Переиспользование параметров рабочих процессов и кубиков в CI/CD SourceCraft
В CI/CD SourceCraft можно один раз описать общие параметры рабочих процессов и кубиков, а затем переиспользовать их с помощью параметра uses. Это сокращает повторяющиеся фрагменты конфигурации и упрощает ее поддержку: общую последовательность действий достаточно обновить в одном месте.
Например, для развертывания нескольких сервисов можно задать общий рабочий процесс и передавать ему имя нужного сервиса. Кубики можно подключать из текущего файла конфигурации, других файлов и репозиториев.
Рабочие процессы
Если несколько рабочих процессов выполняют одинаковые последовательности заданий, опишите эту последовательность один раз и переиспользуйте ее с разными входными параметрами. Для этого:
- В блоке
workflowsфайла.sourcecraft/ci.yamlопределите переиспользуемый рабочий процесс. Объявите его входные параметры в блоке inputs и используйте их значения в конфигурации. - В вызывающем рабочем процессе укажите имя переиспользуемого рабочего процесса в параметре
uses. - Передайте значения его входных параметров в блоке
with. Ключи в этом блоке должны соответствовать именам параметров вinputsпереиспользуемого рабочего процесса, а значения — их типам и ограничениям.
Примечание
Вызывающий рабочий процесс может иметь собственный блок inputs. Имена и настройки входных параметров вызывающего и переиспользуемого рабочих процессов могут различаться. Сопоставьте параметры в блоке with.
Пример переиспользования параметров рабочего процесса
В примере release-workflow содержит общую последовательность сборки, проверки и развертывания приложения. Рабочие процессы для отдельных сервисов переиспользуют эту последовательность и передают имя нужного сервиса через параметр RELEASE_APP.
Предполагается, что в репозитории есть скрипты build.sh, check.sh и deploy.sh, которые принимают имя сервиса в качестве аргумента:
workflows:
release-workflow:
inputs:
RELEASE_APP:
type: choice
required: true
options:
- service1
- service2
- service3
env:
RELEASE_APP: ${{ inputs.RELEASE_APP }}
tasks:
- name: build-app
cubes:
- name: build
script:
- ./build.sh "$RELEASE_APP"
- name: run-compliance-checks
needs: [build-app]
cubes:
- name: check
script:
- ./check.sh "$RELEASE_APP"
- name: deploy-app
needs: [build-app, run-compliance-checks]
cubes:
- name: deploy
script:
- ./deploy.sh "$RELEASE_APP"
service1-release-workflow:
uses: release-workflow
with:
RELEASE_APP: service1
service2-release-workflow:
uses: release-workflow
with:
RELEASE_APP: service2
service3-release-workflow:
uses: release-workflow
with:
RELEASE_APP: service3
manual-release-workflow:
inputs:
TARGET_APP:
type: choice
required: true
default: service3
options:
- service1
- service2
- service3
uses: release-workflow
with:
RELEASE_APP: ${{ inputs.TARGET_APP }}
В рабочем процессе manual-release-workflow имя сервиса задается входным параметром TARGET_APP. Выражение ${{ inputs.TARGET_APP }} в блоке with передает его значение в параметр RELEASE_APP переиспользуемого рабочего процесса. Таким образом, имена входных параметров вызывающего и переиспользуемого рабочих процессов могут различаться.
Кубики
С помощью параметра uses в текущем кубике можно переиспользовать параметры другого кубика. В зависимости от того, где определен переиспользуемый кубик, применяется следующий синтаксис:
-
uses: <имя_кубика>— для кубиков, определенных в.sourcecraft/ci.yaml. Подробнее в подразделе Пример переиспользования параметров кубика внутри одного .sourcecraft/ci.yaml. -
uses: ./<путь_к_файлу_в_репозитории>/cubes/<имя_кубика>— для кубиков, определенных в произвольном YAML-файле этого же репозитория. Подробнее в подразделе Пример переиспользования параметров кубика из произвольного YAML-файла этого же репозитория. Количество файлов с кубиками или количество кубиков в каждом файле не ограничено.Важно
Путь должен начинаться с
./. После пути к файлу должно быть указано/cubes/<имя_кубика>. -
uses: <слаг_организации>/<слаг_репозитория>/<путь_к_файлу_в_репозитории>/cubes/<имя_кубика>— для кубиков, определенных в произвольном YAML-файле другого репозитория. Подробнее в подразделе Пример переиспользования параметров кубика из произвольного YAML-файла другого репозитория.Важно
Чтобы переиспользовать кубик из другого репозитория, у этого кубика должен быть задан флаг
exported: true. Если флаг не задан, то попытка переиспользовать кубик в другом репозитории завершится ошибкой.
Вы можете переопределить отдельные параметры текущего кубика. Подробнее в подразделе Пример переиспользования параметров кубика внутри одного .sourcecraft/ci.yaml.
Пример переиспользования параметров кубика внутри одного .sourcecraft/ci.yaml
cubes:
- name: external-cube
env:
CUBE_VAR: hello
script:
- echo $CUBE_VAR
tasks:
- name: first-task
cubes:
- name: first-cube
uses: external-cube
# Переиспользование кубика с переопределением параметра
- name: second-cube
env:
CUBE_VAR: world
uses: external-cube
workflows:
first-workflow:
tasks:
- first-task
Пример переиспользования параметров кубика из произвольного YAML-файла этого же репозитория
Файл с переиспользуемым кубиком .ci-files/cubes/bash-lib.yaml:
cubes:
- name: external-cube-1
env:
CUBE_VAR: hello
script:
- echo $CUBE_VAR
- name: external-cube-2
script:
- echo "world"
Файл .sourcecraft/ci.yaml:
tasks:
- name: first-task
cubes:
- name: first-cube
uses: ./.ci-files/cubes/bash-lib.yaml/cubes/external-cube-1
workflows:
first-workflow:
tasks:
- first-task
- name: second-task
cubes:
- name: second-cube
uses: ./.ci-files/cubes/bash-lib.yaml/cubes/external-cube-2
Пример переиспользования параметров кубика из произвольного YAML-файла другого репозитория
Файл с переиспользуемым кубиком .ci-files/cubes/bash-lib.yaml в другом репозитории myrepo организации myorg:
cubes:
- name: external-cube-1
env:
CUBE_VAR: hello
script:
- echo $CUBE_VAR
# Флаг, разрешающий использовать кубик в других репозиториях
exported: true
- name: external-cube-2
script:
- echo "world"
exported: true
Файл .sourcecraft/ci.yaml репозитория, в котором настраивается CI:
tasks:
- name: first-task
cubes:
- name: first-cube
uses: myorg/myrepo/.ci-files/cubes/bash-lib.yaml/cubes/external-cube-1
workflows:
first-workflow:
tasks:
- first-task
- name: second-task
cubes:
- name: second-cube
uses: myorg/myrepo/.ci-files/cubes/bash-lib.yaml/cubes/external-cube-2