我们正在使用 Script Pipeline 语法,Jenkinsfile
其中定义了很多阶段来构建和部署代码。我们有一个用例,如果我要执行
完整构建,则要
运行所有阶段,但是如果需要执行一些AWS路由,则只运行一个特定阶段。我知道我可以使用if(<expression>)
跳过阶段或运行阶段。问题是我不想将这个if
条件应用于我的每个阶段Jenkinsfile
。
在新的 声明性管道
语法中,使用该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') {}
变成
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)
})
}
我希望能够在Jenkins中包装一个“阶段”,这样我就可以在一个阶段的开始和结束时执行自定义代码,比如: 我想我可以通过使用元类来做到这一点: 但是Groovy脚本本身似乎是一个绑定,它没有元类: 我还在学习Groovy和Jenkins管道是如何工作的,所以也许我只是错过了一些东西。
问题内容: 仅在构建特定分支时,如何运行构建步骤/阶段? 例如,仅在调用分支的情况下才运行部署步骤,而其他所有都保持不变。 问题答案: 在声明性管道语法中执行相同的操作,以下是一些示例: 出现更有效的方法-https: //issues.jenkins- ci.org/browse/JENKINS-41187 另请 参阅- https://jenkins.io/doc/book/pipeline/
仅当构建特定分支时,如何运行构建步骤/阶段? 例如,仅当分支被称为时才运行部署步骤,其他操作保持不变。
我们有一个Jenkins脚本管道,包含6个阶段。我需要在每个阶段结束时调用RESTAPI,将阶段的状态推送到Cassandra DB。在詹金斯管道中有没有一种有效的方法? 目前,我正在每个阶段结束时调用一个状态为的函数。我必须在所有阶段编写这段代码,即使阶段成功或失败。
问题内容: 如何 从Jenkinsfile(groovy)中获取Jenkins中管道配置字段“脚本路径”的内容? 在此处输入图片说明 在此示例中:我想在 执行Jenkinsfile本身时获取字符串’Apps / mq-logger / Jenkinsfile’ 。 问题答案: 您可以通过这种方式获取脚本路径 请注意,您必须approve 所有这些方法。
问题内容: 我正在尝试在Jenkins脚本化管道中运行条件步骤,但是我不确定如何仅在上一步成功的情况下运行步骤。例如,在以下情况中,如果“测试”阶段成功,我只想运行“推送工件”阶段: 我知道声明性管道允许您使用“后”条件,但是我对Jenkins中的声明性管道与脚本化管道的理解是,脚本化管道提供了更大的灵活性。有没有一种方法可以基于脚本管道中其他阶段的成功来运行阶段? 问题答案: 在詹金斯管道中没有