Кубики (cubes)

В блоке cubes определяется перечень минимальных логических действий — кубиков, которые будут выполняться в задании.

Минимальным действием может быть вызов скрипта или запуск Docker-контейнера. Также может быть вариант вызова скрипта в Docker-контейнере.

Есть следующие виды кубиков:

  • Нативный — выполняется напрямую на виртуальной машине (воркере).

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

  • Docker-кубик — выполняется внутри Docker-контейнера, который запускается на воркере. Внутри контейнера запускается пользовательский скрипт или скрипт контейнера, если для контейнера предусмотрена точка входа (entrypoint).

    Если Docker-кубик в процессе выполнения изменит окружение, оно будет доступно последующим кубикам задания, только если изменения производятся внутри директории /sourcecraft. Все остальные изменения удаляются вместе с Docker-контейнером.

    При работе из контейнера директории монтируются следующим образом:

    • директория, в которой находятся связанные с выполняемым заданием файлы, монтируется по пути /sourcecraft;
    • директория, в которую клонируется репозиторий, и которая по умолчанию назначается рабочей (workdir), монтируется по пути /sourcecraft/workspace.

    Пути указанных директорий можно получить из предопределенных переменных окружения $SOURCECRAFT_ROOT_DIRECTORY и $SOURCECRAFT_WORKSPACE соответственно.

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

В кубиках вы можете использовать переменные окружения, а также секреты. Для передачи переменных окружения от одного кубика к последующим в виде пар KEY=VALUE предусмотрена предопределенная переменная $SOURCECRAFT_ENV.

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

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

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

  • name — имя кубика.
  • script — команда, которая будет выполнена в кубике.
  • needs — список кубиков, которые должны быть выполнены до выполнения текущего.
  • image — (опционально) Docker-образ, который будет использоваться для выполнения кубика. Подробнее см. в подразделе image.
  • envпеременные окружения, доступные только в конкретном кубике.
  • artifacts — список путей к файлам, которые будут созданы в результате работы кубика и сохранены для дальнейшего использования. Артефакты можно будет скачать из конкретного кубика в секции Автоматизации репозитория в течение 14 дней.

Примеры конфигураций кубиков

  • Использование переменных, в том числе предопределенных:

    workflows:
      my-workflow:
        tasks:
          - name: 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
                # Здесь определяются переменные, которые будут доступны только внутри кубика
                env:
                  CUBE_ENV_VAR: This variable is available only in cube my-cube-1.
                  # Переменная, значение которой задается из секрета
                  SECRET_VAR: ${{ secrets.<название_секрета> }}
                script:
                  - echo "$TASK_ENV_VAR"
                  - echo "$MULTILINE_VAR"
                  - echo "$CUBE_ENV_VAR"
                  - echo "$SECRET_VAR"                
              - name: 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"
    

    Подробнее о работе с переменными окружения см. на странице Работа с переменными окружения в SourceCraft.

  • Использование артефактов:

    workflows:
      my-workflow:
        tasks:
          - name: my-task
            cubes:
              - name: delete-git
                script:
                  - env
                  - rm -rfv ./git
                artifacts:
                  paths:
                    - ./test.cpp
    

    Также см. пример использования артефактов для Java в разделе Примеры.

  • Зависимости между кубиками:

    workflows:
      my-workflow:
        tasks:
          - name: my-task
            cubes:
              - name: vendor
                script:
                  - make vendor
    
              - name: build-client
                needs: [ "vendor" ]
                script:
                  - go build -C cmd/client
                artifacts:
                  paths:
                    - cmd/client/client
    
              - name: build-server
                needs: [ "vendor" ]
                script:
                  - go build -C cmd/server/server
                artifacts:
                  paths:
                    - cmd/server/server
    
              - name: run-tests
                needs: [ "build-client", "build-server" ]
                script:
                  - go test ./...
    

Docker-образы (image)

Блок image содержит параметры Docker-образа, который будет использоваться для выполнения кубика.

Вы можете указать стандартное имя Docker-образа или путь в конкретном реестре.

Если блок image не указан, команды будут выполняться в окружении Linux.

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

  • name — путь к Docker-образу в реестре.

  • username — имя пользователя для доступа к реестру.

  • password — пароль для доступа к реестру. Для хранения пароля рекомендуется использовать секреты.

  • entrypoint — переопределение точки входа (entrypoint) контейнера. Аналог флага --entrypoint для команды docker run.

  • args — аргументы, которые будут переданы на вход контейнеру при запуске. Нельзя использовать в кубике, в котором задан параметр script.

    Подробнее о работе с точкой входа и аргументами см. в разделе Точка входа (entrypoint) и аргументы (args).

Примеры конфигураций Docker-образов

  • Указание стандартного имени Docker-образа:

    workflows:
      my-workflow:
        tasks:
          - name: my-task
            cubes:
              - name: my-cube
                image: ubuntu:22.04
                script: echo "hello world!"
    
  • Указание пути в конкретном реестре:

    workflows:
      my-workflow:
        tasks:
          - name: my-task
            cubes:
              - name: my-cube
                image: cr.yandex/mirror/ubuntu:22.04
                script: echo "hello world!"
    
  • Если для доступа к реестру нужна аутентификация, то можно использовать в задании команду docker login или задать настройки аутентификации в блоке image и задействовать секрет, например:

    workflows:
      my-workflow:
        tasks:
          - name: my-task
            cubes:
              - name: my-cube
                image:
                  name: some-docker-registry.com/account-name/ubuntu:22.04
                  username: username 
                  password: ${{ secrets.<название_секрета> }}
    

    Подробнее о работе с секретами см. на странице Управлять секретами в репозитории SourceCraft.

Точка входа (entrypoint) и аргументы (args)

Выполнить набор команд в Docker-контейнере

Чтобы выполнить набор команд в контексте контейнера, укажите путь к Docker-образу в реестре в параметрах image или image:name, а набор команд — в script, например:

cubes:
  - name: greet
    env:
      GREETING: "Hello"
    image: docker.io/library/node
    script:
      - echo $GREETING

Если в контейнере переопределена точка входа, то, чтобы выполнить в нем команды из script, сбросьте точку входа. Это можно сделать, указав в параметре entrypoint значение "". Например, вы можете использовать контейнер, у которого по умолчанию задана точка входа ENTRYPOINT ["/usr/bin/docker"]:

cubes:
  - name: greet
    env:
      GREETING: "Hello"
    image:
      name: some-docker-registry.com/cloud-builders/docker
      entrypoint: ""
    script:
      - echo $GREETING

Передать аргументы командной строки в Docker-контейнер

Чтобы передать в контейнер с переопределенной точкой входа аргументы, которые нужны для его выполнения, используйте параметр args. Например, это может быть контейнер, который используется для создания нового Docker-образа:

cubes:
  - name: build-and-greet
    image:
      name: some-docker-registry.com/cloud-builders/docker
      args: ["build", "-t", "hello-world", "."]

Эквивалентная конфигурация:

cubes:
  - name: build-and-greet
    image:
      name: some-docker-registry.com/cloud-builders/docker
      args:
        - 'build'
        - '-t'
        - 'hello-world'
        - '.'

Совет

Чтобы гибко решать задания CI/CD с помощью Docker-контейнеров, комбинируйте параметры entrypoint и args.

Пример совместного использования entrypoint и args:

cubes:
  - name: test
    image:
      name: docker.io/library/python:3.13-slim
      entrypoint: "/bin/bash"
      args: ["-c", "'pip install flask && python test_app.py -v'"]

Эквивалентная конфигурация с помощью script:

cubes:
  - name: test
    image: docker.io/library/python:3.13-slim
    script:
      - pip install flask
      - python test_app.py -v

Параметр script: [commands] является альтернативой установки entrypoint: "default shell" и args: ["-c", 'command_1 && … && command_N'].

Важно

В одном кубике нельзя одновременно задать image:args и script.

См. также