我在网上搜索了很多,但没有找到这个问题的答案。我们有两个项目A和B,它们触发了一个公共项目C,因为它是管道步骤。现在,如果A触发了C(公共项目),并且B也几乎同时触发C,则只运行C的一个构建,并且结果由A和B使用。C中的构建状态同时显示“* 由上游项目A启动 ”和“ 由上游项目B启动 *”。如何使项目C首先完成由A触发的生成,然后为B触发的生成启动新的生成?
fdx2calv1#
当您启用Do not allow concurrent builds时会发生这种情况,除非Jenkins将运行视为唯一运行,否则它不会将其他作业排队,Jenkins会认为您正在尝试多次运行同一个作业。为了欺骗Jenkins,您需要在每次触发作业时更改一个参数,如果你使用相同的参数,它会认为这是同一个作业,所以在目标作业(作业C)中引入一个新的参数,并可能传递一些随机值,这将使它唯一。在目标作业C中
Do not allow concurrent builds
string(name: 'UniqueString', defaultValue: 'o', description: 'something')
在触发作业A和B中,传递一些随机值,我传递
def randomValue = "${JOB_NAME}-${BUILD_ID}" build wait: false, job: 'otherjob', parameters: [ string(name: 'UniqueString',value: "$randomValue") ... ]
1zmg4dgp2#
我使用Jenkins中的lockable resource plugin解决了这个问题,所以项目A和B的Jenkinsfile如下所示
pipeline { agent { ... } stages { stage('Invoke project C') { steps { lock('project-c-lock') { script { ... ... } } } } }
因此,这一步只执行一次,同步就发生了。使用相同的锁资源名是很重要的。
2条答案
按热度按时间fdx2calv1#
当您启用
Do not allow concurrent builds
时会发生这种情况,除非Jenkins将运行视为唯一运行,否则它不会将其他作业排队,Jenkins会认为您正在尝试多次运行同一个作业。为了欺骗Jenkins,您需要在每次触发作业时更改一个参数,如果你使用相同的参数,它会认为这是同一个作业,所以在目标作业(作业C)中引入一个新的参数,并可能传递一些随机值,这将使它唯一。在目标作业C中
在触发作业A和B中,传递一些随机值,我传递
1zmg4dgp2#
我使用Jenkins中的lockable resource plugin解决了这个问题,所以项目A和B的Jenkinsfile如下所示
因此,这一步只执行一次,同步就发生了。使用相同的锁资源名是很重要的。