| docker_compose_build | ||
| docker_compose_up | ||
| hook_after_build | ||
| hook_after_deploy | ||
| hook_pre_build | ||
| init_repo | ||
| action.yml | ||
| README.md | ||
shared-cicd
Репозиторй для хранения рабочего процесса CI/CD
Механика
при пуше в папку на сервере
~/services/cicd примонтирвоана как /cicd
клонинуется репозиторий если его нет в папку
НАЗВАНИЕ-РЕПОЗИТОРИЯ_ВЕТКА и ветка гит меняется на нужную
далее производится git pull на случай если папка уже была
после создается файлик .env в который попадают все секреты начинающиеся на ВЕТКА_
Cам префикс ветки убирается из имени секрета!
То есть например требуемая переменная TOKEN (они все должны быть заглавными)
тогда нужно зайти в настройки проекта→действия→секреты и добавить для каждой сетки свое значение. Например:
MASTER_TOKEN и TEST_TOKEN.
далее производится сборка
для докер команд используются файлы названые
compose-ВЕТКА.yaml
например
compose-test.yaml, compose-master.yaml
на следующем этапе пересоздание контейнера и запуск
Так же есть хуки в трех местах
- pre-build перед сборкой
- after-build после сборки и до запуска
- after-deploy после запуска
для того чтобы ими воспользоватся нужно создать sh скрипты в папке scripts/ с префиксом
ИМЯ_ВЕТКИ-ИМЯ_HOOK.sh
например что бы запустить тесты на тестовой ветке после запуска нужен файл
scripts/test-after-deploy.sh
учтите что на поднятие сервиса самого внутри контейнера может уйти какоето время особенно если вы не сделали heath check
для этого надо добавить в свой образ curl и делать к себе запрос через соотвествующую секцию compose
или в тестовом скрипте учесть это
1 Добавляем секреты для каждой ветки с префиксом ВЕТКА_
Секреты могут добавлять только администраторы! Отправить список ключей значений администратору!
Заходим в проект -> Настрйоки -> Дейтсвия -> Секреты -> Добавить секрет
например
TEST_ARG1 "test arg 1"
MASTER_ARG1 "master arg 1"
Соответствующие переменные окружения БЕЗ префикса сами запишутся в .env на этапе init_repo
2 создаем файл для рабочего процесса
.forgejo/workflows/deploy.yml
name: Docker Deploy
on:
push:
branches:
- 'master'
- 'test'
jobs:
update_cicd:
runs-on: docker
container:
image: cicd_base:1
steps:
- name: init_repo
uses: shared/cicd/init_repo@master
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
all_secrets_json: ${{ toJSON(secrets) }}
- name: hook_pre_build
uses: shared/cicd/hook_pre_build@master
- name: docker_compose_build
uses: shared/cicd/docker_compose_build@master
- name: hook_after_build
uses: shared/cicd/hook_after_build@master
- name: docker_compose_up
uses: shared/cicd/docker_compose_up@master
- name: hook_after_deploy
uses: shared/cicd/hook_after_deploy@master
3 Удостоверяемся что есть файлы сборки и запуска
Создаем под ветки test и master
compose-test.yaml
compose-master.yaml
Если монтируем volumes
Кроме того в .env запишется SERVER_FOLDER=,
где будет указан абсолютный правильный путь папки для монтирования volumes
например:
volumes:
- ${SERVER_FOLDER:-"."}/volumes/data:/app/data
4 Добавялем если нужно скрипты
Например, запустить тест после деплоя
создаем файл scripts/test-after-deploy.sh
пишем команду для теста в нём
обычно через docker compose exec
node или python в образе который выполняет команды нет,
но можно использовать docker run -rm что бы получить, что угодно
5 При пуше в master/test смотрим действия удачно ли они завершились
TODO
- оповещения