【发布时间】:2020-08-31 19:07:26
【问题描述】:
我正在使用 Jenkins 声明式管道,我想根据环境变量进行条件步骤,该环境变量是根据文件的存在设置的。
所以我只想做这样的事情:如果 Dockerfile 存在,则执行下一阶段,否则不执行。
为此我尝试了:
pipeline {
// ...
stage {
stage('Docker') {
environment {
IS_DOCKERFILE = fileExists 'Dockerfile'
}
when {
environment name: 'IS_DOCKERFILE', value: true
}
stage('Build') {
// ...
}
}
}
}
或者:
pipeline {
// ...
stage {
stage('Docker') {
environment {
IS_DOCKERFILE = fileExists 'Dockerfile'
}
when {
expression {
env.IS_DOCKERFILE == true
}
}
stage('Build') {
// ...
}
}
}
}
在这两种情况下,Dockerfile 都存在并且位于工作区中。我也尝试过使用字符串 ("true"),但每次,管道都会继续而不执行阶段“构建”。
有什么建议吗?
【问题讨论】:
-
目前尚不清楚您要达到的目标。大多数管道驻留在 Jenkinsfile 中,该文件与存储库中的其他代码一起保存。假设这也是你的情况,存储库要么有 Dockerfile,要么没有。我看不出在运行时发现这一点的意义。
-
这是因为我试图为两种应用程序类型使用相同的管道:Web 服务(具有 Dockerfile)和库(没有 Dockerfile)。唯一的区别是该库不需要构建为 docker 映像,因此我尝试仅在 Dockerfile 时执行最后一步。我使用 jenkins 共享库,因此管道很常见(可能是不好的做法)
-
您应该为每个项目使用不同的管道。话虽如此,您可以有一个阶段来查看是否有使用
fileExists的dockerfile,并设置一个全局变量。然后另一个阶段可以使用例如查看全局变量。when { expression { IS_DOCKERFILE == true }}或script { if (IS_DOCKERFILE) { ... } }
标签: jenkins jenkins-pipeline jenkins-groovy