web-dev-qa-db-ja.com

Jenkinsfile:git rev-parse --abbrev-ref HEAD returns HEAD

私はjenkins/devopsが初めてです。私は この例 に従っています。私がローカルで行う場合(ターミナルから):

git rev-parse --abbrev-ref HEAD

現在のブランチの名前を取得します。ただし、Jenkinsfile内から、ログに次のように表示されます。

HEAD

しばらくオンラインで調べていましたが、今のところ理由がわかりません。この結果の潜在的な原因は何ですか?

追加の詳細

私のjenkinsfileで、現在のgitブランチの名前(Webhookをトリガーした名前)を取得し、それを 'git branch'コマンド内にパイプしようとしているため、コードは次のようになります。

pipeline {
agent {
    label 'ubuntu'
}
stages {
    stage('check') {
    steps {
            script {
               env.GIT_BRANCH_NAME=sh(returnStdout: true, script: "git rev-parse --abbrev-ref HEAD").trim()
            }

            sh 'echo BRANCH_NAME ${GIT_BRANCH_NAME}'
            git branch: GIT_BRANCH_NAME, credentialsId: '******', url: 'https://*****/*****/*****.git'
      }
....
}

ラインで

sh 'echo BRANCH_NAME ${GIT_BRANCH_NAME}'

戻り値 HEAD

私はこれを回避する方法を見つけました git name-rev --name-only HEAD スクリプトコードを次のように変更しました。

script {
    env.GIT_BRANCH_PATH=sh(returnStdout: true, script: "git name-rev --name-only HEAD").trim()
    env.GIT_BRANCH_NAME=GIT_BRANCH_PATH.split('remotes/Origin/')[1]
}

今、私は正しいブランチ名を取得し、手順は機能しますが、どちらかと言うとハックの少ない方法で行いたいと思います。

ベストプラクティスを使用して達成したいことを達成するための最良の方法は何ですか?

PS 私はマルチブランチパイプラインを使用しておらず、要件はマルチブランチを使用しないことでした。

18
chad

私はおそらく応答が遅れていますが、より簡単な方法が潜在的にあります。 Git構成内の追加の動作で「特定のローカルブランチにチェックアウト」を選択していることを確認してください。これにより、gitが追跡している正確なブランチにチェックアウトし、元のコマンド「git rev-parse --abbrev-ref HEAD」が正常に機能するようになります。 enter image description here

15
Vijay Ramaswamy

この状況で私が見つけた解決策は次のとおりです。

checkout([$class: 'GitSCM', branches: [[name: '*/' + branch]], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'LocalBranch', localBranch: "**"]], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'cred', url: '[email protected]:repofolder/repo.git']]])

ここでの鍵は[$class: 'LocalBranch', localBranch: "**"]。リビジョンではなくブランチをチェックアウトできます。

そのソースは here から取得されます。

マルチブランチパイプラインを使用している場合、ブランチ名は環境変数でenv. BRANCH_NAMEとして使用できる必要があります。ステップ内でsh 'printenv'を使用して、使用可能なすべての環境変数を出力できます

1
Kvk

問題:

torek で述べたように、コミット(ブランチに対して)をチェックアウトした場合、「 detached HEAD 状態(HEAD detached at 123abc)

どうして?

--abbrev-ref はオブジェクト名の明確な短い名前を返します。現在のオブジェクトはブランチではなく、チェックアウトしたコミットです。さらに、あなたがチェックアウトしたコミットcouldは複数のブランチに簡単に存在するため、gitはとにかく必要なブランチを判別できません。

解決:

私は Vijay Ramaswamysuggestion を使用しますが、スクリプトでブランチ名をハードコーディングすることもできます。

env.GIT_BRANCH_NAME='my-branch-name'

より簡単に

git branch: 'my-branch-name', credentialsId: '******', url: 'https://*****/*****/*****.git'

0
bkidd