Контекст GitVerse

Info

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

Что такое контекст

Контекст — это встроенная структура данных, доступная в каждом шаге workflow. Она позволяет обращаться к информации о:

  • текущем репозитории, коммите, ветке;
  • джобах и шагаx (их статусах, результатах);
  • пользователе, событии-триггере, секретах и переменных;
  • среде выполнения (runner, ОС, архитектура, путь и т.д.).

Контексты делают workflow динамичным — вы можете подставлять значения в runtime, не захардкоживая их в YAML.


Пример использования

Info

Контексты вызываются через синтаксис ${{ ... }} и доступны во всех выражениях (if:, run:, env: и т.д.).

name: Простой пример использования контекста
 
on: [push]
 
jobs:
  show-context:
    runs-on: ubuntu-latest
    steps:
      - name: Выведем ветку и инициатора пуша
        run: echo "Commit by ${{ gitverse.actor }} on branch ${{ gitverse.ref_name }}"
КонтекстОписаниеПример обращения
gitverseИнформация о событии, репозитории и.т.д${{ gitverse.repository }}
githubТо же самое что и gitverse, для собратной совместимости${{ github.repository }}
envПеременные окружения${{ env.MY_VAR }}
jobДанные о текущей job в workflow${{ job.build.result }}
jobsДанные о всех job в workflow${{ jobs.build.result }}
runnerСведения о среде выполнения (ОС, архитектура)${{ runner.os }}
secretsСекреты, заданные в настройках репозитория${{ secrets.TOKEN }}
strategyДанные о matrix-сборке${{ strategy.job-index }}
matrixТекущие значения matrix-параметров${{ matrix.python-version }}
stepsРезультаты предыдущих шагов${{ steps.test.outputs.coverage }}
inputsВходные параметры для workflow_call${{ inputs.name }}
varsПеременные, заданные на уровне репозитория или организации${{ vars.ENVIRONMENT }}

Пример с условиями

steps:
  - name: Деплоить только из ветки main
    if: ${{ gitverse.ref_name == 'master' && gitverse.event_name == 'push' }}
    run: echo "Deploying to production..."
  - name: Печатаем env контекст
    run: echo '${{ toJson(env) }}

Доступ к репозиториям организации

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

Однако доступ к репозиториям ограничен политикой безопасности.

Разрешено:

  • приватный репозиторий → Приватный репозиторий (если оба принадлежат одному владельцу);
  • приватный репозиторий → Публичный репозиторий (если оба принадлежат одному владельцу);
  • публичный репозиторий → Публичный репозиторий (если оба принадлежат одному владельцу);
  • публичный репозиторий → Публичный репозиторий (если репозитории принадлежат разным владельцам, и владелец клонируемого репозитория имеет публичную видимость).

Запрещено:

  • приватный репозиторий → Приватный репозиторий (если принадлежат разным владельцам);
  • приватный репозиторий → Публичный репозиторий (если принадлежат разным владельцам, и владелец клонируемого репозитория не имеет публичной видимости);
  • публичный репозиторий → Приватный репозиторий;
  • публичный репозиторий → Публичный репозиторий (если репозитории принадлежат разным владельцам, и владелец клонируемого репозитория не имеет публичной видимости).

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

name: Простой пример доступа к репозиториям
 
on: [push]
 
jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout основного репозитория
        uses: actions/checkout@v4
        
      - name: Checkout другого репозитория из организации
        uses: actions/checkout@v4
        with:
          repository: organisation/another-repo
          ref: 'master'
          
      - name: Читаем код из другого репозитория
        run: |
          echo "README другого репозитория"
          ls -la
          cat README.md