10分鐘搞定讓你困惑的 Jenkins 環境變量

2021-01-18 tanrgyb

前言

Jenkins, DevOps 技術棧的核心之一,CI/CD 離不開編寫 Pipeline 腳本,上手 Jenkins ,簡單查一下文檔,你就應該不會被 agent,stages,step 這類關鍵詞弄懵,也能很快構建出 pipeline 的骨架

但是當向骨架中填充內容的時候,尤其如何利用環境變量(系統內置 | 自定義),多數人都會變得比較混亂,浪費很多時間,本文就幫助大家快速通關環境變量

準備

如果你想一邊閱讀本文,一邊實踐,但是沒有 Jenkins 服務可用,又想快速嘗試,可以應用 Docker 一個命令快速搭建 Jenkins 服務

docker container run --rm -p 8080:8080 -p 50000:50000 --name=jenkins -v $(pwd):/var/jenkins_home jenkins/jenkins

2021 年了,本地沒有 Docker 說不過去了,過來瞧瞧 Docker 系列是否入得了你的法眼?

打開瀏覽器輸入:localhost:8080

找到終端的臨時密碼登陸安裝推薦的依賴創建新的 Pipeline 類型的 Item 點擊左側 Config,然後在頁面底部 Pipeline 部分輸入我們接下來寫的腳本進行測試就好了

就是這麼簡單.....

認識 Jenkins 環境變量

Jenkins 環境變量就是通過 env 關鍵字暴露出來的全局變量,可以在 Jenkins 文件的任何位置使用

其實和你使用的程式語言中的全局變量沒有實質差別

查看 Jenkins 系統內置環境變量

Jenkins 在系統內置了很多環境變量方便我們快速使用,查看起來有兩種方式:

方式一:

直接在瀏覽器中訪問 ${YOUR_JENKINS_HOST}/env-vars.html 頁面就可以,比如 http://localhost:8080/env-vars.html ,每個變量的用途寫的都很清楚

方式二

通過執行 printenv shell 命令來獲取:

pipeline { agent any stages { stage("Env Variables") { steps { sh "printenv" } } }}直接 Save - Build, 在終端 log 中你會看到相應的環境變量,並且可以快速看到他們當前的值

通常這兩種方式可以結合使用

讀取環境變量

上面我們說了 env 是環境變量的關鍵字,但是讀取 Jenkins 內置的這些環境變量,env 關鍵字是可有可無, 但不能沒了底褲,都要使用 ${xxx} 包圍起來。以 BUILD_NUMBER 這個內置環境變量舉例來說明就是這樣滴:

如果你在 Jenkins 文件中使用 shell 命令,使用這些內置環境變量甚至可以不用 {}, 來看一下:

pipeline { agent any stages { stage("Read Env Variables") { steps { echo "帶 env 的讀取方式:${env.BUILD_NUMBER}" echo "不帶 env 的讀取方式:${BUILD_NUMBER}" sh 'echo "shell 中讀取方式 $BUILD_NUMBER"' } } }}可以看到結果是一樣一樣滴,不管有幾種,記住第一種最穩妥

內置的環境變量雖好,但也不能完全滿足我們自定義的 pipeline 的執行邏輯,所以我們也得知道如何定義以及使用自定義環境變量

自定義 Jenkins 環境變量

Jenkins pipeline 分聲明式(Declarative)和 腳本式(imperative)寫法,相應的環境變量定義方式也略有不同,歸納起來有三種方式:

還是看個實際例子吧:

pipeline { agent any environment { FOO = "bar" } stages { stage("Custom Env Variables") { environment { NAME = "RGYB" } steps { echo "FOO = ${env.FOO}" echo "NAME = ${env.NAME}" script { env.SCRIPT_VARIABLE = "Thumb Up" } echo "SCRIPT_VARIABLE = ${env.SCRIPT_VARIABLE}" withEnv(["WITH_ENV_VAR=Come On"]) { echo "WITH_ENV_VAR = ${env.WITH_ENV_VAR}" } } } }}來看運行結果:

注意:withEnv(["WITH_ENV_VAR=Come On"]) {}這裡的 = 號兩側不能有空格,必須是 key=value 的形式

一個完整的 pipeline 通常會有很多個 stage,環境變量在不同的 stage 有不同的值是很常見的,知道如何設置以及讀取環境變量後,我們還得知道如何重寫環境變量

重寫 Jenkins 環境變量

Jenkins 讓人相對困惑最多的地方就是重寫環境變量,但是只要記住下面這三條規則,就可以搞定一切了

withEnv(["WITH_ENV_VAR=Come On"]) {} 內置函數的這種寫法,可以重寫任意環境變量定義在 environment {} 的環境變量不能被腳本式定義的環境變量(env.key="value")重寫腳本式環境變量只能重寫腳本式環境變量這三點是硬規則,沒涵蓋在這 3 點規則之內的也就是被允許的了

三條規則就有點讓人頭大了,農夫選豆種,舉例為證吧

pipeline { agent any environment { FOO = "你當像鳥飛往你的山" NAME = "Tan" } stages { stage("Env Variables") { environment { // 會重寫第 6 行 變量 NAME = "RGYB" // 會重寫系統內置的環境變量 BUILD_NUMBER BUILD_NUMBER = "10" } steps { // 應該列印出 "FOO = 你當像鳥飛往你的山" echo "FOO = ${env.FOO}" // 應該列印出 "NAME = RGYB" echo "NAME = ${env.NAME}" // 應該列印出 "BUILD_NUMBER = 10" echo "BUILD_NUMBER = ${env.BUILD_NUMBER}" script { // 腳本式創建一個環境變量 env.SCRIPT_VARIABLE = "1" } } } stage("Override Variables") { steps { script { // 這裡的 FOO 不會被重寫,違背 Rule No.2 env.FOO = "Tara" // SCRIPT_VARIABLE 變量會被重寫,符合 Rule No.3 env.SCRIPT_VARIABLE = "2" } // FOO 在第 37 行重寫失敗,還會列印出 "FOO = 你當像鳥飛往你的山" echo "FOO = ${env.FOO}" // 會列印出 "SCRIPT_VARIABLE = 2" echo "SCRIPT_VARIABLE = ${env.SCRIPT_VARIABLE}" // FOO 會被重寫,符合 Rule No.1 withEnv(["FOO=Educated"]) { // 應該列印 "FOO = Educated" echo "FOO = ${env.FOO}" } // 道理同上 withEnv(["BUILD_NUMBER=15"]) { // 應該列印出 "BUILD_NUMBER = 15" echo "BUILD_NUMBER = ${env.BUILD_NUMBER}" } } } }}來驗證一下結果吧

看到這,基本的設置應該就沒有什麼問題了,相信你也發現了,Jenkins 設置環境變量和程式語言的那種設置環境變量還是略有不同的,後者可以將變量賦值為對象,但 Jenkins 就不行,因為在 Jenkins 文件中,所有設置的值都會被當成 String, 難道沒辦法應用 Boolean 值嗎?

Jenkins 中使用 Boolean 值

如果設置一個變量為 false ,Jenkins 就會將其轉換為 "false", 如果想使用 Boolean 來做條件判斷,必須要調用 toBoolean() 方法做轉換

pipeline { agent any environment { IS_BOOLEAN = false } stages { stage("Env Variables") { steps { script { // Hello 會被列印出來,因為非空字符串都會被認為是 Boolean.True if (env.IS_BOOLEAN) { echo "Hello" } // 真正的 Boolean 比較 if (env.IS_BOOLEAN.toBoolean() == false) { echo "日拱一兵" } // 真正的 Boolean if (!env.IS_BOOLEAN.toBoolean()) { echo "RGYB" } } } } }}來看運行結果:

如果你寫過 Pipeline,你一定會知道,寫 Pipeline 是離不開寫 shell 的,有些時候,需要將 shell 的執行結果賦值給環境變量,Jenkins 也有方法支持

Shell 結果賦值給環境變量

實現這種方式很簡單,只需要記住一個格式:sh(script: 'cmd', returnStdout:true)

pipeline { agent any environment { // 使用 trim() 去掉結果中的空格 LS_RESULT = "${sh(script:'ls -lah', returnStdout: true).trim()}" } stages { stage("Env Variables") { steps { echo "LS_RESULT = ${env.LS_RESULT}" } } }}

總結

關於 Jenkins環境變量,了解這些基本上就滿足絕大多數應用場景了,當再遇到環境變量問題時,可以回過來翻看一下了,有解決的困惑嗎?

原創 | 日拱一兵

相關焦點

  • 手把手教你用 Jenkins+K8S 打造流水線環境
    當你第一次訪問一個新的 Jenkins 實例時, 要求你使用自動生成的密碼對其進行解鎖。若是你無法看見該內容,點擊左上方的新建 item。 pod 的生命周期,就是我們開始構建這個任務,選擇了使用 jenkins slave,所以在執行過程中jenkins-slave就會自動創建,任務執行完成,jenkins-slave 對應的pod會自動回收: 在構建日誌裡我們也可以看到 jenkins 啟動了 jenkins-slave-dj3vc pod 進行這個任務的執行,也和上面的 pod 名稱對應起來了
  • 如何在 Kubernetes 上配置 Jenkins?
    按照以下步驟為Jenkins設置好部署環境:1. 運行以下命令,創建一個名為jenkins-namespace.yaml的文件:apiVersion: v1kind: Namespacemetadata: name: jenkins2.
  • 使用Jenkins、Docker 構建部署 Serverless 應用
    Jenkins 有多種運行方式: jenkins.war + Tomcat java -jar jenkins.war 各種 linux 作業系統分發包(例如:rpm 包) Docker
  • SpringBoot+GitLab+Docker+Jenkins實現持續集成下
    創建Docker容器docker create --name jenkins -u root -p 8889:8080 --privileged=true -v jenkins-data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v /home/jenkins:/home docker.io
  • 如何在Kubernetes容器環境下部署Spinnaker?
    spinnaker主要用於展示與管理你的雲端資源。涉及Applications, clusters, and server groups等,並 通過Load balancers and firewalls 將服務展示給用戶。官方結構如下:
  • 大話西遊手遊10分鐘搞定智鬥老龜的隱藏功績
    導 讀 大話西遊手遊10分鐘搞定智鬥老龜的隱藏功績。
  • 5分鐘教你搞定澳大利亞籤證
    一想到出行前還要搞定手續繁瑣的籤證手續,是不是就開始頭大了?為了解決各位的煩惱,我在這裡整理了一份超簡潔的澳大利亞籤證攻略,5分鐘就能搞定哦,快來一起看看吧!從2016年12月12日起,中國公民還可以申請長達10年的「常旅客」訪客籤證。最後支付了相關籤證費用,就可坐等官方的郵件通知啦!澳大利亞籤證準備就緒,你的澳洲之行即將啟程!
  • 環境變量到底是個什麼鬼?
    環境變量到底是個什麼鬼你是否會遇到這種情況,在黑窗口輸入javac xxx.java回車之後的結果是javac不是內部命令也不是外部命令,不僅如此,其它程式語言配置開發環境的時候也會遇到此類問題,說到底是「環境變量」配置出現了問題。
  • 10分鐘搞定! 保險盒取電接行車記錄儀
    對於車輛比較了解的朋友們,相信用不了10分鐘就能搞定。而對於新手朋友,稍微研究一下想必也能上手操作。相關內容回顧:愛卡手工課(9)徒手搞定行車記錄儀布線
  • 早起10分鐘,搞定一道簡單的快手早餐,營養美味,全家都愛吃
    早起10分鐘,搞定一道簡單的快手早餐,營養美味,全家都愛吃 今天早上一起床,就發現外面下雪了,洋洋灑灑的,冬天的第一場雪,開啟了寒冷的季節,我們這個小城市雖然是北方的城市,但是即使是冬天的時候也還算可以,幾乎落雪就融化,一個冬天下來也只有幾場雪是能夠達到堆積的地步。
  • 製作早餐營養又快速,而且超級簡單,10分鐘就搞定!
    製作早餐營養又快速,而且超級簡單,10分鐘就搞定!④ 翻面之後等半分鐘左右就可以了,煎餅煎的時間非常快,簡單好上手。⑤ 也可以在裡面抹上一層的醬,放上一些自己喜歡的配菜,捲起來就可以吃了,跟煎餅果子很像哦!
  • 淺談動態類型領域中 Python 的變量、對象以及引用
    Python,導致他有時候會覺得很困惑,這個直接表現在他對於很多概念的理解很混亂。因為我之前也是做 C 和 C++ 出身,初次接觸 Python 的時候也會有這種不適感,所以我計劃接下來更新一些文章,寫一些像上面這樣大家在轉變上可能會困惑的地方,希望能給你帶來一些幫助。01.變量、對象和引用像在上面說的,在 Python 中使用變量的時候不需要提前聲明變量及其類型,變量還是會正常工作。
  • 宅在家也可以剪髮,教你剪「齊肩短髮」的教程,一分鐘輕鬆搞定!
    教你自己在家剪「齊肩短髮」的教程,一分鐘輕鬆搞定!好了,回到正題,教你剪「齊肩短髮」的教程,一分鐘輕鬆搞定!齊肩短髮是很多小姐姐們都超級愛的短髮款式,它百搭也不挑人剪,自己宅在家選這種長度的短髮來剪,是再適合不過了,搭配自然的黑髮色,造型是美美噠!
  • 晚餐,別錯過這道開胃菜,酸辣爽口,還特解膩,10分鐘就搞定
    晚餐,別錯過這道開胃菜,酸辣爽口,還特解膩,10分鐘就搞定。3、接著,在鍋中加入適量清水,將鍋中的水煮至沸騰後,放入切好的菠菜,焯水1分鐘左右後撈出,再過一遍冷水。4、然後,在盤中依次放入:辣椒粉、白芝麻、蒜末和已經切好的小米辣和線椒圈。5、緊接著,我們來製作調味料:在小碗中放入生抽、蠔油、黃豆醬、辣醬、米醋。
  • 申領、更換駕照10分鐘搞定
    市民初次申領和更換駕照,可一站式搞定,全程最快只需10分鐘。需要提醒的是,工作日時間,醫生會遠程對體檢結果進行審核籤名,現場審核時間約3~10分鐘;非法定工作日時間,醫生審核通過後會簡訊通知,市民可根據通知信息再次前往業務大廳繼續完成業務辦理。完成體檢後,體檢數據將直接錄入車管所的業務系統,市民無需再列印紙質證明遞交到窗口,現場使用「交管12123」手機APP就可申請初次申領駕駛證和期滿換證業務。
  • 1分鐘操作視頻:趨勢性檢驗 P for trend,當Y為連續變量時
    結局指標Y是連續變量時,如何做趨勢性檢驗?1分鐘操作視頻2010年發表在JAMA 的研究體力活動和增重的文章。核心結果給出了趨勢性檢驗 P  for trend:結果解讀X用每周代謝當量(metabolic equivalent , MET)時間評價體力活動水平(physical activity levels)。
  • 新疆軍區某裝甲團:炮膛密封,15分鐘輕鬆搞定
    他們戴著白手套,小心翼翼地將一節連著一節的「氣象密封棒」送進清潔乾淨的炮膛裡,最後用一個塑料密封蓋塗上炮脂塞住炮口,整個過程不到15分鐘。「火炮如果密封不嚴,春季啟封時,就很容易生鏽。所以每次冬季裝備換季保養,火炮密封都是重頭戲。」連長周亮虎對筆者說:「以前,十幾個人喊著號子一起捅炮,加上塗油、密封等工序,密封一門炮少說也得兩個小時。
  • 分分鐘搞定常用實驗單位換算
    ,稀釋倍數n 和稀釋液的體積Vaddingn =Cfinal /CstockVadding = Vstock(需要添加的儲備液體積)乘以(n-1)  例如,我們需要將100uL   50uM的引物稀釋為 10uM
  • 如何運用計算機中的環境變量快速打開文件或程序
    這就運用到了電腦中的環境變量。1、什麼是PATH環境變量當要求系統運行一個程序或文件而沒有告訴該文件或程序所在的完整路徑時-系統首先在當前目錄下面尋找該文件或程序-若是沒有找到,就會到系統指定的PATH路徑中尋找;若是找到了,直接運行該程序或文件-若是最終在PATH環境中也沒有找到,直接提示不是內部或外部命令,也不是可運行的程序2、PATH環境變量添加的兩種方式
  • 教你10分鐘更好汽車保險絲
    如果確定是保險絲的問題,只需用看了下面的教程,相信你10分鐘就能搞定。保險絲在哪  汽車用電設備越多,需要的保險絲也就越多,現在中高級車輛在發動機艙、車身內部設置多處集成電源模塊,俗稱保險盒。有些汽車在很隱蔽的位置設置保險盒,即使對汽車非常熟悉的人很難找到。