2017-02-22 140 views
12

我創建了一個jenkins管道,它從scm中拉取管道腳本。
我將分支說明符設置爲'all',因此它基於對任何分支的任何更改。在Jenkins Jenkinsfile中獲取git分支名稱

如何從Jenkinsfile訪問導致此構建的分支名稱?

一切我都試過了回聲除了空

sh(returnStdout: true, script: 'git rev-parse --abbrev-ref HEAD').trim() 

這始終是master

回答

3

如果您的管道有jenkins文件,請檢查您是否在執行時在您的environment variables中看到了您的分支名稱。

你可以打印出來:

pipeline { 
    agent any 

    environment { 
     DISABLE_AUTH = 'true' 
     DB_ENGINE = 'sqlite' 
    } 

    stages { 
     stage('Build') { 
      steps { 
       sh 'printenv' 
      } 
     } 
    } 
} 

然而,PR 91表明分支名稱在某些管道配置僅僅定義:

+0

謝謝,這很有幫助。看起來它不在我的環境變量中。是否有可能暴露導致構建的分支? –

2

切換到多分支管道允許我訪問分支名稱。不建議使用常規管道。

+0

是的,閱讀https://github.com/jenkinsci/pipeline-model-definition-plugin/pull/91,你應該在'BRANCH_NAME'中看到它。 – VonC

4

一位同事告訴我使用scm.branches[0].name,它工作。我把它包在我Jenkinsfile功能:

def getGitBranchName() { 
    return scm.branches[0].name 
} 
+0

嘗試,並得到了.. ... org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: 腳本不得使用方法 BRANCH_NAME不工作,env.BRANCH_NAME返回null ... – James

+1

如果您將共享庫設置爲全局您不會遇到安全問題。另一種方法是在'Manage Jenkins> In Process Script Approval'中允許這些安全例外 – Chen

+0

您也可以將該方法的白名單 –

3

利用多分支管道..不是管道

在我的腳本..

stage('Build') { 
    node { 
     echo 'Pulling...' + env.BRANCH_NAME 
     checkout scm 

    } 
} 

產量...

Pulling...master 
+1

這實際上只是作業的名稱,而不是git分支的名稱。只要你的工作和你的分支有相同的名字,這就行得通了。 – Ctwx

+0

而且所有這些變量都在Git插件頁面的環境變量下定義:https://plugins.jenkins.io/git – arjabbar