Jenkins的job和job中間傳遞參數

有時候需要將上游job的某些值傳遞到下游job中使用,自己使用的幾種方法記錄一下。

場景一、job之間的變量傳遞

當有兩個job,jobA進行代碼編譯,jobB進行環境部署。我們需要先進行jobA執行,執行成功之後再執行jobB 如果兩個job之間不需要有變量的傳遞,那麼可以選擇:Build other projects

但是如果需要傳遞參數選擇Trigger parameterized build on other projects(需要有插件:Parameterized Trigger Plugin)

1.使用插件Parameterized Trigger Plugin

 

 

插件可以實現Job間參數傳遞但是有侷限性,我們只能選擇傳遞當前build的參數或者環境變量。而且這個變量只能是上級job中參數化時傳入的,shell中進行了修改也不會改變。如果要傳遞一個自定義的變量怎麼辦呢? 構建步驟中的自定義變量在執行結束後都會被回收,我們不可能在"predefined parameters"中取到。

 

2.使用保存文件的方式

執行jobA的時候將需要的變量存在一個var.txt中,jobB需要使用時就將到這個目錄下,獲取文件中的內容

或者使用一個從文件中獲取的插件:Extended Choice Parameter

 

使用絕對路徑  文件test.txt內容:sid=fshdfkhsdjkfhsfsdhjkfh

 jobA保存在文件中的sid就能給jobB使用了。

但是保存文件的方式,如果是用不同的slave,在不同服務器上,保存文件的方式就不好處理了。所以有了以下兩種方法:

3.通過properties file的方式傳遞參數(仍然需要插件:Parameterized Trigger Plugin)

現有上游job:[test-file-parameters] 和下游job:[test-job] 

在[test-file-parameters]中有參數:compiled 默認值:123456

刪除原來老的數據 然後可以對變量進行一些操作之後,然後以"xx=xx"的樣式寫入到配置文件『propfile.txt』中。

IFUT=$compiled  IFUT是下游job test-job裏的變量  compiled是上游job test-file-parameter裏的變量

然後在"Trigger parameterized build on other projects"中選擇"Parameters from preperties file",在propfile裏寫入多個變量就可以傳遞多個值。

在[test-job]中有參數 IFUT  這個值要和profile.txt裏的key值一樣 否則無法傳遞

查看一下IFUT最終的值 是不是上游job中shell裏修改成的3333333

構建上游job:[test-file-parameter] 構建成功之後會觸發test-job 傳遞自定義變量成功!

4.通過EnvInject Plugin插件

EnvInject Plugin可以支持修改、注入和刪除環境變量。

同樣添加shell腳本,變量傳遞

我們在構建中增加步驟"Inject environment variables", 將寫在配置文件中的變量${IFUT},注入到環境變量裏。

在"Trigger parameterized build on other projects"就可以直接選擇"predefined parameters"方式直接傳遞變量了。

 

同樣的在Job『test-job』裏就可以直接訪問變量${IFUT}了。

       上面兩種方法,都是通過profile.txt文件的方式,通過這個配置,可以將自定義的變量值不僅能傳遞,而且還能自定義修改值。這樣的話,當上遊需要傳遞一個自定義變量,這個變量又是通過shell腳本中修改過的,就可以使用profile.txt方式。

 

場景二:Job構建步驟間的變量傳遞

有時爲了使Job中的複雜的構建流程更加清晰我們配置多個構建步驟像下面這樣。圖中包含兩個構建步驟,步驟2需要根據步驟1中的返回值來判斷是否執行操作:

執行時jenkins將兩個構建步驟生成兩個shell文件,然後分別調用。
do_build_step_1
[Jenkins] $ /bin/bash -xe /tmp/hudson1270042613896791809.sh
do_build_step_2
[Jenkins] $ /bin/bash -xe /tmp/hudson5918908417824291692.sh
理論上兩個shell之間是無法通信的,step1執行完之後變量$dostep2就會被回收,要注意試圖在step1中通過export或者其他腳本方式注入環境變量都是無效的。

解決方案:讀寫文件
要實現它們之間的變量傳遞只能通過讀寫文件的方式。我們有一個真實應用場景是這樣的,配置由git push觸發編譯任務,但是並不是每一次git的提交都需要觸發編譯,比如說只有前端代碼的提交其實並不影響編譯的結果,我們只好在step1中加入判斷來卻確定step2是否真的有必要被執行。

參考:

https://www.cnblogs.com/junneyang/p/5239480.html

https://www.cnblogs.com/silvi/articles/7404320.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章