---
metadata:
  - name: generator
    content: Diplodoc Platform v5.55.2
alternate:
  - https://sourcecraft.dev/portal/docs/en/sourcecraft/concepts/ci-cd.md
  - https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/ci-cd.md
  - href: ru/sourcecraft/concepts/ci-cd.md
    type: text/markdown
    title: Markdown version
  - href: ../../llms.txt
    type: text/markdown
    title: llms.txt
---
> **Documentation Index:** Fetch the complete configuration index at https://sourcecraft.dev/portal/docs/ru/llms.txt

# Непрерывная интеграция и непрерывное развертывание в SourceCraft

[Непрерывная интеграция и непрерывное развертывание](https://ru.wikipedia.org/wiki/CI/CD) (_CI/CD_, _Continuous Integration/Continuous Deployment_) — это набор практик и инструментов, с помощью которых вы можете автоматически вносить изменения, тестировать и развертывать код. Такой подход позволяет постоянно улучшать качество программного обеспечения, а также ускорить разработку.

### Непрерывная интеграция (CI) {#ci}

Цель CI заключается в частой и регулярной интеграции изменений кода в основную ветку репозитория. Каждый коммит проходит автоматические проверки, например юнит-тесты и статический анализ кода. Таким образом можно убедиться в корректности коммита и стабильности кода. Это снижает риски интеграционных проблем, а разработчики быстрее получают обратную связь.

### Непрерывное развертывание (CD) {#cd}

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

Вы можете реализовать весь процесс CI/CD в SourceCraft, а также создавать интеграции с внешними системами с помощью [вебхуков](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/webhooks.md).

## Конфигурация CI/CD {#ci-cd-configuration}

В SourceCraft встроен механизм для работы с CI/CD-процессами.

<!-- source: ru/_includes/sourcecraft/ci-cd/config-file-description.md -->
Конфигурация CI/CD задается для конкретного репозитория и хранится в файле `.sourcecraft/ci.yaml`.

Общий вид конфигурационного файла `.sourcecraft/ci.yaml`:

```yaml
on:
  pull_request:
    - workflows: [<список_рабочих_процессов>]
      filter:
        source_branches: [<список_исходных_веток>]
        target_branches: [<список_целевых_веток>]
        paths: [<список_путей>]

  push:
    - workflows: [<список_рабочих_процессов>]
      filter:
        branches: [<список_веток>]
        paths: [<список_путей>]
    - workflows: [<список_рабочих_процессов>]
      filter:
        tags: [<список_тегов>]

  schedule:
    - workflows: [<список_рабочих_процессов>]
      interval: <интервал_запуска_в_часах_или_минутах>
      description: <произвольное_описание>
    - workflows: [<список_рабочих_процессов>]
      cron: "<cron-выражение>"
      description: <произвольное_описание>

workflows:
  <имя_рабочего_процесса>:

    tasks:
      - name: <имя_задания>
        
        cubes:
          - name: <имя_кубика>
            image: <путь_к_Docker-образу>
            script:
              - <выполняемый_скрипт>
...
```

Конфигурация может включать в себя следующие элементы:
* [События-триггеры](https://sourcecraft.dev/portal/docs/ru/sourcecraft/ci-cd-ref/on.md) (блок `on`).
* [Рабочие процессы](https://sourcecraft.dev/portal/docs/ru/sourcecraft/ci-cd-ref/workflows.md) (блок `workflows`).
* [Задания](https://sourcecraft.dev/portal/docs/ru/sourcecraft/ci-cd-ref/tasks.md) (блок `tasks`).
* [Кубики](https://sourcecraft.dev/portal/docs/ru/sourcecraft/ci-cd-ref/cubes.md) (блок `cubes`).
* [Сервисные подключения](https://sourcecraft.dev/portal/docs/ru/sourcecraft/ci-cd-ref/tokens.md) (блок `tokens`).
* [Переменные окружения](https://sourcecraft.dev/portal/docs/ru/sourcecraft/ci-cd-ref/env.md) (блок `env`).

{% note tip %}

Для файла `.sourcecraft/ci.yaml` поддерживаются вывод структуры файла, поиск деклараций и мест использования элементов. Подробнее на странице [Навигация и поиск по коду в SourceCraft](https://sourcecraft.dev/portal/docs/ru/sourcecraft/operations/code-navigation.md).

{% endnote %}

Вы можете использовать вложенную структуру для элементов конфигурации или разметить их в виде отдельных блоков.

{% cut "Пример конфигурации CI/CD в виде отдельных блоков" %}

```yaml
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
        uses: hello-cube

cubes:
  - name: hello-cube
    script:
      - echo "Hello, world!"
```

{% endcut %}

В конфигурационном файле поддерживается использование [секретов](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/index.md#secrets). Подробнее в разделе [Использовать значение секрета в CI/CD](https://sourcecraft.dev/portal/docs/ru/sourcecraft/operations/secrets.md#use-secret-in-ci-cd).
<!-- endsource: ru/_includes/sourcecraft/ci-cd/config-file-description.md -->

<!-- source: ru/_includes/sourcecraft/service-connection-note.md -->
В SourceCraft реализована безопасная аутентификация изнутри процессов [CI/CD](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/ci-cd.md) в [API](https://yandex.cloud/ru/docs/api-design-guide/concepts/general) Yandex Cloud с помощью [сервисных подключений](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/service-connections.md).
<!-- endsource: ru/_includes/sourcecraft/service-connection-note.md -->

В SourceCraft поддерживаются следующие сторонние инструменты в CI/CD:
* [запуск GitHub Actions](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/gh-actions.md)
* [использование пайплайнов GitLab](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/gl-pipelines.md)

Подробнее о работе с CI/CD на странице [Настроить CI/CD в репозитории SourceCraft](https://sourcecraft.dev/portal/docs/ru/sourcecraft/operations/ci-cd.md).

<!-- source: ru/_includes/sourcecraft/configuration-tip.md -->
{% note tip %}

Настройка и просмотр конфигураций репозитория доступны в интерфейсе SourceCraft в разделе ![image](../../_assets/console-icons/gear.svg) **Настройки репозитория** в секции ![image](../../_assets/console-icons/nut-hex.svg) **Конфигурации**. Подробнее в инструкции [Настроить конфигурации репозитория в виде кода](https://sourcecraft.dev/portal/docs/ru/sourcecraft/operations/configuration-edit.md).

{% endnote %}
<!-- endsource: ru/_includes/sourcecraft/configuration-tip.md -->

Все рабочие процессы CI/CD выполняются на [воркерах SourceCraft](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/workers.md).

### События-триггеры (on) {#on}

<!-- source: ru/_includes/sourcecraft/ci-cd/on-description.md -->
В блоке `on` настраиваются _события-триггеры_, которые будут запускать [рабочие процессы](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/ci-cd.md#workflows) CI/CD в репозитории. Такими событиями могут быть отправка изменений в ветку удаленного репозитория (`push`), создание предложения изменений (`pull_request`) или запуск по расписанию (`schedule`).

{% note warning %}

Чтобы событие-триггер сработало, файл `.sourcecraft/ci.yaml` должен находиться в основной ветке репозитория, например `main` или `master`. Установить основную ветку можно в [настройках репозитория](https://sourcecraft.dev/portal/docs/ru/sourcecraft/operations/repo-edit.md).

{% endnote %}

Для разных событий вы можете настроить разные рабочие процессы. Также срабатывание триггеров можно настроить для конкретных веток или путей в репозитории.
<!-- endsource: ru/_includes/sourcecraft/ci-cd/on-description.md -->

Подробнее на странице [События-триггеры (on)](https://sourcecraft.dev/portal/docs/ru/sourcecraft/ci-cd-ref/on.md) в справочнике CI/CD.

Помимо автоматического запуска рабочих процессов CI/CD в репозитории по определенным событиям-триггерам, вы можете [запустить](https://sourcecraft.dev/portal/docs/ru/sourcecraft/operations/run-workflow-manually.md) рабочий процесс вручную из интерфейса SourceCraft.

<!-- source: ru/_includes/sourcecraft/ci-cd/inputs-note.md -->
{% note tip %}

В разделе ![image](../../_assets/console-icons/terminal-line.svg) **Автоматизации** **→** ![image](../../_assets/console-icons/arrows-3-rotate-right.svg) **CI/CD** репозитория, а также на странице конкретного запуска для каждого [рабочего процесса](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/ci-cd.md#workflows), запущенного вручную, отображаются значения параметров.

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

{% cut "Пример отображения в интерфейсе" %}

![image](../../_assets/sourcecraft/manual-workflow-configs.png)

{% endcut %}

{% endnote %}
<!-- endsource: ru/_includes/sourcecraft/ci-cd/inputs-note.md -->

### Рабочие процессы (workflows) {#workflows}

<!-- source: ru/_includes/sourcecraft/ci-cd/workflows-description.md -->
В блоке `workflows` определяется перечень _рабочих процессов_ CI/CD.

Рабочий процесс предназначен для логического объединения [заданий](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/ci-cd.md#tasks), связанных с определенным этапом CI/CD. 

Например, один рабочий процесс может выполняться для сборки, тестов, линтинга, проверок покрытия кода (code coverage) и т. д. Перечисленные этапы будут разными заданиями, объединенными в один рабочий процесс. Другой рабочий процесс будет выполняться, например, для генерации документации и развертывания новой версии ПО в промышленную эксплуатацию.

Все рабочие процессы запускаются параллельно.

Рабочий процесс можно сделать [доступным для запуска всем участникам организации](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/public-workflows.md).
<!-- endsource: ru/_includes/sourcecraft/ci-cd/workflows-description.md -->

Подробнее на странице [Рабочие процессы (workflows)](https://sourcecraft.dev/portal/docs/ru/sourcecraft/ci-cd-ref/workflows.md) в справочнике CI/CD.

### Задания (tasks) {#tasks}

<!-- source: ru/_includes/sourcecraft/ci-cd/tasks-description.md -->
В блоке `tasks` определяется перечень _заданий_, которые будут выполняться в [рабочем процессе](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/ci-cd.md#workflows).

Каждое задание содержит в себе набор минимальных логических действий — [кубиков](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/ci-cd.md#cubes). Результатом задания является выполнение всех кубиков.

{% note info %}

Все кубики одного задания запускаются на одной и той же виртуальной машине (воркере). Поэтому если один кубик изменит окружение воркера, например, установит пакет, создаст или удалит файл и т. д., это окружение останется для всех последующих кубиков, которые выполняются в рамках одного задания. Например, в первом кубике устанавливается пакет `runtime` для языка Go, во втором выполняется команда `go build`, а в следующем — `go test`. Подробнее о наследовании окружения на странице [Кубики (cubes)](https://sourcecraft.dev/portal/docs/ru/sourcecraft/ci-cd-ref/cubes.md).

Если кубики запущены в разных заданиях, то они гарантированно будут исполняться на разных воркерах.

{% endnote %}

По умолчанию задание начинается с клонирования репозитория.

Все задания рабочего процесса запускаются параллельно.

В заданиях и кубиках вы можете использовать [переменные окружения](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/ci-cd.md#variables), а также [секреты](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/index.md#secrets).
<!-- endsource: ru/_includes/sourcecraft/ci-cd/tasks-description.md -->

Задания, связанные через параметр `needs`, могут передавать друг другу выходные значения через блок `outputs`. Подробнее на странице [Передача данных между заданиями CI/CD SourceCraft](https://sourcecraft.dev/portal/docs/ru/sourcecraft/ci-cd-ref/data-between-tasks.md).

Подробнее о заданиях на странице [Задания (tasks)](https://sourcecraft.dev/portal/docs/ru/sourcecraft/ci-cd-ref/tasks.md) в справочнике CI/CD.

### Кубики (cubes) {#cubes}

<!-- source: ru/_includes/sourcecraft/ci-cd/cubes-description.md -->
В блоке `cubes` определяется перечень минимальных логических действий — _кубиков_, которые будут выполняться в [задании](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/ci-cd.md#tasks).

Минимальным действием может быть вызов скрипта или запуск Docker-контейнера. Также может быть вариант вызова скрипта в Docker-контейнере.

Есть следующие виды кубиков:

* _Нативный_ — выполняется напрямую на [воркере](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/workers.md). 

  Если нативный кубик в процессе выполнения изменит окружение воркера, например, установит пакет, создаст или удалит файл и т. д., это окружение останется для всех последующих кубиков, которые выполняются в рамках одного задания.

* _Docker-кубик_ — выполняется внутри Docker-контейнера, который запускается на воркере. Внутри контейнера запускается пользовательский скрипт или скрипт контейнера, если для контейнера предусмотрена точка входа (entrypoint).

  Если Docker-кубик в процессе выполнения изменит окружение, оно будет доступно последующим кубикам задания, только если изменения производятся внутри директории `/sourcecraft`. Все остальные изменения удаляются вместе с Docker-контейнером.

  При работе из контейнера директории монтируются следующим образом:
  * директория, в которой находятся связанные с выполняемым заданием файлы, монтируется по пути `/sourcecraft`;
  * директория, в которую клонируется репозиторий, и которая по умолчанию назначается рабочей (`workdir`), монтируется по пути `/sourcecraft/workspace`.

  Пути указанных директорий можно получить из [предопределенных переменных окружения](https://sourcecraft.dev/portal/docs/ru/sourcecraft/ci-cd-ref/predefined-variables.md) `$SOURCECRAFT_ROOT_DIRECTORY` и `$SOURCECRAFT_WORKSPACE` соответственно.

  Docker-кубик задается с помощью параметра [image](https://sourcecraft.dev/portal/docs/ru/sourcecraft/ci-cd-ref/cubes.md#image), в котором указывается название Docker-образа, а также опционально логин, пароль, точка входа и аргументы.

* _Devcontainer-кубик_ — выполняется в окружении, которое задано [спецификацией Development Container](https://containers.dev/implementors/spec/). Такой кубик собирает контейнер по конфигурации из репозитория и запускает в нем пользовательский скрипт.

  Devcontainer-кубик задается с помощью параметра [devcontainer](https://sourcecraft.dev/portal/docs/ru/sourcecraft/ci-cd-ref/cubes.md#devcontainer), в котором указывается путь к директории со спецификацией `devcontainer.json` и `Dockerfile`. 
  
  [Примеры спецификаций Development Container](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/spaces-env-config.md#examples)

В кубиках вы можете использовать [переменные окружения](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/ci-cd.md#variables), а также [секреты](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/index.md#secrets). Для передачи переменных окружения от одного кубика к последующим в виде пар `KEY=VALUE` предусмотрена [предопределенная переменная](https://sourcecraft.dev/portal/docs/ru/sourcecraft/ci-cd-ref/predefined-variables.md) `$SOURCECRAFT_ENV`.

Кубики внутри одного задания по умолчанию запускаются последовательно. Кубики могут быть связаны между собой через параметр `needs`. В параметре указывается список кубиков, которые должны быть выполнены до запуска текущего. Если параметр не указан, кубик будет зависеть от кубика, который определен непосредственно перед ним.

Артефакты, которые могут быть созданы в результате работы кубика, сохраняются для дальнейшего использования. Их можно скачать из конкретного кубика в секции ![image](../../_assets/console-icons/arrows-3-rotate-right.svg) **CI/CD** репозитория в течение 14 дней.
<!-- endsource: ru/_includes/sourcecraft/ci-cd/cubes-description.md -->

Кубики одного задания могут передавать друг другу переменные окружения и выходные значения. Подробнее на странице [Передача переменных окружения от одного кубика к другому в CI/CD SourceCraft](https://sourcecraft.dev/portal/docs/ru/sourcecraft/ci-cd-ref/env-vars-between-cubes.md).

Подробнее о кубиках на странице [Кубики (cubes)](https://sourcecraft.dev/portal/docs/ru/sourcecraft/ci-cd-ref/cubes.md) в справочнике CI/CD.

## Переменные окружения в CI/CD {#variables}

<!-- source: ru/_includes/sourcecraft/ci-cd/ci-variables-description.md -->
В CI/CD-процессах SourceCraft поддерживаются переменные окружения. Доступны следующие области видимости переменных:
* Глобальная — переменные будут переданы во все кубики всех заданий во всех рабочих процессах.
* [Рабочий процесс](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/ci-cd.md#workflows) — переменные будут переданы во все кубики всех заданий конкретного рабочего процесса.
* [Задание](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/ci-cd.md#tasks) — переменные будут переданы во все связанные с заданием кубики.
* [Кубик](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/ci-cd.md#cubes) — переменные будут переданы только в конкретный кубик.

Переменные можно переиспользовать во вложенных областях видимости.

Также вы можете использовать [предопределенные переменные окружения](https://sourcecraft.dev/portal/docs/ru/sourcecraft/ci-cd-ref/predefined-variables.md).

{% note warning %}

Не храните в переменных окружения конфиденциальные данные, например пароли, ключи доступа, токены и т. д. Для хранения таких данных используйте [секреты](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/index.md#secrets).

{% endnote %}
<!-- endsource: ru/_includes/sourcecraft/ci-cd/ci-variables-description.md -->

### Пример конфигурации с переменными окружения {#variables-example}

<!-- source: ru/_includes/sourcecraft/ci-cd/config-with-vars.md -->
```yaml
# Здесь определяются переменные с глобальной областью видимости,
# они будут переданы во все кубики всех заданий во всех рабочих процессах
env:
  GLOBAL_VAR: global_var
  GLOBAL_SECRET: ${{ secrets.<название_секрета> }}

workflows:
  my-workflow:
    # Здесь определяются переменные, которые будут доступны во всех кубиках 
    # всех заданий рабочего процесса my-workflow
    env:
      WORKFLOW_VAR: workflow-var
    
    tasks:
      - name: my-task
        # Здесь определяются переменные, которые будут доступны во всех кубиках 
        # внутри задания my-task
        env:
          TASK_ENV_VAR: This variable is available in all cubes of this task.
          # Многострочная переменная
          MULTILINE_VAR: |
            multi-var
            multi-var
            this is my multi-var
        
        cubes:
          - name: my-cube-1
            # Здесь определяются переменные, которые будут доступны только внутри
            # кубика my-cube-1
            env:
              CUBE_ENV_VAR: This variable is available only in cube my-cube-1.
              # Переменная, значение которой задается из секрета
              SECRET_VAR: ${{ secrets.<название_секрета> }}
              # Переиспользование переменных из глобальной области видимости, 
              # например GLOBAL_VAR и GLOBAL_SECRET
              LOCAL_VAR: ${{ env.<глобальная_переменная_1> }}
              LOCAL_SECRET: ${{ env.<глобальная_переменная_2> }}
              # Переиспользование переменных из области видимости рабочего
              # процесса, например WORKFLOW_VAR
              LOCAL_VAR2: ${{ env.<переменная_рабочего_процесса> }}

            script:
              - echo "$TASK_ENV_VAR"
              - echo "$MULTILINE_VAR"
              - echo "$CUBE_ENV_VAR"
              - echo "$SECRET_VAR"
              - echo "$WORKFLOW_VAR"
              - echo "$LOCAL_VAR"
              - echo "$LOCAL_VAR2"
              - echo "$LOCAL_SECRET"

          - name: my-cube-2
            # Здесь определяются переменные, которые будут доступны только внутри 
            # кубика my-cube-2
            env:
              CUBE_ENV_VAR: This variable is available only in cube my-cube-2.
            script:
              - echo "$TASK_ENV_VAR"
              - echo "$CUBE_ENV_VAR"
              # Использование предопределенной переменной
              - echo "$SOURCECRAFT_TASK"
              - echo "$WORKFLOW_VAR"
              - echo "$GLOBAL_VAR"

      - name: my-task-2
        cubes:
          - name: my-cube-3
            script:
              - echo "$WORKFLOW_VAR"
              - echo "$GLOBAL_VAR"
```
<!-- endsource: ru/_includes/sourcecraft/ci-cd/config-with-vars.md -->

Подробнее об использовании переменных окружения на странице [Работа с переменными окружения в SourceCraft](https://sourcecraft.dev/portal/docs/ru/sourcecraft/operations/variables.md).

#### Полезные ссылки {#see-also}

* [Шаблоны репозиториев](https://sourcecraft.dev/sourcecraft/repos)
* [Настроить CI/CD в репозитории SourceCraft](https://sourcecraft.dev/portal/docs/ru/sourcecraft/operations/ci-cd.md)
* [Справочник CI/CD](https://sourcecraft.dev/portal/docs/ru/sourcecraft/ci-cd-ref/index.md)
* [Настройка CI/CD с Yandex Cloud Functions](https://sourcecraft.dev/portal/docs/ru/sourcecraft/tutorials/ci-cd-sourcecraft-functions.md)
* [Правила ревью кода в SourceCraft](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/code-review.md)
* [Настроить правила ревью кода в репозитории SourceCraft](https://sourcecraft.dev/portal/docs/ru/sourcecraft/operations/code-review.md)
* [Политики веток в SourceCraft](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/branch-policies.md)
* [Настроить политику веток в репозитории SourceCraft](https://sourcecraft.dev/portal/docs/ru/sourcecraft/operations/branch-policies.md)
* [Интеграция с GitHub Actions в SourceCraft](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/gh-actions.md)
* [Пайплайны GitLab в CI/CD SourceCraft](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/gl-pipelines.md)
* [Вебхуки в SourceCraft](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/webhooks.md)
