我正在创建一个Jenkins声明性管道作业,我在一个依赖于外部数据库容器的docker容器中运行一些节点测试。我创建了一个独特的网络,然后尝试将网络uid作为docker arg传递,以便docker容器可以访问所述db容器:
def myNetwork = dbNetwork
stage('test-ci') {
agent {
docker {
reuseNode true
image 'myrepo/my-nodejs'
label 'docker'
args "--net ${myNetwork}"
}
}
steps {
script {
try {
sh 'npm run test-ci'
} catch(err) {
currentBuild.result = 'FAILED'
}
}
}
}
然而,Jenkins输出显示,当docker收到变量时,变量以某种方式结束为空:
$ docker run -t -d -u 233:233 --net null -w /home/jenkins/workspace/es_feature_add-db-container- ...
我确实注意到演示传递args的示例使用单引号,但我需要双引号,因此myNetwork
正确扩展,但也许这不是管道方式。
如何正确地将变量传递给docker?
编辑:在玩了一点之后,我认为这是一个范围问题,因为我成功地传递了像env.BUILD_TAG
这样的环境变量。我基本上只需要一个随机的,保证唯一的网络名称来运行给定的工作,所以我不会与其他工作发生冲突 - env.BUILD_TAG
似乎可以完成这项工作,但我仍然想知道为什么我无法传入我在脚本中定义的变量。
答案 0 :(得分:0)
创建一个environment
部分 - 这是桥接Groovy和in-Jenkins Shell的方法
String SomeVar = "wibble"
pipeline {
...
environment {
// use a Groovy GString here
SomeVar = "$SomeVar"
// mix with the environment in "shell jenkins"
MyBuild = "$SomeVar-$GIT_COMMIT"
}
}
stage(DockerBuild) {
echo 'this is a groovy level call - so' + env.SomeVar + 'will work'
}
简而言之,我们可以在Grtoovy段中有一个变量,并且在管道部分仍然可以在Shell 和中访问它,如果我们需要使用groovy级别调用(通常是docker.build),那么varible就在env.Varname