Переиспользование параметров рабочих процессов и кубиков в CI/CD SourceCraft

В CI/CD SourceCraft можно один раз описать общие параметры рабочих процессов и кубиков, а затем переиспользовать их с помощью параметра uses. Это сокращает повторяющиеся фрагменты конфигурации и упрощает ее поддержку: общую последовательность действий достаточно обновить в одном месте.

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

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

Если несколько рабочих процессов выполняют одинаковые последовательности заданий, опишите эту последовательность один раз и переиспользуйте ее с разными входными параметрами. Для этого:

  1. В блоке workflows файла .sourcecraft/ci.yaml определите переиспользуемый рабочий процесс. Объявите его входные параметры в блоке inputs и используйте их значения в конфигурации.
  2. В вызывающем рабочем процессе укажите имя переиспользуемого рабочего процесса в параметре uses.
  3. Передайте значения его входных параметров в блоке 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 в текущем кубике можно переиспользовать параметры другого кубика. В зависимости от того, где определен переиспользуемый кубик, применяется следующий синтаксис:

Вы можете переопределить отдельные параметры текущего кубика. Подробнее в подразделе Пример переиспользования параметров кубика внутри одного .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

Полезные ссылки