社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Git

基于Gitlab CI的上线时间校验

BlackHole1 • 4 年前 • 226 次点击  
阅读 32

基于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

其实这个方法也有缺陷,那就是是刚刚所说的两个前提,以及不应该把这种限制下发到小组单位,理想的情况下各个小组都是没有权限进行控制的,正在的控制权应该上升到更高一层,但是目前还想不到好的方式让更高一层介入进来。所以目前只能通过这种方式来做到上线控制。

作者信息:

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

其他

我司招人,感兴趣的小伙伴可以来投简历呀。

弹性工作制、每日水果、小伙伴都nice、965、五险一金...

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/33458
 
226 次点击