Непрерывная интеграция и непрерывное развертывание в SourceCraft
Непрерывная интеграция и непрерывное развертывание (CI/CD, Continuous Integration/Continuous Deployment) — это набор практик и инструментов, с помощью которых вы можете автоматически вносить изменения, тестировать и развертывать код. Такой подход позволяет постоянно улучшать качество программного обеспечения, а также ускорить разработку.
Непрерывная интеграция (CI)
Цель CI заключается в частой и регулярной интеграции изменений кода в основную ветку репозитория. Каждый коммит проходит автоматические проверки, например юнит-тесты и статический анализ кода. Таким образом можно убедиться в корректности коммита и стабильности кода. Это снижает риски интеграционных проблем, а разработчики быстрее получают обратную связь.
Непрерывное развертывание (CD)
Подход CD строится на автоматизации развертывания кода на продуктовые серверы после проверки качества кода. Это обеспечивает уверенность в том, что приложения всегда находятся в развернутом состоянии с последними обновлениями и исправлениями.
Конфигурация CI/CD
В SourceCraft встроен механизм для работы с CI/CD-процессами.
Конфигурация CI/CD задается для конкретного репозитория и хранится в корне репозитория в файле .src.ci.yaml
.
Общий вид конфигурационного файла .src.ci.yaml
:
on:
pull_request:
- workflows: [<список_рабочих_процессов>]
filter:
source_branches: [<список_исходных_веток>]
target_branches: [<список_целевых_веток>]
paths: [<список_путей>]
push:
- workflows: [<список_рабочих_процессов>]
filter:
branches: [<список_веток>]
paths: [<список_путей>]
workflows:
<имя_рабочего_процесса>:
tasks:
- name: <имя_задания>
cubes:
- name: <имя_кубика>
image: <путь_к_Docker-образу>
script:
- <выполняемый_скрипт>
...
Вы можете использовать вложенную структуру для элементов конфигурации или разметить их в виде отдельных блоков.
Пример конфигурации СI/CD в виде отдельных блоков
on:
pull_request:
- workflows: my-test-workflow
filter:
source_branches: ["**", "!test**"]
target_branches: "main"
workflows:
my-test-workflow:
tasks:
- my-test-task
tasks:
- name: my-test-task
cubes:
- name: my-test-cube
image: docker.io/library/node
script:
- echo Hello, world!
В конфигурационном файле поддерживается использование секретов. Подробнее см. в разделе Использовать значение секрета в CI/CD.
Полную спецификацию файла .src.ci.yaml
см. в репозитории templates в SourceCraft.
События-триггеры (on)
В блоке on
настраиваются события-триггеры, которые будут запускать рабочие процессы CI/CD в репозитории.
Такими событиями могут быть отправка изменений в ветку удаленного репозитория или создание пул-реквеста.
Для разных событий вы можете настроить разные рабочие процессы. Также срабатывание триггеров можно настроить для конкретных веток или путей в репозитории.
Подробнее см. на странице События-триггеры (on) в справочнике CI/CD.
Рабочие процессы (workflows)
В блоке workflows
определяется перечень рабочих процессов CI/CD.
Рабочий процесс предназначен для логического объединения заданий, связанных с определенным этапом CI/CD.
Например, один рабочий процесс может выполняться для сборки, тестов, линтинга, проверок покрытия кода (code coverage) и т. д. Перечисленные этапы будут разными заданиями, объединенными в один рабочий процесс. Другой рабочий процесс будет выполняться, например, для генерации документации и развертывания новой версии ПО в промышленную эксплуатацию.
Все рабочие процессы запускаются параллельно.
Подробнее см. на странице Рабочие процессы (workflows) в справочнике CI/CD.
Задания (tasks)
В блоке tasks
определяется перечень заданий, которые будут выполняться в рабочем процессе.
Каждое задание содержит в себе набор минимальных логических действий — кубиков. Результатом задания является выполнение всех кубиков.
Примечание
Все кубики одного задания запускаются на одной и той же виртуальной машине (воркере). Поэтому если один кубик изменит окружение воркера, например, установит пакет, создаст или удалит файл и т. д., это окружение останется для всех последующих кубиков, которые выполняются в рамках одного задания. Например, в первом кубике устанавливается пакет runtime
для языка Go, во втором выполняется команда go build
, а в следующем — go test
. Подробнее о наследовании окружения см. на странице Кубики (cubes).
Если кубики запущены в разных заданиях, то они гарантированно будут исполняться на разных воркерах.
По умолчанию задание начинается с клонирования репозитория.
Все задания рабочего процесса запускаются параллельно.
В заданиях и кубиках вы можете использовать переменные окружения, а также секреты.
Подробнее о заданиях см. на странице Задания (tasks) в справочнике CI/CD.
Кубики (cubes)
В блоке cubes
определяется перечень минимальных логических действий — кубиков, которые будут выполняться в задании.
Минимальным действием может быть вызов скрипта или запуск Docker-контейнера. Также может быть вариант вызова скрипта в Docker-контейнере.
Есть следующие виды кубиков:
-
Нативный — выполняется напрямую на виртуальной машине (воркере).
Если нативный кубик в процессе выполнения изменит окружение воркера, например, установит пакет, создаст или удалит файл и т. д., это окружение останется для всех последующих кубиков, которые выполняются в рамках одного задания.
-
Docker-кубик — выполняется внутри Docker-контейнера, который запускается на воркере. Внутри контейнера запускается пользовательский скрипт или скрипт контейнера, если для контейнера предусмотрена точка входа (entrypoint).
Если Docker-кубик в процессе выполнения изменит окружение, оно будет доступно последующим кубикам задания, только если изменения производятся внутри директории
/sourcecraft
. Все остальные изменения удаляются вместе с Docker-контейнером.При работе из контейнера директории монтируются следующим образом:
- директория, в которой находятся связанные с выполняемым заданием файлы, монтируется по пути
/sourcecraft
; - директория, в которую клонируется репозиторий, и которая по умолчанию назначается рабочей (
workdir
), монтируется по пути/sourcecraft/workspace
.
Пути указанных директорий можно получить из предопределенных переменных окружения
$SOURCECRAFT_ROOT_DIRECTORY
и$SOURCECRAFT_WORKSPACE
соответственно.Docker-кубик задается с помощью параметра image, в котором указывается название Docker-образа, а также опционально логин, пароль, точка входа и аргументы.
- директория, в которой находятся связанные с выполняемым заданием файлы, монтируется по пути
В кубиках вы можете использовать переменные окружения, а также секреты. Для передачи переменных окружения от одного кубика к последующим в виде пар KEY=VALUE
предусмотрена предопределенная переменная $SOURCECRAFT_ENV
.
Кубики внутри одного задания по умолчанию запускаются последовательно. Кубики могут быть связаны между собой через параметр needs
. В параметре указывается список кубиков, которые должны быть выполнены до запуска текущего. Если параметр не указан, кубик будет зависеть от кубика, который определен непосредственно перед ним.
Артефакты, которые могут быть созданы в результате работы кубика, сохраняются для дальнейшего использования. Их можно скачать из конкретного кубика в секции
Подробнее о кубиках см. на странице Кубики (cubes) в справочнике CI/CD.
Переменные окружения в CI/CD
В CI/CD-процессах SourceCraft поддерживаются переменные окружения. Переменные можно задать в следующих элементах конфигурации .src.ci.yaml
:
- Задание — переменные будут переданы во все связанные с заданием кубики.
- Кубик — переменные будут переданы только в конкретный кубик.
Также вы можете использовать предопределенные переменные окружения.
Важно
Не храните в переменных окружения конфиденциальные данные, например пароли, ключи доступа, токены и т. д. Для хранения таких данных используйте секреты.
Пример конфигурации с переменными окружения
tasks:
- name: my-task
# Здесь определяются переменные, которые будут переданы во все связанные с заданием кубики.
env:
TASK_VAR: test-var-'test'-\"test\"
MULTILINE_VAR: |
multi-var
multi-var
this is my multi-var
cubes:
- name: my-cube
# Здесь определяются переменные, которые будут переданы только в конкретный кубик.
env:
CUBE_VAR: "you can see me here only"
SECRET_VAR: ${{ secrets.<название_секрета> }}
script:
- echo "$TASK_VAR"
- echo "$MULTILINE_VAR"
- echo "$CUBE_VAR"
- echo "$SECRET_VAR"
Подробнее об использовании переменных окружения см. на странице Работа с переменными окружения в SourceCraft.
Предопределенные переменные окружения
В SourceCraft значения некоторых переменных окружения задаются автоматически. Вы можете использовать их в своих CI/CD-процессах.
Переменная |
Описание |
|
Показывает, что задание выполняется в CI-окружении. Значение всегда |
|
Показывает, что задание выполняется в CI/CD SourceCraft. Значение всегда |
|
Путь до директории, в которой находятся связанные с выполняемым заданием файлы. |
|
Путь до директории, в которую клонируется репозиторий, и которая по умолчанию назначается рабочей директорией ( |
|
Путь до директории, в которой находятся служебные файлы выполняемого задания. |
|
Полное имя ветки или тега, в которых запустился рабочий процесс. |
|
SHA-хэш коммита, после которого запустился рабочий процесс. |
|
Первые 8 символов |
|
SHA-хэш коммита, по отношению к которому вычисляется список изменений. Принимает различные значения, в зависимости от события, вызвавшего запуск рабочего процесса:
|
|
Полное имя целевой ветки пул-реквеста. Заполняется только при запуске проверок в пул-реквесте и их перезапусках. |
|
Тип события-триггера, которое вызвало запуск рабочего процесса:
|
|
Индикатор автоматического клонирования репозитория. Равно значению опции |
|
Имя выполняемого рабочего процесса. |
|
Имя выполняемого задания. |
|
Имя выполняемого кубика. |
|
Используемый кубиком Docker-образ. Определен только для кубиков, которые используют контейнер. |
|
Список путей до артефактов кубика относительно |
|
Автор коммита. Передается в формате |
|
Пользователь (сommitter), который добавил коммит в целевую ветку. Передается в формате |
|
Временная метка коммита в формате ISO 8601, например |
|
Сообщение коммита. |
|
Заголовок коммита. Первая строчка сообщения. |
|
Описание коммита. Если заголовок менее 100 символов — сообщение без заголовка. Иначе — сообщение целиком. |
|
Переменная, с помощью которой передаются переменные окружения от одного кубика к последующим в виде пар
Во всех кубиках, которые будут исполнены после кубика |