GitLab CI:制品过期时如何禁用手动部署步骤?
解决GitLab CI手动部署按钮在制品过期后禁用的问题
首先,如果你使用的是GitLab 13.0及以上版本,这个问题其实已经被官方解决了!当手动作业依赖的制品过期后,GitLab会自动将该作业标记为「Cannot run: Dependencies have expired artifacts」,对应的部署按钮会变成灰色不可点击,完全符合你的需求。你只需要保持现有的.gitlab-ci.yml配置即可,不需要额外修改。
如果你的GitLab版本低于13.0,无法享受这个原生特性,可以试试下面的替代方案:
替代方案1:通过前置检查提前拦截无效部署
我们可以在部署作业的前置步骤中添加时间校验,当距离管道创建时间超过制品过期时长时,直接终止作业并给出提示,避免执行后续的rsync操作。
修改你的staging deploy配置如下:
staging deploy: stage: deploy image: drupaldocker/drush:8 dependencies: - drupal build - npm build script: - export SSH_ENV_DIR="master1/drupal" - bash bin/gitlab/deploy.sh when: manual environment: name: staging before_script: # 先执行全局的before_script内容 - eval $(ssh-agent -s) - ssh-add <(echo "$SSH_PRIVATE_KEY") - mkdir -p ~/.ssh - echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config # 新增时间校验:判断是否超过drupal build制品的3小时过期时间 - | # 将管道创建时间转换为时间戳 PIPELINE_CREATED_TIMESTAMP=$(date -d "$CI_PIPELINE_CREATED_AT" +%s) CURRENT_TIMESTAMP=$(date +%s) # 计算时间差(单位:秒) TIME_DIFF=$((CURRENT_TIMESTAMP - PIPELINE_CREATED_TIMESTAMP)) # 3小时=10800秒,超过则终止作业 if [ $TIME_DIFF -gt 10800 ]; then echo "❌ 依赖制品已过期,请重新执行构建步骤后再部署" exit 1 fi
这个方案虽然不能完全隐藏按钮,但会在用户点击后立即检查并终止,避免无效的部署操作。
替代方案2:用父子管道绑定构建与部署的生命周期
将构建和部署拆分为父子管道:
- 父管道负责执行
npm build和drupal build作业,生成制品后触发子管道。 - 子管道仅包含
staging deploy手动作业,并且通过配置让子管道的有效期与制品过期时间一致(比如3小时)。
当制品过期后,子管道会自动失效,对应的部署按钮也会变为不可点击状态。不过这个方案需要额外配置父子管道,复杂度稍高,适合对CI流程有更高定制需求的场景。
内容的提问来源于stack exchange,提问作者dbrekelmans




