Auto-build docker when docker file changes.
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
name: '🚦 CI'
|
||||
|
||||
# Single orchestrator. This is the only workflow that triggers on push/PR.
|
||||
# It decides which reusable sub-workflows to run and in what order:
|
||||
# changes ─┬─> docker (only if the Dockerfile/requirements changed) ─┬─> test
|
||||
# │ └─> docs
|
||||
# When the builder image is rebuilt it MUST finish (and push) before test/docs
|
||||
# run, so they validate against the fresh image.
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- develop
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
- develop
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
# Detect which parts of the repo changed in this push/PR.
|
||||
changes:
|
||||
runs-on: linux/amd64
|
||||
outputs:
|
||||
dockerfile: ${{ steps.filter.outputs.dockerfile }}
|
||||
code: ${{ steps.filter.outputs.code }}
|
||||
docs: ${{ steps.filter.outputs.docs }}
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Detect changed paths
|
||||
id: filter
|
||||
uses: dorny/paths-filter@v3
|
||||
with:
|
||||
filters: |
|
||||
dockerfile:
|
||||
- 'Dockerfile.builder'
|
||||
- 'docs/requirements.txt'
|
||||
docs:
|
||||
- 'docs/**'
|
||||
- 'mkdocs.yml'
|
||||
- 'examples/**/*.cpp'
|
||||
code:
|
||||
- 'src/**'
|
||||
- 'include/**'
|
||||
- 'tests/**'
|
||||
- 'examples/**'
|
||||
- 'python/**'
|
||||
- 'CMakeLists.txt'
|
||||
- '**/*.cpp'
|
||||
- '**/*.hpp'
|
||||
- '**/*.h'
|
||||
|
||||
# Rebuild the builder image first, but only when it actually changed.
|
||||
# On pull requests we build to validate the Dockerfile but do not push.
|
||||
docker:
|
||||
needs: changes
|
||||
if: ${{ needs.changes.outputs.dockerfile == 'true' }}
|
||||
uses: ./.gitea/workflows/docker.yaml
|
||||
with:
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
|
||||
# Runs after docker (if docker ran). A skipped docker job is fine; a failed
|
||||
# one blocks this via !failure(). Re-run tests when code OR the image changed.
|
||||
test:
|
||||
needs: [changes, docker]
|
||||
if: ${{ !failure() && !cancelled() && (needs.changes.outputs.code == 'true' || needs.changes.outputs.dockerfile == 'true') }}
|
||||
uses: ./.gitea/workflows/test.yaml
|
||||
|
||||
docs:
|
||||
needs: [changes, docker]
|
||||
if: ${{ !failure() && !cancelled() && github.ref == 'refs/heads/master' && (needs.changes.outputs.docs == 'true' || needs.changes.outputs.dockerfile == 'true') }}
|
||||
uses: ./.gitea/workflows/docs.yaml
|
||||
secrets: inherit
|
||||
Reference in New Issue
Block a user