Окружение — набор секретов и настроек доступа для определенной среды работы приложения. Например, окружения staging и production позволяют использовать одинаковую конфигурацию рабочего процесса CI/CD для развертывания на разных стендах, подставляя разные наборы секретов.
В SourceCraft можно определить, кто получает доступ к секретам окружения и управляет ими. Секреты используются в заданиях CI/CD, а ссылки между окружениями позволяют подключать общие секреты организации, проекта или репозитория.
Примечание
Окружение само по себе не создает серверы, базы данных и другие ресурсы приложения. Действия по развертыванию задаются в кубиках CI/CD.
Для создания окружения нужна роль Ответственный за окружение или выше на организацию, проект или репозиторий, к которому будет относиться окружение. Эти разрешения также предоставляют следующие роли:
В примерах используются окружения репозитория staging и production. Для общих настроек можно создать окружение shared в организации или проекте и подключить его к окружениям репозитория.
Выберите организацию, проект или репозиторий, которому будет принадлежать окружение.
В настройках выбранного ресурса откройте раздел Окружения. В репозитории он находится в секции Настройки репозитория.
Нажмите Новое окружение.
В поле Название укажите имя, например staging.
Имя должно быть уникально в пределах выбранного ресурса и содержать от 3 до 63 символов: строчные латинские буквы, цифры и дефис. Первый символ — буква, последний — буква или цифра.
В поле Описание опишите назначение окружения, например Проверка веб-приложения перед выпуском.
Для примера из раздела Использовать окружение в CI/CD повторите шаги и создайте в том же репозитории окружение production с описанием Продуктовая среда веб-приложения.
Добавить секреты
Откройте окружение и перейдите на вкладку Секреты.
Добавить внутренний секрет
В блоке Секреты окружения нажмите Создать секрет.
Выберите тип Внутренний.
В поле Название укажите название секрета, например API_TOKEN. Используйте прописные латинские буквы, цифры и символ подчеркивания.
В поле Значение введите значение, например токен доступа к API приложения для выбранной среды.
Нажмите Добавить секрет.
В окружениях staging и production создайте секреты с одинаковым названием API_TOKEN, но разными токенами. В конфигурации CI/CD используйте одно выражение ${{ secrets.API_TOKEN }}, а нужное окружение выбирайте параметром environment рабочего процесса.
В поле Название задайте название, по которому будете обращаться к секрету из CI/CD.
В поле Сервисное подключение выберите сервисное подключение, подготовленное ранее.
В поле Секрет Lockbox выберите секрет Yandex Lockbox.
(Опционально) Чтобы подключить только часть ключей, нажмите Выбрать ключи. В блоке Ключи payload нажмите названия нужных ключей, например DB_USER и DB_PASSWORD. Нужно выбрать хотя бы один ключ. Если не настраивать выбор, будут добавлены все ключи секрета.
Нажмите Добавить секрет.
Например, если вы задали название DB_CREDENTIALS, для обращения к ключу DB_PASSWORD подключенного секрета используйте в CI/CD выражение ${{ secrets.DB_CREDENTIALS#DB_PASSWORD }}.
Изменить или удалить внутренний секрет
Чтобы изменить значение, в строке внутреннего секрета нажмите Редактировать.
В открывшемся диалоге нажмите Показать значение, чтобы разблокировать поле Значение.
Введите новое значение и нажмите Сохранить изменения.
Для удаления нажмите Удалить секрет в строке внутреннего секрета и подтвердите удаление.
Секреты из подключенных окружений изменяются в окружении-источнике при наличии соответствующих прав. Чтобы переопределить значение только для текущего окружения, создайте в нем собственный секрет с тем же ключом. Для изменения секретов нужна роль Ответственный за окружение или выше в соответствующем окружении.
Совет
Например, если из shared подключен секрет API_TOKEN, создайте в production собственный секрет API_TOKEN с токеном для продуктовой среды. Другие окружения продолжат получать общий токен. После удаления собственного секрета в production снова будет использоваться значение из shared.
Подключить другое окружение
Важно
Пользователь с правом чтения секретов текущего окружения может получить через него и секреты подключенных окружений. Отдельно назначать ему доступ к каждому источнику не требуется.
Перед добавлением ссылки проверьте состав участников текущего окружения: подключаемые секреты станут доступны пользователям с ролью Разработчик окружения и выше.
Создайте окружение с общими секретами, например shared в организации, и добавьте в него нужные секреты.
Откройте окружение репозитория, например production, и перейдите на вкладку Ссылки на секреты.
В блоке Секреты из других окружений нажмите Добавить ссылку на окружение.
В открывшемся диалоге выберите окружение, например shared. У каждого окружения указаны его владелец и описание.
Нажмите Добавить ссылку.
Если подключено несколько окружений, расставьте их в нужном порядке, перетаскивая строки за ручку слева. При одной ссылке ручка не отображается.
На вкладке Обзор включите Унаследованные секреты и проверьте итоговый список секретов и их источники. Без этой настройки отображаются только собственные секреты окружения.
Секрет ищется по ключу в следующем порядке:
В собственных секретах текущего окружения.
В подключенных окружениях по порядку ссылок, начиная с первого приоритета. Для каждой ссылки сначала проверяется подключенное окружение, затем его ссылки.
В секретах, созданных непосредственно в организации, проекте или репозитории, которому принадлежит текущее окружение.
Новая ссылка на окружение добавляется с первым приоритетом: при поиске секрета она проверяется раньше уже подключенных окружений.
Используется первое найденное значение. Если изменить порядок ссылок или удалить собственный секрет, результат поиска может измениться. Подробнее в примере с общими секретами.
Важно
Последний шаг применяется только к ресурсу, которому принадлежит текущее окружение. При поиске по ссылкам секреты самих ресурсов, которым принадлежат подключенные окружения, не проверяются. Например, ссылка на окружение организации дает доступ к секретам этого окружения и его ссылок, но не к секретам, созданным непосредственно в организации.
Если окружение недоступно для выбора, проверьте разрешенные уровни подключения и свои права. Подключения, образующие цикл, запрещены: у такого окружения отображается пометка Ссылка создаст цикл.
Отключить окружение
На вкладке Ссылки на секреты в блоке Секреты из других окружений найдите подключенное окружение и нажмите Удалить в его строке.
В открывшемся диалоге нажмите Удалить ссылку на окружение.
Секреты источника перестанут поступать по этой ссылке. Собственные секреты текущего окружения и само окружение-источник сохранятся. Перед новым запуском проверьте, что все используемые в CI/CD ключи по-прежнему доступны.
Настроить доступ
Откройте окружение и перейдите на вкладку Доступы.
Нажмите Добавить участника.
В поле Пользователи или команды выберите пользователя или команду.
Например, в staging назначьте команде разработки роль Разработчик окружения. В production назначьте эту роль участникам, которые будут запускать рабочие процессы с секретами продуктовой среды. Для просмотра информации об окружении без доступа к значениям секретов достаточно роли Просмотр окружения.
Чтобы изменить роль участника, в столбце Роль рядом с ролью нажмите , выберите новую и нажмите Обновить.
Для удаления участника в его строке нажмите и подтвердите удаление.
Замените адреса в API_URL на адреса API вашего приложения. В этом примере открытые адреса заданы непосредственно в конфигурации CI/CD, а токены хранятся в окружениях. Задания используют одинаковое обращение к секрету и один скрипт; набор секретов выбирается параметром environment рабочего процесса, на одном уровне с tasks.
Примечание
Окружение выбирается параметром environment рабочего процесса и используется для всех его заданий. В выражении secrets имя окружения не указывается. Например, при environment: production выражение ${{ secrets.API_TOKEN }} получает секрет через окружение production с учетом порядка поиска. Если параметр environment не задан, используются секреты самого репозитория.
Добавьте в корень репозитория файл check-api.sh. Например, если API принимает запрос GET с токеном в заголовке Authorization, скрипт проверки может выглядеть так:
Для этого примера на воркере должен быть доступен curl. Адаптируйте запрос под API вашего приложения. При ответе с кодом ошибки HTTP скрипт завершится с ошибкой.
Сохраните оба файла в репозитории.
Запустите вручную рабочий процесс check-staging для нужной ветки или тега и проверьте результат запуска CI/CD.
Чтобы проверить продуктовую среду, запустите check-production от имени участника с доступом к секретам production.
Оба рабочих процесса выполнят один скрипт с разными адресами API и токенами. Секрет для каждого запуска будет найден в соответствующем окружении, его ссылках или в секретах самого репозитория согласно порядку поиска.
Изменить окружение
Важно
При переименовании окружения его подключения сохраняются, а имя в конфигурации CI/CD автоматически не изменяется. Обновите параметр environment в рабочих процессах, которые используют это окружение, иначе новые запуски завершатся с ошибкой. Обращения к секретам менять не нужно: имя окружения в них не указывается.
Откройте страницу окружения.
В правом верхнем углу нажмите Редактировать.
Измените название или описание.
Нажмите Обновить окружение.
Если изменили название, обновите параметр environment в рабочих процессах CI/CD.
Например, при переименовании staging в preprod замените environment: staging на environment: preprod. Выражение ${{ secrets.API_TOKEN }} останется прежним.
Удалить окружение
Проверьте, какие рабочие процессы используют окружение и какие окружения получают из него значения. Обновите их настройки до удаления.
Откройте страницу окружения.
В правом верхнем углу нажмите Редактировать.
В секции Опасная зона нажмите Удалить окружение.
В открывшемся диалоге введите название окружения для подтверждения, например preprod.
Нажмите Удалить окружение.
Важно
Удаление окружения безвозвратно удаляет его собственные секреты, настройки доступа, а также входящие и исходящие ссылки. Другие окружения перестают получать из него секреты. Новые запуски CI/CD, которые обращаются к удаленному окружению, завершаются с ошибкой.
Перед удалением обновите конфигурацию CI/CD и настройки окружений, которые используют удаляемое окружение.
Например, перед удалением временного окружения preprod обновите параметр environment в рабочих процессах .sourcecraft/ci.yaml: укажите другое существующее окружение с необходимыми секретами. Иначе новые запуски с environment: preprod завершатся с ошибкой.