Skip to content

Commit 9354cd6

Browse files
authored
ci(validate-wkflow): add file-changes detection to restrict irrelevant job execution (#6)
1 parent d13a911 commit 9354cd6

File tree

1 file changed

+66
-0
lines changed

1 file changed

+66
-0
lines changed

.github/workflows/validate.yml

+66
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,67 @@ permissions: {}
1414

1515
jobs:
1616

17+
eval-changes:
18+
name: Evaluate changes
19+
runs-on: ubuntu-latest
20+
21+
steps:
22+
- uses: actions/checkout@v4
23+
with:
24+
fetch-depth: 50 # Must at least retrieve a set of commits to compare changes
25+
# primarily because of any 'Rebase and Merge' PR action in GitHub
26+
27+
- name: Evaluate | Check specific file types for changes
28+
id: changed-files
29+
uses: tj-actions/[email protected]
30+
if: github.event_name == 'push' || github.event_name == 'pull_request'
31+
with:
32+
base_sha: ${{ github.event.push.before || github.event.pull_request.base.sha }}
33+
# action.yml is not considered as src because we can't test it
34+
files_yaml: |
35+
ci:
36+
- .github/workflows/validate.yml
37+
- .github/workflows/ci.yml
38+
docs:
39+
- AUTHORS.rst
40+
- CONTRIBUTING.rst
41+
- LICENSE
42+
- README.md
43+
src:
44+
- src/**
45+
tests:
46+
- tests/**
47+
48+
- name: Evaluate | Detect if any of the combinations of file sets have changed
49+
id: all-changes
50+
if: ${{ steps.changed-files.outcome == 'success' }}
51+
run: |
52+
printf '%s\n' "any_changed=false" >> $GITHUB_OUTPUT
53+
if [ "${{ steps.changed-files.outputs.ci_any_changed }}" == "true" ] || \
54+
[ "${{ steps.changed-files.outputs.docs_any_changed }}" == "true" ] || \
55+
[ "${{ steps.changed-files.outputs.src_any_changed }}" == "true" ] || \
56+
[ "${{ steps.changed-files.outputs.tests_any_changed }}" == "true" ]; then
57+
printf '%s\n' "any_changed=true" >> $GITHUB_OUTPUT
58+
fi
59+
60+
- name: Evaluate | Handle manual trigger (lie that all files changed)
61+
id: manual-trigger
62+
if: github.event_name == 'workflow_dispatch'
63+
run: |
64+
printf '%s\n' "ci_any_changed=true" >> $GITHUB_OUTPUT
65+
printf '%s\n' "docs_any_changed=true" >> $GITHUB_OUTPUT
66+
printf '%s\n' "src_any_changed=true" >> $GITHUB_OUTPUT
67+
printf '%s\n' "tests_any_changed=true" >> $GITHUB_OUTPUT
68+
printf '%s\n' "any_changed=true" >> $GITHUB_OUTPUT
69+
70+
outputs:
71+
any-file-changes: ${{ steps.all-changes.outputs.any_changed || steps.manual-trigger.outputs.any_changed }}
72+
ci-changes: ${{ steps.changed-files.outputs.ci_any_changed || steps.manual-trigger.outputs.ci_any_changed }}
73+
doc-changes: ${{ steps.changed-files.outputs.docs_any_changed || steps.manual-trigger.outputs.docs_any_changed }}
74+
src-changes: ${{ steps.changed-files.outputs.src_any_changed || steps.manual-trigger.outputs.src_any_changed }}
75+
test-changes: ${{ steps.changed-files.outputs.tests_any_changed || steps.manual-trigger.outputs.tests_any_changed }}
76+
77+
1778
commitlint:
1879
runs-on: ubuntu-latest
1980

@@ -31,8 +92,13 @@ jobs:
3192
validate-action:
3293
name: Validate Action Build & Execution
3394
runs-on: ubuntu-latest
95+
if: needs.eval-changes.outputs.src-changes == 'true' || needs.eval-changes.outputs.test-changes == 'true' || needs.eval-changes.outputs.ci-changes == 'true'
96+
needs:
97+
- eval-changes
98+
3499
env:
35100
TEST_CONTAINER_TAG: psr-publish-action:latest
101+
36102
steps:
37103
- name: Setup | Checkout Repository
38104
uses: actions/checkout@v4

0 commit comments

Comments
 (0)