Skip to content
Agentmart
Submit a tool

github-actions-conventions

GitHub Actions mechanics: workflows, pinned actions, SARIF, release notes, Releases, Pages.

Skill by leroyguillaume

IndexedMIT★ 7
Write a review

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/leroyguillaume-github-actions-conventions

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

GitHub Actions mechanics: workflows, pinned actions, SARIF, release notes, Releases, Pages. TRIGGER when: editing anything under `.github/workflows/` or `.github/actions/`, `.github/release.yaml`, or an `action.yaml`/`.yml`; setting up CI on GitHub; user asks about Actions, runners, SARIF, GitHub Releases or Pages. SKIP when: the repo is not on GitHub (`gitlab-ci-conventions`). Load `ci-conventions` alongside.

Use cases: devops, writing, productivity

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md and code. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/github-actions-conventions

What's inside

Skill name
github-actions-conventions
Description
GitHub Actions mechanics: workflows, pinned actions, SARIF, release notes, Releases, Pages. TRIGGER when: editing anything under `.github/workflows/` or `.github/actions/`, `.github/release.yaml`, or an `action.yaml`/`.yml`; setting up CI on GitHub; user asks about Actions, runners, SARIF, GitHub Releases or Pages. SKIP when: the repo is not on GitHub (`gitlab-ci-conventions`). Load `ci-conventions` alongside.
License
MIT
Instructions
241 lines in SKILL.md · view on GitHub

Files (1)

  • SKILL.md

SKILL.md (first lines)

# GitHub Actions conventions

How the pipelines from `ci-conventions` are written on GitHub. One workflow
file per canonical pipeline the repo needs: `.github/workflows/quality.yaml`,
`build.yaml`, `security.yaml`, `chart.yaml`, `release.yaml`, `docs.yaml`.
`ci-conventions` says which ones a repo has; a repo with no lockfile and no
published image has no `security.yaml`.

## YAML style

Write the trigger key as bare **`on:`**, never quoted `"on":`. Everything else
is `yaml-conventions`.

## Step naming

- **Every step has a `name:`**. It is mandatory for `uses:` steps and
  expected on `run:` steps. A nameless action step reads as a bare SHA in the
  UI.
- Step names start with a **lowercase letter**: `name: set up the Rust
  toolchain`. Proper nouns keep their capitals (`Rust`, `GHCR`, `GitHub`).
- Keep step names **static**. Never interpolate `${{ }}` into a `name:`.

## Pin actions by SHA

- Pin **every** `uses:` to a full commit SHA, with a trailing comment naming
  the **latest** release tag it corresponds to:
  ```yaml
  - uses: actions/checkout@<40-char-sha>  # vX.Y.Z
  ```
  Resolve it with `git ls-remote --tags https://github.com/<owner>/<repo>
  '<tag>^{}'`.
- Add **`.github/dependabot.yaml`** with the `github-actions` ecosystem so the
  SHAs and their tag comments are bumped. The rest of that file is
  `dependency-update-conventions`.
- Never use a bare branch or tag ref (`@v4`, `@main`, `@stable`).

## Permissions

Top-level `permissions: contents: read`. Widen only in the job that needs
it: `packages: write` to push to GHCR, `security-events: write` for the SARIF
upload, `contents: write` for `gh release create`, `packages: read` to pull a
private image on the scheduled scan.

A called workflow can only keep or narrow the `GITHUB_TOKEN` scope of the job
that calls it, never widen it. The `release` job that runs `uses:
./.github/workflows/build.yaml` therefore grants `packages: write` itself;
without it the push is denied however `build.yaml` declares its own
permissions.

## Triggers per workflow

| Workflow | Triggers |
| --- | --- |
| `quality` | `push` to the default branch, `pull_request`, no `paths` |
| `build` | `push`/`pull_request` with `paths`, `workflow_dispatch` and `workflow_call` with `push` and `version` inputs |
| `security` | `push` to the default branch, `pull_request`, `schedule`, `workflow_dispatch`, no `paths` |
| `chart` | `push` of tags `chart-*`, `workflow_dispatch` |
| `release` | `push` of tags `v*` |
| `docs` | `push` to the default branch and `pull_request` with `paths`, `workflow_dispatch` |

Path filters do not apply to tag, `schedule`, `workflow_dispatch` or
`workflow_call` events, so don't write them there.

`chart` runs the same version drift guard as `release` before it packages
(`release-script-conventions`).

**A `paths`-filtered workflow must never be a required status check.** When
the filter skips it, the check never reports and the PR waits on it forever.
Only `quality` and, when it exists, `security` (never filtered) go into
branch protection.

## `build` and `release`

- Multi-arch: a static `matrix` with `amd64` on `ubuntu-24.04` and `arm64` on
  `ubuntu-24.04-arm`.
- Tags and labels come from **`docker/metadata-action`**: labels on each
  per-arch build, tags in the `manifest` job, consumed from
  `DOCKER_METADATA_OUTPUT_JSON` by `docker buildx imagetools create`.
- Scan before push: `docker/build-push-action` with `load: true`, then
  `trivy image` on the loaded image, then the same build again with a push
  by digest. That second build is a full cache hit, so the pushed layers are
  the ones that were scanned.
- Layer cache: `type=gha,scope=<arch>`. An unscoped `type=gha` cache is
  shared, so the two arch jobs overwrite each other.
- `release` calls `build` through `workflow_call` with `push: true`, then
  `gh release create "$TAG" --generate-notes` gated on the tag containing no
  `-`. For a stable tag, pass `--notes-start-tag` with the previous stable
  tag.

## `docs` and GitHub Pages

What the pipeline does is in `starlight-conventions`. On GitHub:

- **Pages source is "GitHub Actions"**: checking and switching it on is
  `github-repo-settings`' job. A custom domain is set in the repository's
  Pages settings, and the site's `site`/`base` follow it. No `CNAME` file is
  needed with an Actions deployment.
- Two jobs. `build` checks out with `fetch-depth: 0` (the release tags), runs
  `actions/setup-node` with `node-version-file: docs/.nvmrc`, `npm ci`, and the
  versioned build, then `actions/upload-pages-artifact` with `path: docs/dist`
  on non-PR runs of the default branch only. `deploy` (`needs: build`, same
  condition) runs `actions/deploy-pages` in `environment: github-pages` with
  `url: ${{ steps.deploy.outputs.page_url }}`.
- `permissions: pages: write` and `id-token: write` on `deploy` alone; the
  workflow stays `contents: read`.
- **The `github-pages` environment deploys from the default branch only**, so
  a tag run cannot deploy. After a stable release, `release` dispatches the
  docs on the default branch, in a job that `needs:` the GitHub Release job
  (skipped for an rc, so the docs are too):
  ```yaml
  docs:
    name: docs
    needs:
      - github-release
    permissions:
      actions: write
    runs-on: ubuntu-24.04
    steps:
      - name: rebuild the documentation site

From leroyguillaume/claude, MIT.

More from leroyguillaume/claude

Signals

Stars
7
Forks
3
Open issues
0
Last commit (this folder)
Oct 2, 2026 (26 days ago)

From GitHub (fetched Oct 24, 2026).

Details

License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from leroyguillaume

Cite this page

github-actions-conventions skill. Agent Mart. https://agentmart.dev/skills/leroyguillaume-github-actions-conventions (last updated 2026-10-24)