env и context
Тема дорожной карты · GitHub Actions
GitHub Actions предоставляет два взаимодополняющих способа доступа к данным времени выполнения внутри workflow: переменные окружения, задаваемые ключом env:, и контекстные выражения, используемые через синтаксис ${{ <context> }}. Понимание различия между ними необходимо для написания надёжных CI/CD-пайплайнов. Контекст env (${{ env.MY_VAR }}) открывает доступ к переменным, определённым на уровне workflow, job или step, тогда как встроенные контексты github, runner, secrets, steps и needs предоставляют метаданные о запускающем событии, среде выполнения и выходных данных вышестоящих jobs. Например, ${{ github.sha }} разрешается в полный хеш коммита запускающего push, что идеально для тегирования Docker-образов или аннотации артефактов деплоя в workflow непрерывной интеграции. Переменные окружения, задаваемые через run: echo "VAR=value" >> $GITHUB_ENV, сохраняются для последующих шагов в том же job, связывая мир shell-команд и мир выражений GitHub Actions в рамках одного запуска пайплайна. Знание того, когда использовать env:, контекстные выражения или $GITHUB_ENV, — ключевой навык GitHub Actions для написания поддерживаемой и защищённой от инъекций автоматизации workflow.
Как это работает
env и context: name, on (триггеры: push, pull_request, schedule, workflow_dispatch, repository_dispatch), jobs (каждый с runs-on, steps, опциональным needs для упорядочивания, if для условий, strategy для matrix), env (env vars), defaults (например default shell), permissions (scope GITHUB_TOKEN). Steps либо uses: action@version, либо run: command. Выражения: ${{ github.event_name }}, ${{ secrets.X }}, ${{ inputs.x }}.
Когда применять
Всегда пиньте actions к SHA, не к тегу (uses: actions/checkout@v4 для удобства; uses: actions/checkout@a5ac7e5... для безопасности). permissions: read-all и write только где надо (least privilege для GITHUB_TOKEN). concurrency: — отмена старых запусков на новом коммите. workflow_dispatch: — для ручных триггеров с inputs.
Типичные ошибки
Ловушки env и context: баги отступов YAML (всё тихо валится); pull_request_target без понимания security (запускается против base-ветки с секретами — частый вектор атаки); огромные env-блоки на workflow-уровне (чище per-job или per-step); секреты в ${{ }} непреднамеренно логируются (используйте ::add-mask:: или secret-префикс).