Actions Ci Tuning logo

Actions Ci Tuning

Community
mizchi
actions-ci-tuning

Use when auditing or improving GitHub Actions workflows for a project. Covers cache setup (npm/pnpm/yarn), job parallelism, shard-based test splitting, artifact handling pitfalls, and Playwright-specific patterns. Trigger on: slow CI, cache miss, flaky shard jobs, merge-reports failures, or an explicit 'tune CI' request.

Overview

Publishermizchi
Repositoryskills
Skill nameactions-ci-tuning
Stars
333
Forks
4
Bundled files
Instructions only
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by mizchi on GitHub. Read the source before you install it.

Installation

Install the Actions Ci Tuning AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/mizchi/skills.git /tmp/skills
mkdir -p .claude/skills
cp -r /tmp/skills/actions-ci-tuning .claude/skills/actions-ci-tuning
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Actions Ci Tuning in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Actions Ci Tuning on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Actions Ci Tuning is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

GitHub Actions CI Tuning

Audit and improve GitHub Actions workflows. Focus on correctness first (jobs that error rather than fail), then speed (cache, parallelism), then reliability (flakiness, artifact guards).


Workflow

  1. Inventory — list all .github/workflows/*.yml files and their trigger events, jobs, and rough durations (gh run list --workflow <file> --limit 5).
  2. Audit against checklist — run through each section below and flag every gap.
  3. Prioritise — group findings by impact: correctness bugs > cache misses > parallelism gains > cosmetic.
  4. Propose changes — draft minimal diffs; do not refactor unrelated parts.
  5. Verify — after applying, confirm via gh run list that the next run is green and faster.

Checklist

Package Manager Cache

A cache miss means re-downloading hundreds of packages on every run. This is the single highest-ROI fix in most repos.

pnpm

yaml
- uses: pnpm/action-setup@v6
  with:
    version: latest           # or pin to a specific version

- uses: actions/setup-node@v7
  with:
    node-version-file: .nvmrc  # or node-version: '24' (current LTS)
    cache: 'pnpm'              # ← must be present; omitting it silently skips caching

Common mistake: calling corepack enable instead of pnpm/action-setup. corepack enable does NOT set up the pnpm store cache — actions/setup-node cache: 'pnpm' requires pnpm/action-setup to have run first.

npm

yaml
- uses: actions/setup-node@v7
  with:
    node-version-file: .nvmrc
    cache: 'npm'

yarn (classic / berry)

yaml
- uses: actions/setup-node@v7
  with:
    node-version-file: .nvmrc
    cache: 'yarn'

Verify cache is working: look for Cache restored successfully in setup-node logs. If absent, cache: key is likely missing or the lockfile path is wrong.


Dependency Install

  • Always use --frozen-lockfile (pnpm) / --ci (npm) / --immutable (yarn berry) in CI. Prevents lockfile drift from silently changing the installed tree.
  • Never use npm install or pnpm install without the frozen flag in CI.

Parallel Jobs vs. Steps

  • Independent jobs (lint, typecheck, test) should be separate jobs so they run in parallel, not sequential steps.
  • Sequential steps are fine for setup within a single job (install → build → test).
  • If a repo has lint + typecheck + unit test all in one job, split them.
yaml
jobs:
  lint:
    runs-on: ubuntu-latest
    steps: [checkout, setup, install, run lint]
  typecheck:
    runs-on: ubuntu-latest
    steps: [checkout, setup, install, run typecheck]
  test:
    runs-on: ubuntu-latest
    steps: [checkout, setup, install, run test]

Test Sharding (Playwright / Vitest)

Use sharding to cut long test suites. Each shard runs a subset of tests in parallel.

Playwright example — 4 shards:

yaml
jobs:
  e2e:
    strategy:
      fail-fast: false
      matrix:
        shard: [1, 2, 3, 4]
    steps:
      - run: pnpm exec playwright test --shard=${{ matrix.shard }}/4
        env:
          CI: true
      - uses: actions/upload-artifact@v7
        if: ${{ !cancelled() }}       # ← upload even on test failure
        with:
          name: blob-report-${{ matrix.shard }}
          path: blob-report/
          retention-days: 1

Pitfalls:

  • fail-fast: false is required — otherwise one failing shard cancels the rest before they upload blob reports.
  • if: ${{ !cancelled() }} on the upload step ensures blob reports are uploaded even when tests fail. Without this, the merge-reports job gets no artifacts.

Artifact Guard in merge-reports

When shards can fail before uploading blob reports, the all-blob-reports directory may not exist. Guard the merge command:

yaml
- name: Merge reports
  run: |
    if [ -d all-blob-reports ] && [ "$(ls -A all-blob-reports 2>/dev/null)" ]; then
      pnpm exec playwright merge-reports --reporter=html ./all-blob-reports
    else
      echo "No blob reports found, skipping merge"
      mkdir -p playwright-report
      echo "<html><body><p>No test results available</p></body></html>" > playwright-report/index.html
    fi

Without this guard, the merge-reports job errors with Error: Directory does not exist: ./all-blob-reports even when the overall workflow should gracefully report "no results."


Playwright Docker Image

For VRT (Visual Regression Testing), snapshots must be generated in the same environment as CI (Linux + specific fonts). Use the official Playwright Docker image instead of a plain node:* image:

mcr.microsoft.com/playwright:v1.59.1-noble   # pin to the same version as @playwright/test

Why not node:24?

  • node:24 requires playwright install --with-deps chromium which triggers apt-get and can hang for hours in Docker Desktop on macOS (known issue with apt in QEMU-emulated environments).
  • The mcr.microsoft.com/playwright image ships Chromium and all system dependencies pre-installed — no apt-get needed, starts in seconds.

Version pinning: keep the image version in sync with @playwright/test in package.json. Mismatch causes browser-not-found errors.


Concurrency Control

Cancel in-progress runs for the same branch/PR to avoid queue buildup:

yaml
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

Exception: do NOT cancel release/deploy workflows on main. Scope it to PR branches only:

yaml
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}

Scheduled Workflow Reliability

  • Scheduled workflows on GitHub Actions can silently stop firing if the repo has no activity for 60 days.
  • Add a workflow_dispatch: trigger alongside schedule: so it can be manually re-triggered without a code change.
  • For critical scheduled jobs (e.g., nightly E2E), add a failure notification step (GitHub issue creation, Slack, etc.) so silent failures are visible.
yaml
on:
  schedule:
    - cron: '0 0 * * *'
  workflow_dispatch:      # ← always add this

Action Version Pinning

  • Pin third-party actions to a full commit SHA, not a tag. Tags can be moved.
  • Use a comment with the human-readable version for readability:
yaml
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
  • Dependabot or Renovate can keep SHA pins up to date automatically. Check that .github/dependabot.yml includes the github-actions ecosystem.

Node.js 20 deprecation warning: GitHub started issuing "Node.js 20 actions are deprecated" warnings in 2025/2026. This refers to the action's own runtime (runs.using: node20), not the project's Node version. Fix by upgrading to the first major version that uses node24:

actionfirst node24 majorcurrent major (2026-09)
actions/checkoutv6.0.0v7
actions/setup-nodev6.0.0v7
actions/cachev5.0.0v6
actions/upload-artifactv7.0.0v7
actions/download-artifactv8.0.0v8
aws-actions/configure-aws-credentialsv6.0.0v6

Latest pinned SHAs (verified 2026-09):

yaml
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
uses: aws-actions/configure-aws-credentials@cbe3b392738ccf3f987d68400dafcf4b0624a56c # v6.2.4

Note: SHAs drift — always verify with gh release view --repo <owner>/<action> before pinning.


Environment Variables

  • CI: true should be set at the job or workflow level, not only in individual run steps. Many tools (Playwright, Vite, etc.) change behavior based on this flag.
  • Secrets should use ${{ secrets.NAME }} — never hardcode tokens.
  • NODE_OPTIONS: --max-old-space-size=4096 is sometimes needed for large builds in constrained runners (default heap is ~1.5 GB for a 7 GB runner).

Quick Audit Commands

bash
# List recent run durations for a workflow
gh run list --workflow e2e.yml --limit 10 --json databaseId,displayTitle,createdAt,updatedAt,conclusion \
  | jq '.[] | {title: .displayTitle, duration: (.updatedAt | fromdate) - (.createdAt | fromdate), conclusion: .conclusion}'

# Find jobs that always time out
gh run list --workflow e2e.yml --status failure --limit 20 --json databaseId \
  | jq -r '.[].databaseId' \
  | xargs -I{} gh run view {} --json jobs \
  | jq '.jobs[] | select(.conclusion == "timed_out") | .name'

# Check cache usage in a run
gh run view <run_id> --log | grep -i "cache"

Common Anti-Patterns

Anti-patternProblemFix
corepack enable only (no pnpm/action-setup)pnpm store is not cachedAdd pnpm/action-setup@v6 before setup-node
pnpm install without --frozen-lockfileLockfile can silently driftUse --frozen-lockfile always in CI
fail-fast: true on test matrixShards cancel before uploading artifactsSet fail-fast: false
Upload artifact without if: ${{ !cancelled() }}Blob reports lost on test failureAdd the if condition
playwright merge-reports without directory guardJob errors when no shards uploadedGuard with [ -d all-blob-reports ] check
node:* image for Playwright VRTapt-get hangs in Docker Desktop on macOSUse mcr.microsoft.com/playwright image
Scheduled workflow without workflow_dispatchCan't manually re-triggerAlways add workflow_dispatch:
Action pinned to tag not SHATag can be moved (supply-chain risk)Pin to full commit SHA

Frequently asked questions

What does the Actions Ci Tuning AI skill do?

Use when auditing or improving GitHub Actions workflows for a project. Covers cache setup (npm/pnpm/yarn), job parallelism, shard-based test splitting, artifact handling pitfalls, and Playwright-specific patterns. Trigger on: slow CI, cache miss, flaky shard jobs, merge-reports failures, or an explicit 'tune CI' request.

Why use Actions Ci Tuning on TypingMind?

Because you install it once and use it with any model. Actions Ci Tuning is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Actions Ci Tuning in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/mizchi/skills/tree/main/actions-ci-tuning. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Actions Ci Tuning?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Actions Ci Tuning?

As many as you like. As long as a model supports skills, you can use Actions Ci Tuning with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Actions Ci Tuning AI skill free?

It is published on GitHub by mizchi. Check the repository for licensing terms. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇