BitBucket には と の 2 つのブランチがあります。master
またdevelop
、そのリポジトリを構築するために、Jenkins サーバーに BitBucket チーム フォルダー ジョブを設定しました。develop
ブランチには、次の Jenkinsfile があります。
node {
stage('Checkout') {
checkout scm
}
stage('Try different branch') {
sh "git branch -r"
sh "git checkout master"
}
}
Jenkins がこれを実行すると、チェックアウトを試みるとビルドが失敗します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/master
origin/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 エージェントが強制終了されるようです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
最終的には、何かを にコミットしてから にマージする予定ですmaster
が、これまでのところあまりうまくいっていません。 誰か解決策や回避策を知っていますか?
PS: これは Jenkinsfile の問題にのみ当てはまるようです。私が望んでいることと似たようなことを実行するフリースタイルのジョブがあり、問題なく動作します。
ベストアンサー1
数時間の試行錯誤の末、私は可能な解決策を思いつきました。それは部分的に Matt の回答に基づいていますが、うまく機能させるために変更する必要がありました。
Matt は基本的な部分では正しかった。checkout scm
必要なことを実行できるほど柔軟性がなかったため、カスタマイズする必要があったGitSCM
。主な注目点は以下のとおりです。
- 拡張機能を追加して、
LocalBranch
デタッチされたブランチではなく、実際のブランチにチェックアウトしていることを確認しましたHEAD
。 - ワークスペース内のすべてを削除し、完全なクローンを強制する拡張機能を追加しました
WipeWorkspace
。これは私の質問に対する解決策の一部ではないと思いますが、それでも便利でした。 credentialsId
リポジトリはプライベートなので、プロパティを使用して SSH 資格情報を指定しました。
何らかの理由で、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: '[email protected]:NAVFREG/jenkinsfile-tests.git']],
doGenerateSubmoduleConfigurations: false
])
}
stage('Release') {
// Preparing Git
sh "git branch -u origin/develop develop"
sh "git config user.email \"[email protected]\""
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"
}
}
}