我们有一些Jenkins工作,在构建之前检查多个github仓库;一个单独的构建可能需要一个小时或更长时间。如果有什么变化,我们希望安排新的构建,但目前Jenkins正在安排太多的构建。我们已经设置了一个SCM轮询后,每10分钟,它安排一个新的运行作业每10分钟,即使已经有5个相同的作业在队列中等待.切换到git后,看起来情况变得更糟了,而svn并没有那么糟糕.
我们的愿望在我看来是卑微的:
1.如果一个工作已经在等待名单上,不要安排新的工作。
1.运行作业时,始终从所有存储库中检出最新提交,以适应所有更改。
有没有可能用Jenkins声明式管道来实现这一点?我试图通过在互联网上找到的localBranch: '**'
技巧来解决2),但不确定它是否有效,也许它使1)更糟。我们的管道草图看起来像:
pipeline {
agent {
label 'BuildWin6'
}
triggers {
pollSCM '*/10 * * * *'
}
stages {
stage('Checkout') {
steps {
dir('production') {
checkout([$class: 'GitSCM', branches: [[name: '*/main']], extensions: [[$class: 'LocalBranch', localBranch: '**']], userRemoteConfigs: [[credentialsId: 'b342365f-2641-4fe7-a77d-e4378431434f', url: '[email protected]:Company/Project']]])
}
dir('test-core') {
checkout([$class: 'GitSCM', branches: [[name: '*/main']], extensions: [[$class: 'LocalBranch', localBranch: '**']], userRemoteConfigs: [[credentialsId: 'b342365f-2641-4fe7-a77d-e4378431434f', url: '[email protected]:Company/Project-test-core.git']]])
}
}
}
// ...
}
// ...
}
字符串
感谢任何提示!
1条答案
按热度按时间ntjbwcob1#
我自己回答我的问题。我无法让Jenkins pipeline
triggers
机制做我想要的事情,无论是pollSCM
还是upstream
。相反,我通过试验Groovy发现它通过Hudson.instance.queue.getItems()
和item.getTask().getName()
暴露了所需的信息。后者似乎报告了屏幕上显示的相同构建队列行,例如part of MyJobName #243
,从那里我可以看到一个作业是否在构建队列中。所以,我现在的解决方案是添加一个单独的Jenkins作业,它每10分钟运行一次,从各种repos中检查是否有新的提交,并触发所需的作业。这个触发作业必须在一个特定的单独节点上运行,该节点不运行任何其他长作业,以确保它确实每10分钟运行一次。
字符串
当然,中间部分也可以用Groovy编写,我敢肯定。
为了触发级联作业,前一个作业最终可以做类似的事情:
型