Рубрики
Uncategorized

Настройка CI для микросервисов в MonorePo с использованием действий GitHub

В этой статье я опишу, как настроить непрерывную интеграцию для примера приложения Consis … с меткой DevOps, Github, Go, Actionshackathon.

В этой статье я опишу, как настроить Непрерывная интеграция Для примера приложения, состоящего из нескольких микросервисов, структурированных как 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»