Jenkinsfile で別のブランチをチェックアウトすることは不可能ですか? 質問する

Jenkinsfile で別のブランチをチェックアウトすることは不可能ですか? 質問する

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/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 エージェントが強制終了されるようです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"
        }
    }
}

おすすめ記事