如何使 Jenkins 管道由拉取请求触发,以构建 Github 项目中的所有存储库



我想设置一个管道,该管道由 GitHub 项目的拉取请求自动触发,然后构建其中的所有存储库。我找到了这篇文章并按照说明进行操作,因为它与我需要的类似,但我目前陷入了让管道在同一个 GitHub 项目中触发和构建多个存储库的困境,每次为其中一个存储库进行 PR 时。

我附上了这张图,以更清楚地说明我的问题。

因此,目标是当在存储库 1 的分支 3 上发出拉取请求时,将触发管道,该管道按指定顺序构建该分支和所有其他存储库,即工作项目的存储库2、存储库3等。

您的帮助将不胜感激,我认为为此提供解决方案将使 CI DevOps 社区受益匪浅。谢谢!

尝试以下内容 - 不能保证以下内容是准确的,但应该会让你朝着正确的方向前进。

您要做的第一件事是在每个存储库中保持一致的 Jenkinsfile,现在您可以通过多种不同的方式执行此操作,但实现这一目标的一种方法是使用外部 groovy 管道,以便逻辑可以在存储库中保持一致。这方面的一个例子位于此处。在每个存储库之间复制 Jenkinsfile 也可以,但是单一事实来源通常是一种更好的方法。

node{
deleteDir()
git env.flowScm
def flow = load 'pipeline.groovy'
stash includes: '**', name: 'flowFiles'
stage 'Checkout'
checkout scm // short hand for checking out the "from scm repository"
flow.runFlow()
}

pipeline.groovy 文件包含实际管道的地方如下所示:

def runFlow() {
// your pipeline code
} 
// Has to exit with 'return this;' in order to be used as library
return this;

让每个触发器使用相同的管道逻辑后,您可以利用dir命令克隆和使用不是触发构建的存储库。此处就是一个例子。

node('ATLAS && Linux') {
dir('CalibrationResults') {
git url: 'https://github.com/AtlasBID/CalibrationResults.git'
}
dir('Combination') {
git url: 'https://github.com/AtlasBID/Combination.git'
}
dir('CombinationBuilder') {
git url: 'https://github.com/AtlasBID/CombinationBuilder.git'
}
sh('ls')
sh('. CombinationBuilder/build.sh')
}

在这种情况下,将这两个步骤放在一起应该可以实现您所追求的目标。

最新更新