我们有以下本地场景:开发人员在 Bitbucket 上开发应用程序,运维人员在 Gitlab 上处理“Gitops”事务。我们希望通过 Gitlab 管道自动执行构建和部署,并寻找实现方法。构建部分已经可以正常工作。但我们希望区分分支 - 并非每个分支都应该部署 - 尤其是生产分支需要手动部署。
由于 webhook 包含我在部署阶段尝试设置的分支:
only:
- dev
也
rules:
- if: '$TOKEN_BRANCH != $PROD_BRANCH'
但无论哪种方式,部署管道仍然会被触发。
我想到两个解决方法:
一种选择是通过“提交后挂钩”来镜像 bitbucket 存储库 - 但一方面这个插件需要成本,另一方面你需要第二个插件进行镜像 - 而我能找到的唯一插件不再维护。
第二种选择是授权 Gitlab Ultimate 使用“拉镜像”,这也可以通过 Bitbucket webhook 触发。
由于我们没有使用存储库镜像,唯一的用例是能够在“本地存储库”上使用 Gitlab 管道,其中所有上述用于区分部署分支的方法都应该起作用 - 我更愿意找到一种已经可用资源的方法。
很高兴听到您对此的想法!
编辑: 管道部分:
variables:
PROD_BRANCH: main
before_script:
- TOKEN_BRANCH=$(cat $TRIGGER_PAYLOAD | jq -r '.changes[0].ref.displayId')
deploy:
stage: deploy
tags:
- openshift
rules:
- if: $TOKEN_BRANCH != $PROD_BRANCH
- echo $TOKEN_BRANCH 返回“main”。
- 在规则中:仅当以下语句为真时,才会触发管道的这一部分。
- 由于“main == main”而不是“!=”,因此不应执行管道的“部署”阶段。但事实确实如此...
有多种变体
rules:
- if: '$TOKEN_BRANCH !~ $PROD_BRANCH'
rules:
- if: '$TOKEN_BRANCH =~ $PROD_BRANCH'
when: never
在这些情况下,情况正好相反 - 管道从来没有部署阶段 - 它甚至不会在 Gitlab 中的“管道”视图中显示该阶段。
答案1
找到了一个可行的解决方案:
在“规则”不起作用后,我现在在部署阶段的脚本部分使用“if 循环”。因此每次都会触发部署阶段,但只有当令牌包含相应阶段时,逻辑(=部署)才会完成。
deploy-to-test:
stage: deploy
variables:
PROD: master
tags:
- openshift
script:
- >
if [ "$TOKEN_BRANCH" != "$PROD" ]; then
---logic---
else
echo "skipping ..."
fi