Рабочие процессы (workflows)
В блоке workflows определяется перечень рабочих процессов CI/CD.
Рабочий процесс предназначен для логического объединения заданий, связанных с определенным этапом CI/CD.
Например, один рабочий процесс может выполняться для сборки, тестов, линтинга, проверок покрытия кода (code coverage) и т. д. Перечисленные этапы будут разными заданиями, объединенными в один рабочий процесс. Другой рабочий процесс будет выполняться, например, для генерации документации и развертывания новой версии ПО в промышленную эксплуатацию.
Все рабочие процессы запускаются параллельно.
Рабочий процесс можно сделать доступным для запуска всем участникам организации.
Поддерживаются следующие параметры:
-
tasks— список заданий, которые будут выполняться в рабочем процессе; -
settings— настройки, которые будут использоваться для всего рабочего процесса. -
env— переменные окружения, доступные во всех кубиках всех заданий конкретного рабочего процесса. Подробнее см. Пример рабочего процесса с использованием секретов и переменных, в том числе предопределенных. -
runs_on— метки воркера, на котором будут запущены задания рабочего процесса. -
inputs— параметры для ручного запуска рабочего процесса.
settings
В блоке settings указываются общие для всего рабочего процесса настройки:
-
max_cube_duration— максимальная длительность выполнения кубика в секундах (s) или минутах (m). Значение по умолчанию — 5 минут. Пример:workflows: my-workflow: settings: max_cube_duration: 20s -
shared— разрешение запускать рабочий процесс всем участникам организации, в том числе при отсутствии ролей в репозитории, в котором рабочий процесс размещен.Подробнее см. на странице Настроить общедоступный рабочий процесс в SourceCraft.
Пример настройки и запуска общедоступного рабочего процесса
Конфигурация:
workflows:
professor-test:
inputs:
STUDENTREPO:
type: string
required: true
TASK:
type: string
required: true
settings:
shared: true
tasks:
- name: professor-task
cubes:
- name: professor-cube
script:
- |
mkdir -p artifacts
echo "Repo: ${{ inputs.STUDENTREPO }}" > artifacts/professor-output
echo "Task: ${{ inputs.TASK }}" >> artifacts/professor-output
artifacts:
paths:
- artifacts/professor-output
on:
push: professor-test
Запуск рабочего процесса другим участником организации:
workflows:
check-solution:
tasks:
- name: main
cubes:
- name: run-shared-workflow
image: cr.yandex/sourcecraft/cubes/shared-workflows:latest
env:
ORG_SLUG: professor-org
REPO_SLUG: professor-repo
WORKFLOW_NAME: professor-test
WORKFLOW_VALUES: '[{"name": "STUDENTREPO", "value": "student"}, {"name": "TASK", "value": "task-1"}]'
TASK_NAME: professor-task
CUBE_NAME: professor-cube
ARTIFACT_LOCAL_PATH: artifacts/professor-output
artifacts:
paths:
- artifacts/output
on:
push: check-solution
-
Создайте персональный токен (PAT).
-
Запустите общедоступный рабочий процесс, передав в теле запроса параметр
"shared": true:export PAT=<персональный_токен> cat > body.json << 'EOF' { "workflows": [ { "name": "professor-test", "values": [ { "name": "STUDENTREPO", "value": "student" }, { "name": "TASK", "value": "task-1" } ] } ], "shared": true } EOF curl \ --request POST \ --header "Authorization: Bearer $PAT" \ --data '@body.json' \ --url "https://api.sourcecraft.tech/<слаг_организации>/<слаг_репозитория>/cicd/runs"Важно
Запустить общедоступный рабочий процесс можно только в основной ветке репозитория и только с конфигурацией CI/CD из основной ветки. Передача в теле запроса параметров
headиconfig_revisionприведет к ошибке выполнения.Сохраните значение слага запуска (
slug), полученное в ответе. -
Получите статус запущенного рабочего процесса:
curl \ --request GET \ --header "Authorization: Bearer $PAT" \ --url "https://api.sourcecraft.tech/<слаг_организации>/<слаг_репозитория>/cicd/runs/<слаг_запуска>"Примечание
Доступ к статусу и артефактам общедоступного рабочего процесса возможен только с тем же персональным токеном (PAT), с которым он был запущен.
-
Получите артефакты запущенного рабочего процесса:
curl \ --request GET \ --header "Authorization: Bearer $PAT" \ --url "https://api.sourcecraft.tech/<слаг_организации>/<слаг_репозитория>/cicd/artifacts/<слаг_запуска>/professor-test/professor-task/professor-cube"
Подробнее см. на странице Работа с REST API SourceCraft.
runs_on
В поле runs_on указывается перечень меток воркера, на котором будут запущены задания рабочего процесса. Поддерживаются следующие типы меток:
-
runtime-метка — тип воркера. Возможные значения:
compute— облачный воркер. Значение по умолчанию.serverless— serverless-воркер. См. примеры.self-hosted— пользовательский (self-hosted) воркер.
Важно
В поле
runs_onне может быть указано более одной runtime-метки. Если runtime-метка не указана, по умолчанию применяетсяcompute. -
метки пользовательских воркеров.
Примечание
В строковых значениях метки может содержаться ограниченный набор символов: буквы латинского алфавита (
a-zA-Z), а также-,.и_.Метка
self-hostedпроставляется в параметрах пользовательского воркера автоматически. Ее не надо добавлять дополнительно в полеtagsфайлаconfig.yaml.
Пример рабочего процесса с двумя заданиями, приведенными в разном формате
Одно задание рабочего процесса размещено внутри блока workflows, второе — вне его. В задании my-task приведен пример использования зависимостей между кубиками, подробнее см. на странице Кубики (cubes).
tasks:
- name: another-task
cubes:
- name: D
script:
- echo It's another task.
workflows:
my-workflow:
tasks:
- name: my-task
cubes:
- name: A
script:
- touch test.txt
- name: B
needs: ['-']
script:
- rm -f test.txt
- name: C
needs: ['A', 'B']
script:
- ls
- another-task
...
Пример с двумя различными рабочими процессами, запускаемыми в зависимости от типа события
on:
pull_request:
- workflows: workflow-for-pr
filter:
source_branches: ["**", "!test**"]
target_branches: "main"
push:
- workflows: workflow-for-push
filter:
branches: ["main"]
workflows:
workflow-for-pr:
tasks:
- name: sample-task-1
cubes:
- name: sample-cube1
image: docker.io/library/node
script:
- echo Hello, world!
workflow-for-push:
tasks:
- name: sample-task-2
cubes:
- name: sample-cube2
script:
- echo Test, and deploy your project.
Пример рабочего процесса с использованием секретов и переменных, в том числе предопределенных
# Здесь определяются переменные с глобальной областью видимости,
# они будут переданы во все кубики всех заданий во всех рабочих процессах
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"
inputs
В блоке inputs указываются параметры для ручного запуска рабочего процесса. В общем виде блок выглядит следующим образом:
inputs:
<название_параметра>:
type: <тип_параметра>
required: <обязательность_параметра>
description: <описание_параметра>
default: <значение_по_умолчанию>
options: <возможные_значения_для_типа_choice>
Где:
-
type— тип параметра. Возможные значения:string— строка.bool— логическое значениеtrueилиfalse.choice— выбор из предустановленных значений.
Примечание
Если в конфигурации указан параметр
options, необязательно задавать параметрtype: choice.Если тип не указан и нет параметра
options, то тип параметра по умолчанию —string. -
required— обязательность параметра. Возможные значения:trueилиfalse. -
description— произвольное описание параметра, которое будет отображаться в интерфейсе SourceCraft при ручном запуске рабочего процесса. -
default— значение параметра по умолчанию. Может быть указано, в том числе, если параметр является обязательным. -
options— возможные значения для типа параметраchoice.
Пример использования блока inputs см. в инструкции Запустить рабочий процесс вручную с пользовательскими параметрами.