Ali*_*gat 5 groovy jenkins jenkins-pipeline
我们正在使用Script Pipeline语法,Jenkinsfile它有很多阶段定义来构建和部署我们的代码.我有一个用例,如果我正在进行完整构建,我想运行所有阶段,但如果我需要执行一些AWS路由,则只运行一个特定阶段.我知道我可以使用if(<expression>)跳过舞台或跑舞台.问题是我不想将这个if条件应用到我的每个阶段Jenkinsfile.
在新的Declarative Pipeline语法中,使用该stage..when选项很容易实现.我们的基础结构中使用了很多自定义Groovy辅助函数,所以此时我无法从Script Pipeline语法切换到新的Declarative Pipeline语法.我最终在现有Jenkinsfile的东西上做的是这样的......
原来詹金斯文件
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') {}
Run Code Online (Sandbox Code Playgroud)
变成
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') {}
}
Run Code Online (Sandbox Code Playgroud)
这让我觉得有点hacky,我在Jenkins文档上找不到任何提供这种方法的好方法.
有没有人有更好的方法可以加入这个?
cul*_*mat 23
我也不喜欢在我的舞台{}中有一个冗余的if {}块的想法.我通过如下覆盖舞台解决了这个问题
def stage(name, execute, block) {
return stage(name, execute ? block : {echo "skipped stage $name"})
}
Run Code Online (Sandbox Code Playgroud)
现在你可以按如下方式禁用一个阶段
stage('Full Build', false) {
...
}
Run Code Online (Sandbox Code Playgroud)
更新 您还可以使用以下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)
})
}
Run Code Online (Sandbox Code Playgroud)