将 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 分支的构建开始了。我猜以下是问题的原因:

  1. commit/push 到 develop 分支
  2. 在构建 develop 分支期间创建的标签
  3. commit/push 在 feature 分支
  4. 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

这现在只会启动使用该特定分支的构建。