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

В блоке workflows определяется перечень рабочих процессов CI/CD.

Рабочий процесс предназначен для логического объединения заданий, связанных с определенным этапом CI/CD.

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

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

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

Поддерживаются следующие параметры:

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
  1. Создайте персональный токен (PAT).

  2. Запустите общедоступный рабочий процесс, передав в теле запроса параметр "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), полученное в ответе.

  3. Получите статус запущенного рабочего процесса:

    curl \
      --request GET \
      --header "Authorization: Bearer $PAT" \
      --url "https://api.sourcecraft.tech/<слаг_организации>/<слаг_репозитория>/cicd/runs/<слаг_запуска>"
    

    Примечание

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

  4. Получите артефакты запущенного рабочего процесса:

    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-метка — тип воркера. Возможные значения:

    Важно

    В поле 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 см. в инструкции Запустить рабочий процесс вручную с пользовательскими параметрами.

См. также