2017-06-29 149 views
2

問題:有沒有什麼辦法可以通過jenkinsfile中的Pipeline獲取分支的名稱?Jenkins - 管道訪問git分支名稱

注意:我不在多分支管道!

在我的流水線IM使用

checkout([$class: 'GitSCM', 
      userRemoteConfigs: [[url:'https://github.com/repo', 
           credentialsId: 'xxxx',name: '1234']]]) 

其中name是提交ID。我需要驗證這個提交ID是否來自用戶指定爲參數的分支(user指定了分支名稱和提交ID,並且我需要在構建項目之前檢查是否沒有錯誤)。

爲什麼分支名稱未在管道中公開,但僅在多分支管道中公開?對我來說沒有意義。

有三個原因,我不想轉換爲多分支管道:

  1. 我用另一個插件Build Blocker Plugin在我的管道,似乎在多分支管道不提供。
  2. 我有一個參數化管道,我沒有在多分支管道中看到這個選項。
  3. 很多時間已經進入這個管道,我只是不想從頭開始重新設置這個項目,只是爲了這個分支名稱功能。

我已經打印出所有環境變量,分支名稱不在其中。

感謝您的幫助!

+0

在哪裏你得到的承諾從?如果它是一個鉤子,你可以不添加分支名稱是一個參數? – JamesD

+0

用戶指定他想要構建的提交。參數{string(defaultValue:'develop',description:'',name:'123456')}。如果參數被傳遞來構建管道並默認開發,這將檢查提交123456。 – tenticon

回答

0

參見Pipeline: Nodes and Processes, sh: Shell Script

returnStdout(可選)

如果從任務檢查,標準輸出被返回作爲步長值作爲String,而不是被打印到構建日誌。 (標準錯誤,如果有的話,仍然會被打印到日誌中。)您通常需要調用.trim()來結果,以去掉尾隨的換行符。

和看到git-branch

--contains [<提交>]
     含有(如果未指定HEAD)指定提交只列出分支。意味着--list

與結合這些:

... 
def branches = sh(returnStdout: true, script: "git branch --contains ${commitId}") 
... 

,並檢查是否branches包含由用戶提供的分支名。

順便說一句,我會重命名變量,因爲:

  • name是你的提交ID,又名(提交)散列,所以我把它叫做commitIdcommitHash
  • 你確實有一些其他的事情使用一個名稱,在分支,這才叫branchName然後使將來的維護靜物容易
+0

有一件事我從來沒有理解Jenkins的'checkout'命令。你可以使用userRemoteConfigs中的'name'作爲值,或者使用作爲值,或者你可以使用關鍵'branches'來指定。你是否建議定義變量'commitId'和'branchName',然後將它們作爲值傳遞給'userRemoteConfig'?我不能把鑰匙的名字改成別的東西。 – tenticon

+0

@tenticon根據「[_'checkout,$ class:GitSCM userRemoteConfigs'](https://jenkins.io/doc/pipeline/steps/workflow-scm-step/#code-checkout-code-general-scm) - 'name' - [是] repository_的ID「,不是散列或分支名稱,」_'branches「 - 嵌套對象 - 」名稱「 - 如果您想跟蹤存儲庫中的特定分支,請指定分支._」。 –

0

參見Git for Computer Scientists

refs:參考文獻,或頭或分支,像便利貼耳光DAG中的[向無環圖]的節點上。在DAG僅被添加到並且現有節點不能被突變的情況下,其後可以自由移動。它們不會被存儲在歷史記錄中,並且它們不會直接在存儲庫之間傳輸。他們充當書籤,「我在這裏工作」。

這樣可以很容易地找到一個分支承諾:從通過圖中的分支裁判走,但它的棘手倒過來,因爲一個承諾可以屬於多個分支(如果該分支之後再次分支)。例如。從Pro Git, 3.1 Git Branching - Branches in a Nutshell

enter image description here

的三個提交到左邊屬於分支mastertesting

+0

這如何幫助我在詹金斯管道中找到分支的名稱?對不起,如果我不明白。 – tenticon

+0

@tenticon同意,這不會幫助你在這種情況下。這是一個回答與您的問題的背景信息「_Why是分支名稱沒有暴露...?_」。對不起,如果這不明顯。 –

2

,如果你使用的是管道的代碼,我ASSU我你正在做的事情,如:

checkout scm

好處是它返回一些有用的東西的地圖,從中可以抓住以下方式簽出的分支:

def scmVars = checkout scm def branchName = scmVars.GIT_BRANCH

+0

你英雄! <3實際上,在使用管道時幾乎所有其他操作都不起作用!拯救了我的一天! – wegginho