Как настроить конвейер CI на GitLab
Непрерывная интеграция (CI) означает, что изменения кода создаются и тестируются автоматически. Вот как я настроил конвейер CI для своего проекта на C++.
В этой статье рассматривается настройка конвейера CI для проекта C++ на GitLab. В моих предыдущих статьях рассказывалось, как настроить систему сборки на основе CMake и VSCodium и как интегрировать модульные тесты на основе GoogleTest и CTest. Эта статья является продолжением расширения конфигурации с помощью конвейера CI. Сначала я демонстрирую настройку конвейера, а затем его выполнение. Далее идет сама конфигурация CI.
Непрерывная интеграция (CI) просто означает, что изменения кода, которые фиксируются в центральном репозитории, создаются и тестируются автоматически. Популярной платформой с открытым исходным кодом для настройки CI-конвейеров является GitLab. В дополнение к центральному репозиторию Git, GitLab также предлагает настройку конвейеров CI/CD, отслеживание проблем и реестр контейнеров.
Условия, которые нужно знать
Прежде чем я углублюсь в эту область философии DevOps, я остановлюсь на некоторых общих терминах, встречающихся в этой статье и документации GitLab:
- Непрерывная доставка (CD): автоматическая подготовка приложений с целью их развертывания.
- Непрерывное развертывание (CD): автоматическая публикация программного обеспечения.
- Конвейеры: компонент верхнего уровня для CI/CD, определяет этапы и задания.
- Этапы: набор заданий, которые должны быть выполнены успешно.
- Задания: определение задач (например, компиляция, выполнение модульного теста).
- Исполнители: службы, которые фактически выполняют задания.
Настройка конвейера CI
Я буду повторно использовать примеры проектов из предыдущих статей, доступных на GitLab. Чтобы выполнить шаги, описанные в следующих главах, создайте ветвь примера проекта, нажав кнопку Разветвить, которая находится в правом верхнем углу:
Стефан Авенведде (CC BY-SA 4.)
Настройка бегуна
Чтобы понять, как все работает вместе, начните с самого начала, установив бегун в локальной системе.
Следуйте инструкциям по установке службы запуска GitLab для вашей системы. После установки вам необходимо зарегистрировать бегун.
1. На странице GitLab выберите проект и на левой панели перейдите к Настройки и выберите CI/CD.
Стефан Авенведде (CC BY-SA 4.0)
2. Разверните раздел «Спонсоры» и отключите параметр Общие бегунки (желтый маркер). Обратите внимание на токен и URL-адрес (зеленый маркер); они понадобятся нам на следующем этапе.
Стефан Авенведде (CC BY-SA 4.0)
3. Теперь откройте терминал и введите gitlab-runner Register
. Команда вызывает сценарий, который запрашивает некоторый ввод. Вот ответы:
- Экземпляр GitLab: https://gitlab.com/ (скриншот выше)
- Регистрационный токен: выберите его в разделе Бегуны (скриншот выше).
- Описание: Свободный выбор
- Теги: Это необязательно. Вам не нужно указывать теги
- Исполнитель: выберите здесь Shell.
Если вы захотите изменить конфигурацию позже, вы можете найти ее в разделе ~/.gitlab-runner/config.toml
.
4. Теперь запустите бегун командой gitlab-runner run
. Бегун теперь ждет работы. Теперь ваш бегун доступен в разделе Раннеры настроек проекта на GitLab:
Стефан Авенведде (CC BY-SA 4.0)
Выполнить конвейер
Как упоминалось ранее, конвейер — это набор заданий, выполняемых бегуном. Каждый коммит, отправленный в GitLab, генерирует конвейер, прикрепленный к этому коммиту. Если несколько коммитов объединены вместе, конвейер создается только для последнего коммита. Чтобы запустить конвейер в демонстрационных целях, зафиксируйте и отправьте изменение непосредственно через веб-редактор GitLab.
Для первого теста откройте README.md
и добавьте дополнительную строку:
Стефан Авенведде (CC BY-SA 4.0)
Теперь зафиксируйте изменения.
Обратите внимание, что по умолчанию установлено значение Создать новую ветку. Для простоты выберите Применить к основной ветке.
Стефан Авенведде (CC BY-SA 4.0)
Через несколько секунд после фиксации вы должны заметить вывод в окне консоли, где выполняется программа GitLab:
Checking for jobs... received job=1975932998 repo_url=https://gitlab.com/hANSIc99/cpp_testing_sample.git runner=Z7MyQsA6
Job succeeded duration_s=3.866619798 job=1975932998 project=32818130 runner=Z7MyQsA6
В обзоре проекта в GitLab выберите на правой панели CI/CD --> Pipelines. Здесь вы можете найти список недавно выполненных конвейеров.
Стефан Авенведде (CC BY-SA 4.0)
Если вы выберете конвейер, вы получите подробный обзор, в котором вы сможете проверить, какое задание не выполнено (в случае сбоя конвейера), а также просмотреть результаты отдельных заданий.
Задание считается невыполненным, если было возвращено ненулевое значение. В следующем случае я просто вызвал команду bash exit 1
(строка 26), чтобы задание не удалось:
Стефан Авенведде (CC BY-SA 4.0)
Конфигурация CI
Конфигурации этапов, конвейеров и заданий выполняются в файле .gitlab-ci.yml в корне репозитория. Я рекомендую редактировать конфигурацию с помощью встроенного редактора Pipeline GitLab, поскольку он автоматически проверяет точность во время редактирования.
stages:
- build
- test
build:
stage: build
script:
- cmake -B build -S .
- cmake --build build --target Producer
artifacts:
paths:
- build/Producer
RunGTest:
stage: test
script:
- cmake -B build -S .
- cmake --build build --target GeneratorTest
- build/Generator/GeneratorTest
RunCTest:
stage: test
script:
- cmake -B build -S .
- cd build
- ctest --output-on-failure -j6
В файле определены этапы сборка и тестирование. Далее он определяет три задания: build, RunGTest и RunCTest. Задание сборка назначается одноименному этапу, а остальные задания — этапу тестирование.
Команды в разделе script представляют собой обычные команды оболочки. Вы можете читать их так, как если бы вы вводили их построчно в оболочке.
Хочу отметить одну особенность: артефакты. В данном случае я определяю двоичный файл Producer как артефакт задания build. Артефакты загружаются на сервер GitLab и их можно скачать оттуда:
Стефан Авенведде (CC BY-SA 4.0)
По умолчанию задания на более поздних стадиях автоматически загружают все артефакты, созданные заданиями на более ранних стадиях.
Ссылка на gitlab-ci.yml
доступна на docs.gitlab.com.
Заворачивать
Приведенный выше пример является элементарным, но он показывает общий принцип непрерывной интеграции. В приведенном выше разделе о настройке раннера я деактивировал общие бегуны, хотя в этом и есть сильная сторона GitLab. Вы можете создавать, тестировать и развертывать свое приложение в чистых контейнерных средах. В дополнение к свободно доступным раннерам, для которых GitLab предоставляет бесплатный ежемесячный контингент, вы также можете предоставить свои собственные автономные раннеры на основе контейнеров. Конечно, есть и более продвинутый способ: вы можете оркестровать контейнерные исполнители с помощью Kubernetes, что позволяет свободно масштабировать обработку конвейеров. Подробнее об этом можно прочитать на сайте about.gitlab.com.
Поскольку я использую Fedora, я должен отметить, что Podman пока не поддерживается в качестве контейнерного движка для запуска GitLab. Согласно выпуску gitlab-runner #27119, поддержка Podman уже есть в списке.
Описывая повторяющиеся шаги как задания и объединяя их в конвейеры и этапы, вы можете отслеживать их качество, не вызывая дополнительной работы. Особенно в крупных проектах сообщества, где вам нужно решить, будут ли приняты или отклонены мерж-реквесты, правильно настроенный подход CI может сказать вам, улучшит ли представленный код проект или ухудшит его.