gpt4 book ai didi

git - 是否无法在 Jenkinsfile 中 checkout 不同的分支?

转载 作者:IT王子 更新时间:2023-10-29 00:58:28 24 4
gpt4 key购买 nike

我在 BitBucket 上有两个分支:masterdevelop。我还在我的 Jenkins 服务器上配置了一个 BitBucket Team Folder 作业来构建该存储库。在 develop 分支上有以下 Jenkinsfile:

node {
stage('Checkout') {
checkout scm
}

stage('Try different branch') {
sh "git branch -r"
sh "git checkout master"
}
}

当 Jenkins 运行它时,构建在尝试 check out master 时失败:

[Pipeline] stage
[Pipeline] { (Try different branch)
[Pipeline] sh
[e_jenkinsfile-tests_develop-4R65E2H6B73J3LB52BLACQOZLBJGN2QG22IPONX3CV46B764LAXA] Running shell script
+ git branch -r
origin/develop
[Pipeline] sh
[e_jenkinsfile-tests_develop-4R65E2H6B73J3LB52BLACQOZLBJGN2QG22IPONX3CV46B764LAXA] Running shell script
+ git checkout master
error: pathspec 'master' did not match any file(s) known to git.
[Pipeline] }

我原以为 git branch -r 命令会打印出 origin/masterorigin/develop,但由于某些原因它只打印后者。

我已经阅读并尝试想出任何方法来做到这一点:例如,我尝试为 Jenkins 安装 SSH 代理插件并将 Jenkinsfile 更改为:

node {
stage('Checkout') {
checkout scm
}

stage('Try different branch') {
sshagent(['Bitbucket']) {
sh "git branch -r"
sh "git checkout master"
}
}
}

但它仍然没有找到origin/master。更糟糕的是,SSH 代理似乎在尝试 check out master 之前就被杀死了:

[Pipeline] { (Try different branch)
[Pipeline] sshagent
[ssh-agent] Using credentials ThomasKasene (Used to communicate with Bitbucket)
[ssh-agent] Looking for ssh-agent implementation...
[ssh-agent] Exec ssh-agent (binary ssh-agent on a remote machine)
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-M6pIguCUpAV4/agent.11899
SSH_AGENT_PID=11902
$ ssh-add /var/jenkins_home/workspace/e_jenkinsfile-tests_develop-4R65E2H6B73J3LB52BLACQOZLBJGN2QG22IPONX3CV46B764LAXA@tmp/private_key_2394129657382526146.key
Identity added: /var/jenkins_home/workspace/e_jenkinsfile-tests_develop-4R65E2H6B73J3LB52BLACQOZLBJGN2QG22IPONX3CV46B764LAXA@tmp/private_key_2394129657382526146.key (/var/jenkins_home/workspace/e_jenkinsfile-tests_develop-4R65E2H6B73J3LB52BLACQOZLBJGN2QG22IPONX3CV46B764LAXA@tmp/private_key_2394129657382526146.key)
[ssh-agent] Started.
[Pipeline] {
[Pipeline] sh
[e_jenkinsfile-tests_develop-4R65E2H6B73J3LB52BLACQOZLBJGN2QG22IPONX3CV46B764LAXA] Running shell script
+ git branch -r
origin/develop
[Pipeline] sh
$ ssh-agent -k
unset SSH_AUTH_SOCK;
unset SSH_AGENT_PID;
echo Agent pid 11902 killed;
[ssh-agent] Stopped.
[e_jenkinsfile-tests_develop-4R65E2H6B73J3LB52BLACQOZLBJGN2QG22IPONX3CV46B764LAXA] Running shell script
+ git checkout master
error: pathspec 'master' did not match any file(s) known to git.
[Pipeline] }

我最终的计划是提交一些东西到 develop,然后将其 merge 到 master,但到目前为止我运气不佳。有人有可能的解决方案或解决方法吗?

PS:这似乎只是 Jenkinsfile 中的一个问题;我有一份自由式工作,它做的事情与我想要的类似,而且工作正常。

最佳答案

经过几个小时的反复试验,我想出了一个可能的解决方案。它部分建立在 Matt 的回答之上,但我必须对其进行修改才能使其发挥作用。

Matt 在 Gist 上是正确的:checkout scm 不够灵活,无法让我做我需要的,所以我不得不使用 GitSCM 来定制它.主要兴趣点是:

  • 添加了扩展 LocalBranch 以确保我 checkout 到一个实际的分支,而不仅仅是一个分离的 HEAD
  • 添加扩展 WipeWorkspace 以删除工作区中的所有内容并强制进行完整克隆。我不认为这是解决我的问题的一部分,但它仍然很方便。
  • 使用 credentialsId 属性指定 SSH 凭据,因为存储库是私有(private)的。

无论出于何种原因,当执行checkout步骤时,它只检查分支,而没有将其设置为跟踪远程分支。在找到更优雅的解决方案之前,我不得不手动执行此操作。

完成所有这些后,我可以使用常规 sh "git checkout master" 甚至 sh "git push",只要我将它们包含在 sshagent 步骤。

我在下面添加了生成的 Jenkinsfile 的工作示例,但请记住,它不应该用于接近生产的任何东西,因为它仍处于起步阶段;例如,硬编码版本号并且不检查您所在的分支。

node {
mvnHome = tool 'Maven'
mvn = "${mvnHome}/bin/mvn"

stage('Checkout') {
checkout([
$class: 'GitSCM',
branches: scm.branches,
extensions: scm.extensions + [[$class: 'LocalBranch'], [$class: 'WipeWorkspace']],
userRemoteConfigs: [[credentialsId: 'Bitbucket', url: 'git@bitbucket.org:NAVFREG/jenkinsfile-tests.git']],
doGenerateSubmoduleConfigurations: false
])
}

stage('Release') {
// Preparing Git
sh "git branch -u origin/develop develop"
sh "git config user.email \"jenkins@thomaskasene.com\""
sh "git config user.name \"Jenkins\""

// Making and committing new verison
sh "${mvn} versions:set -DnewVersion=2.0.0 -DgenerateBackupPoms=false"
sh "git commit -am \"Released version 2.0.0\""

// Merging new version into master
sh "git checkout master"
sh "git merge develop"
sh "git checkout develop"

// Making and committing new snapshot version
sh "${mvn} versions:set -DnewVersion=3.0.0-SNAPSHOT -DgenerateBackupPoms=false"
sh "git commit -am \"Made new snapshot version 3.0.0-SNAPSHOT\""

// Pushing everything to remote repository
sshagent(['Bitbucket']) {
sh "git push"
sh "git checkout master"
sh "git push"
}
}
}

关于git - 是否无法在 Jenkinsfile 中 checkout 不同的分支?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45399894/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com