0

我想在一个容器中运行我的构建,其图像由源代码控制下的文件确定,所以类似于

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'
            }
        }
    }
}
4

2 回答 2

3

事实证明,问题image env.whatever是在任何有机会运行之前就对其进行了评估。

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

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

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

于 2018-11-28T15:24:47.093 回答
0

您只需要:

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

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

sh 'echo ${my_image}'

但在管道步骤中,您需要从 env 中取消引用它

于 2018-11-28T14:03:48.267 回答