Непрерывная интеграция и непрерывное развертывание в 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. В параметре указывается список кубиков, которые должны быть выполнены до запуска текущего. Если параметр не указан, кубик будет зависеть от кубика, который определен непосредственно перед ним.

Артефакты, которые могут быть созданы в результате работы кубика, сохраняются для дальнейшего использования. Их можно скачать из конкретного кубика в секции Автоматизации репозитория в течение 14 дней.

Подробнее о кубиках см. на странице Кубики (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-окружении. Значение всегда true.

SOURCECRAFT_CI

Показывает, что задание выполняется в CI/CD SourceCraft. Значение всегда true.

SOURCECRAFT_ROOT_DIRECTORY

Путь до директории, в которой находятся связанные с выполняемым заданием файлы.

SOURCECRAFT_WORKSPACE

Путь до директории, в которую клонируется репозиторий, и которая по умолчанию назначается рабочей директорией (workdir) для кубиков с контейнером.

SOURCECRAFT_TASK_DATA

Путь до директории, в которой находятся служебные файлы выполняемого задания.

SOURCECRAFT_COMMIT_REF

Полное имя ветки или тега, в которых запустился рабочий процесс.

SOURCECRAFT_COMMIT_SHA

SHA-хэш коммита, после которого запустился рабочий процесс.

SOURCECRAFT_COMMIT_SHORT_SHA

Первые 8 символов SOURCECRAFT_COMMIT_SHA.

SOURCECRAFT_BASE_SHA

SHA-хэш коммита, по отношению к которому вычисляется список изменений. Принимает различные значения, в зависимости от события, вызвавшего запуск рабочего процесса:

  • SHA-хэш предыдущего коммита в ветке в случае отправки изменений в ветку удаленного репозитория (on.push).
  • SHA-хэш последнего коммита в целевой ветке (merge-base) в случае создания пул-реквеста (on.pull_request).
  • Пустое значение в случае ручного запуска CI/CD-процесса (manual).

SOURCECRAFT_BASE_REF

Полное имя целевой ветки пул-реквеста. Заполняется только при запуске проверок в пул-реквесте и их перезапусках.

SOURCECRAFT_EVENT

Тип события-триггера, которое вызвало запуск рабочего процесса:

  • push — отправка изменений в ветку удаленного репозитория.
  • pull_request — создание пул-реквеста.
  • restart — перезапуск CI/CD-процесса.
  • manual — ручной запуск CI/CD-процесса.

SOURCECRAFT_CHECKOUT_ENABLED

Индикатор автоматического клонирования репозитория. Равно значению опции checkout:enabled. Значение по умолчанию — true.

SOURCECRAFT_WORKFLOW

Имя выполняемого рабочего процесса.

SOURCECRAFT_TASK

Имя выполняемого задания.

SOURCECRAFT_CUBE

Имя выполняемого кубика.

SOURCECRAFT_CUBE_IMAGE

Используемый кубиком Docker-образ. Определен только для кубиков, которые используют контейнер.

SOURCECRAFT_CUBE_ARTIFACTS

Список путей до артефактов кубика относительно SOURCECRAFT_WORKSPACE с ; в качестве разделителя. Определен только для кубиков с заданными артефактами.

SOURCECRAFT_COMMIT_AUTHOR

Автор коммита. Передается в формате Имя email.

SOURCECRAFT_COMMITTER

Пользователь (сommitter), который добавил коммит в целевую ветку. Передается в формате Имя email.

SOURCECRAFT_COMMIT_TIMESTAMP

Временная метка коммита в формате ISO 8601, например 2025-03-03T23:41:19Z. По умолчанию в зоне UTC.

SOURCECRAFT_COMMIT_MESSAGE

Сообщение коммита.

SOURCECRAFT_COMMIT_TITLE

Заголовок коммита. Первая строчка сообщения.

SOURCECRAFT_COMMIT_DESCRIPTION

Описание коммита. Если заголовок менее 100 символов — сообщение без заголовка. Иначе — сообщение целиком.

SOURCECRAFT_ENV

Переменная, с помощью которой передаются переменные окружения от одного кубика к последующим в виде пар KEY=VALUE. Для записи в переменную используется оператор перенаправления ввода >>. Например:

cubes:
  - name: example
    script:
      - echo "VER=1.0.1" >> $SOURCECRAFT_ENV
      - echo "VAR1=SOME_VALUE" >> $SOURCECRAFT_ENV

Во всех кубиках, которые будут исполнены после кубика example, переданные значения будут находиться в переменных окружения VER и VAR1.

См. также