私は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 私はマルチブランチパイプラインを使用しておらず、要件はマルチブランチを使用しないことでした。
この状況で私が見つけた解決策は次のとおりです。
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'
を使用して、使用可能なすべての環境変数を出力できます
torek で述べたように、コミット(ブランチに対して)をチェックアウトした場合、「 detached HEAD 状態(HEAD detached at 123abc)
。
--abbrev-ref
はオブジェクト名の明確な短い名前を返します。現在のオブジェクトはブランチではなく、チェックアウトしたコミットです。さらに、あなたがチェックアウトしたコミットcouldは複数のブランチに簡単に存在するため、gitはとにかく必要なブランチを判別できません。
私は Vijay Ramaswamy の suggestion を使用しますが、スクリプトでブランチ名をハードコーディングすることもできます。
env.GIT_BRANCH_NAME='my-branch-name'
より簡単に
git branch: 'my-branch-name', credentialsId: '******', url: 'https://*****/*****/*****.git'