Руководство. Развертывание репозиториев GitLab в Статические веб-приложения Azure
Статические веб-приложения Azure имеет гибкие варианты развертывания, позволяющие работать с различными поставщиками. В этой статье вы развернете веб-приложение, размещенное в GitLab, в Статические веб-приложения Azure.
Из этого руководства вы узнаете, как выполнять такие задачи.
- Импорт репозитория в GitLab
- Создание статического веб-приложения
- Настройка репозитория GitLab для развертывания в Статические веб-приложения Azure
Предварительные требования
- Учетная запись GitLab
- Учетная запись Azure
- Если у вас еще нет подписки Azure, создайте бесплатную пробную учетную запись.
Создание репозитория
В этой статье используется репозиторий GitHub в качестве источника для импорта кода в репозиторий GitLab.
- Войдите в учетную запись GitLab и перейдите по адресу https://gitlab.com/projects/new#import_project
- Выберите Репозиторий по URL-адресу.
- В поле URL-адрес репозитория Git введите URL-адрес репозитория для выбранной платформы.
Создание статического веб-приложения
Теперь, когда репозиторий создан, можно создать статическое веб-приложение на портале Azure.
- Перейдите на портал Microsoft Azure.
- Выберите Создать ресурс.
- Выполните поиск по запросу Статические веб-приложения.
- Выберите Статические веб-приложения.
- Щелкните Создать.
- В разделе Основные сведения начните с настройки нового приложения.
Параметр Значение Подписка Azure. Выберите подписку Azure. Группа ресурсов Щелкните ссылку Создать и введите static-web-apps-gitlab. Имя Введите my-first-static-web-app. Тип плана Выберите Бесплатно. Область для API Функций Azure и промежуточных сред Выберите ближайший к вам регион. Источник Выберите Другой. Создание задачи конвейера в GitLab
Затем добавьте задачу рабочего процесса, отвечающую за сборку и развертывание сайта по мере внесения изменений.
Добавление маркера развертывания
- Перейдите в репозиторий в GitLab.
- Выберите Параметры.
- Выберите CI/CD.
- Рядом с разделом Переменные выберите Развернуть.
- Выберите Добавить переменную.
- В поле Ключ введите DEPLOYMENT_TOKEN.
- В поле Значение вставьте значение маркера развертывания, которое вы отложили на предыдущем шаге.
- Выберите Добавить переменную.
Добавление файла
- Выберите пункт меню Репозиторий .
- Выберите Файлы.
- Убедитесь, что в раскрывающемся списке ветви в верхней части выбрана главная ветвь.
- Нажмите раскрывающийся список «плюс » и выберите Создать файл.
- Создайте новый файл с именем .gitlab-ci.yml в корне репозитория. (Убедитесь, что файл имеет .yml расширение .)
- Введите в файл следующий код YAML.
variables: API_TOKEN: $DEPLOYMENT_TOKEN APP_PATH: '$CI_PROJECT_DIR/src' deploy: stage: deploy image: registry.gitlab.com/static-web-apps/azure-static-web-apps-deploy script: - echo "App deployed successfully."variables: API_TOKEN: $DEPLOYMENT_TOKEN APP_PATH: '$CI_PROJECT_DIR/src' OUTPUT_PATH: '$CI_PROJECT_DIR/dist/angular-basic' deploy: stage: deploy image: registry.gitlab.com/static-web-apps/azure-static-web-apps-deploy script: - echo "App deployed successfully."variables: API_TOKEN: $DEPLOYMENT_TOKEN APP_PATH: '$CI_PROJECT_DIR/Client' OUTPUT_PATH: 'wwwroot' deploy: stage: deploy image: registry.gitlab.com/static-web-apps/azure-static-web-apps-deploy script: - echo "App deployed successfully."variables: API_TOKEN: $DEPLOYMENT_TOKEN APP_PATH: '$CI_PROJECT_DIR' OUTPUT_PATH: '$CI_PROJECT_DIR/build' deploy: stage: deploy image: registry.gitlab.com/static-web-apps/azure-static-web-apps-deploy script: - echo "App deployed successfully."variables: API_TOKEN: $DEPLOYMENT_TOKEN APP_PATH: '$CI_PROJECT_DIR' OUTPUT_PATH: '$CI_PROJECT_DIR/dist' deploy: stage: deploy image: registry.gitlab.com/static-web-apps/azure-static-web-apps-deploy script: - echo "App deployed successfully."Следующие свойства конфигурации используются в файле .gitlab-ci.yml для настройки статического веб-приложения.
Переменная $CI_PROJECT_DIR сопоставляется с расположением корневой папки репозитория в процессе сборки.
Свойство Описание Пример Обязательно APP_PATH Расположение кода приложения. Введите $CI_PROJECT_DIR/ , находится ли исходный код приложения в корне репозитория или $CI_PROJECT_DIR/app находится ли код приложения в папке с именем app . Да API_PATH Расположение кода Функций Azure. Введите $CI_PROJECT_DIR/api , находится ли код приложения в папке с именем api . Нет OUTPUT_PATH Расположение выходной папки сборки относительно APP_PATH . Если исходный код приложения находится в $CI_PROJECT_DIR/app , а скрипт сборки выводит файлы в папку $CI_PROJECT_DIR/app/build , установите $CI_PROJECT_DIR/app/build в качестве значения OUTPUT_PATH . Нет API_TOKEN Маркер API для развертывания. API_TOKEN: $DEPLOYMENT_TOKEN Да После завершения развертывания можно просмотреть веб-сайт.
Просмотр веб-сайта
При развертывании статического приложения следует учитывать два фактора. На первом шаге создаются базовые ресурсы Azure, составляющие ваше приложение. Второй — это рабочий процесс GitLab, который создает и публикует приложение.
Прежде чем перейти на новый статический сайт, сборка развертывания должна завершиться.
В окне обзора службы «Статические веб-приложения» отображается ряд ссылок, которые помогут вам взаимодействовать с веб-приложением.
- Вернитесь к статическому веб-приложению в портал Azure.
- Перейдите в окно Обзор .
- Щелкните ссылку под меткой URL-адреса . Веб-сайт загружается на новой вкладке.
Очистка ресурсов
Если вы не собираетесь продолжать использовать это приложение, можно удалить экземпляр Статические веб-приложения Azure и все связанные службы, удалив группу ресурсов.
- Выберите группу ресурсов static-web-apps-gitlab в разделе Обзор .
- Выберите Удалить группу ресурсов в верхней части группы ресурсов Обзор.
- Введите имя группы ресурсов static-web-apps-gitlab в диалоговом окне подтверждения Удалить static-web-apps-gitlab?
- Выберите Удалить.
На удаление группы ресурсов может потребоваться несколько минут.
4.8 Git на сервере — GitLab
GitWeb довольно-таки прост. Если вам нужен более современный, полнофункциональный Git-сервер, есть несколько решений с открытым исходным кодом, которые можно использовать. Так как GitLab это один из самых популярных, мы рассмотрим его установку и использование в качестве примера. Это немного сложнее, чем GitWeb, и скорее всего потребует больше обслуживания, но и функциональность гораздо богаче.
Установка
GitLab — это веб-приложение на основе базы данных, так что его установка немного сложней, чем у некоторых других серверов Git. К счастью, этот процесс хорошо документирован и поддерживается. GitLab настоятельно рекомендует установить GitLab на ваш сервер через официальный пакет Omnibus GitLab.
Другие варианты установки:
- GitLab Helm chart для использования с Kubernetes.
- Официальные образы GitLab для использования с Docker.
- Из исходных файлов.
- Облачный провайдер, такой как AWS, Google Cloud Platform, Azure, OpenShift или Digital Ocean.
Для получения дополнительной информации прочтите GitLab Community Edition (CE) readme.
Администрирование
Административный интерфейс GitLab доступен через веб. Просто направьте ваш браузер на имя или IP-адрес хоста, где установлен GitLab, и войдите как администратор. Имя пользователя по умолчанию admin@local.host , пароль по умолчанию 5iveL!fe (вас попросят изменить их при входе). Войдя, нажмите иконку «Административная зона» в меню справа и сверху.

Рисунок 50. Пункт «Административная зона» в меню GitLab
Пользователи
Пользователи в GitLab — это учётные записи, соответствующие людям. Пользовательские учётные записи не очень сложны; в основном это набор персональной информации, прикреплённый к имени. У каждого пользователя есть пространство имён, логически группирующее проекты данного пользователя. Если у пользователя jane есть проект project, адрес этого проекта будет http://server/jane/project .

Рисунок 51. Экран управления пользователями GitLab
Удаление пользователя может быть выполнено двумя способами. «Блокирование» («Blocking») пользователя запрещает ему вход в GitLab, но все данные в его пространстве имен сохраняются, и коммиты, подписанные этим пользователем, будут указывать на его профиль.
«Разрушение» («Destroying») пользователя, с другой стороны, полностью удаляет его из базы данных и файловой системы. Все проекты и данные в его пространстве имен удаляются, как и все принадлежащие ему группы. Конечно, этим более постоянным и разрушительным действием пользуются реже.
Группы
Группы GitLab — это коллекция проектов с указанием того, как пользователи получают к ним доступ. Каждая группа имеет пространство имён проектов (так же как и пользователи), так что если в группе training есть проект materials, его адрес будет http://server/training/materials .

Рисунок 52. Экран управления группами GitLab
Каждая группа связана с пользователями, каждый из которых имеет уровень доступа к проектам группы и к самой группе. Он разнится от «Гостя» («Guest», только проблемы и чат) до «Владельца» («Owner», полный контроль над группой, её членами и проектами). Типы разрешений слишком обширны, чтобы перечислять их здесь, но на экране управления GitLab есть полезная ссылка с описанием.
Проекты
Проект GitLab примерно соответствует одному git-репозиторию. Каждый проект принадлежит одному пространству имён, групповому или пользовательскому. Если проект принадлежит пользователю, владелец контролирует, кто имеет доступ к проекту; если проект принадлежит группе, действуют групповые уровни доступа для пользователей.
Каждый проект также имеет уровень видимости, который контролирует, кто имеет доступ на чтение страниц проекта или репозитория. Если проект Приватный (Private), владелец должен явно дать доступ на чтение отдельным пользователям. Внутренний (Internal) проект виден любому вошедшему пользователю GitLab, а Публичный (Public) проект видим всем. Это относится как к доступу git fetch , так и к доступу к проекту через веб-интерфейс.
Хуки
GitLab включает поддержку хуков (перехватчиков, hooks) на уровне проектов и всей системы. В обоих случаях, когда происходит некоторое событие, сервер GitLab выполняет запрос HTTP POST с осмысленным JSON-содержанием. Это отличный способ соединить ваши git-репозитории и инсталляцию GitLab с автоматикой инфраструктуры разработки, такой как сервера непрерывной интеграции, комнаты чатов или инструменты деплоя.
Базовое использование
Первое, чего вы захотите от GitLab, это создать новый проект. Это достигается нажатием иконки «+» на панели инструментов. Будут запрошены имя проекта, пространство имён, которому он должен принадлежать, и уровень видимости. Большинство из этих настроек можно потом изменить через интерфейс настроек. Нажмите «Создать проект» («Create Project»), чтобы закончить.
Когда проект создан, вы, наверное, захотите соединить его с локальным git-репозиторием. Каждый проект может быть доступен через HTTPS или SSH, каждый из которых может быть использован для указания удалённого репозитория. Адреса (URL) видимы наверху домашней страницы проекта. Для существующего локального репозитория, следующая команда создаст удалённый репозиторий с именем gitlab и размещением на сервере:
$ git remote add gitlab https://server/namespace/project.gitЕсли у вас нет локального репозитория, можно просто сделать его:
$ git clone https://server/namespace/project.gitВеб-интерфейс даёт доступ к нескольким полезным видам самого репозитория. Домашняя страница каждого проекта показывает недавнюю активность, а ссылки наверху ведут на список файлов проекта и журнала коммитов.
Совместная работа
Самый простой метод совместной работы над проектом GitLab — это выдача другому пользователю прямого доступа на запись (push) в git-репозитории. Вы можете добавить пользователя в проект в разделе «Участники» («Members») настроек проекта, указав уровень доступа (уровни доступа кратко обсуждались в Группы). Получая уровень доступа «Разработчик» («Developer») или выше, пользователь может беспрепятственно отсылать свои коммиты и ветки непосредственно в репозиторий.
Другой, более разобщённый способ совместной работы — использование запросов на слияние (merge requests). Эта возможность позволяет любому пользователю, который видит проект, вносить свой вклад подконтрольным способом. Пользователи с прямым доступом могут просто создать ветку, отослать в неё коммиты и открыть запрос на слияние из их ветки обратно в master или любую другую ветку. Пользователи без доступа на запись могут «форкнуть» репозиторий («fork», создать собственную копию), отправить коммиты в эту копию и открыть запрос на слияние из их форка обратно в основной проект. Эта модель позволяет владельцу полностью контролировать, что попадает в репозиторий и когда, принимая помощь от недоверенных пользователей.
Запросы на слияние и проблемы (issues) это основные единицы долгоживущих дискуссий в GitLab. Каждый запрос на слияние допускает построчное обсуждение предлагаемого изменения (поддерживая облегчённое рецензирование кода), равно как и общее обсуждение. И те и другие могут присваиваться пользователям или организовываться в вехи (milestones).
Мы в основном сосредоточились на частях GitLab, связанных с git, но это — довольно зрелая система, и она предоставляет много других возможностей, помогающих вашей команде работать совместно, например вики-страницы для проектов и инструменты поддержки системы. Одно из преимуществ GitLab в том, что, однажды запустив и настроив сервер, вам редко придётся изменять конфигурацию или заходить на него по SSH; большинство административных и пользовательских действий можно выполнять через веб-браузер.
GitLab для начинающих: как и для чего используется

В материале подробно разбираем, что такое GitLab, для чего используется, чем отличается от аналогов и как с ним работать.
Что такое GitLab
GitLab представляет собой веб-приложение и систему управления репозиториями программного кода для распределенной системы контроля версий Git. GitLab, как правило, используется с Git, что позволяет разработчикам сохранять написанный код в онлайн-формате и работать с другими разработчиками над разными проектами.
GitLab позволяет взаимодействовать с репозиториями, управлять правами доступа и пользователями, отслеживать ошибки, автоматизировать процессы и выполнять многие другие операции. Установить и использовать его можно на собственном сервере или же в облаке.
Для чего нужен GitLab
GitLab имеет множество возможностей, основные из них представлены ниже.
Планирование
GitLab способен эффективно поддерживать различные модели коллективной работы вне зависимости от выбранной методологии разработки. Гибкие инструменты управления проектами GitLab позволяют делать процесс разработки наглядным, координировать его, отслеживать и назначать приоритеты.Создание
С Gitlab команда разработчиков может консолидировать исходный код в общей распределенной среде контроля версий. Веб-сервис позволяет управлять и поддерживать распределенную среду, не нарушая процессы разработки.GitLab имеет целый арсенал инструментов для управления ветками и доступом к проектам, создавая общую достоверную среду для совместной работы команды разработчиков.
Тестирование
В GitLab реализованы инструменты ревью кода, его тестирования и оценки качества, что позволяет разработчикам быстрее находить ошибки и сокращать цикл их исправления.Можно персонально настраивать модель приемки качества, тестировать код в автоматическим режиме и назначать изменения в среды тестирования для каждой версии кода.
Сборка
Репозиторий контейнеров GitLab дает возможность создавать безопасное хранилище кастомных образов контейнеров Docker. Причем для этого не придется задействовать дополнительные инструменты — возможности скачивания и загрузки образов внедрены в среду управления репозиторием Git по умолчанию.Релиз
Компоненты поддержки технологий непрерывной доставки и развертывания позволяют эффективно автоматизировать операции, связанные со сборкой, автоматическим тестированием и установкой релизов. Установка релиза как на один сервер, так и на множество, будет занимать минимум времени.Конфигурирование
GitLab позволяет автоматизировать весь процесс разработки приложения. Для этого предоставляются готовые шаблоны моделей, с которыми начать работу можно без сложных предварительных настроек — достаточно добавить специфику приложения на каждом этапе сборки и развертывания.В качестве сервиса с предварительно настроенными шаблонами приложений для разработки можно использовать GitLab CE Virtual Appliance.
Мониторинг
С GitLab можно отслеживать время, затраченное на каждый этап, проверять работоспособность приложения, собирать и просматривать метрики, а также анализировать, как изменения кода влияют на производительность среды.
Git, GitLab и GitHub
Каждому разработчику важно знать и понимать, чем отличаются и схожи Git, GitLab и GitHub.
Git представляет собой распределенную систему контроля версий. Она позволяет разработчикам контролировать изменения в файлах и работать совместно с другими специалистами. Git также локально сохраняет весь репозиторий в файл небольшого объема, не снижая качества данных.
GitHub, как и GitLab, представляет собой онлайн-сервис для размещения репозиториев, удаленного управления ими и других задач разработки. В нем предусмотрены багтрекинг, вики для каждого проекта, история коммитов, графика, вложенные списки задач и многое другое.
Оба сервиса предназначены для использования группами разработчиков, поэтому многие функции и возможности GitHub и GitLab дублируются. Вместе с тем, есть и отличия:
- В GitLab реализована встроенная бесплатная непрерывная интеграция. В GitHub есть инструмент Actions. Он позволяет запускать бесплатные непрерывные интеграции в публичных репозиториях, а что касается частных репозиториев — стоимость указана здесь.
- GitLab задействует Kubernetes для беспроблемного развертывания. В GitHub встроенной платформы развертывания нет.
- В GitLab есть бесплатные репозитории частного формата для проектов, имеющих открытый исходный код. В GitHub такого нет.
Подробнее о том, чем еще отличается GitLab, можно прочитать на официальном сайте веб-приложения.
Еще одним решением для разработки является Cloud Container Engine от SberCloud — сервис для автоматизации развертывания, масштабирования и управления приложениями в высокопроизводительных кластерах Kubernetes. Он обеспечивает высокую производительность, корпоративную надежность и безопасность, а также открытость и совместимость.
Калькулятор виртуальных машин
Виртуальная машина+диск от 96 копеек/час

Как пользоваться GitLab
Рассмотрим основные этапы работы с GitLab:
Создание аккаунта
На GitLab простая процедура регистрации. На главной странице официального сайта есть форма входа, в которой надо ввести только имя пользователя или адрес электронной почты и придумать пароль. После отправки запроса остается только подтвердить регистрацию в письме, отправленном на указанную почту.

Для входа можно использовать аккаунты в других сервисах и социальных сетях.
Создание репозитория
Для создания нового проекта надо нажать на значок «+» по центру экрана и выбрать соответствующий пункт.

При создании надо указать имя, описание репозитория и определить уровень доступа: приватный, доступный всем зарегистрированным или публичный.
После указания всех данных и нажатия на кнопку «Create repo», репозиторий будет создан, а на его странице будет доступен стартовый набор действий.
Также GitLab позволяет настроить работу удаленного репозитория. Это значит, что продвинутые пользователи смогут решать большинство рутинных задач через консольные команды или графических клиентов.
Загрузка файлов проекта
В интерфейсе предусмотрены удобные варианты загрузки проектов. На главной странице репозитория можно загрузить файл, создать новый файл, добавить лицензию и файл Readme. При этом загрузка файлов с компьютера выполняется быстро, не требует переформатирования или других операций.
SSH-ключи
Чтобы во время загрузки данных репозитория не приходилось вводить логин и пароль, для авторизации можно использовать SSH-ключи. Они создаются в несколько шагов:
- открывается терминал и выполняется «ssh-keygen»;
- указывается путь к файлу для сохранения ключа.
После этого создается два файла — закрытый и открытый. Для создания ключей нужен открытый. Его нужно открыть в текстовом редакторе и скопировать содержимое в буфер обмена. Затем нужно перейти в GitLab и выбрать «Настройки» (Settings). В меню настроек в пункте «SSH Keys» в поле «Key» надо вставить скопированный ранее текст и сохранить изменения. Далее нужно перейти в репозиторий и нажать на кнопку «Clone». После этого нужно вернуться к локальному репозиторию, удалить адрес https и добавить ssh. На этом настройка SSH-ключей будет завершена.
Ветки репозитория
По умолчанию в репозитории GitLab предусмотрена только одна ветка — master(main). При этом для реализации вспомогательных функций отдельные этапы разработки можно выносить в независимые ветки. В веб-интерфейсе сервиса ветки отображаются слева, что упрощает переход между ними. Ветки создаются в пару кликов — нужно выбрать «+» по центру экрана и нажать «New branch». Кроме того, после обновления изменений в репозитории в GitLab отображаются и новые ветки, созданные в Git. Все операции с ветками можно выполнять через настройки.
Слияние веток
В ветках разрабатывается функциональность, поэтому может потребоваться их перенос — для этого предназначены запросы слияния («Merge request gitlab»). Для использования этой возможности в интерфейсе GitLab нужно нажать кнопку «Create merge request», задать описание «Merge Request», выбрать исходную и целевые ветки. После одобрения запроса на слияние надо нажать на кнопку «Merge». В результате файлы ветки преемника будут заменены файлами из ветки источника.
Добавление пользователей
В GitLab можно добавлять неограниченное количество разработчиков даже к приватным репозиториям. Чтобы сделать это, надо перейти в меню «Настройки» (Settings) и выбрать пункт «Участники» (Members). В этом пункте в поле «Выбрать участника для приглашения» (Select members to invite) надо указать адрес электронной почты пользователя или его никнейм. Перед отправкой приглашения также указывается уровень доступа. Для добавления надо нажать «Добавить в проект» (Add to project).
Удаление проекта
Для удаления проекта нужно перейти в «Настройки» (Settings) -> «Главные» (General) -> «Продвинутые» (Advanced) и выбрать пункт «Удалить проект» (Remove Project). Перед удалением проекта потребуется ввести его имя.
Возможные проблемы
При работе с GitLab могут возникать проблемы, для каждой из которых есть решение:
- Ошибка при выполнении pull-запросов. Причиной может быть длительная фаза SSH-аутентификации или низкая скорость обработки запросов. Решается перенастройкой репозиториев.
- Ошибка при входе. Может появляться после некорректного введения логина и пароля учетной записи. Решается удалением данных через панель управления.
- Ошибка при запуске. Система может указывать на отсутствие GitLab-серверов по заявленным IP-адресам. Причиной проблемы может быть неверное введение команды запуска, использование динамического IP или ошибки при назначении порта. Решается перенастройкой.
Итог
Веб-приложение GitLab является отличным решением для построения рабочих процессов CI/CD в облаке, в том числе если системы контроля и разработки надо установить на личном сервере.
GitLab имеет множество сфер применения и широкие возможности, что в сочетании с удобным инструментарием делает его удобным сервисом как для начинающих разработчиков, так и для профессионалов.
GitLab активно развивается как продукт, подстраиваясь под актуальные потребности разработчиков, поэтому его применение оправдано в проектах любого масштаба.
Gitlab — это великолепный веб-инструмент, который можно использовать для разработки проектов любого размера и сложности. Каждый разработчик или компания может найти в Gitlab для себя подход, который сделает разработку более надежной, качественной и быстрой. Я считаю, что Gitlab CI, разграничение ролей, автоматическое тестирование и мониторинг незаменимы для разработки в командах и оценки эффективности Кирилл Шеховцов Технический лидер в SberCloud.
Источники
- Что такое GitLab, как и для чего он используется
- GitLab и GitHub: в чем различия?
- GitLab
- GitLab vs GitHub
Запросите бесплатную консультацию по вашему проекту
Настройка CI/CD для Gitlab-репозитория: схемы и гайд по шагам
Рассказываем, как работать с CI/CD. Сравнение инструментов и подробный гайд по сборке и развертыванию через Docker на удаленный сервер с помощью Gitlab CI/CD на примере Spring Boot-приложения.

Привет! Меня зовут Николай, я Backend-разработчик в РЕЛЭКС. В статье ты найдешь полезный теоретический материал и сравнение инструментов CI/CD. Покажу, как настроить сервер и поделюсь полезными командами, которые помогут в работе.
- Начнём с теории: коротко о CI/CD — это база.
- Инструменты работы с CI/CD: выбираем свой.
- Как устроен процесс CI/CD: схема работы.
- Переходим к практике: настройка виртуального сервера.
- Настройка конфига .gitlab-ci.yml.
Начнём с теории: коротко о CI/CD — это база
CI/CD (Continuous Integration / Continuous Deployment) — это непрерывная интеграция и развертывание, предназначенные для повышения удобства, частоты и надежности публикации изменений программного обеспечения или продукта, где:
CI — это практика разработки ПО, при которой изменения в коде автоматически собираются, тестируются и интегрируются в целевую ветку репозитория. Основная идея — минимизация разрыва между компонентами проекта и быстрая обратная связь о качестве кода, благодаря автоматической сборке и тестированию.
CD — это продолжение CI, которое позволяет автоматически разворачивать успешно собранный и протестированный код на сервере или другой среде реального применения. Цель — автоматизация процесса разработки и развертывания приложения или программного продукта после всех этапов проверки и тестирования. Развертывание в продакшн должно выполняться после ручного подтверждения деплоя, чтобы предоставить дополнительный уровень контроля и безопасности.
Инструментов работы с CI/CD огромное множество — самыми популярными считаются:

- Gitlab CI/CD — полностью интегрированная в GitLab система для автоматизации сборки, тестирования и развертывания программного кода. GitLab CI/CD использует файл конфигурации YAML в репозитории проекта для определения правил работы на каждом этапе в пайплайне. Поддерживает использование Docker-образов для определения окружения сборки — отсюда большая гибкость и повторное использование кода.
- Jenkins — система с открытым исходным кодом для внедрения CI/CD для автоматизации процесса разработки. Jenkins — самостоятельное приложение, которое требует настройки на сервере, зато предлагает обширный набор плагинов. Это расширяет его функциональность и интеграцию с другими системами и сервисами.
- Azure DevOps — отдельное комплексное решение от Microsoft с набором инструментов разработки. Оно позволяет командам планировать работу, совместно создавать код и доставлять приложения. Для автоматизации сборки, тестирования и развертывания приложений используется инструмент Azure Pipelines.
- TeamCity — сервер непрерывной интеграции от JetBrains. У TeamCity открытая архитектура, которая позволяет разработчикам создавать плагины для расширения функционала. Некоторые функции бесплатны, но для больших команд и проектов может потребоваться покупка коммерческой лицензии, с чем сейчас возникают сложности.
Выбор инструмента зависит от ваших целей, задач и сложности реализации.
Задача — развернуть Spring Boot-приложение, расположенное в Gitlab-репозитории на продакшн стенде. Сделать это надо с помощью удобного и простого инструмента, чтобы начать использовать его функционал сразу, «из коробки» — Gitlab CI/CD отлично подходит. Он полностью интегрирован со средой Gitlab. Не требует дополнительной установки, а также имеет поддержку и подробную документацию.
С выбором инструмента разобрались. Перейдем к главному: как устроен процесс CI/CD. Ниже — схема его работы.
Как устроен процесс CI/CD: схема работы

Алгоритм схемы следующий:
- Разработчик пишет код и заливает его в GitLab-репозиторий проекта.
- GitLab ищет в корне репозитория конфиг .gitlab-ci.yml и, когда находит, запускает пайплайн согласно описанной в конфиге логике.
Пайплайн (pipeline) представляет собой целиковый процесс из этапов или стадий (stage), которые состоят из задач (job). Каждая задача выполняется в изолированном процессе (используется GitLab Runner).
Что за термины мы описали выше?
- Раннер (gitlab runner) — приложение, в рамках которого выполняются задачи и которое можно развернуть на разных типах систем: Linux, macOS, Windows, Docker, Kubernetes и так далее.
- Задачи (jobs) — «кирпичики», из которых строится процесс CI/CD. Это может быть сборка проекта (компиляция, подтягивание зависимостей) или прогон автотестов, или публикация собранного кода в Docker-репозиторий. По умолчанию задачи выполняются изолированно, но их можно связать между собой при помощи артефактов.
- Артефакты (artifacts) — исполняемые файлы или пакеты для передачи результатов выполнения одной задачи на вход другой. Это позволяет управлять жизненным циклом программного продукта. Пример артефактов — скомпилированные бинарные файлы, архивы, образы контейнеров.
- Этапы (stages) — служат для группировки задач и определения порядка их выполнения. Задачи, принадлежащие одному этапу, выполняются параллельно, если доступно достаточное количество раннеров. Этапы будут выполняться в порядке, указанном в конфиге.
- Пайплайн (pipeline) — верхнеуровневый элемент процесса CI/CD, включающий в себя этапы и задачи.
Переходим от теории к практике. Теперь только пайплайны! Только хардкор!

Переходим к практике: настройка виртуального сервера
Переходим к настройке сервера. Процесс займет не одно действие, поэтому пойдем последовательно, шаг за шагом:
Шаг 1: Установка Docker
Официальный сайт руководства по Docker предоставляет удобный скрипт для неинтерактивной установки Docker. Такой вариант, скорее, подходит для рабочего окружения, а не для продакшена.
С помощью curl-команды скачаем sh-файл для запуска и настройки докера.
curl -fsSL https://get.docker.com -o get-docker.shЗатем запустим его для установки необходимых зависимостей.
sudo sh ./get-docker.shШаг 2: Скачивание и запуск контейнера GitLab Runner в Docker
В официальном руководстве Gitlab есть описание нескольких вариантов GitLab Runner. В этой статье рассмотрим установку через Docker — более простую для развертывания и версионирования. Также меньше нагружает сервер скачиванием дополнительных пакетов. Для наших целей будем использовать облегченный образ GitLab Runner последней версии:
docker run -d --name gitlab-runner --restart always \ -v /srv/gitlab-runner/config:/etc/gitlab-runner \ -v /var/run/docker.sock:/var/run/docker.sock \ gitlab/gitlab-runner:alpineПосле установки можно выполнить команду docker-ps и посмотреть, что появился контейнер с GitLab Runner.
Помимо создания собственных раннеров, которые привязаны к конкретному проекту или группе, в GitLab есть так называемые “Shared runners”, которые доступны для всех проектов в пределах организации или всего инстанса GitLab. Такие раннеры обычно настраиваются администраторами и имеют общую конфигурацию, которую нельзя изменить на уровне отдельного проекта.
Облачная версия gitlab.com предоставляет несколько таких раннеров, которые можно использовать для ваших проектов. Они располагаются в блоке “Shared runners”. Проверьте, чтобы был активен чекбокс “Enable shared runners for this project”.

Шаг 3: Регистрация нового GitLab Runner
— — URL GitLab-сервера, с которым должен связаться Runner.
— — токен для установления связи между Runner и сервером.
Если вы используете свою установку GitLab, то в качестве параметра Runner registration URL, указываете ее URL-адрес. Если используется облачная версия, то https://gitlab.com/.
Чтобы узнать параметр Registration token перейдите в репозиторий проекта, в левой панели откройте меню Settings > CI/CD и разверните секцию Runners. В этой секции, в разделе Project runners, нажмите на троеточие справа от кнопки New project runner, где находится токен.
docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner:alpine register \ --non-interactive \ --url \ --registration-token \ --executor docker \ --description "Brief description for the project" \ --tag-list "docker" \ --docker-image alpine:latest \ --docker-privileged \ --docker-volumes "/certs/client"Выполнили команду — переходим во вкладку Runners в настройках CI/CD проекта. Там появится зарегистрированный раннер проекта, готовый к работе.

Шаг 4: Использование Container Registry для сохранения образа приложения
У gitlab есть интегрированный реестр докер-контейнеров (Container Registry). Так, у проекта появляется собственное пространство для хранения докер-образов, которые получили на этапе сборки. Перед использованием реестра контейнеров проверьте, что эта функция включена для вашего проекта. Для это откройте вкладку Visibility, project features, permissions в общих настройках проекта и сделаете чекбокс активным.

Чтобы сохранять и отправлять изображения, нужно пройти аутентификацию в реестре контейнеров. Для аутентификации нужно использовать один из представленных типов:
В примере использовали личный токен доступа. Перейдём в настройки профиля, во вкладку Access token, где нужно выбрать Add new token.
Для всех типов токенов требуется минимальные правила:
- read_registry — доступ на чтение (pull).
- write_registry — доступ на запись (push).

Сохраните в буфер обмена получившийся токен и вставьте его в Docker команду для аутентификации в реестре контейнеров, где:
— — ваше реальное имя пользователя.
Команда выполняется на сервере, где ранее установили Docker, чтобы там взаимодействовать с реестром контейнера
docker login registry.example.com -u -p
Шаг 5: Настройка SSH-ключа
SSH-ключ используется GitLab CI/CD для входа на сервер и выполнения процедуры развертывания. Сгенерируем 4096-разрядный SSH-ключ алгоритмом RSA (пара из открытого и закрытого ключей).
Флаг -C добавляет комментарий для идентификации ключа. В качестве комментария можно указать, например, имя пользователя. подтвердите оба вопроса с помощью Enter.
ssh-keygen -t rsa -b 4096 -C
Чтобы авторизовать публичную часть SSH-ключа, осуществляющего развертывание, добавим её к authorized_keys файлу.
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keysЗатем сохраним приватный ключ в GitLab как CI/CD переменную, чтобы сделать его доступным в процессе работы раннера. Для этого выведем содержимое приватного ключа.
cat ~/.ssh/id_rsaКопируем содержимое ключа в буфер обмена, переходим в настройки CI/CD проекта во вкладку Variable и нажимаем Add variable.

Шаг 6: Определяем оставшиеся переменные окружения CI/CD
Добавим оставшиеся переменные для развертывания приложения на сервере:
SERVER_USER — имя пользователя для подключения к удаленному серверу через SSH. Можете использовать действующего пользователя или создать отдельного в системе.
SERVER_HOST — IP-адрес удаленного сервера для подключения через SSH. Для переменной сделать активной опцию Mask variable
ENV_FILE — путь к файлу с переменными окружения, который будет использован при выполнении команд Docker Compose. Для этого поля поменяете тип с variable на file. В поле для ввода переменные указываются через знак равенства с новой строки.

Таким образом в списке должны отображаться четыре переменные окружения.

На этом все подготовка закончилась. Переходим к настройке конфига .gitlab-ci.yml.
Настройка конфига .gitlab-ci.yml
Файл .gitlab-ci.yml располагается в корне репозитория и определяет структуру пайплайна и логику его работы. Gitlab при каждом поддерживаемом событии (например, push-изменений или создание merge request разработчиком) ищет его и проверяет, есть ли в нем описание для обработки наступившего события.
Ниже — файл .gitlab-ci.yml для сборки и развертывания Spring Boot-приложения в docker-контейнере.
stages: - build - deploy build-only-MR: stage: build tags: - docker image: name: gcr.io/kaniko-project/executor:v1.9.2-debug entrypoint: [ "" ] script: - /kaniko/executor --context "$" --dockerfile "$/Dockerfile" --no-push only: - merge_requests build: stage: build tags: - docker image: name: gcr.io/kaniko-project/executor:v1.9.2-debug entrypoint: [ "" ] script: - /kaniko/executor --context "$" --dockerfile "$/Dockerfile" --destination "$:latest" only: - main deploy: stage: deploy image: docker:20.10-git tags: - gitlab-org-docker variables: DOCKER_HOST: "ssh://$@$" before_script: - mkdir -p ~/.ssh - chmod 700 ~/.ssh - eval $(ssh-agent -s) - echo "$" | tr -d '\r' | ssh-add - - '[[ -f /.dockerenv || -d /run/secrets/kubernetes.io/serviceaccount ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config' - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY script: - docker compose --env-file $ENV_FILE pull - docker compose --env-file $ENV_FILE down --timeout=60 --remove-orphans - docker compose --env-file $ENV_FILE up --build --detach - docker image prune -f || true only: - main when: manualПайплайн состоит из двух этапов: сборка и развертывание.
Для этапа сборки написаны две задачи: build-only-MR и build. Обе выполняются на gitlab-runner с тегом Docker, который ранее мы зарегистрировали.
Первая — для сборки проекта только при создании merge request-а. При этом получившийся Docker-образ не сохраняется в реестре контейнеров GitLab.
Вторая задача для сборки проекта при вливании кода в ветку main. Получившийся Docker-образ пушится в реестр контейнеров GitLab с тегом latest.
Для сборки Docker-образов из Dockerfile в директории проекта используется образ Kaniko. Это мощный инструмент для сборки образов Docker, который не требует наличия Docker-демона. Например, внутри своего контейнера или кластера Kubernetes. Использование Kaniko считается более быстрым и безопасным подходом, чем Docker-in-Docker.
Этап развертывания включает в себя одну задачу, которая выполняется на общем раннере с тэгом gitlab-org-docker. Это один из Shared runner, которые предоставляет облачная версия gitlab.com.
Задача использует стандартный Docker-образ версии 20.10-git. В переменных задан путь для подключения к Docker на удаленном сервере через SSH. Переменные окружения SERVER_USER и SERVER_HOST определили ранее, как переменные CI/CD.
В блоке before_script выполняется настройка SSH для безопасного взаимодействия со стендом: создание директории, установка прав доступа для хранения SSH-ключа, инициализация SSH-агента, к которому добавляется приватный ключ из переменной окружения. После чего производится настройка параметров SSH. Затем авторизация в реестре контейнеров с использованием логина и пароля, хранящихся в переменных CI_REGISTRY_USER и CI_REGISTRY_PASSWORD — для получения доступа к собранным Docker-образам.
В блоке scripts подтягиваются обновления для образов с реестра. Затем останавливаются и удаляются текущие контейнеры — начинается запуск контейнеров в фоновом режиме с новыми скачанными образами из реестра. Крайняя команда удаляет все неиспользуемые образы.
Эта задача также выполняется только при вливании кода в ветку main и требует ручного подтверждения для запуска (опция when: manual).
Разворачивать будем REST-приложение на Java. Напишем контроллер, в котором будет один GET-запрос для теста, что приложение развернуто на удаленном сервере, и мы можем к нему обратиться.
Ниже — ключевые файлы, которые мы написали.
Тестовый GET-запрос:
@CrossOrigin @RequestMapping("/test") @RestController public class TestController < @GetMapping("/hello") public ResponseEntitygetTest() < return ResponseEntity.ok("Hello world"); >>Dockerfile
FROM maven:3.8-openjdk-17-slim RUN mkdir -p /home/app WORKDIR /home/app ADD pom.xml /home/app ADD src /home/app/src RUN mvn clean package CMD ["java", "-jar", "/home/app/target/test-0.0.1-SNAPSHOT.jar"]docker-compose.yml
version: '3.9' services: core: container_name: spring-application image: registry.gitlab.com/my-test-project6/test-cicd-project:latest environment: TEST_SERVICE_PORT: $ OPEN_API_TITLE: $ ports: - "8081:$" logging: driver: 'json-file' options: max-size: '100m' max-file: '3'Такой момент: мы используем переменные TEST_SERVICE_PORT — порт, на котором будет запущено приложение в Docker-контейнере и OPEN_API_TITLE — заголовок swagger-а. Прописав переменные в docker-compose-файле, мы указали нашему Java-приложению, что ее можно использовать как значение переменной в конфигурационном файле application.yml.
application.yml
server: port: $ servlet: context-path: /api api: title: $ springdoc: api-docs: path: /doc/api-docs swagger-ui: path: /doc/swagger-ui.htmlКогда изменения кода зальются в main-ветку, начнется выполнение задачи build. Как только сборка успешно завершилась, можно деплоить на прод, нажав на значок запуска.

Через пару минут увидим, что приложение успешно прошло сборку и развертывание в Docker-контейнере на удаленном сервере.

Приложение доступно на порту 8081. Мы можем обратиться по API /api/test/hello и увидеть заветную надпись «Hello world». Готово!

Краткие выводы
CI/CD — важная практика разработки программного обеспечения для автоматизации процесса интеграции, тестирования и развертывания кода. Благодаря CI/CD команды разработчиков могут улучшать качество ПО и доставлять новые функции эффективнее и в более короткие сроки.
Приятных «разворачиваний»! Не бойтесь сложностей — это только начало!