基於Gitlab CI的上線時間校驗

前提

目前公司在不少項目在上線時,都明確要求了,周4、週五上線production環境須要發郵件申請,周6、週日不容許上線,週一至週三天天下午5點到晚上9點不容許上線。git

之因此這麼要求,是由於減小在人員不齊狀況下上線帶來的風險。github

而這種規範,只能由公司各個項目組之間的自覺,可是這種自覺實際上是一種不可靠因素。我我的感受仍是須要一套約束,來下降這種不可靠因素。gitlab

目標

前提肯定好後,那就須要一個目標了。也就說,在某些分支上的某些時間點是不容許讓CI進行自動構建的。spa

一開始,個人想法是經過git hook來實現,可是後來給否決了,緣由爲:code

  • pre-commit 只是針對當前commit的時間點,並非push的時間點
  • pre-push 雖然說能夠作到,可是問題在於,能夠經過--no-verify來跳過鉤子,並且這種跳過是下發到組內每一個成員的。
  • merge無能爲力,網上的方案都是經過prepare-commit-msg來判斷當前commit是否存在Merge字符串,不可靠

理想狀況下,組員是沒有任何權限去控制這一塊的,也就是說沒法被繞過,git hook的方式都是在組員本地,也存在了各類被繞過的風險。ip

那既然沒法在本地校驗來達到目標,那就只能把目標放在gitlab-ci這一塊了。ci

正文

這裏有個前提,一個小組內,只能有部分人具備CI的控制權。而且必定有code review。只有具有以上兩點才能進行下一步。字符串

經過在CI Variables來增長如下兩個變量:get

NOT_SUPPORT_HOUR 17,18,19,20,21
NOT_SUPPORT_WEEK 4,5,6,0
複製代碼

這個變量就應對上上面所說的只能有部分人具備CI控制權string

而後在.gitlab-ci.yml裏增長一個check_deploy stages,以及增長相關的pip

stages:
 - check_deploy
check_time:
 image: busybox
 stage: check_deploy
 script:
 - export TZ=UTC-8
 - export CURRENT_WEEK=$(date '+%w')
 - export CURRENT_HOUR=$(date '+%H')
 - if [ $(echo $NOT_SUPPORT_HOUR | grep "${CURRENT_HOUR}") ]; then exit 126; fi; - if [ $(echo $NOT_SUPPORT_WEEK | grep "${CURRENT_WEEK}") ]; then exit 126; fi;  only:
 - master
複製代碼

經過啓動一個busybox容器,來對當前時間以及不容許時間段進行一個比較,噹噹前時間點在不容許時間端內,則拋出錯誤碼126。且只對上線分支有效(這裏爲master分支)

這個也對應上了,以前所說的必定有code review

其實這個方法也有缺陷,那就是是剛剛所說的兩個前提,以及不該該把這種限制下發到小組單位,理想的狀況下各個小組都是沒有權限進行控制的,正在的控制權應該上升到更高一層,可是目前還想不到好的方式讓更高一層介入進來。因此目前只能經過這種方式來作到上線控制。

做者信息:

  • Author: Black-Hole
  • Blog: bugs.cc/
  • github: github.com/BlackHole1/
  • Twitter: twitter.com/Free_BlackH…
  • Email: 158blackhole@gmail.com

其餘

我司(愛樂奇)招人,感興趣的小夥伴能夠來投簡歷呀。

彈性工做制、每日水果、同事都特別nice、96五、團建、五險一金...

地點上海浦軟大廈

相關文章
相關標籤/搜索