Можно ли изменить значение переменной Gitlab CI после запуска конвейера?

Я пытаюсь создать динамический конвейер gitlab на основе его собственного хода выполнения. Например, у меня есть 2 среды, и развертывание в каждой из них будет включено/выключено в зависимости от выполнения скрипта в before_script. У меня это не работает, кажется, что значение переменной конвейера не может быть изменено после запуска конвейера. Какие-либо предложения? (см. мой gitlab-ci.yml ниже)

variables:
  RELEASE: limited

stages:
  - build
  - deploy


before_script:
  - export RELEASE=${check-release-type-dynamically.sh}

build1:
  stage: build
  script:
    - echo "Do your build here"

## DEPLOYMENT
deploy_production_ga:
  stage: update_prod_env
  script:
  - echo "deploy environment for all customers"
  allow_failure: false
  only:
  - branches
  only:
   variables:
   - $RELEASE == "general_availability"


deploy_production_limited:
  stage: update_prod_env
  script:
  - echo "deploy environment for limited customers"
  allow_failure: false
  only:
  - branches
  only:
   variables:
   - $RELEASE == "limited"

person Roman Dolgoter    schedule 13.06.2018    source источник


Ответы (1)


Переменные не могут оцениваться в определении. Если вы действительно хотите использовать сценарий оболочки, чтобы решить, что будет развернуто, вы можете использовать предложение bash if:

stages:
  - build
  - update_prod_env

build1:
  stage: build
  script:
    - echo "Do your build here"

deploy_production_ga:
  stage: update_prod_env
  script:
  - if [ "$(./check-release-type-dynamically.sh)" == "general_availability" ]; then
      echo "deploy environment for all customers"
    fi
  only:
  - branches    

deploy_production_limited:
  stage: update_prod_env
  script:
  - if [ "$(./check-release-type-dynamically.sh)" == "limited" ]; then
      echo "deploy environment for all customers"
    fi
  only:
  - branches    

Однако это действительно плохой дизайн. Оба задания будут выполняться при каждом коммите, но только одно из них будет что-то делать. Их лучше различать по отраслям. Делайте коммиты только в ту ветку, в которую хотите развернуть:

stages:
  - build
  - update_prod_env

build1:
  stage: build
  script:
    - echo "Do your build here"

deploy_production_ga:
  stage: update_prod_env
  script:
  - echo "deploy environment for all customers"
  only:
  - branches-general_availability    

deploy_production_limited:
  stage: update_prod_env
  script:
  - echo "deploy environment for all customers"
  only:
  - branches-limited

Таким образом, выполняется только то задание сборки, которое вы хотите выполнить.

Еще пару вещей, которые я заметил:

export RELEASE=${check-release-type-dynamically.sh} используйте () вместо {} для подоболочек. Также, если сценарий оболочки находится в том же каталоге, вы должны добавить ./. Это должно выглядеть так: export RELEASE=$(./check-release-type-dynamically.sh)

allow_failure: false это значение по умолчанию в gitlab-ci и не обязательно.

variables:
- $RELEASE == "general_availability"

Неправильный синтаксис для переменных, используйте:

variables:
  VARIABLE_NAME: "Value of Variable"

Взгляните на https://docs.gitlab.com/ee/ci/yaml/< /а>

person mles    schedule 13.06.2018
comment
Спасибо @mles. Можно использовать ветки, но я хотел использовать выражения переменных в gitlab 10.7 link где задание будет выполняться на основе значения переменной, как здесь: variables: - $RELEASE == "general_availability" - person Roman Dolgoter; 14.06.2018