簡體   English   中英

Jenkins 管道分支名稱返回 null

[英]Jenkins pipeline branch name returns null

我正在嘗試獲取 jenkins groovy 腳本的分支名稱。 我無法獲取當前的分支名稱。 我嘗試以下操作:

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

這是 output - 它總是返回 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

我錯過了什么嗎?

此變量僅適用於多分支管道:

BRANCH_NAME 對於多分支項目,這將設置為正在構建的分支的名稱,例如,如果您希望從主分支而不是功能分支部署到生產環境。

我在一個正常的管道中測試

在 Jenkins 中有兩個管道選項:

  1. 新項目 -> 管道 -> env.BRANCH_NAME返回分支null
  2. 新項目 -> 多分支管道 -> env.BRANCH_NAME返回分支master or branch name

我的解決方法,不知道是否為別人工作..

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

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

這將使 git repo 進入分離的 HEAD模式,就其本質而言,它沒有分支。

Jenkinsfile

簽出步驟將從源代碼管理中簽出代碼; scm是一個特殊變量,它指示檢出步驟克隆觸發此管道運行的特定修訂。

所以${env.BRANCH_NAME}為空。

如“ Jenkins Workflow Checkout Accessing BRANCH_NAME and GIT_COMMIT ”中所述,您可以使用 groovy 語法(在 Jenkins 管道 DSL 中進行調整)獲取剛剛簽出的 SHA1:

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

在管道作業中,我使用env.GIT_BRANCH解析為origin/{BRANCH}

在多分支作業的情況下, env.GIT_BRANCH解析為{BRANCH} (無origin/ )。

我遇到了同樣的問題,但我通過更改解決了

println "${env.BRANCH_NAME}"

println "${BRANCH_NAME}"

請注意,我的插件也在分離模式下簽出:

git checkout -f e10a170e17fb5f9282f903a7b3cd17bd2e181dee

從一個簡單的管道中,您可以使用以下腳本:

\\...
stage('Test') {
        steps {
            script {
                branchName = sh(label: 'getBranchName', returnStdout: true, script: 'git rev-parse --abbrev-ref HEAD').trim()
                println branchName
            }   
        }
      } 
\\...

這段代碼對我有用。

def BRANCH_NAME = getCurrentBranch()
echo 'Current branch is' + BRANCH_NAME
def getCurrentBranch () {
    return sh (
    script: 'git name-rev --name-only HEAD',
    returnStdout: true
    ).trim()
}

以下對我有用:

env.BRANCH_NAME = scm.branches[0].name

我在Get git branch name in Jenkins Pipeline/Jenkinsfile上找到了這個答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM