8 / 48 · 16 CI/CD Pipelines · GitHub Actions: A Practical Example← prev⊞ allnext →☰ Read as one page
2.3Extending the Pipeline
Adding Lint and Type Checks
Add a fast first job that runs before everything else:
lint-and-typecheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 24
cache: 'npm'
- run: npm ci
- run: npm run lint
- run: npm run typecheck
Note on Node versions (as of July 2026): Node 24 is the active LTS line and Node 26 is Current, with a one-major-per-year cadence starting with Node 27. Node 24 can run TypeScript files directly via stable type-stripping (node app.ts), but it does not type-check them -- keep tsc --noEmit as a separate CI step.
Then make unit-tests depend on lint-and-typecheck:
unit-tests:
needs: lint-and-typecheck
Adding Slack Notifications
notify-on-failure:
needs: [unit-tests, integration-tests, browser-tests]
if: failure()
runs-on: ubuntu-latest
steps:
- uses: slackapi/slack-github-action@v1
with:
payload: |
{
"text": "Pipeline failed on ${{ github.ref_name }}: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}
Adding Path Filtering
Skip expensive tests when only documentation changes:
on:
push:
branches: [main, develop]
paths-ignore:
- '**.md'
- 'docs/**'
- '.github/ISSUE_TEMPLATE/**'