Learn (Almost) Anything
КаталогСкачать курс

Автоматизация в GitHub

Как выбирать third-party actions, читать `action.yml`, задавать `with`, pin по SHA/tag, Dependabot updates, trust model и риск supply chain.

ruЭнциклопедия33 урока6 модулей9
GitHub actionsАвтоматизация в GitHubМодель workflowсостояние и артефактыматрицы и runtimeрелизы и environmentsПереиспользование и собственные actionsgovernance и эксплуатацияgithubactions

Marketplace actions и pinning

Как выбирать third-party actions, читать `action.yml`, задавать `with`, pin по SHA/tag, Dependabot updates, trust model и риск supply chain.

Marketplace actions и pinning

Marketplace action — это готовый building block для steps[].uses: checkout, setup runtime, login в registry, upload reports, deploy, security scan. Технически GitHub Marketplace — только витрина. Workflow подключает не «карточку Marketplace», а репозиторий и ref в форме owner/repo[/path]@ref, поэтому тот же trust model работает и для action из README, и для action из внутреннего репозитория.

Ключевая мысль: action выполняется внутри job и получает тот же workspace, network, environment и права GITHUB_TOKEN, которые доступны job. Если job читает secrets, пушит image или получает cloud token через Cloud deploy через OIDC, сторонний action оказывается рядом с самым чувствительным местом pipeline. Поэтому выбор action — это не только вопрос удобства YAML, а часть Secure use и threat model.

flowchart TD A["Workflow step: uses owner/repo@ref"] --> B{"Какой ref?"} B --> C["Branch: самый плавающий вариант"] B --> D["Tag: удобный version ref, но mutable"] B --> E["Full commit SHA: конкретный reviewed commit"] E --> F["Проверить repo, release notes и diff"] F --> G["Запустить с минимальными permissions"] G --> H["Dependabot PR для обновлений"] D --> I["Принимать только при доверии к maintainer и низком риске"] C --> J["Оставить для экспериментов, не для production deploy"]
flowchart TD
  A["Workflow step: uses owner/repo@ref"] --> B{"Какой ref?"}
  B --> C["Branch: самый плавающий вариант"]
  B --> D["Tag: удобный version ref, но mutable"]
  B --> E["Full commit SHA: конкретный reviewed commit"]
  E --> F["Проверить repo, release notes и diff"]
  F --> G["Запустить с минимальными permissions"]
  G --> H["Dependabot PR для обновлений"]
  D --> I["Принимать только при доверии к maintainer и низком риске"]
  C --> J["Оставить для экспериментов, не для production deploy"]
Как ref в `uses` влияет на воспроизводимость и supply chain risk.

Что именно вы подключаете

Запись uses состоит из трёх решений: чей код, какая точка входа и какой ref.

steps:
  - uses: owner/action-name@v3          # tag: удобно, но tag можно передвинуть
  - uses: owner/action-name@main        # branch: почти всегда слишком плавающий ref
  - uses: owner/action-name@0123456789abcdef0123456789abcdef01234567 # SHA: конкретный commit

Branch удобен для эксперимента, но плох для воспроизводимости: сегодня и завтра это может быть разный код. Major tag вроде @v3 даёт обновления без изменения workflow, но остаётся mutable ref. Полный commit SHA — единственный практический способ сказать: «запусти ровно тот код, который мы посмотрели». Для third-party actions в deploy, release, package publish и security-sensitive jobs это нормальный baseline, а не паранойя.

Tag всё ещё используют, особенно для first-party actions и низкорисковых CI steps. Но риск надо называть честно: если tag будет передвинут или репозиторий action скомпрометирован, workflow начнёт выполнять другой код без изменения вашего YAML. Badge «Verified creator» в Marketplace полезен как сигнал идентичности автора, но не превращает mutable tag в immutable release.

Как читать action.yml

Перед добавлением action откройте его action.yml или action.yaml. Это metadata-файл action: он объявляет inputs, outputs, runs и иногда branding. По runs.using сразу видно тип:

name: Example deploy action
inputs:
  token:
    description: GitHub token or service token
    required: true
  dry-run:
    description: Print commands without applying changes
    default: "false"
runs:
  using: node24
  main: dist/index.js

runs.using: node20 или node24 означает JavaScript actions. runs.using: composite ведёт к набору workflow steps (run и, при необходимости, uses) из Composite actions. runs.using: docker означает Docker container actions, которые дают контролируемое Linux-окружение, но добавляют build/pull latency и работают только на Linux runners.

inputs показывают, что action ждёт через with. Не ограничивайтесь README: README может устареть, metadata ближе к runtime-контракту. Важная деталь из GitHub Docs: required: true в metadata само по себе не гарантирует автоматическую ошибку при отсутствии input; хорошая action должна валидировать критичные inputs в своём коде.

Пример подключения с явным with и минимальными permissions:

name: publish-image

on:
  push:
    tags: ["v*"]

permissions:
  contents: read
  packages: write

jobs:
  publish:
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v6

      - name: Login to GHCR
        uses: docker/login-action@0123456789abcdef0123456789abcdef01234567
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

Здесь SHA — пример формы pinning, не рекомендация конкретного commit. В реальном repo SHA берут из release/tag action и проверяют, что commit принадлежит исходному репозиторию, а не fork. Связь с Permissions и GITHUB_TOKEN прямая: даже хорошо pinned action не должен получать лишние права job.

Supply chain risk на практике

Плохой критерий выбора: «у action много stars, значит можно». Лучше смотреть на несколько сигналов сразу: кто maintainer, есть ли releases и changelog, как устроен action.yml, есть ли pinned dependencies, открыта ли security policy, насколько часто ломаются issues, есть ли понятная migration/deprecation policy. Для JavaScript action отдельно проверьте, что исполняемый dist/ действительно обновляется в release, потому что workflow запускает bundled code, а не TypeScript-исходники из соседней папки.

Риск зависит от job. Action, который форматирует Markdown в CI без secrets и с contents: read, опасен меньше. Action, который работает в Deployment workflows, публикует Packages и container images, получает id-token: write или запускается рядом с environment secrets, надо рассматривать как production dependency. Для pull request сценариев особенно осторожно сочетание стороннего action, checkout непроверенного кода и событий из pull_request_target и untrusted PR.

Dependabot updates

Pinning к SHA не должен превращать workflow в музей. GitHub поддерживает Dependabot version updates для ecosystem github-actions: бот смотрит workflow-файлы в .github/workflows и reusable workflows, затем открывает PR на обновление outdated refs.

# .github/dependabot.yml
version: 2
updates:
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"
    groups:
      actions:
        patterns:
          - "*"

Dependabot PR — это повод для review, а не автоподпись под новым supply chain state. Для низкорискового CI можно включить auto-merge после зелёных checks. Для deploy/login/security actions лучше смотреть release notes, diff между старым и новым commit, изменения в action.yml, новые network/API permissions и открытые security advisories. Если updates шумят, группируйте их, но не отключайте полностью: старый action тоже становится риском, особенно когда runtime вроде Node устаревает.

ИнтерактивМини-процедура: принять сторонний action#int-1
Шаг 1 из 51. Найдите реальный runtime
Откройте `action.yml` и посмотрите `runs.using`: JavaScript, composite или Docker. Это говорит, какой код реально будет выполняться и на каких runners action работает.
Короткий чеклист review перед тем, как добавить Marketplace action в рабочий workflow.

Когда Marketplace action не нужен

Если action заменяет одну понятную shell-команду, иногда лучше оставить run. Если один и тот же набор steps повторяется в нескольких workflow внутри repo, часто лучше сделать Composite actions. Если нужно стандартизовать целый pipeline с jobs, permissions, environments и outputs между репозиториями, берите Reusable workflows. Marketplace action хорош там, где он реально покупает поддержку чужой интеграции: setup SDK, auth flow, upload report, deploy adapter, сложную работу с GitHub API.

Практическое правило: чем ближе action к secrets, release, deploy и write permissions, тем строже pinning, review и ownership. Внутри организации это часто оформляют policy: разрешённые owners, обязательный SHA pin, CODEOWNERS на .github/workflows, отдельный review для изменения deploy actions и регулярный аудит через Monitoring и troubleshooting и Enterprise policies и migration.

See also

Внешние справки: GitHub Docs по secure use, metadata syntax, Dependabot updates for actions и release/maintenance actions.

Быстрое повторение #rc-1

Почему owner/repo@main почти всегда плохой ref для third-party action в production workflow?

Показать ответ

Branch — плавающий ref: сегодня и завтра он может указывать на разный код. Это ломает воспроизводимость и усложняет review supply chain state.

Источники

  1. GitHub Docs — Secure use reference
  2. GitHub Docs — Metadata syntax reference
  3. GitHub Docs — Keeping your actions up to date with Dependabot
  4. GitHub Docs — Releasing and maintaining actions