В этой статье я опишу, как настроить Непрерывная интеграция Для примера приложения, состоящего из нескольких микросервисов, структурированных как Monorepo и написано в Go Анкет
Что такое Monorepo?
В контексте микросервисов структурирование применения в качестве монорепо означает наличие одного репозитория для всех микросервисов с каждым микросервисом, проживающим в собственном отдельном каталоге.
Почему Monorepo?
Чтобы быть ясным, Monorepo не является серебряной пулей для структурирования микросервисов, имея свои собственные преимущества и недостатки. Как правило, преимущества включают простота , последовательность , стабильность и Повторное использование кода , в то время как недостатки считаются тесная связь , GIT Repo Scalability и Отсутствие контроля доступа кода . Я буду глубже погружаться в преимущества и недостатки структурирования микросервисов как Monorepo в отдельной статье.
Пример Monorepo
Давайте посмотрим на Пример приложения структурирован как Monorepo. Это простой HTTP API, который состоит из трех маршрутов: аут
, Пользователи
и Статьи
Анкет
monorepo-actions-ci └── routes ├── articles │ └── main.go ├── auth │ └── main.go └── users └── main.go
Важным деталем является то, что каждый маршрут является независимым применением с собственной точкой входа, main.go
Анкет
маршруты/auth/main.go
маршруты/пользователи/main.go
маршруты/статьи/main.go
Настройка действий GitHub
Давайте создадим простой рабочий процесс для маршрута Auth, .github/workflows/auth.yaml
Анкет
name: "auth" on: push: # run the workflow only on changes # to the auth route and auth workflow paths: - "routes/auth/**" - ".github/workflows/auth.yaml" jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 # run tests for route - name: Run tests run: |- cd routes/auth go test ./...
Этот рабочий процесс работает Перейти тест
Когда изменения вносятся в маршрут авто. Кроме того, он работает, когда вносятся изменения в файл рабочего процесса, который полезен для отладки самого рабочего процесса.
Автоматизация генерации рабочих процессов
Теперь следующее — добавить тот же рабочий процесс для маршруты/пользователи
и Маршруты/Статьи
Анкет Однако, хотя в этом случае просто дублирование рабочего процесса кажется разумным подходом, в случае большого приложения со сложным рабочим процессом и большим количеством маршрутов это становится проблематичным.
Вместо этого было бы лучше автоматически генерировать рабочие процессы из одного шаблона рабочего процесса. Давайте определим, какие части рабочего процесса необходимо отрегулировать, когда мы переходим от одной конечной точки к другой.
name: "{{ROUTE}}" on: push: paths: - "routes/{{ROUTE}}/**" - ".github/workflows/{{ROUTE}}.yaml" jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - name: Run tests run: |- cd routes/{{ROUTE}} go test ./...
Выглядит просто. Давайте поместим этот шаблон в .github/Workflow-template.yaml
и создайте сценарий Bash, который генерирует рабочие процессы для всех конечных точек из этого шаблона. Давайте поместим этот сценарий в Workflows.sh
:
# read the workflow template WORKFLOW_TEMPLATE=$(cat .github/workflow-template.yaml) # iterate each route in routes directory for ROUTE in $(ls routes); do echo "generating workflow for routes/${ROUTE}" # replace template route placeholder with route name WORKFLOW=$(echo "${WORKFLOW_TEMPLATE}" | sed "s/{{ROUTE}}/${ROUTE}/g") # save workflow to .github/workflows/{ROUTE} echo "${WORKFLOW}" > .github/workflows/${ROUTE}.yaml done
Не забудьте сделать исполняемый файл сценария после создания файла:
chmod +x ./workflows.sh
Теперь давайте запустим сценарий и посмотрим, что произойдет:
monorepo-actions-ci ❯ ./workflows.sh generating workflow for routes/articles generating workflow for routes/auth generating workflow for routes/users
После быстрого взгляда на .github/Workflows
Вы увидите, что скрипт автоматически генерировал рабочий процесс для каждого маршрута, присутствующего в /маршруты
.
дерево
.github/workflow/auth.yaml
.github/workflow/users.yaml
.github/workflow/strists.yaml
Это работает?
Давайте подтолкнем наш код в репозиторий GitHub и посмотрим, что произойдет.
Рабочие процессы начинаются:
Рабочие процессы успешно закончились:
АВТОРСКАЯ ДЕЛАГО РАБОТАЦИЯ:
Каждый из рабочих процессов успешно завершил работу. Успех! 🎉
Я надеюсь, что эта статья пригодится вам однажды. Дайте мне знать ваши мысли в комментариях ниже или на Twitter Анкет 🖖
Оригинал: «https://dev.to/stackdumper/setting-up-ci-for-microservices-in-monorepo-using-github-actions-5do2»