有時候需要將上游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是否真的有必要被執行。
參考: