我正在使用 jenkins 声明式管道来构建我的项目。有3个项目:A,B和C。项目A是B和C的下游。每次触发项目B或C时(通过 Subversion 中的提交(,它们都会生成一个工件(快照(,然后由项目A使用。出于性能原因,我想强制仅生成一次项目A,即在生成项目B和C时或在队列中等待时。
如何使用声明性管道实现这一点?
以下是我的管道源代码:
答:
pipeline {
agent any
tools {
maven "maven"
}
stages {
stage('Build') {
steps {
sh "mvn clean install"
}
}
}
}
乙:
pipeline {
agent any
tools {
maven "maven"
}
stages {
stage('Build') {
steps {
sh "mvn clean install"
}
}
}
post {
success {
build job: 'A', wait: false
}
}
}
三:
pipeline {
agent any
tools {
maven "maven"
}
stages {
stage('Build') {
steps {
sh "mvn clean install"
}
}
}
post {
success {
build job: 'A', wait: false
}
}
}
如注释中所述,发布包装器管道的基本代码片段:
pipeline {
stages {
stage('Trigger'){
// Initial trigger if needed
}
stage('Build B and C'){
parallel BuildB: {
when{
// Condition to evaluate
}
steps {
// Trigger pipeline B
}
},
BuildC: {
when{
// Condition to evaluate
}
steps {
// // Trigger pipeline C
}
}
}
stage('Build A'){
// Trigger pipeline A
}
}
}
此包装器管道将并行执行 B 和 C,只有在完成两者后,才会触发 A。
我终于找到了 Jenkins 处理这个问题的方法,那就是使用quietPriod(<time-to-wait-in-seconds>)
。因此,管道A如下所示:
pipeline {
agent any
tools {
maven "maven"
}
options {
quietPeriod(30)
}
stages {
stage('Build') {
steps {
sh "mvn clean install"
}
}
}
}
例如,如果项目B触发下游项目 A,则A不会立即开始构建,而是等待 30 秒,然后开始构建。如果在这 30 秒内项目C(或项目B(启动并触发项目 A,则只生成一次A。我发现这篇文章很有帮助。