基於Gitlab CI的上線時間校驗
前提
目前公司在很多項目在上線時,都明確要求了,週四、週五上線production
環境需要發郵件申請,週六、週日不允許上線,週一至週三每天下午5點到晚上9點不允許上線。
之所以這麼要求,是因為減少在人員不齊情況下上線帶來的風險。
而這種規範,只能由公司各個項目組之間的自覺,但是這種自覺其實是一種不可靠因素。我個人感覺還是需要一套約束,來降低這種不可靠因素。
目標
前提確定好後,那就需要一個目標了。也就說,在某些分支上的某些時間點是不允許讓CI
進行自動構建的。
一開始,我的想法是通過git hook
來實現,但是後來給否決了,原因為:
pre-commit
只是針對當前commit的時間點,並不是push的時間點pre-push
雖說可以做到,但是問題在於,可以通過--no-verify
來跳過鉤子,而且這種跳過是下發到組內每個成員的。- 對
merge
無能為力,網上的方案都是通過prepare-commit-msg
來判斷當前commit是否存在Merge
字元串,不可靠
理想情況下,組員是沒有任何許可權去控制這一塊的,也就是說無法被繞過,git hook
的方式都是在組員本地,也存在了各種被繞過的風險。
那既然無法在本地校驗來達到目標,那就只能把目標放在gitlab-ci
這一塊了。
正文
這裡有個前提,一個小組內,只能有部分人具有CI的控制權。並且一定有code review
。只有具備以上兩點才能進行下一步。
通過在CI Variables
來增加以下兩個變數:
NOT_SUPPORT_HOUR 17,18,19,20,21
NOT_SUPPORT_WEEK 4,5,6,0
這個變數就應對上上面所說的只能有部分人具有CI控制權
然後在.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
其實這個方法也有缺陷,那就是是剛剛所說的兩個前提,以及不應該把這種限制下發到小組
單位,理想的情況下各個小組都是沒有許可權進行控制的,正在的控制權應該上升到更高一層,但是目前還想不到好的方式讓更高一層介入進來。所以目前只能通過這種方式來做到上線控制。
其他
我司(愛樂奇)招人,感興趣的小夥伴可以來投簡歷呀。
彈性工作制、每日水果、同事都特別nice、965、團建、五險一金...
地點上海浦軟大廈
推薦閱讀: