Предположим есть логика для инфраструктурного сиай, где при сборке кастомного бинаря мы его тут же деплоим ansible-ом. Как правило реализуется это на triggered pipeline, так как репозиторий с inventory файлами ansible лежит в другом git repository. Следовательно пробросить переменную в сиай при вызове не сложно, но это временно, нужно же еще сделать комит. Расширяемая джоба ниже как раз для этого:
.git_commit:
image: alpine:3.19
before_script:
- apk add --no-cache git curl yq
- git config --global --add safe.directory '*'
- git config --global user.email "${GITLAB_USER_EMAIL}"
- git config --global user.name "${GITLAB_USER_NAME}"
- git remote set-url origin https://ci_commit_token:${CI_COMMIT_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_PATH_OVERRIDE}.git
- git fetch
- git checkout $CI_COMMIT_REF_NAME
- git reset --hard "origin/$CI_COMMIT_REF_NAME"
script:
- yq -i ".${YAML_KEY_PATH} = strenv(YAML_KEY_NEW_VALUE)" "${YAML_TARGET_FILE}"
- git add "${YAML_TARGET_FILE}"
- |
git commit -m "ci: update ${YAML_KEY_PATH} in ${YAML_TARGET_FILE}"
- git push origin HEAD:$CI_COMMIT_REF_NAME -o ci.skip
Предполагается, что из другого проекта она будет вызвана примерно так:
<job:name>:
stage: .post
extends: [".git_commit"]
variables:
YAML_KEY_PATH: "<variables_name_in_yaml>"
YAML_KEY_NEW_VALUE: "<variables_new_value>"
YAML_TARGET_FILE: "<path_to_vars>"
CI_PROJECT_PATH_OVERRIDE: "<project>"
rules:
- { when: on_success , if: '$CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH' }
- { when: never }
YAML_KEY_PATH - это название переменной в переменных инвентори (vars или group_vars, например). YAML_KEY_NEW_VALUE - новое значение этой переменной.YAML_TARGET_FILE - путь до переменных. Например у меня это почти всегда файлы в group_vars.CI_PROJECT_PATH_OVERRIDE - название проекта вида group/sub_group/project. Он будет склонирован в нашей джобе и в него же будет комит. Стандартная переменная CI_PROJECT_PATH в данном случае не подходит, так как мы вызываем данный код из другого проекта.Значение переменной заменяется через
yq. Не забываем делать ci.skip, чтобы не дублировать запуск пайплайна, ведь предполагается, что мы уже накатили версию в предыдущем шаге и тут просто фиксируем ее в наш "источник правды" - git.#gitlab