将 Jenkins Git 轮询限制在一个分支
Limit Jenkins Git polling to one branch
当前的 Jenkins 管道作业已设置为构建从 Git 检出的分支。我们使用 SCM 插件进行结帐:
triggers {
pollSCM scmpoll_spec: ''
}
checkout(
poll: true,
scm: [$class: 'GitSCM',
branches: [[name: 'refs/heads/develop']],
userRemoteConfigs: [
[url: 'https://git-server/repo.git',
name: 'origin',
refspec: '+refs/heads/develop:refs/remotes/origin/develop',
credentialsId: 'XXX']
],
extensions: [
[$class: 'WipeWorkspace'],
[$class: 'CloneOption', honorRefspec: true, noTags: true, reference: '', shallow: false],
[$class: 'LocalBranch', localBranch: 'develop']
],
browser: [$class: 'GitList', repoUrl: 'https://git-server/gitlist/repo.git']
]
)
在构建期间调用 npm version patch
更新 package.json
文件,提交并在本地创建标签。然后我们将其推送回服务器端 git 存储库。为了阻止 Jenkins 开始另一个构建,我们使用选项推送并且 post-receive 挂钩忽略这些推送:
git push origin develop --follow-tags --push-option=nobuild
服务器上的 post-receive 挂钩仅在用户推送时发送到 Jenkins,因为他们不会使用选项:
"https://jenkins-server/git/notifyCommit?url=https://git-server/repo.git"
这一切都很好地工作,但是,问题是当开发人员提交 feature
分支时,develop
分支的构建开始了。我猜以下是问题的原因:
- commit/push 到
develop
分支
- 在构建
develop
分支期间创建的标签
- commit/push 在
feature
分支
- Jenkins 在开发
branch
上看到新标签并开始构建
所以我正在寻找一种方法来强制 Jenkins 只考虑 commits/pushes 到特定分支以触发特定构建。或者强制 Jenkins 在考虑开始构建时忽略作为标记一部分的更改。
注意,我发现了另一个 SO post:Jenkins git commit for specific branch triggers build jobs for other branches too
虽然文档中似乎没有,但再次寻找答案时我遇到了这张 Jenkins 票证:JENKINS-29574 - notifyCommit branch parameter is ignored。看来您可以向 URL 添加一个额外的参数:&branches=<branch-name>
作为 Git post-receive
钩子脚本的一部分,我可以找到分支名称并将其用作 POST:
的一部分
https://jenkins-server/git/notifyCommit?url=https://git-server/repo.git&branches=develop
这现在只会启动使用该特定分支的构建。
当前的 Jenkins 管道作业已设置为构建从 Git 检出的分支。我们使用 SCM 插件进行结帐:
triggers {
pollSCM scmpoll_spec: ''
}
checkout(
poll: true,
scm: [$class: 'GitSCM',
branches: [[name: 'refs/heads/develop']],
userRemoteConfigs: [
[url: 'https://git-server/repo.git',
name: 'origin',
refspec: '+refs/heads/develop:refs/remotes/origin/develop',
credentialsId: 'XXX']
],
extensions: [
[$class: 'WipeWorkspace'],
[$class: 'CloneOption', honorRefspec: true, noTags: true, reference: '', shallow: false],
[$class: 'LocalBranch', localBranch: 'develop']
],
browser: [$class: 'GitList', repoUrl: 'https://git-server/gitlist/repo.git']
]
)
在构建期间调用 npm version patch
更新 package.json
文件,提交并在本地创建标签。然后我们将其推送回服务器端 git 存储库。为了阻止 Jenkins 开始另一个构建,我们使用选项推送并且 post-receive 挂钩忽略这些推送:
git push origin develop --follow-tags --push-option=nobuild
服务器上的 post-receive 挂钩仅在用户推送时发送到 Jenkins,因为他们不会使用选项:
"https://jenkins-server/git/notifyCommit?url=https://git-server/repo.git"
这一切都很好地工作,但是,问题是当开发人员提交 feature
分支时,develop
分支的构建开始了。我猜以下是问题的原因:
- commit/push 到
develop
分支 - 在构建
develop
分支期间创建的标签 - commit/push 在
feature
分支 - Jenkins 在开发
branch
上看到新标签并开始构建
所以我正在寻找一种方法来强制 Jenkins 只考虑 commits/pushes 到特定分支以触发特定构建。或者强制 Jenkins 在考虑开始构建时忽略作为标记一部分的更改。
注意,我发现了另一个 SO post:Jenkins git commit for specific branch triggers build jobs for other branches too
虽然文档中似乎没有,但再次寻找答案时我遇到了这张 Jenkins 票证:JENKINS-29574 - notifyCommit branch parameter is ignored。看来您可以向 URL 添加一个额外的参数:&branches=<branch-name>
作为 Git post-receive
钩子脚本的一部分,我可以找到分支名称并将其用作 POST:
https://jenkins-server/git/notifyCommit?url=https://git-server/repo.git&branches=develop
这现在只会启动使用该特定分支的构建。