我正在使用带有插件的 JenkinsGitHub 拉取请求生成器。然后我从 GitHub 设置了 webhook,以便在打开或提交新的 Pull 请求时触发 jenkins 中的构建。
我使用 Jenkins DSL 配置了 GHPRB 插件:
job("name") {
properties {
githubProjectUrl("https://github.com/org/${repo}")
}
scm {
git {
remote {
name("origin")
url("[email protected]:org/${repo}.git")
credentials("jenkins-ssh-keyid")
}
branch("**")
extensions {
gitTagMessageExtension()
}
}
}
triggers {
githubPullRequest{
admins(["github-username"])
orgWhitelist('org-name')
cron("")
triggerPhrase("build")
extensions {
commitStatus {
context("unittest")
}
}
useGitHubHooks()
}
}
steps {
shell("./run-unittests");
}
}
我遇到的问题是,有时詹金斯会感到困惑并选择错误的提交进行构建。
当发生这种情况时,詹金斯输出如下所示:
GitHub pull request #9 of commit 126434b, no merge conflicts.
Setting status of 126434b to PENDING with url http://jenkins/job/unittest/26/ and message: 'Build started sha1 is merged.'
Using context: unittest
> git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
> git config remote.origin.url [email protected]:org/repo.git # timeout=10
Fetching upstream changes from [email protected]:org/repo.git
> git --version # timeout=10
using GIT_SSH to set credentials
> git -c core.askpass=true fetch --tags --progress [email protected]:org/repo.git +refs/heads/*:refs/remotes/origin/*
Seen branch in repository origin/feature-branch-0
Seen branch in repository origin/feature-branch-1
Seen branch in repository origin/feature-branch-2
Seen 3 remote branches
Checking out Revision 1995d66 (origin/master)
这里,Jenkins 从使用功能分支的尖端 ( 126434b
) 转变为使用 master 分支的尖端 ( 1995d66
)。
> git config core.sparsecheckout # timeout=10
> git checkout -f 1995d66
> git rev-list ba7ec55 # timeout=10
> git describe --tags 126434b # timeout=10
Tag information could not be determined for this revision; no git tag info will be exported
请注意,当Git 标签消息插件运行git describe
检查标签信息,它使用功能分支的提交 ID。
然后,詹金斯继续工作,处理主分支提示 ( 1995d66
),而不是预期的功能分支提示 ( 126434b
)。
答案1
问题在于branch
规范和refspec
。将scm.git
作业部分更改为以下内容解决了 Jenkins 签出错误提交的问题:
scm {
git {
remote {
name("origin")
url("[email protected]:org/${repo}.git")
credentials("jenkins-ssh-keyid")
refspec('+refs/pull/*:refs/remotes/origin/pr/*')
}
branch('${ghprbActualCommit}')
}
}
}
答案2
以防其他人因为与我们相同的原因遇到这个问题!
如果您的缓存已损坏,则可能会发生这种情况。检查 Jenkins 下的“缓存”文件夹,并删除其中的所有 git 文件夹。(当然,先关闭 Jenkins)。