Skip to content

Commit eb7ae7f

Browse files
authored
enh(ci): skip workflow when no change on PR (centreon#5334)
1 parent 3609bca commit eb7ae7f

20 files changed

Lines changed: 427 additions & 21 deletions

.github/workflows/as400.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ jobs:
2424

2525
package:
2626
needs: [get-environment]
27+
if: |
28+
needs.get-environment.outputs.skip_workflow == 'false' &&
29+
needs.get-environment.outputs.stability != 'stable'
2730
runs-on: ubuntu-22.04
2831
strategy:
2932
fail-fast: false
@@ -107,6 +110,7 @@ jobs:
107110
deliver-packages:
108111
needs: [get-environment, package]
109112
if: |
113+
needs.get-environment.outputs.skip_workflow == 'false' &&
110114
(contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) || ( needs.get-environment.outputs.stability == 'stable' && github.event_name != 'workflow_dispatch')) &&
111115
! cancelled() &&
112116
! contains(needs.*.result, 'failure') &&
@@ -141,3 +145,12 @@ jobs:
141145
stability: ${{ needs.get-environment.outputs.stability }}
142146
release_type: ${{ needs.get-environment.outputs.release_type }}
143147
artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }}
148+
149+
set-skip-label:
150+
needs: [get-environment, deliver-packages]
151+
if: |
152+
needs.get-environment.outputs.skip_workflow == 'false' &&
153+
! cancelled() &&
154+
! contains(needs.*.result, 'failure') &&
155+
! contains(needs.*.result, 'cancelled')
156+
uses: ./.github/workflows/set-pull-request-skip-label.yml

.github/workflows/connector-vmware.yml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ jobs:
2626

2727
package:
2828
needs: [get-environment]
29-
if: ${{ needs.get-environment.outputs.stability != 'stable' }}
29+
if: |
30+
needs.get-environment.outputs.skip_workflow == 'false' &&
31+
needs.get-environment.outputs.stability != 'stable'
3032
runs-on: ubuntu-22.04
3133
strategy:
3234
matrix:
@@ -84,6 +86,7 @@ jobs:
8486
deliver-packages:
8587
needs: [get-environment, package]
8688
if: |
89+
needs.get-environment.outputs.skip_workflow == 'false' &&
8790
(contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) || ( needs.get-environment.outputs.stability == 'stable' && github.event_name != 'workflow_dispatch')) &&
8891
! cancelled() &&
8992
! contains(needs.*.result, 'failure') &&
@@ -118,3 +121,12 @@ jobs:
118121
stability: ${{ needs.get-environment.outputs.stability }}
119122
release_type: ${{ needs.get-environment.outputs.release_type }}
120123
artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }}
124+
125+
set-skip-label:
126+
needs: [get-environment, deliver-packages]
127+
if: |
128+
needs.get-environment.outputs.skip_workflow == 'false' &&
129+
! cancelled() &&
130+
! contains(needs.*.result, 'failure') &&
131+
! contains(needs.*.result, 'cancelled')
132+
uses: ./.github/workflows/set-pull-request-skip-label.yml

.github/workflows/docker-builder-packaging-plugins.yml

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,14 @@ on:
1818
- ".github/docker/packaging/*"
1919

2020
jobs:
21-
create-and-push-docker:
21+
get-environment:
22+
uses: ./.github/workflows/get-environment.yml
23+
24+
dockerize:
25+
needs: [get-environment]
26+
if: |
27+
needs.get-environment.outputs.skip_workflow == 'false' &&
28+
needs.get-environment.outputs.stability != 'stable'
2229
strategy:
2330
fail-fast: false
2431
matrix:
@@ -87,3 +94,12 @@ jobs:
8794
pull: true
8895
push: true
8996
tags: ${{ vars.DOCKER_INTERNAL_REGISTRY_URL }}/${{ matrix.image }}:latest
97+
98+
set-skip-label:
99+
needs: [get-environment, dockerize]
100+
if: |
101+
needs.get-environment.outputs.skip_workflow == 'false' &&
102+
! cancelled() &&
103+
! contains(needs.*.result, 'failure') &&
104+
! contains(needs.*.result, 'cancelled')
105+
uses: ./.github/workflows/set-pull-request-skip-label.yml

.github/workflows/docker-builder-testing-plugins.yml

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,14 @@ on:
1818
- ".github/docker/testing/*"
1919

2020
jobs:
21-
create-and-push-docker:
21+
get-environment:
22+
uses: ./.github/workflows/get-environment.yml
23+
24+
dockerize:
25+
needs: [get-environment]
26+
if: |
27+
needs.get-environment.outputs.skip_workflow == 'false' &&
28+
needs.get-environment.outputs.stability != 'stable'
2229
strategy:
2330
fail-fast: false
2431
matrix:
@@ -72,3 +79,12 @@ jobs:
7279
pull: true
7380
push: true
7481
tags: ${{ vars.DOCKER_INTERNAL_REGISTRY_URL }}/testing-plugins-${{ matrix.image }}:latest
82+
83+
set-skip-label:
84+
needs: [get-environment, dockerize]
85+
if: |
86+
needs.get-environment.outputs.skip_workflow == 'false' &&
87+
! cancelled() &&
88+
! contains(needs.*.result, 'failure') &&
89+
! contains(needs.*.result, 'cancelled')
90+
uses: ./.github/workflows/set-pull-request-skip-label.yml

.github/workflows/docker-builder-unit-tests.yml

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,14 @@ on:
1818
- ".github/docker/unit-tests/*"
1919

2020
jobs:
21-
create-and-push-docker:
21+
get-environment:
22+
uses: ./.github/workflows/get-environment.yml
23+
24+
dockerize:
25+
needs: [get-environment]
26+
if: |
27+
needs.get-environment.outputs.skip_workflow == 'false' &&
28+
needs.get-environment.outputs.stability != 'stable'
2229
strategy:
2330
fail-fast: false
2431
matrix:
@@ -72,3 +79,12 @@ jobs:
7279
pull: true
7380
push: true
7481
tags: ${{ vars.DOCKER_INTERNAL_REGISTRY_URL }}/unit-tests-${{ matrix.image }}:latest
82+
83+
set-skip-label:
84+
needs: [get-environment, dockerize]
85+
if: |
86+
needs.get-environment.outputs.skip_workflow == 'false' &&
87+
! cancelled() &&
88+
! contains(needs.*.result, 'failure') &&
89+
! contains(needs.*.result, 'cancelled')
90+
uses: ./.github/workflows/set-pull-request-skip-label.yml

.github/workflows/get-environment.yml

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ on:
2323
is_targeting_feature_branch:
2424
description: "if it is a PR, check if targeting a feature branch"
2525
value: ${{ jobs.get-environment.outputs.is_targeting_feature_branch }}
26+
skip_workflow:
27+
description: "if the current workflow should be skipped"
28+
value: ${{ jobs.get-environment.outputs.skip_workflow }}
2629

2730
jobs:
2831
get-environment:
@@ -34,10 +37,128 @@ jobs:
3437
target_stability: ${{ steps.get_stability.outputs.target_stability }}
3538
release_type: ${{ steps.get_release_type.outputs.release_type }}
3639
is_targeting_feature_branch: ${{ steps.get_stability.outputs.is_targeting_feature_branch }}
40+
skip_workflow: ${{ steps.skip_workflow.outputs.result }}
3741

3842
steps:
43+
- name: Check if PR has skip label
44+
id: has_skip_label
45+
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
46+
with:
47+
script: |
48+
let hasSkipLabel = false;
49+
if (${{ contains(fromJSON('["pull_request", "pull_request_target"]') , github.event_name) }} === true) {
50+
try {
51+
const labels = await github.rest.issues.listLabelsOnIssue({
52+
owner: context.repo.owner,
53+
repo: context.repo.repo,
54+
issue_number: context.issue.number
55+
});
56+
labels.data.forEach(({ name }) => {
57+
if (name === '${{ format('skip-workflow-{0}', github.workflow) }}') {
58+
hasSkipLabel = true;
59+
}
60+
});
61+
} catch (e) {
62+
core.warning(`failed to list labels: ${e}`);
63+
}
64+
}
65+
return hasSkipLabel;
66+
3967
- name: Checkout sources (current branch)
4068
uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0
69+
with:
70+
fetch-depth: ${{ steps.has_skip_label.outputs.result == 'true' && 100 || 1 }}
71+
72+
- if: ${{ steps.has_skip_label.outputs.result == 'true' }}
73+
name: Get workflow triggered paths
74+
id: get_workflow_triggered_paths
75+
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
76+
with:
77+
script: |
78+
const fs = require('fs');
79+
80+
let paths = [];
81+
82+
const workflowFilePath = '${{ github.workflow_ref }}'.replace('${{ github.repository }}/', '').split('@').shift();
83+
84+
if (fs.existsSync(workflowFilePath)) {
85+
const workflowFileContent = fs.readFileSync(workflowFilePath, 'utf8');
86+
const workflowFileContentLines = workflowFileContent.split('\n');
87+
88+
let hasReadOn = false;
89+
let hasReadPullRequest = false;
90+
let hasReadPaths = false;
91+
for (const line of workflowFileContentLines) {
92+
if (line.match(/^on:\s*$/)) {
93+
hasReadOn = true;
94+
continue;
95+
}
96+
if (line.match(/^\s{2}pull_request(_target)?:\s*$/)) {
97+
hasReadPullRequest = true;
98+
continue;
99+
}
100+
if (line.match(/^\s{4}paths:\s*$/)) {
101+
hasReadPaths = true;
102+
continue;
103+
}
104+
105+
if (hasReadOn && hasReadPullRequest && hasReadPaths) {
106+
const matches = line.match(/^\s{6}-\s['"](.+)['"]\s*$/);
107+
if (matches) {
108+
paths.push(matches[1].trim());
109+
} else {
110+
break;
111+
}
112+
}
113+
}
114+
}
115+
116+
if (paths.length === 0) {
117+
paths = ['**'];
118+
}
119+
120+
console.log(paths);
121+
122+
return paths;
123+
124+
- if: ${{ steps.has_skip_label.outputs.result == 'true' }}
125+
name: Get push changes
126+
id: get_push_changes
127+
uses: tj-actions/changed-files@bab30c2299617f6615ec02a68b9a40d10bd21366 # v45.0.5
128+
with:
129+
since_last_remote_commit: true
130+
json: true
131+
escape_json: false
132+
files: ${{ join(fromJSON(steps.get_workflow_triggered_paths.outputs.result), ';') }}
133+
files_separator: ';'
134+
135+
- name: Check if current workflow should be skipped
136+
id: skip_workflow
137+
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
138+
with:
139+
script: |
140+
if (${{ steps.has_skip_label.outputs.result }} === false) {
141+
return false;
142+
}
143+
144+
const label = '${{ format('skip-workflow-{0}', github.workflow) }}';
145+
if ('${{ steps.get_push_changes.outputs.any_changed }}' === 'true') {
146+
try {
147+
await github.rest.issues.removeLabel({
148+
name: label,
149+
owner: context.repo.owner,
150+
repo: context.repo.repo,
151+
issue_number: context.issue.number
152+
});
153+
core.notice(`label ${label} removed because changes were detected on last push.`);
154+
} catch (e) {
155+
core.warning(`failed to remove label ${label}: ${e}`);
156+
}
157+
158+
return false;
159+
}
160+
161+
return true;
41162
42163
- if: ${{ github.event_name == 'pull_request' }}
43164
name: Get nested pull request path
@@ -155,6 +276,7 @@ jobs:
155276
['release_type', '${{ steps.get_release_type.outputs.release_type || '<em>not defined because this is not a release</em>' }}'],
156277
['is_targeting_feature_branch', '${{ steps.get_stability.outputs.is_targeting_feature_branch }}'],
157278
['target_stability', '${{ steps.get_stability.outputs.target_stability || '<em>not defined because current run is not triggered by pull request event</em>' }}'],
279+
['skip_workflow', '${{ steps.skip_workflow.outputs.result }}']
158280
];
159281
core.summary
160282
.addHeading(`${context.workflow} environment outputs`)

.github/workflows/nrpe.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ jobs:
2424

2525
package:
2626
needs: [get-environment]
27+
if: |
28+
needs.get-environment.outputs.skip_workflow == 'false' &&
29+
needs.get-environment.outputs.stability != 'stable'
2730
runs-on: ubuntu-24.04
2831
strategy:
2932
fail-fast: false
@@ -117,6 +120,7 @@ jobs:
117120
deliver-packages:
118121
needs: [get-environment, package]
119122
if: |
123+
needs.get-environment.outputs.skip_workflow == 'false' &&
120124
(contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) || ( needs.get-environment.outputs.stability == 'stable' && github.event_name != 'workflow_dispatch')) &&
121125
! cancelled() &&
122126
! contains(needs.*.result, 'failure') &&
@@ -151,3 +155,12 @@ jobs:
151155
stability: ${{ needs.get-environment.outputs.stability }}
152156
release_type: ${{ needs.get-environment.outputs.release_type }}
153157
artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }}
158+
159+
set-skip-label:
160+
needs: [get-environment, deliver-packages]
161+
if: |
162+
needs.get-environment.outputs.skip_workflow == 'false' &&
163+
! cancelled() &&
164+
! contains(needs.*.result, 'failure') &&
165+
! contains(needs.*.result, 'cancelled')
166+
uses: ./.github/workflows/set-pull-request-skip-label.yml

0 commit comments

Comments
 (0)