如何在Jenkins声明性管道

时间:2017-08-16 06:04:17

标签: docker jenkins jenkins-declarative-pipeline

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

1 个答案:

答案 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