jenkins 声明管道中的参数化 docker 图像

Parametrized docker image in jenkins declarative pipeline

我想 运行 我在一个容器中构建我的图像由源代码管理下的文件确定,所以像

environment {
   my_image = ...
}
agent {
    docker { 
        image my_image
    }
}

但詹金斯抱怨

groovy.lang.MissingPropertyException: No such property: my_image for class: groovy.lang.Binding

有没有办法让 Jenkins 为 docker 图像规范使用变量?

完整管道供参考:

pipeline {
    agent any
    environment {
        REPO = 'unknown'
    }
    stages {
        stage('toolchain') {
            steps {
                git 'https://github.com/avikivity/jenkins-docker-test'
                script {
                    REPO = readFile 'repo'
                }
                echo "repo = ${REPO}"
            }
        }
        stage('build') {
            agent {
                docker {
                    image REPO
                    //image 'docker.io/scylladb/scylla-build-dependencies-docker:fedora-29'
                    label 'packager'
                }
            }
            steps {
                git 'https://github.com/avikivity/jenkins-docker-test'
                sh './build'
            }
        }
    }
}

您只需要:

environment {
   my_image = ...
}
agent {
    docker { 
        image env.my_image
    }
}

您可以在 shell 步骤中单独使用 my_image

sh 'echo ${my_image}'

但在管道步骤中,您需要从 env

中取消引用它

问题原来是 image env.whatever 在任何东西有机会 运行 之前就被评估了。

我通过使用 docker 插件的脚本版本解决了这个问题:

            script {
                docker.image(env.IMAGE).inside {
                    sh './build'
                }
            }

现在,env.IMAGE 在计算后进行求值,插件不会被未初始化的参数混淆。