JenkinsPipeline环境变量使用指南
你是否遇到过因环境变量问题导致调试流水线很长时间?这篇文章一定能解决你的问题。本文章翻译自博客 https://e.printstacktrace.blog/jenkins-pipeline-environment-variables-the-definitive-guide/
今天,我们专注于有效地使用Jenkins Pipeline环境变量。您将学习如何定义env变量,如何更新它们,以及如何在布尔表达式中正确使用它们。
主要内容
列出环境变量
读取环境变量
设置环境变量
将布尔值存储在环境变量中
sh在env环境变量中获取输出
1
列出环境变量
让我们首先列出所有可用的环境变量。您可以通过两种不同的方法进行操作。您可以${YOUR_JENKINS_HOST}/env-vars.html在Jenkins主服务器上打开页面,以获取HTML页面上列出的所有环境变量的列表。
另外,您可以通过执行printenvshell命令列出所有环境变量。pipeline{
agentany
stages{
stage("EnvVariables") {
steps{
sh"printenv"
}
}
}
}
注意:使用printenv | sort命令组合来获取环境变量的排序列表可能很有用。
2
读取环境变量
您可以在通过env对象的管道步骤中访问环境变量,例如,env.BUILD_NUMBER将返回当前的内部版本号。您也可以使用简写版本BUILD_NUMBER,但是在此变体中,这可能会使某些用户感到困惑-它缺少BUILD_NUMBER来自环境变量的上下文。
pipeline {
agent any
stages {
stage("Env Variables") {
steps {
echo"The build number is${env.BUILD_NUMBER}"
echo"You can also use \${BUILD_NUMBER} ->${BUILD_NUMBER}"
shecho "I can access $BUILD_NUMBER in shell command as well."
}
}
}
}
3
设置环境变量
可以使用environment { }block 来声明性地设置环境变量,必须使用env.VARIABLE_NAME或命令来设置环境变量withEnv(["VARIABLE_NAME=value"]) {}。
pipeline {
agent any
environment {
FOO ="bar"
}
stages {
stage("Env Variables") {
environment {
NAME ="Alan"
}
steps {
echo"FOO =${env.FOO}"
echo"NAME =${env.NAME}"
script {
env.TEST_VARIABLE ="some test value"
}
echo"TEST_VARIABLE =${env.TEST_VARIABLE}"
withEnv(["ANOTHER_ENV_VAR=here is some value"]) {
echo"ANOTHER_ENV_VAR =${env.ANOTHER_ENV_VAR}"
}
}
}
}
}
4
覆盖环境变量
Jenkins Pipeline支持覆盖环境变量。您需要注意一些规则。
该withEnv(["env=value]) { }块可以覆盖任何环境变量。
使用environment {}块设置的变量不能使用命令式env.VAR = "value"赋值覆盖。
命令式env.VAR = "value"分配只能覆盖使用命令式创建的环境变量。
这是一个示例性的Jenkinsfile,显示了所有三种不同的用例。
pipeline {
agent any
environment {
FOO ="bar"
NAME ="Joe"
}
stages {
stage("Env Variables") {
environment {
NAME ="Alan"// overrides pipeline level NAME env variable
BUILD_NUMBER ="2"// overrides the default BUILD_NUMBER
}
steps {
echo"FOO = ${env.FOO}"// prints "FOO = bar"
echo"NAME = ${env.NAME}"// prints "NAME = Alan"
echo"BUILD_NUMBER = ${env.BUILD_NUMBER}"// prints "BUILD_NUMBER = 2"
script {
env.SOMETHING ="1"// creates env.SOMETHING variable
}
}
}
stage("Override Variables") {
steps {
script {
env.FOO ="IT DOES NOT WORK!"// it cant override env.FOO declared at the pipeline (or stage) level
env.SOMETHING ="2"// it can override env variable created imperatively
}
echo"FOO = ${env.FOO}"// prints "FOO = bar"
echo"SOMETHING = ${env.SOMETHING}"// prints "SOMETHING = 2"
withEnv(["FOO=foobar"]) {// it can override any env variable
echo"FOO = ${env.FOO}"// prints "FOO = foobar"
}
withEnv(["BUILD_NUMBER=1"]) {
echo"BUILD_NUMBER = ${env.BUILD_NUMBER}"// prints "BUILD_NUMBER = 1"
}
}
}
}
}
5
将布尔值存储在环境变量中
关于使用环境变量,存在一种普遍的误解。存储为环境变量的每个值都将转换为String。当您存储布尔false值时,它将转换为"false"。如果要在布尔表达式中正确使用该值,则需要调用"false".toBoolean()method。
pipeline{
agentany
environment{
IS_BOOLEAN=false
}
stages{
stage("EnvVariables") {
steps{
script{
if(env.IS_BOOLEAN) {
echo"You can see this message, because \"false\" String evaluates to Boolean.TRUE value"
}
if(env.IS_BOOLEAN.toBoolean() == false) {
echo"You can see this message, because \"false\".toBoolean() returns Boolean.FALSE value"
}
}
}
}
}
}
6
使用sh捕获环境变量
您还可以将shell命令的输出捕获为环境变量。请记住,您需要使用sh(script: cmd, returnStdout:true)格式来强制sh步骤返回输出,以便可以捕获它并将其存储在变量中。
pipeline{
agentany
environment{
LS="${sh(script:ls -lah, returnStdout: true)}"
}
stages{
stage("EnvVariables") {
steps{
echo"LS = ${env.LS}"
}
}
}
}
关于我们
泽阳,DevOps领域实践者。专注于企业级DevOps运维开发技术实践分享,主要以新Linux运维技术、DevOps技术课程为主。丰富的一线实战经验,课程追求实用性获得多数学员认可。课程内容均来源于企业应用,在这里既学习技术又能获取热门技能,欢迎您的到来!(微信ID: devopsvip)
运行管道
创建指向 Jenkins 文件的 Jenkins 管道作业类型(示例如下) :
单击 Build 时,您将在控制台日志中看到相应的输出:
结论
用配置作为代码设置Jenkins实例(使用Yaml配置)
本文介绍了如何使用yaml通过ConfigurationasCode插件设置Jenkins实例
Jenkins配置-学习笔记
修改默认工作目录Homedirection