我们正在使用 Script Pipeline 语法,Jenkinsfile其中定义了很多阶段来构建和部署代码。我们有一个用例,如果我要执行 完整构建,则要 运行所有阶段,但是如果需要执行一些AWS路由,则只运行一个特定阶段。我知道我可以使用if(<expression>)跳过阶段或运行阶段。问题是我不想将这个if条件应用于我的每个阶段Jenkinsfile。
Jenkinsfile
if(<expression>)
if
在新的 声明性管道 语法中,使用该stage..when选项很容易实现。我们的基础架构中使用了许多自定义的Groovy帮助器函数,因此,此时我无法从 Script Pipeline 语法切换到新的 Declarative Pipeline 语法。我最终在现有设备上所做的Jenkinsfile就是这样。
stage..when
原始的詹金斯档案
stage('Checkout Code') {} stage('Build') {} parallel( stage('Sonar Analysis') {} stage('CLM Analysis') {} stage('Security Analysis') {} ) stage('Build Docker Image') {} ... ... stage('QA Deploy') {} stage('QA Routing') {} ... ... stage('Prod Deploy') {} stage('Prod Routing') {}
变成
if (fullDeploy){ stage('Full Build') { stage('Checkout Code') {} stage('Build') {} parallel( stage('Sonar Analysis') {} stage('CLM Analysis') {} stage('Security Analysis') {} ) stage('Build Docker Image') {} ... ... stage('QA Deploy') {} stage('QA Routing') {} ... ... stage('Prod Deploy') {} stage('Prod Routing') {} } } if (routeOnly){ stage('Prod Routing') {} }
这对我来说有点不客气,我在Jenkins文档上找不到任何提供这种方法的好方法。
有没有人有更好的方法来整合这一点?
我还不喜欢在 舞台{}* 中使用多余的 if {} 块的想法。我通过覆盖以下阶段解决了这个问题 *
def stage(name, execute, block) { return stage(name, execute ? block : {echo "skipped stage $name"}) }
现在您可以按以下方式禁用阶段
stage('Full Build', false) { ... }
更新 您还可以使用以下def标记舞台已跳过
import org.jenkinsci.plugins.pipeline.modeldefinition.Utils def stage(name, execute, block) { return stage(name, execute ? block : { echo "skipped stage $name" Utils.markStageSkippedForConditional(STAGE_NAME) }) }