TGViewer
Сочный DevOps Сочный DevOps @andtree_sec · 420 subscribers
Post #196 203
Сохранение версии в инфраструктурном CI

Предположим есть логика для инфраструктурного сиай, где при сборке кастомного бинаря мы его тут же деплоим 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
  • ❤ 1
More from @andtree_sec
  1. Sep 7, 2026Давненько не было сообщений. Скорее всего в будущем они уйдут в telegraf, который я еще не…
  2. Jul 6, 2026Последнее время на работе часто приходится работать с apache flink и даже что-то писать на…
  3. Jun 4, 2026Немножко про молекула тесты... У нас принято использовать в переменных lookup плагин для д…
  4. May 20, 2026Очередной небольшой проект. Веб-приложение, которое агрегирует через стандартный механиз g…
  5. May 15, 2026Включаем профилирование в ansible Профилирование, это вывод даты, времени запуска и итогов…
  6. Apr 17, 2026Так выглядит общий dashbord работы с инцидентами.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →