如何检查作业中环境/开发是否存在/成功并决定部署/更新它

Иль*_*мов 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 参考中的一些内容,我发现的唯一解决方案是在检查阶段/作业上创建失败管道,但这并不高兴看到这么多失败的管道。

Bee*_*ake 2

已经过去两个月了,所以您可能已经有了解决方案,但如果它适合您的用例,您可以尝试以下方法

方法:

使用管道触发器和调用 Gitlab API 的脚本

1. 判断环境是否存在

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)

2.在检查作业中使用触发管道

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)

3. 使部署作业仅在特定的 DEPLOYMENT_STRATEGY 上激活

# 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)