Иль*_*мов 5 gitlab gitlab-ci gitlab-ci.yml
在 gitlab ceomnibus 14.10.2 实例中,有一个项目需要在 gitlab-ci.yml 中创建一个管道,用于检查动态环境部署是否存在,如果不存在,则不执行任何操作,如果是,它会更新它们或通过 WebUI 的触发器手动部署。
我的例子:
#...
check-review:
variables:
GIT_STRATEGY: none
stage: dev/review/check
only:
- /^(feature|hotfix)\/(.*)/m
dependencies: []
allow_failure: true
script:
- curl -sLf ${CI_COMMIT_REF_SLUG}.domain.io --output /dev/null
when: always
ansible/deploy:
stage: dev/review
only:
- /^(feature|hotfix)\/(.*)/m
except:
- master
- staging
environment:
name: $CI_COMMIT_REF_NAME
url: https://${CI_COMMIT_REF_SLUG}.domain.io
action: start
on_stop: ansible/undeploy
when: on_success
dependencies:
- vendor # build back
script:
- make deploy
ansible/undeploy:
stage: dev/review
variables:
GIT_STRATEGY: none
environment:
name: $CI_COMMIT_REF_NAME
url: https://${CI_COMMIT_REF_SLUG}.domain.io
action: stop
when: manual
needs:
- job: ansible/deploy
script:
- make delete_dev_stand
Run Code Online (Sandbox Code Playgroud)
这种情况是需要的,因为开发团队在许多分支上工作,并不是每个人都需要部署在开发环境上,另一方面,仅需要手动更新 - 每个更新/修复代码 qa 都需要转到 gitlab webui 并触发作业来部署/更新部署在环境中 https://${CI_SERVER_HOST}/${CI_PROJECT_PATH}/-/environments/
也许我错过了 gitlab-ci 参考中的一些内容,我发现的唯一解决方案是在检查阶段/作业上创建失败管道,但这并不高兴看到这么多失败的管道。
已经过去两个月了,所以您可能已经有了解决方案,但如果它适合您的用例,您可以尝试以下方法
使用管道触发器和调用 Gitlab API 的脚本
A。创建一个名为 get-deployment-strategy.sh 的脚本并将其添加到您的项目中
b. 在您的用户首选项中创建一个具有 API 读取权限的私有令牌,并将其添加到您的 CI/CD 变量中 (GITLAB_API_PRIVATE_READ_TOKEN=token)
#!/bin/bash
# Private Token (created in user preferences) with API READ permission added to CI/CD vars
HEADER="PRIVATE-TOKEN: $GITLAB_API_PRIVATE_READ_TOKEN"
# To get the project which the environment should be read from
API_URL="https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/environments"
# URL query parameter to filter for environment with specific name
QUERY_STRING="name=$DEPLOYMENT_TARGET/$DEPLOYMENT_NAME"
# Call Gitlab API (Environments API)
API_RESPONSE="$(curl -G --header "$HEADER" "$API_URL" --data-urlencode "$QUERY_STRING")"
# The response is an empty array (string) if there is no environment with the specific name
if [ "$API_RESPONSE" = "[]" ]; then
# Deployment environment does not exist
echo "DO_STRATEGY_A"
else
echo "DO_STRATEGY_B"
fi
Run Code Online (Sandbox Code Playgroud)
A。在 CI/CD 设置中创建触发令牌并将其添加到 CI/CD 变量中
b. 在检查作业中调用触发器管道并向其传递“部署策略变量”
像这样的东西:
check-job:
before_script:
- export DEPLOYMENT_STRATEGY=$(./get-deployment-strategy.sh)
script:
- |
curl \
--fail \
--request POST \
--form token=$DEPLOY_TRIGGER_TOKEN \
--form ref=$CI_COMMIT_BRANCH \
--form variable[DEPLOYMENT_STRATEGY]=$DEPLOYMENT_STRATEGY \
"https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/trigger/pipeline"
Run Code Online (Sandbox Code Playgroud)
# Only runs for DO_STRATEGY_A (environment does not exist)
deploy/strategy-A:
rules:
- if: '$CI_PIPELINE_SOURCE="trigger" && $DEPLOYMENT_STRATEGY=="DO_STRATEGY_A"'
# Only runs for DO_STRATEGY_B (environment exists)
deploy/strategy-B:
rules:
- if: '$CI_PIPELINE_SOURCE="trigger" && $DEPLOYMENT_STRATEGY=="DO_STRATEGY_B"'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1357 次 |
| 最近记录: |