我希望能够做类似的事情:
AOEU=$(echo aoeu)
并让詹金斯设置AOEU=aoeu
。
Jenkins 中的环境变量部分没有这样做。相反,它设置AOEU='$(echo aoeu)'
.
如何让 Jenkins 评估 shell 命令并将输出分配给环境变量?
最终,我希望能够将作业的执行程序分配给可以传递给其他脚本或由其他脚本使用的环境变量。
我希望能够做类似的事情:
AOEU=$(echo aoeu)
并让詹金斯设置AOEU=aoeu
。
Jenkins 中的环境变量部分没有这样做。相反,它设置AOEU='$(echo aoeu)'
.
如何让 Jenkins 评估 shell 命令并将输出分配给环境变量?
最终,我希望能够将作业的执行程序分配给可以传递给其他脚本或由其他脚本使用的环境变量。
这可以通过EnvInject 插件以下列方式完成:
创建一个运行的“执行 shell”构建步骤:
echo AOEU=$(echo aoeu) > propsfile
创建一个注入环境变量构建步骤并将“属性文件路径”设置为propsfile
.
注意:这个插件(大部分)与 Pipeline 插件不兼容。
就我而言,我需要JMETER_HOME
在我的 Jenkins 服务器 (Linux) 上的所有项目中通过我的 Ant 构建脚本添加环境变量,这样不会干扰build.xml
脚本中的本地构建环境(Windows 和 Mac) . 通过Manage Jenkins - Configure System - Global properties设置环境变量是完成此操作的最简单且侵入性最小的方法。不需要插件。
然后通过以下方式在 Ant 中提供环境变量:
<property environment="env" />
<property name="jmeter.home" value="${env.JMETER_HOME}" />
这可以通过添加来验证是否有效:
<echo message="JMeter Home: ${jmeter.home}"/>
产生:
JMeter 主页:~/.jmeter
在我的情况下,我使用以下选项配置环境变量并且它有效 -
Manage Jenkins -> Configure System -> Global Properties -> Environment Variables -> Add
你可以试试这样的
stages {
stage('Build') {
environment {
AOEU= sh (returnStdout: true, script: 'echo aoeu').trim()
}
steps {
sh 'env'
sh 'echo $AOEU'
}
}
}
您可以使用Environment Injector Plugin在 Jenkins 中在作业和节点级别设置环境变量。下面我将展示如何在工作级别设置它们。
Manage Jenkins > Manage Plugins
并安装插件。Configure
屏幕Add build step
在部分中查找Build
并选择Inject environment variables
如果您需要根据某些条件(例如作业参数)定义一个新的环境变量,那么您可以参考这个答案。
EnvInject Plugin aka ( Environment Injector Plugin ) 为您提供了几个选项来从 Jenkins 配置中设置环境变量。
通过选择Inject environment variables to the build process
,您将获得:
Properties File Path
Properties Content
Script File Path
Script Content
最后Evaluated Groovy script
。
Evaluated Groovy script
使您可以根据执行命令的结果设置环境变量:
execute
方法: return [HOSTNAME_SHELL: 'hostname'.execute().text,
DATE_SHELL: 'date'.execute().text,
ECHO_SHELL: 'echo hello world!'.execute().text
]
Groovy
代码: return [HOSTNAME_GROOVY: java.net.InetAddress.getLocalHost().getHostName(),
DATE_GROOVY: new Date()
]
(关于每种方法的更多细节可以在内置帮助(?)中找到)
不幸的是,你不能Script Content
像它所说的那样做同样的事情:
执行旨在设置环境的脚本文件,例如创建文件夹、复制文件等。给出脚本文件内容。您可以使用上述属性变量。 但是,在脚本中添加或覆盖环境变量不会对构建作业产生任何影响。
这是存储环境变量并访问它的片段。
node {
withEnv(["ENABLE_TESTS=true", "DISABLE_SQL=false"]) {
stage('Select Jenkinsfile') {
echo "Enable test?: ${env.DEVOPS_SKIP_TESTS}
customStep script: this
}
}
}
注意:环境变量的值以字符串的形式出现。如果要将其用作布尔值,则必须使用 Boolean.parse(env.DISABLE_SQL) 对其进行解析。
通常,您可以在配置系统的全局属性中配置环境变量。
但是对于带有 shell 替换的动态变量,您可能希望在 Jenkins HOME 目录中创建一个脚本文件并在构建期间执行它。需要 SSH 访问权限。例如。
sudo su - jenkins
或sudo su - jenkins -s /bin/bash
创建一个shell脚本,例如:
echo 'export VM_NAME="$JOB_NAME"' > ~/load_env.sh
echo "export AOEU=$(echo aoeu)" >> ~/load_env.sh
chmod 750 ~/load_env.sh
在 Jenkins Build ( Execute shell ) 中,先调用脚本及其变量,例如
source ~/load_env.sh
尝试与EnvInject非常相似的Environment Script Plugin ( GitHub ) 。它允许您在构建之前(在 SCM 检出之后)运行脚本,为其生成环境变量。例如
并且在您的脚本中,您可以将例如打印FOO=bar
到标准输出以设置该变量。
附加到现有PATH
-style 变量的示例:
echo PATH+unique_identifier=/usr/local/bin
因此,您可以自由地在脚本中做任何您需要的事情 - 无论cat
是文件,还是从项目的源代码树中以其他语言运行脚本等。
扩展@JSixface 的答案:
要全局定义环境变量以从声明性管道的所有阶段访问,您可以在块中添加该environment
部分pipeline
。
pipeline {
agent {
node {
label 'myAgent'
}
}
environment {
AOEU = "${sh(returnStdout: true, script: 'echo aoeu').trim()}"
}
stages {
...
}
}
由于某种原因sudo su - jenkins
没有将我登录到jenkins
用户,我最终使用了不同的方法。
我使用 jenkins config.xml
at /var/lib/jenkins/config.xml
(安装在 Linux/RHEL 中)成功设置了全局环境变量 - 没有使用外部插件。
我只需要停止 jenkins add 然后 add globalNodeProperties
,然后重新启动。
例如,我正在定义变量APPLICATION_ENVIRONMENT
并SPRING_PROFILES_ACTIVE
在continious_integration
下面定义,
<?xml version='1.0' encoding='UTF-8'?>
<hudson>
<globalNodeProperties>
<hudson.slaves.EnvironmentVariablesNodeProperty>
<envVars serialization="custom">
<unserializable-parents/>
<tree-map>
<default>
<comparator class="hudson.util.CaseInsensitiveComparator"/>
</default>
<int>2</int>
<string>APPLICATION_ENVIRONMENT</string>
<string>continious_integration</string>
<string>SPRING_PROFILES_ACTIVE</string>
<string>continious_integration</string>
</tree-map>
</envVars>
</hudson.slaves.EnvironmentVariablesNodeProperty>
</globalNodeProperties>
</hudson>
您可以使用下列任一方式:
管理 Jenkins -> 配置系统 -> 全局属性 -> 环境变量 -> 添加
我们使用 groovy 作业文件:
description('')
steps {
environmentVariables {
envs(PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: true)
}
}