2

我正在创建一个 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似乎可以完成这项工作,但我仍然想知道为什么我不能传入变量我在脚本中定义的。

4

1 回答 1

-1

创建一个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),该变量位于 env.Varname

于 2018-05-09T16:35:27.603 回答