場景一: Job構建步驟間的變量傳遞
譬如『Execute shell』1 中的自定義變量傳給『Execute shell』2
解決方法:讀寫文件 或 export導出變量
場景二: Job之間的變量傳遞
現在有兩個Project『run_compile』和『run_deploy』,代碼編譯成功後開始執行環境部署。不需要傳遞參數的情況下可以選擇“Build other projects“的方式。
需要傳遞參數則需要選擇"Trigger parameterized build on other projects"的方式。
Jenkins Parameterized Trigger plugin可以實現Job間參數傳遞但是有侷限性,我們只能選擇傳遞當前build的參數或者環境變量。 (例:$GIT_COMMIT是git plugin提供的一個變量,存着當前build觸發時最新的git code.) 如果要傳遞一個自定義的變量怎麼辦呢? 構建步驟中的自定義變量在執行結束後都會被回收,我們不可能在"predefined parameters"中取到。
依舊以編譯任務爲例,前端代碼的提交不需要觸發編譯,沒有編譯也就不需要執行接下來的『run_ut』單元測試。(泛指後臺代碼的UT, JS UT這種稀有存在暫不考慮)
如何將編譯的狀態告訴下游的單元測試呢?
聰明的你想起了場景一的解決辦法。對,我們也可以通過讀寫文件的方式來解決這個問題嘛!
不過這裏我不推薦大家採用這種方式,理由有兩點:
一,『run_compile』和『run_ut』有可能被部署在不同slave上,如果考慮更加智能的CI配置方式會在構建時動態的選擇空閒的slave去執行,這種文件讀寫的方式就有了很大的侷限性;
二,很難確保文件傳遞的準確性,如果『run_compile』寫入文件失敗,『run_ut』中讀到的就是一箇舊值一個不準確的值。
解決方案一:通過properties file的方式傳遞參數。
首先將變量以"xx=xx"的樣式寫入到配置文件『propfile.txt』中。
然後在"Trigger parameterized build on other projects"中選擇"Parameters from preperties file",在propfile裏寫入多個變量就可以傳遞多個值。
建議勾選"Don't trigger if any files are missing"和刪除舊文件配合使用。
最後在『run_ut』中可以直接獲取這個變量來使用了。
解決方案二: 通過EnvInject Plugin插件
EnvInject Plugin可以支持修改、注入和刪除環境變量。
我們在構建中增加步驟"Inject environment variables", 將寫在配置文件中的變量${IFUT},注入到環境變量裏。
這樣在"Trigger parameterized build on other projects"就可以直接選擇"predefined parameters"方式直接傳遞變量了。同樣的在Job『run_deploy』裏就可以直接訪問變量${IFUT}了。