-
Notifications
You must be signed in to change notification settings - Fork 106
134 lines (116 loc) · 4.07 KB
/
label.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
name: Label
on:
pull_request:
branches: [master, vara-stage-1, vara-stage-2, vara-stage-3]
types: [labeled]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
dispatch:
runs-on: ubuntu-latest
if: >-
github.event.label.name == 'A0-pleasereview'
|| github.event.label.name == 'E2-forcemacos'
steps:
- uses: actions/checkout@v3
with:
ref: ${{ github.event.pull_request.head.sha }}
# - name: Set HEAD_SHA
# run: echo "HEAD_SHA=$(git rev-parse HEAD)" >> $GITHUB_ENV
- uses: actions/github-script@v6
env:
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
LABEL: ${{ github.event.label.name }}
REF: ${{ github.head_ref || github.ref_name }}
with:
script: |
const { LABEL, REF, HEAD_SHA } = process.env;
const [owner, repo] = ["gear-tech", "gear"];
const linux = (LABEL === "A0-pleasereview");
// List the latest check runs
const {
data: { check_runs }
} = await github.rest.checks.listForRef({
owner,
repo,
ref: REF,
});
// Filter the traget skipped workflow run.
const runs = linux
?check_runs.filter((run) => run.name === "build")
:check_runs.filter((run) => run.name === "build / macox-x86")
console.log(runs);
if (runs.length === 0) return;
if (runs[0].conclusion !== "skipped") return;
/**
* The main logic starts from here.
**/
// Dispatch target workflow.
const workflow_id = linux
?".github/workflows/build.yml"
:".github/workflows/build-macos.yml";
await github.rest.actions.createWorkflowDispatch({
owner,
repo,
workflow_id,
ref: REF,
});
// Create check and update status
const check = async (name) => await github.rest.checks.create({
owner,
repo,
name,
head_sha: HEAD_SHA
});
const sleep = ms => new Promise(r => setTimeout(r, ms));
const update = async (checks) => {
const { workflow_runs } = await github.rest.actions.listWorkflowRuns({
owner,
repo,
workflow_id,
head_sha: HEAD_SHA,
});
for (check of checks) {
const name = check.name;
let runs = workflow_runs.filter((run) => run.name === name);
if (runs.length !== 1) {
core.setFailed(`Could not find action ${name} from ${workflow_runs}`);
return;
}
const {
status,
conclusion,
id: external_id,
started_at,
url: details_url,
} = runs[0];
await github.rest.checks.update({
repo,
owner,
check_run_id: check.run_id,
external_id,
started_at,
details_url,
status,
conclusion,
});
if (status === "completed") {
checks = checks.filter((c) => c != check);
}
}
if (checks.length === 0) {
return true;
} else {
await sleep(10000);
return await update(checks);
}
}
if (linux) {
const buildLinux = await check("build / linux");
const buildWinCross = await check("build / win-cross");
await update([buildLinux, buildWinCross]);
} else {
const buildMacosX86 = await check("build / macos-x86");
await update([buildMacosX86])
}