Jenkins:GitSCM以一个独立的头状态完成克隆,我怎样才能确保检出正确的分支名称?

Ita*_*not 13 git jenkins

我写了一个Jenkins管道,它克隆了一个git存储库并运行了一个MSBUILD构建.

我使用GitSCM将存储库克隆到工作区中,如下所示:

stage ('Checkout SCM & Merge master to feature branch') {
    checkout([$class: 'GitSCM', branches: [[name: '*/feature/*']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '99f978af-XXXX-XXXX-8147-2cf8f69ef864', url: 'http://TFS_SERVER:8080/tfs/DefaultCollection/PC_International/_git/REPO_NAME']]])
}
Run Code Online (Sandbox Code Playgroud)

在克隆步骤发生后,HEAD指向一个独立的头部,我不明白为什么.

Started by user itai ganot
[Pipeline] node
Running on master in C:\Program Files (x86)\Jenkins\workspace\bbb
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Setup)
[Pipeline] deleteDir
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Checkout SCM & Merge master to feature branch)
[Pipeline] checkout
Cloning the remote Git repository
Cloning repository http://pctfs1:8080/tfs/DefaultCollection/PC_International/_git/Ensure-pcs-intl
 > git.exe init C:\Program Files (x86)\Jenkins\workspace\bbb # timeout=10
Fetching upstream changes from http://TFS_SERVER:8080/tfs/DefaultCollection/PC_International/_git/Ensure-pcs-intl
 > git.exe --version # timeout=10
using GIT_SSH to set credentials javab SSH file
 > git.exe fetch --tags --progress http://TFS_SERVER:8080/tfs/DefaultCollection/PC_International/_git/REPO_NAME +refs/heads/*:refs/remotes/origin/*
 > git.exe config remote.origin.url http://TFS_SERVER:8080/tfs/DefaultCollection/PC_International/_git/REPO_NAME # timeout=10
 > git.exe config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* # timeout=10
 > git.exe config remote.origin.url http://TFS_SERVER:8080/tfs/DefaultCollection/PC_International/_git/REPO_NAME # timeout=10
Fetching upstream changes from http://TFS_SERVER:8080/tfs/DefaultCollection/PC_International/_git/REPO_NAME
using GIT_SSH to set credentials javab SSH file
 > git.exe fetch --tags --progress http://TFS_SERVER:8080/tfs/DefaultCollection/PC_International/_git/REPO_NAME +refs/heads/*:refs/remotes/origin/*
Seen branch in repository origin/feature/merge_tfs
Seen branch in repository origin/master
Seen branch in repository origin/origin
Seen 3 remote branches
 > git.exe tag -l # timeout=10
Checking out Revision 97b3493db4f726e11e334e5ba34fa808b63edec5 (origin/feature/merge_tfs)
 > git.exe config core.sparsecheckout # timeout=10
 > git.exe checkout -f 97b3493db4f726e11e334e5ba34fa808b63edec5
First time build. Skipping changelog.
[Pipeline] bat
[bbb] Running batch script

C:\Program Files (x86)\Jenkins\workspace\bbb>cd C:\Program Files (x86)\Jenkins\workspace\bbb 

C:\Program Files (x86)\Jenkins\workspace\bbb>git branch 
* (HEAD detached at 97b3493)
Run Code Online (Sandbox Code Playgroud)

更重要的是,众所周知,在运行Jenkins管道时,git参数未正确评估,因此我无法通过简单地运行来修复它:

git checkout ${BRANCH_NAME}
Run Code Online (Sandbox Code Playgroud)

那么如何在启动MSBUILD步骤之前确保HEAD指向分支名称?

我相信有人已经遇到了这种情况并且有一个解决方案.

Ita*_*not 16

经过大量的研究,甚至联系Jenkins的专业人士和我身边的许多尝试,我找到了如何解决这个问题.

以下代码修复了此问题:

checkout([$class: 'GitSCM', branches: [[name: '*/feature/*']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'LocalBranch', localBranch: "**"]], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '99f978af-XXXX-XXXX-8147-2cf8f69ef864', url: 'http://TFS_SERVER:8080/tfs/DefaultCollection/Product/_git/Project']]])
Run Code Online (Sandbox Code Playgroud)

注意localBranch扩展中的"**".

詹金斯日志:

Checking out Revision 97b3493db4f726e11e33XXXba34fa808b63edec5 (origin/feature/merge_tfs)
 > git.exe config core.sparsecheckout # timeout=10
 > git.exe checkout -f 97b3493db4f726e11e33XXXba34fa808b63edec5
 > git.exe branch -a -v --no-abbrev # timeout=10
 > git.exe checkout -b feature/merge_tfs 97b3493db4f726e11e33XXXba34fa808b63edec5
 > git.exe rev-list 97b3493db4f726e11e334e5ba34fa808b63edec5 # timeout=10
[Pipeline] bat
[Ensure] Running batch script

C:\Program Files (x86)\Jenkins\workspace\Ensure>cd C:\Program Files (x86)\Jenkins\workspace\Ensure 

C:\Program Files (x86)\Jenkins\workspace\Ensure>git branch 
* feature/merge_tfs
Run Code Online (Sandbox Code Playgroud)

  • 我的头因为撞到墙上而有点痛。太感谢了! (3认同)
  • 这太疯狂了!在 Jenkins 的初始克隆和“localBranch”中的“**”确实起到了作用之后,我尝试了几个小时来摆脱分离的 HEAD 状态!你有什么解释为什么他们会提供帮助吗? (2认同)

BWD*_*BWD 5

添加[[$class: 'LocalBranch', localBranch: "**"]]修复了我的问题。

在使用GitSCM插件成功签出 master 分支后,.git/refs/heads/master仍然缺少一些操作总是失败(例如git log --decorate ...创建更改日志)。

  • 这应该是评论而不是答案。 (3认同)
  • 你是对的,但我是 stackoverflow 的新手,所以当我点击“添加评论”时,我得到了一个“你必须有 50 个评论的声誉”弹出窗口 (3认同)