我知道我可以在一个阶段有一个关于詹金斯管道(声明性)的环境部分。 像这样:
stage('Name') {
environment {
NAME = value
}
steps {
script {
Do something using these env vars
}
}
}
我想编写一个常规函数,定义一些环境变量,运行一些东西,然后从几个管道中调用它。 比如:
def function () {
environment {
NAME = value
}
sh "do something using these env vars"
}
有可能吗?
(我知道我可以写
sh "ENV=value; some CMD"
,但我的变量很少,而且可读性较差)。
是的,你可以这样做。 Jenkins Pipeline 将其环境变量存储在名为
ENV
的映射中。因此,您可以向此映射添加其他键值对以获取其他环境变量。这可以通过 Groovy 语法完成:
// syntax option one
env.key = value
// syntax option two
env['key'] = value
对于您的示例,这看起来像:
def function () {
env.NAME = value
sh "do something using these env vars"
}
要创建可以由多个管道共享的函数,您需要将其放置到共享库。
参见 https://www.jenkins.io/doc/book/pipeline/shared-libraries/
将环境变量传递给 sh:
withEnv(['var_name=var_value', 'var_name_2=var_value_2']) {
echo "process to be executed with var_name=$var_name var_name_2=$var_name_2"
sh 'bin/start'
}
参见https://www.jenkins.io/doc/pipeline/steps/workflow-basic-steps/#withenv-set-environment-variables
withEnv
您应该能够在共享库的var
文件夹中的文件中使用。
在课程中(在库的
src
文件夹中),您可能需要使用 ProcessBuilder
。请参阅https://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html
def pb = new ProcessBuilder('script_path','arg1','arg2')
pb.environment().put('var_name','var_value')
pb.environment().put('var_name2','var_value2')
Process p = pb.start()
p.waitFor()