Skip to content

Replace fkirc/skip-duplicate-actions with a reusable skip-on-paths workflow #83

@rtibbles

Description

@rtibbles

This issue is not open for contribution. Visit Contributing guidelines to learn about the contributing process and how to find suitable issues.

Overview

fkirc/skip-duplicate-actions is unmaintained, pinned to @master, and runs on Node 20 — which GitHub force-migrates to Node 24 on 2026-06-16 and removes entirely on 2026-09-16. We use it across many org repos, primarily for its paths_ignore behaviour: skipping a CI run when every changed file matches an ignore glob, while still reporting success so required status checks stay green.

Replace it with a small reusable workflow hosted in this repo (learningequality/.github) that every repo can reference, then migrate all repos off the third-party action.

Complexity: Medium
Target branch: main

Context

GitHub's native paths-ignore trigger filter can't replace the action: when a required status check is filtered out by paths-ignore, it never reports a result, so the PR is blocked from merging indefinitely. This is a long-standing GitHub gap, and it's the specific reason we adopted fkirc/skip-duplicate-actions — the job still runs and reports success on ignorable-only changes, keeping required checks green.

The path-ignore skip can be replicated with a dependency-free git diff: compare the changed files against the ignore globs, and signal "skip" only when every changed file matches. Note that consumers using a shallow checkout (fetch-depth: 1) won't have the base commit available for the diff — the workflow needs to handle fetching the base ref.

The Change

Add a reusable workflow (.github/workflows/skip-on-paths.yml, on: workflow_call) in this repo that consumers call with a single job-level uses: learningequality/.github/.github/workflows/skip-on-paths.yml@main — no checkout of the .github repo required. The workflow checks out the caller's repository, computes the set of changed files for both pull_request and push events, resolves the base ref (fetching it when a shallow checkout means it isn't present), and exposes a should_skip output that is true only when every changed file matches one of the ignore globs. Consuming workflows gate their real jobs on that output via needs, so each job still runs and reports success — keeping required status checks green on ignorable-only changes.

The workflow accepts the ignore globs as a workflow_call input. Reusable-workflow inputs can't be arrays, so the globs come in as a string (e.g. a JSON or newline-delimited list matching today's ["**.po", "**.json"]). All logic lives inline in the workflow file; it must not depend on any third-party action.

Out of Scope

  • The other features of fkirc/skip-duplicate-actions (concurrent-run cancellation, duplicate-commit detection, already-succeeded skipping) are not replicated. Concurrent-run cancellation is already handled by workflow-level concurrency: blocks where needed.
  • No change to which paths each repo ignores — the workflow takes the existing glob list as input; per-repo lists are migrated as-is.

Acceptance Criteria

  • A reusable workflow skip-on-paths.yml (on: workflow_call) exists in learningequality/.github and is callable from other repos via a job-level uses:, with no checkout of the .github repo required by the consumer.
  • The workflow accepts the ignore globs as a string input (e.g. ["**.po", "**.json"]), defaulting to no globs (nothing skipped).
  • The workflow exposes a should_skip output that is true only when every changed file matches one of the ignore globs, and false when at least one changed file does not.
  • The skip computation works for both pull_request and push events.
  • The workflow resolves and fetches the base ref when the caller used a shallow checkout, so the diff is correct without requiring fetch-depth: 0.
  • Gated jobs still run and report success on ignorable-only changes, so required status checks remain green.
  • All logic is inline in the workflow file, with no third-party action dependencies.
  • Usage is documented (README) with a copy-pasteable example showing how to call the workflow and gate a job on should_skip.
  • Every repo currently using fkirc/skip-duplicate-actions is migrated to the new workflow, and no reference to fkirc/skip-duplicate-actions remains across the org.

References

AI usage

I used Claude to draft this issue. It investigated the CI linting bottleneck and the fkirc/skip-duplicate-actions deprecation, and drafted each section from our discussion. I made all the scoping decisions (path-ignore-only scope, full rollout, reusable workflow over composite action), and reviewed and confirmed every section before it was filed.

Metadata

Metadata

Assignees

Labels

github_actionsPull requests that update GitHub Actions code

Type

No fields configured for Task.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions