目前公司在不少項目在上線時,都明確要求了,周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
其實這個方法也有缺陷,那就是是剛剛所說的兩個前提,以及不該該把這種限制下發到小組
單位,理想的狀況下各個小組都是沒有權限進行控制的,正在的控制權應該上升到更高一層,可是目前還想不到好的方式讓更高一層介入進來。因此目前只能經過這種方式來作到上線控制。
我司(愛樂奇)招人,感興趣的小夥伴能夠來投簡歷呀。
彈性工做制、每日水果、同事都特別nice、96五、團建、五險一金...
地點上海浦軟大廈