web-dev-qa-db-ja.com

Jenkinsパイプラインブランチ名はnullを返します

私はジェンキンスのグルーヴィーなスクリプトのために私のブランチの名前を取得しようとしています。現在のブランチ名を取得できません。私は次を試します:

stage('Check out code')
checkout scm
echo "My branch is: ${env.BRANCH_NAME}"

出力は次のとおりです。常にnullを返します。

 Checking out Revision 33b531b2f1caaf8b64d968e437306f39d2dba1da   (Origin/pipeline)
  > git.exe config core.sparsecheckout # timeout=10
  > git.exe checkout -f 33b531b2f1caaf8b64d968e437306f39d2dba1da
 [Pipeline] echo
 My branch is: null

何か不足していますか?

14
pogorman

この変数は、マルチブランチピップラインでのみ機能します。

BRANCH_NAMEマルチブランチプロジェクトの場合、たとえば、機能ブランチからではなくマスターから実稼働環境にデプロイする場合など、ビルドされるブランチの名前に設定されます。

私は通常のピップラインでテストしていました

35
pogorman

私の回避策、他の誰かのために働くかどうかわからない..

def branchName = getCurrentBranch()
echo 'My branch is' + branchName

def getCurrentBranch () {
    return sh (
        script: 'git rev-parse --abbrev-ref HEAD',
        returnStdout: true
    ).trim()
}
5
b.ben
git.exe checkout -f 33b531b2f1caaf8b64d968e437306f39d2dba1da

これにより、gitリポジトリは detached HEADモード になります。これは本来、ブランチを持ちません。

Jenkinsfile から:

チェックアウト手順では、ソース管理からコードをチェックアウトします。 scmは、このPipelineの実行をトリガーした特定のリビジョンを複製するようにチェックアウトステップに指示する特別な変数です。

${env.BRANCH_NAME} 無効である。

BRANCH_NAMEおよびGIT_COMMITにアクセスするJenkinsワークフローチェックアウト 」で説明したように、groovy構文でチェックアウトしたSHA1を取得できます(JenkinsパイプラインDSLに適合させるため)。

sh 'git rev-parse HEAD > commit'
def commit = readFile('commit').trim()
4
VonC

これと同じ問題がありましたが、変更して解決しました

println "${env.BRANCH_NAME}"

println "${BRANCH_NAME}"

私のプラグインも分離モードでチェックアウトしていることに注意してください:

git checkout -f e10a170e17fb5f9282f903a7b3cd17bd2e181dee
0
sdc