# Reusable Workflows — GitHub Actions

Source: https://www.skillbyai.com/en/github-actions/r-reusable

> workflow_call.

## Call a workflow like a function

A workflow with `on: workflow_call` declares `inputs`, `secrets` and `outputs`, and other workflows call it as a job with `uses: org/repo/.github/workflows/build.yml@ref`. This centralises standard pipelines (build, test, deploy) across many repositories so improvements happen in one place. Pass secrets explicitly or with `secrets: inherit`, pin the reference to a tag or SHA, and keep inputs few and well documented.

## Share automation, ship safely

Reusable workflows and composite actions remove duplication; environments add approvals to deployments.

![Three ideas: reusable workflows, composite actions, environments.](assets/figures/github-actions/section-7-map.svg) — Figure 7.1 — Reusable workflows, actions and environments.

## Defining and calling a reusable workflow

Not linted or run here; check the GitHub Actions documentation for current syntax.

```yaml
# .github/workflows/node-ci.yml (in a shared repo)
on:
  workflow_call:
    inputs:
      node-version: { type: string, default: "22" }
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: "${{ inputs.node-version }}", cache: npm }
      - run: npm ci && npm test

# caller
jobs:
  ci:
    uses: acme/workflows/.github/workflows/node-ci.yml@v1
    with: { node-version: "20" }
```

## Version shared workflows

Tag releases of shared workflows so teams can upgrade deliberately.

**Quiz:** Which trigger makes a workflow callable by other workflows?

- [ ] workflow_dispatch
- [x] workflow_call
- [ ] repository_dispatch
- [ ] push

*Answer:* workflow_call. Reusable workflows are called as jobs.
