基于Gitlab CI的上线时间校验

公司项目上线有时间限制,为降低人员自觉的不可靠因素,需对某些分支在特定时间点禁止自动构建。本地校验方式易被绕过,最终通过在CI增加变量,启动容器比较时间,对上线分支进行控制,虽有缺陷但目前只能如此。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前提

目前公司在很多项目在上线时,都明确要求了,周四、周五上线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、团建、五险一金...

地点上海浦软大厦

转载于:https://juejin.im/post/5ce5fca4e51d45554877a541

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值