我在 git 存储库中将 Jenkins
Pipeline
工作定义为。
// File: deployment/jenkinsfiles/staging/Merge
@Library("my_shared_lib") _
import com.company.myteam.Constants
pipeline {
agent { label "common" }
triggers {
pollSCM("H/2 * * * *")
}
options {
buildDiscarder(logRotator(numToKeepStr: "50", artifactNumToKeepStr: "50"))
}
stages {
stage ("Staging Merge") {
steps {
script {
def config = new Constants().repoconfig
ansiColor("xterm") {
myteam.pipelines.stagingMerge(config)
}
}
}
}
}
post {
always {
cleanWs()
}
}
}
然后我创建了 jenkins 作业配置,如下所示。
现在,当我检查
Git Polling Log
时,它也进行了投票 shared-library
。
Started on Feb 25, 2020 5:33:07 PM
Using strategy: Default
[poll] Last Built Revision: Revision 681f996e689bdeb9cfca2b167002b8ccd99590cb (origin/staging)
using credential github_username_with_token
> git --version # timeout=10
using GIT_ASKPASS to set credentials Github Service Account Username with token
> git ls-remote -h https://[email protected]/myteam/myrepo # timeout=10
Found 6 remote heads on https://[email protected]/myteam/myrepo
[poll] Latest remote head revision on refs/heads/staging is: 681f996e689bdeb9cfca2b167002b8ccd99590cb - already built by 53
Using strategy: Default
[poll] Last Built Revision: Revision e80628ec7c9dbc59decbc81a3b884dcaa963a8dc (refs/remotes/origin/master)
using credential github_username_with_token
> git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repositories
> git config remote.origin.url https://[email protected]/myteam/jenkins-shared-libraries.git # timeout=10
Fetching upstream changes from https://[email protected]/myteam/jenkins-shared-libraries.git
> git --version # timeout=10
using GIT_ASKPASS to set credentials Github Service Account Username with token
> git fetch --tags --progress https://[email protected]/myteam/jenkins-shared-libraries.git +refs/heads/*:refs/remotes/origin/* # timeout=10
Polling for changes in
> git rev-parse refs/remotes/origin/master^{commit} # timeout=10
> git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10
> git log --full-history --no-abbrev --format=raw -M -m --raw e80628ec7c9dbc59decbc81a3b884dcaa963a8dc..869b3a16e07d21a88d557f1857376bfed7717a6e # timeout=10
每当我更改
jenkins-shared-library
中的代码时,它就会开始构建该作业。
我尝试了
https://issues.jenkins.io/browse/JENKINS-39615?focusedCommentId=280729&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-280729中给出的
workaround
,但没有运气。
我将
pollSCM
更改为 githubPush
,但这也会在我更改 shared-library
时触发。
我尝试了https://issues.jenkins-ci.org/browse/JENKINS-41497中给出的解决方案作为
Ignore on push notifications
的githubPush()
,但仍然是触发工作。
在搬到
pipeline
之前,我有freestyle
项目。其中有源代码管理部分,我们可以在其中定义分支,并且githubPush()
仅监听该分支。
当我们选择项目类型为
pipeline
时,没有源代码管理部分。可能是因为这个原因,它监听所有推送事件。
通过
push
或poll
,我想限制我的詹金斯工作仅在myrepo.git
发生更改时触发。
我知道这个问题已经很老了,但是对于任何发现这个问题的人来说,我已经找到了解决方案,或者至少是解决方法。
正如您在问题中提到的,在依赖 SCM 轮询的詹金斯管道作业中使用共享库来触发作业会导致作业的 SCM 轮询也包括轮询共享库的 SCM。
共享库配置有默认分支。该分支的
HEAD
是轮询更改的内容。将更改合并到配置的默认分支更改HEAD
,从而导致触发。
我使用的解决方法是在共享库存储库中标记对我的共享库的更新,并在我想要“部署”我的共享库更新到我的所有管道时更新共享库默认分支工作机会。
标签(通常)不会更改,因此即使作业继续轮询共享库 SCM,标签引用也不会更改,并且在将更改合并到我的共享库存储库时不再触发作业。
附加说明:我惊喜地发现,当我更新 Jenkins 中的共享库配置以指向共享库存储库中的新标签时,不会触发作业。
是的,这个解决方法是更新共享库时的额外步骤,但我发现这些额外步骤比处理触发 SCM 更改的作业要省力得多,我希望它们忽略。
示例:
最后注意:允许覆盖默认版本选项非常方便。在我需要管道来继续使用旧标签的情况下,或者如果我想测试尚未标记的更新,我可以在管道脚本中执行此操作,例如:
// use an earlier tag for this pipeline:
@Library('my-shared-lib@v1_1_0`) _
pipeline {
// ....
}
// use the HEAD of the main branch for this pipeline:
@Library('my-shared-lib@main')
pipeline {
// ...
}