Jenkins 踩坑 | job 創建、參數化、定時構建及時區偏差問題解決

本文為霍格沃茲測試學院優秀學員 Jekins 學習踩坑筆記。測試開發技能進階,文末加群。

1、創建 job

1)啟動 Jenkins 後在首頁點擊"開始創建一個新任務"。

Jenkins 踩坑 | job 創建、參數化、定時構建及時區偏差問題解決

2)輸入任務名稱,選擇自由風格,點擊“確定”。

Jenkins 踩坑 | job 創建、參數化、定時構建及時區偏差問題解決

2、構建保持配置

1) 任意輸入描述,然後勾選"丟棄舊的構建", 在"保持構建的最大個數中"輸入 3。

由於 Jenkins 構建產生的日誌等信息會保存在本機磁盤中,這樣無限構建任務的話就會佔用很多磁盤空間,因此可以在這裡對舊的構建進行配置丟棄,可以選擇以天數為條件,也可以選擇保持的個數,這裡就以保持 3 個構建數為例。

Jenkins 踩坑 | job 創建、參數化、定時構建及時區偏差問題解決

3、參數化設置

1)勾選"參數化構建過程",選擇添加"字符參數"

Jenkins 踩坑 | job 創建、參數化、定時構建及時區偏差問題解決

2)設置參數名稱、默認值和描述

Jenkins 踩坑 | job 創建、參數化、定時構建及時區偏差問題解決

4、定時構建

1)在"構建觸發器"中勾選"定時構建",日程表中輸入H2/ * * * *,表示每兩分鐘構建一次。

Jenkins 踩坑 | job 創建、參數化、定時構建及時區偏差問題解決

5、Execute Shell

1)在構建中選擇執行 shell,簡單的執行一條打印語句,打印上面設置好的參數param;設置好之後保存即可。

Jenkins 踩坑 | job 創建、參數化、定時構建及時區偏差問題解決

6、結果展示

  • 可以看到構建結果是每 2 分鐘構建一次,且只保留最近的 3 次構建,參數 param使用了默認值Jenkins。
Jenkins 踩坑 | job 創建、參數化、定時構建及時區偏差問題解決

  • 打開控制檯輸出可以看到執行的日誌信息。
Jenkins 踩坑 | job 創建、參數化、定時構建及時區偏差問題解決

  • 如果想要修改參數值,選擇Build with Parameters,修改參數,點擊開始構建即可。
Jenkins 踩坑 | job 創建、參數化、定時構建及時區偏差問題解決


Jenkins 踩坑 | job 創建、參數化、定時構建及時區偏差問題解決

7、補充說明

7.1 定時構建時間描述

在上述設置定時構建時,輸入了一行命令H2/ * * * *來表示每隔 2 分鐘構建一次,這是一種crontab的寫法,具體描述分五個部分:

<code>分鐘 小時 日期 月份 星期幾
*    *    *    *    *
-    -    -    -    -
|    |    |    |    |
|    |    |    |    +----- 星期中星期幾 (0 - 7) (星期天 為 0 或 7)
|    |    |    +---------- 月份 (1 - 12) 
|    |    +--------------- 一個月中的第幾天 (1 - 31)
|    +-------------------- 小時 (0 - 23)
+------------------------- 分鐘 (0 - 59)/<code>
  • 星號(*):代表所有可能的值,例如 month 字段如果是星號,則表示在滿足其它字段的制約條件後每月都執行該命令操作。
  • 逗號(,):可以用逗號隔開的值指定一個列表範圍,例如,“1,2,5,7,8,9”。
  • 中槓(-):可以用整數之間的中槓表示一個整數範圍,例如 “2-6” 表示 “2,3,4,5,6”。
  • 正斜線(/):可以用正斜線指定時間的間隔頻率,例如 “0-23/2” 表示每兩小時執行一次。同時正斜線可以和星號一起使用,例如 */10,如果用在 minute 字段,表示每十分鐘執行一次。

但是實際在 Jenkins 中進行定時構建時,寫法相似但是還是有區別,還是以上述的H2/ * * * *來表示每隔 2 分鐘為例,當我們用*/2 * * * *寫法時:

Jenkins 踩坑 | job 創建、參數化、定時構建及時區偏差問題解決

可以看到 Jenkins 建議我們使用H來代表通配符,因此在表示每隔多久時建議使用H/的方式。


另外,如果表示每天上午 9 點構建,如果使用0 9 * * *:

Jenkins 踩坑 | job 創建、參數化、定時構建及時區偏差問題解決

可以看到 Jenkins 建議我們使用H 9 * * *的方式:

下面是一些常用定時方式的參考示例:

  1. 每 30 分鐘構建一次:H/30 * * * *。
  2. 每 2 小時構建一次:H H/2 * * *。
  3. 每天早上 9 點構建一次:H 9 * * *。
  4. 每天 8 點、12 點、21 點各構建一次:H 8,12,21 * * *。
  5. 週一至週五,每天 22 點到 23 點之間每隔 3 分鐘構建一次:H/3 22-23 * * 1-5。

7.2 時間不一致

7.2.1 現象原因

運行完畢後,會發現一個問題,構建的時間與我們實際的時間不一致:

  • Jenkins 顯示時間
Jenkins 踩坑 | job 創建、參數化、定時構建及時區偏差問題解決


Jenkins 踩坑 | job 創建、參數化、定時構建及時區偏差問題解決

  • 系統實際時間
Jenkins 踩坑 | job 創建、參數化、定時構建及時區偏差問題解決

因為我們是用 Docker 部署的,所以再通過打印 Docker 容器的時間進行查看:

<code>jenkins@0520b8208ffb:/$ date
Fri Apr 10 01:35:30 UTC 2020
jenkins@0520b8208ffb:/$ exit
exit
xxxdeMacBook-Pro:jenkins_home xxx$ date
2020 年 4 月 10 日 星期五 09 時 35 分 35 秒 CST/<code>

再進入"系統管理"->"系統信息"->"user.timezone"查看:

Jenkins 踩坑 | job 創建、參數化、定時構建及時區偏差問題解決

綜上所述可以確定因為 Jenkins 容器使用的是 UTC 時間,和我們的北京時間差了正好 8 個小時,針對我們是 Docker 部署的,解決方法如下 (其他直接在系統部署的可以另行百度~)。

7.2.2 解決方法

在 Jenkins 容器啟動的時候添加參數

<code>$ docker run ... -e JAVA_OPTS=-Duser.timezone=Asia/Shanghai/<code>

啟動後再次查看"系統管理"->"系統信息"->"user.timezone",發現時區已修改為上海:

Jenkins 踩坑 | job 創建、參數化、定時構建及時區偏差問題解決

查看構建歷史,發現時間已於系統時間保持一致,修改完成:


Jenkins 踩坑 | job 創建、參數化、定時構建及時區偏差問題解決

以上,歡迎大家一起交流探討。

(文章來源於霍格沃茲測試學院)



分享到:


相關文章: