forked from ant-design/ant-design
-
Notifications
You must be signed in to change notification settings - Fork 0
182 lines (160 loc) Β· 7.37 KB
/
visual-regression-diff-finish.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
# Each PR will visual-regression diff that help to check code is work as expect.
name: π Visual Regression Diff Finish
on:
workflow_run:
workflows: [π Visual Regression Diff Build]
types:
- completed
permissions:
contents: read
jobs:
upstream-workflow-summary:
name: upstream workflow summary
runs-on: ubuntu-latest
outputs:
jobs: ${{ steps.visual_diff_build_job_status.outputs.result }}
upstream-job-link: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.event.workflow_run.id }}/job/${{ steps.visual_diff_build_job_status.outputs.job-id }}
build-status: ${{ steps.visual_diff_build_job_status.outputs.build-status }}
steps:
- name: summary jobs status
uses: actions/github-script@v7
id: visual_diff_build_job_status
with:
script: |
const response = await github.rest.actions.listJobsForWorkflowRun({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: ${{ github.event.workflow_run.id }},
});
// { [name]: [conclusion] }, e.g. { 'test image': 'success' }
const jobs = (response.data?.jobs ?? []).reduce((acc, job) => {
if(job?.status === 'completed' && 'name' in job && 'conclusion' in job) {
acc[job.name] = {
id: job.id,
status: job.conclusion,
};
}
return acc;
}, {});
const total = Object.keys(jobs).length;
if(total === 0) core.setFailed('no jobs found');
// the name here must be the same as `jobs.xxx.{name}`
console.log('visual-diff report job status: %s', jobs['visual-diff report'].status);
// set output
core.setOutput('job-id', jobs['visual-diff report'].id);
core.setOutput('build-status', jobs['visual-diff report'].status);
return jobs;
download-visual-regression-report:
name: download visual-regression report
permissions:
actions: read # for dawidd6/action-download-artifact to query and download artifacts
issues: write # for actions-cool/maintain-one-comment to modify or create issue comments
pull-requests: write # for actions-cool/maintain-one-comment to modify or create PR comments
statuses: write
runs-on: ubuntu-latest
needs: [upstream-workflow-summary]
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
# We need get persist-index first
- name: download image snapshot artifact
uses: dawidd6/action-download-artifact@v8
with:
workflow: ${{ github.event.workflow_run.workflow_id }}
run_id: ${{ github.event.workflow_run.id }}
name: visual-regression-diff-ref
path: ./tmp
# Save PR id to output
- name: save PR id
id: pr
run: |
pr_id=$(<tmp/visual-regression-pr-id.txt)
if ! [[ "$pr_id" =~ ^[0-9]+$ ]]; then
echo "Error: pr-id.txt does not contain a valid numeric PR id. Please check."
exit 1
fi
echo "id=$pr_id" >> $GITHUB_OUTPUT
# Download report artifact
- name: download report artifact
id: download_report
if: ${{ needs.upstream-workflow-summary.outputs.build-status == 'success' || needs.upstream-workflow-summary.outputs.build-status == 'failure' }}
uses: dawidd6/action-download-artifact@v8
with:
workflow: ${{ github.event.workflow_run.workflow_id }}
run_id: ${{ github.event.workflow_run.id }}
name: visual-regression-report
path: ./tmp
# unzip report and then upload them to oss
- name: upload visual-regression report
id: report
env:
ALI_OSS_AK_ID: ${{ secrets.ALI_OSS_AK_ID }}
ALI_OSS_AK_SECRET: ${{ secrets.ALI_OSS_AK_SECRET }}
PR_ID: ${{ steps.pr.outputs.id }}
run: |
mkdir ./visualRegressionReport
tar -xzvf tmp/visualRegressionReport.tar.gz -C ./visualRegressionReport
echo "β
Uncompress Finished"
rm package.json
bun add ali-oss --no-save
echo "β
Install `ali-oss` Finished"
echo "π€ Uploading"
node scripts/visual-regression/upload.js ./visualRegressionReport --ref=pr-$PR_ID
echo "β
Uploaded"
delimiter="$(openssl rand -hex 8)"
echo "content<<${delimiter}" >> "${GITHUB_OUTPUT}"
echo "$(<visualRegressionReport/report.md)" >> "${GITHUB_OUTPUT}"
echo "${delimiter}" >> "${GITHUB_OUTPUT}"
- name: success comment
uses: actions-cool/maintain-one-comment@v3
if: ${{ steps.report.outcome == 'success' }}
with:
token: ${{ secrets.GITHUB_TOKEN }}
body: |
${{ steps.report.outputs.content }}
<!-- VISUAL_DIFF_REGRESSION_HOOK -->
body-include: <!-- VISUAL_DIFF_REGRESSION_HOOK -->
number: ${{ steps.pr.outputs.id }}
- name: failed comment
if: ${{ steps.download_report.outcome == 'failure' || steps.report.outcome == 'failure' || failure() }}
uses: actions-cool/maintain-one-comment@v3
with:
token: ${{ secrets.GITHUB_TOKEN }}
body: |
## Visual Regression Build for PR #${{ steps.pr.outputs.id }} Failed β
Potential causes:
- `upstream workflow` status: ${{ needs.upstream-workflow-summary.outputs.build-status }} [upstream job link](${{ needs.upstream-workflow-summary.outputs.upstream-job-link }})
- `current workflow` summary:
- `download report artifact` status: ${{ steps.download_report.outcome }}
- `report upload` status: ${{ steps.report.outcome }}
- workflow url: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}
<!-- VISUAL_DIFF_REGRESSION_HOOK -->
body-include: <!-- VISUAL_DIFF_REGRESSION_HOOK -->
number: ${{ steps.pr.outputs.id }}
# Resync commit status. This will be also reset by `visual-regression-diff-approver`
- name: Reset Commit Status
uses: actions/github-script@v7
if: ${{ steps.report.outcome == 'success' }}
env:
PR_ID: ${{ steps.pr.outputs.id }}
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const prResponse = await github.rest.pulls.get({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: process.env.PR_ID,
});
const prHeadSha = prResponse.data.head.sha;
const fullContent = `${{ toJSON(steps.report.outputs.content) }}`;
const hasVisualDiffSuccess = fullContent.includes('VISUAL_DIFF_SUCCESS');
const hasVisualDiffFailed = fullContent.includes('VISUAL_DIFF_FAILED');
const mergedStatus = hasVisualDiffSuccess ? 'success' : hasVisualDiffFailed ? 'failure' : 'pending';
await github.rest.repos.createCommitStatus({
owner: context.repo.owner,
repo: context.repo.repo,
sha: prHeadSha,
state: mergedStatus,
context: 'Visual Regression Diff Wait Approve',
description: hasVisualDiffSuccess ? 'Visual diff check pass' : 'Visual diff check failed',
});