---
metadata:
  - name: generator
    content: Diplodoc Platform v5.64.0
alternate:
  - https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/environments.md
  - href: https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/environments.md
    type: text/markdown
    title: Markdown version
  - href: https://sourcecraft.dev/portal/docs/ru/llms.txt?revision=r21865753
    rel: describedby
title: Окружения в SourceCraft
description: 'Окружения в SourceCraft: секреты, подключение общих секретов, порядок поиска значений и права доступа.'
---
> **Documentation Index:** Fetch the complete configuration index at https://sourcecraft.dev/portal/docs/ru/llms.txt?revision=r21865753


# Окружения в SourceCraft

<!-- source: ru/_includes/sourcecraft/environments/intro.md -->
_Окружение_ — набор секретов и настроек доступа для определенной среды работы приложения. Например, окружения `staging` и `production` позволяют использовать одинаковую конфигурацию рабочего процесса CI/CD для развертывания на разных стендах, подставляя разные наборы секретов.

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

{% note info %}

Окружение само по себе не создает серверы, базы данных и другие ресурсы приложения. Действия по развертыванию задаются в [кубиках CI/CD](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/ci-cd.md#cubes).

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

## Уровни окружений {#levels}

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

Имя окружения уникально в пределах его владельца. Например, организация и репозиторий могут иметь собственные окружения `production`. Это независимые окружения: совпадение имен не объединяет их секреты. Чтобы использовать общие секреты, нужно явно [подключить другое окружение](#links).

<!-- source: ru/_includes/sourcecraft/environments/repository-warning.md -->
{% note warning %}

Окружение нужно [создать](https://sourcecraft.dev/portal/docs/ru/sourcecraft/operations/environments.md#create) заранее в репозитории: наличие одноименного окружения организации или проекта не заменяет окружение репозитория. Если указанное окружение отсутствует в репозитории, запуск рабочего процесса завершится с ошибкой.

{% endnote %}
<!-- endsource: ru/_includes/sourcecraft/environments/repository-warning.md -->

## Секреты {#values}

_Секреты_ хранят конфиденциальные значения: пароли, токены, ключи доступа. В окружение можно добавить внутренний секрет SourceCraft или подключить секрет из [Yandex Lockbox](https://sourcecraft.dev/portal/docs/ru/sourcecraft/operations/lockbox-integration.md) через [сервисное подключение](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/service-connections.md). Значения секретов маскируются в логах CI/CD.

В файле `.sourcecraft/ci.yaml` внутренний секрет окружения задается выражением `${{ secrets.<название_секрета> }}`, например `${{ secrets.API_TOKEN }}`. Окружение указывается в параметре [environment](https://sourcecraft.dev/portal/docs/ru/sourcecraft/ci-cd-ref/workflows.md#environment) рабочего процесса.

Чтобы передать секрет в скрипт кубика, присвойте выражение переменной в блоке [env](https://sourcecraft.dev/portal/docs/ru/sourcecraft/ci-cd-ref/env.md). Окружение хранит секреты, а `env` определяет, под какими именами они доступны процессам задания или кубика.

{% note info %}

<!-- source: ru/_includes/sourcecraft/environments/explicit-values.md -->
Окружение выбирается параметром [environment](https://sourcecraft.dev/portal/docs/ru/sourcecraft/ci-cd-ref/workflows.md#environment) рабочего процесса и используется для всех его заданий. В выражении `secrets` имя окружения не указывается. Например, при `environment: production` выражение `${{ secrets.API_TOKEN }}` получает секрет через окружение `production` с учетом [порядка поиска](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/environments.md#priority). Если параметр `environment` не задан, используются секреты самого репозитория.
<!-- endsource: ru/_includes/sourcecraft/environments/explicit-values.md -->

{% endnote %}

Открытые настройки, например адрес API или уровень логирования, задавайте в блоке [env](https://sourcecraft.dev/portal/docs/ru/sourcecraft/ci-cd-ref/env.md) конфигурации CI/CD. Подробнее на странице [Работа с переменными окружения в SourceCraft](https://sourcecraft.dev/portal/docs/ru/sourcecraft/operations/variables.md).

## Подключение других окружений {#links}

_Ссылка на окружение_ подключает его секреты к текущему окружению. Значения не копируются: при обращении к секрету выполняется [поиск по ключу](#priority). Так можно централизованно обновлять общие секреты.

Подключать можно окружения того же владельца и его родительских ресурсов:

#|
|| **Текущее окружение** | **Какие окружения можно подключить** ||
|| Организации | Другие окружения этой организации ||
|| Проекта | Другие окружения этого проекта и окружения его организации ||
|| Репозитория | Другие окружения этого репозитория, его проекта и организации ||
|#

Нельзя подключить окружение постороннего репозитория, другого проекта или другой организации. Циклические подключения также запрещены. Например, если `staging` подключает `shared`, окружение `shared` не может подключить `staging`, в том числе через промежуточное окружение.

### Приоритет значений {#priority}

<!-- source: ru/_includes/sourcecraft/environments/priority.md -->
Секрет ищется по ключу в следующем порядке:

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

Новая ссылка на окружение добавляется с первым приоритетом: при поиске секрета она проверяется раньше уже подключенных окружений.

Используется первое найденное значение. Если изменить порядок ссылок или удалить собственный секрет, результат поиска может измениться. Подробнее в [примере с общими секретами](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/environments.md#shared-example).

{% note warning %}

Последний шаг применяется только к ресурсу, которому принадлежит текущее окружение. При поиске по ссылкам секреты самих ресурсов, которым принадлежат подключенные окружения, не проверяются. Например, ссылка на окружение организации дает доступ к секретам этого окружения и его ссылок, но не к секретам, созданным непосредственно в организации.

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

### Доступ через ссылку {#linked-access}

<!-- source: ru/_includes/sourcecraft/environments/edit-linked-values.md -->
Секреты из подключенных окружений изменяются в окружении-источнике при наличии соответствующих прав. Чтобы переопределить значение только для текущего окружения, создайте в нем собственный секрет с тем же ключом. Для изменения секретов нужна роль [Ответственный за окружение](https://sourcecraft.dev/portal/docs/ru/sourcecraft/security/index.md#src-environments-maintainer) или выше в соответствующем окружении.

{% note tip %}

Например, если из `shared` подключен секрет `API_TOKEN`, создайте в `production` собственный секрет `API_TOKEN` с токеном для продуктовой среды. Другие окружения продолжат получать общий токен. После удаления собственного секрета в `production` снова будет использоваться значение из `shared`.

{% endnote %}
<!-- endsource: ru/_includes/sourcecraft/environments/edit-linked-values.md -->

Для управления ссылками нужна роль [Ответственный за окружение](https://sourcecraft.dev/portal/docs/ru/sourcecraft/security/index.md#src-environments-maintainer) или выше в текущем окружении. Для подключения другого окружения репозитория пользователю также требуется право чтения его секретов. Для подключения окружения непубличной организации или проекта требуется участие в соответствующей организации или проекте.

## Управление доступом {#access}

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

Создатель окружения автоматически получает в нем роль [Администратор окружения](https://sourcecraft.dev/portal/docs/ru/sourcecraft/security/index.md#src-environments-admin).

Для окружений предусмотрены роли [Просмотр окружения](https://sourcecraft.dev/portal/docs/ru/sourcecraft/security/index.md#src-environments-viewer), [Разработчик окружения](https://sourcecraft.dev/portal/docs/ru/sourcecraft/security/index.md#src-environments-developer), [Ответственный за окружение](https://sourcecraft.dev/portal/docs/ru/sourcecraft/security/index.md#src-environments-maintainer) и [Администратор окружения](https://sourcecraft.dev/portal/docs/ru/sourcecraft/security/index.md#src-environments-admin).

Роль [Просмотр репозитория](https://sourcecraft.dev/portal/docs/ru/sourcecraft/security/index.md#src-repositories-viewer) включает `Просмотр окружения`, [Ответственный за репозиторий](https://sourcecraft.dev/portal/docs/ru/sourcecraft/security/index.md#src-repositories-maintainer) — `Ответственный за окружение`, а [Администратор репозитория](https://sourcecraft.dev/portal/docs/ru/sourcecraft/security/index.md#src-repositories-admin) — `Администратор окружения`. Эти права наследуются и через соответствующие роли проекта.

Роль [Разработчик репозитория](https://sourcecraft.dev/portal/docs/ru/sourcecraft/security/index.md#src-repositories-developer) сама по себе не дает доступ к значениям секретов именованного окружения. Например, назначьте команде разработки роль `Разработчик окружения` в `staging`, а в `production` — `Просмотр окружения`. Команда сможет использовать секреты тестовой среды и просматривать информацию о продуктовом окружении без доступа к его секретам.

<!-- source: ru/_includes/sourcecraft/environments/linked-access-warning.md -->
{% note warning %}

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

Перед добавлением ссылки проверьте [состав участников текущего окружения](https://sourcecraft.dev/portal/docs/ru/sourcecraft/operations/environments.md#access): подключаемые секреты станут доступны пользователям с ролью `Разработчик окружения` и выше.

{% endnote %}
<!-- endsource: ru/_includes/sourcecraft/environments/linked-access-warning.md -->

Как назначить роли, описано в разделе [Настроить доступ](https://sourcecraft.dev/portal/docs/ru/sourcecraft/operations/environments.md#access).


## Изменение и удаление окружений {#lifecycle}

{% note warning %}

<!-- source: ru/_includes/sourcecraft/environments/rename-warning.md -->
При переименовании окружения его подключения сохраняются, а имя в конфигурации CI/CD автоматически не изменяется. Обновите параметр `environment` в рабочих процессах, которые используют это окружение, иначе новые запуски завершатся с ошибкой. Обращения к секретам менять не нужно: имя окружения в них не указывается.
<!-- endsource: ru/_includes/sourcecraft/environments/rename-warning.md -->

<!-- source: ru/_includes/sourcecraft/environments/delete-warning.md -->
Удаление окружения безвозвратно удаляет его собственные секреты, настройки доступа, а также входящие и исходящие ссылки. Другие окружения перестают получать из него секреты. Новые запуски CI/CD, которые обращаются к удаленному окружению, завершаются с ошибкой.

Перед удалением обновите конфигурацию CI/CD и настройки окружений, которые используют удаляемое окружение.
<!-- endsource: ru/_includes/sourcecraft/environments/delete-warning.md -->

{% endnote %}


Удаление ссылки на окружение деактивирует только подключение: само окружение-источник и его значения остаются доступны.

## Примеры использования {#examples}

### Тестовое и продуктовое окружения {#staging-production-example}

В репозитории веб-приложения создайте окружения `staging` и `production`. В каждом сохраните секрет `API_TOKEN` с токеном доступа к API соответствующей среды. В `staging` назначьте команде разработки роль `Разработчик окружения`, а в `production` предоставьте доступ к секретам только участникам, которым нужно проверять продуктовое приложение.

Для тестовой среды укажите в рабочем процессе `environment: staging`, а для продуктовой — `environment: production`. В обоих случаях используйте одно выражение `${{ secrets.API_TOKEN }}`: конфигурация обращения к секрету и скрипт остаются одинаковыми, а токен выбирается из соответствующего окружения. Полный пример конфигурации и скрипта приведен в [инструкции](https://sourcecraft.dev/portal/docs/ru/sourcecraft/operations/environments.md#ci-cd).

### Общие секреты и переопределение значений {#shared-example}

Организация хранит общие секреты в окружении `shared`, а секреты для сервисов наблюдаемости — в `observability`. Окружение репозитория `production` подключает `observability` с первым приоритетом и `shared` — со вторым. Кроме того, в самом репозитории создан секрет `REPO_API_KEY`.

#|
|| **Ключ секрета** | **production** | **observability** | **shared** | **Секреты репозитория** | **Источник значения** ||
|| `API_TOKEN` | Токен продуктовой среды | Токен наблюдаемости | Общий токен | Не задан | `production` — собственный секрет ||
|| `MONITORING_TOKEN` | Не задан | Токен наблюдаемости | Общий токен | Не задан | `observability` — первая ссылка ||
|| `COMPANY_API_KEY` | Не задан | Не задан | Общий ключ API | Не задан | `shared` — вторая ссылка ||
|| `REPO_API_KEY` | Не задан | Не задан | Не задан | Ключ репозитория | Сам репозиторий — после поиска по ссылкам ||
|#

Если удалить собственный секрет `API_TOKEN` из `production`, будет использован токен из `observability`. Если после этого поставить `shared` первым в списке ссылок, будет использован общий токен.

Для получения общего секрета в CI/CD укажите в рабочем процессе `environment: production` и используйте `${{ secrets.COMPANY_API_KEY }}`. Источник значения определяется по ссылкам окружения `production`.

В заданиях этого рабочего процесса выражение `${{ secrets.REPO_API_KEY }}` получит секрет самого репозитория, поскольку его нет ни в `production`, ни в подключенных окружениях. Если секрет `ORG_API_KEY` создан непосредственно в организации, но отсутствует в ее окружениях `shared` и `observability` и в репозитории, выражение `${{ secrets.ORG_API_KEY }}` его не получит: поиск по ссылкам не обращается к секретам самой организации.

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

* [Работа с окружениями в SourceCraft](https://sourcecraft.dev/portal/docs/ru/sourcecraft/operations/environments.md)
* [Непрерывная интеграция и непрерывное развертывание в SourceCraft](https://sourcecraft.dev/portal/docs/ru/sourcecraft/concepts/ci-cd.md)
* [Управлять секретами в репозитории SourceCraft](https://sourcecraft.dev/portal/docs/ru/sourcecraft/operations/secrets.md)
* [Работа с переменными окружения в SourceCraft](https://sourcecraft.dev/portal/docs/ru/sourcecraft/operations/variables.md)
* [Управление доступом в SourceCraft](https://sourcecraft.dev/portal/docs/ru/sourcecraft/security/index.md)
