-
Notifications
You must be signed in to change notification settings - Fork 149
205 lines (201 loc) · 9.79 KB
/
upstream-adf.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
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
name: Upstream adf
on:
schedule:
- cron: '0 */3 * * *' # “At minute 0 past every 3rd hour.”
workflow_dispatch:
inputs:
tag:
description: 'Type of the tag the latest version should be fetched with'
required: false
type: string
default: 'alpha'
env:
GH_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN }}
jobs:
upstream:
runs-on: ubuntu-latest
outputs:
hasNewVersion: ${{ steps.fetchLatestPkg.outputs.hasNewVersion }}
hasNewADFVersion: ${{ steps.fetchLatestPkg.outputs.hasNewADFVersion }}
latestADFVersion: ${{ steps.fetchLatestPkg.outputs.latestADFVersion }}
hasNewJSVersion: ${{ steps.fetchLatestPkg.outputs.hasNewJSVersion }}
latestJSVersion: ${{ steps.fetchLatestPkg.outputs.latestJSVersion }}
hasNewVersionWithoutPR: ${{ steps.checkPrAlreadyExist.outputs.hasNewVersionWithoutPR }}
steps:
- id: checkoutRepo
name: Checkout repository
uses: actions/checkout@v3
with:
fetch-depth: 1
- id: fetchLatestPkg
name: Fetch the latest package version
uses: actions/github-script@v6
with:
github-token: ${{ secrets.BOT_GITHUB_TOKEN }}
script: |
const getLatestVersionOf = require('./scripts/gh/update/latest-version-of.js');
const { hasNewVersion: hasNewADFVersion , remoteVersion: latestADFVersion } = await getLatestVersionOf({exec, github, dependencyName: 'adf-core', tag: '${{ inputs.tag }}'});
console.log('hasNewADFVersion', hasNewADFVersion);
console.log('latestADFVersion', latestADFVersion?.name);
const { hasNewVersion: hasNewJSVersion, remoteVersion: latestJSVersion } = await getLatestVersionOf({exec, github, dependencyName: 'js-api', tag: '${{ inputs.tag }}'});
console.log('hasNewJSVersion', hasNewJSVersion);
console.log('latestJSVersion', latestJSVersion?.name);
if (hasNewADFVersion === 'true' || hasNewJSVersion === 'true' ) {
core.setOutput('hasNewVersion', 'true');
if (hasNewADFVersion === 'true') {
core.setOutput('hasNewADFVersion', 'true');
core.setOutput('latestADFVersion', latestADFVersion?.name);
}
if (hasNewJSVersion === 'true') {
core.setOutput('hasNewJSVersion', 'true');
core.setOutput('latestJSVersion', latestJSVersion?.name);
}
} else {
core.setOutput('hasNewVersion', 'false');
console.log('No new version available, skipping upstream!');
}
- name: Check value after
run: |
echo "The value hasNewVersion is: ${{ steps.fetchLatestPkg.outputs.hasNewVersion }}"
echo "The value hasNewADFVersion is: ${{ steps.fetchLatestPkg.outputs.hasNewADFVersion }}"
echo "The value latestADFVersion is: ${{ steps.fetchLatestPkg.outputs.latestADFVersion }}"
echo "The value hasNewJSVersion is: ${{ steps.fetchLatestPkg.outputs.hasNewJSVersion }}"
echo "The value latestJSVersion is: ${{ steps.fetchLatestPkg.outputs.latestJSVersion }}"
- id: checkPrAlreadyExist
name: Check if PR with latest already exist
if: ${{ steps.fetchLatestPkg.outputs.hasNewVersion == 'true' }}
uses: actions/github-script@v6
env:
HAS_NEW_ADF_VERSION: ${{ steps.fetchLatestPkg.outputs.hasNewADFVersion }}
LATEST_ADF_VERSION: ${{ steps.fetchLatestPkg.outputs.latestADFVersion }}
HAS_NEW_JS_VERSION: ${{ steps.fetchLatestPkg.outputs.hasNewJSVersion }}
LATEST_JS_VERSION: ${{ steps.fetchLatestPkg.outputs.latestJSVersion }}
with:
github-token: ${{ secrets.BOT_GITHUB_TOKEN }}
script: |
// verify if there is already an Upstream PR pending
const hasNewADFVersion = process.env.HAS_NEW_ADF_VERSION;
const latestADFVersion = process.env.LATEST_ADF_VERSION;
const hasNewJSVersion = process.env.HAS_NEW_JS_VERSION;
const latestJSVersion = process.env.LATEST_JS_VERSION;
const checkPRAlreadyExist = require('./scripts/gh/update/check-pr-already-exists.js');
let isPRWithLatestADFAlreadyAvailable = false;
let isPRWithLatestJSAlreadyAvailable = false;
if (hasNewADFVersion === 'true') {
isPRWithLatestADFAlreadyAvailable = await checkPRAlreadyExist({github, context, version: latestADFVersion});
console.log('isPRWithLatestADFAlreadyAvailable', isPRWithLatestADFAlreadyAvailable);
}
if (hasNewJSVersion === 'true') {
isPRWithLatestJSAlreadyAvailable = await checkPRAlreadyExist({github, context, version: latestADFVersion});
console.log('isPRWithLatestJSAlreadyAvailable', isPRWithLatestJSAlreadyAvailable);
}
if (isPRWithLatestADFAlreadyAvailable || isPRWithLatestJSAlreadyAvailable) {
console.log('Warning: Upstream PR already exist, stop the migration execution!');
core.setOutput('hasNewVersionWithoutPR', 'false');
} else {
core.setOutput('hasNewVersionWithoutPR', 'true');
}
migrate:
if: ${{ needs.upstream.outputs.hasNewVersionWithoutPR == 'true' }}
runs-on: ubuntu-latest
needs: upstream
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
token: ${{ secrets.BOT_GITHUB_TOKEN }}
fetch-depth: 1
- name: setup NPM
uses: actions/setup-node@v3
with:
node-version-file: '.nvmrc'
cache: 'npm'
- name: Migration
shell: bash
env:
IS_ADF_AFFECTED: ${{ needs.upstream.outputs.hasNewADFVersion }}
IS_JS_AFFECTED: ${{ needs.upstream.outputs.hasNewJSVersion }}
PACKAGE_VERSION_ADF: ${{ needs.upstream.outputs.latestADFVersion }}
PACKAGE_VERSION_JS: ${{ needs.upstream.outputs.latestJSVersion }}
BRANCH_TO_CREATE: "upstream-dependencies"
run: |
migrateDependenciesADF() {
echo "Update ADF dependencies to: ${PACKAGE_VERSION_ADF}"
./scripts/update-version.sh -v ${PACKAGE_VERSION_ADF} -vj latest
echo "Migration ADF done"
}
migrateDependenciesJS() {
echo "Update JS dependencies to: ${PACKAGE_VERSION_JS}"
./scripts/update-version.sh -v latest -vj ${PACKAGE_VERSION_JS}
echo "Migration JS done"
}
migrateAllDependencies() {
echo "Update ADF dependencies to: ${PACKAGE_VERSION_ADF} and JS dependencies to: ${PACKAGE_VERSION_JS}"
./scripts/update-version.sh -v ${PACKAGE_VERSION_ADF} -vj ${PACKAGE_VERSION_JS}
echo "Migration done"
}
if git checkout ${BRANCH_TO_CREATE} 2>/dev/null ; then
git reset --hard origin/develop
echo "Reset branch"
fi
if [[ "$IS_ADF_AFFECTED" == "true" ]] && [[ "$IS_JS_AFFECTED" == "true" ]]; then
migrateAllDependencies
elif [[ "$IS_ADF_AFFECTED" == "true" ]]; then
migrateDependenciesADF
elif [[ "$IS_JS_AFFECTED" == "true" ]]; then
migrateDependenciesJS
fi
- name: Commit Code
if: ${{ needs.upstream.outputs.hasNewVersion == 'true' }}
uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: "[ci:force][auto-commit] Update dependencies ADF:${{ needs.upstream.outputs.latestADFVersion }} JS:${{ needs.upstream.outputs.latestJSVersion }}"
branch: upstream-dependencies
push_options: '--force'
create_branch: true
- name: Create a Pull request
uses: actions/github-script@v6
env:
PACKAGE_VERSION_ADF: ${{ needs.upstream.outputs.latestADFVersion }}
PACKAGE_VERSION_JS: ${{ needs.upstream.outputs.latestJSVersion }}
with:
github-token: ${{ secrets.BOT_GITHUB_TOKEN }}
script: |
const { PACKAGE_VERSION_ADF } = process.env;
const { PACKAGE_VERSION_JS } = process.env;
const BRANCH_TO_CREATE = 'upstream-dependencies';
let title = `GH Auto: Upstream dependencies ADF:${PACKAGE_VERSION_ADF} JS-API:${PACKAGE_VERSION_JS} using Tag:${PACKAGE_VERSION_ADF}`;
if (PACKAGE_VERSION_ADF === 'next' || PACKAGE_VERSION_ADF === 'latest') {
title = `GH Auto: Upstream dependencies ADF and JS-API using Tag:${PACKAGE_VERSION_ADF}`;
}
const { data: prs } = await github.rest.pulls.list({
owner: context.repo.owner,
repo: context.repo.repo,
state: 'open',
head: `${context.repo.owner}:${BRANCH_TO_CREATE}`,
base: 'develop'
});
if (prs.length < 1) {
const payloadPullRequest = {
owner: context.repo.owner,
repo: context.repo.repo,
title: title,
head: `${context.repo.owner}:${BRANCH_TO_CREATE}`,
base: 'develop',
body: `Automatic PR`
};
console.log('Payload: ',payloadPullRequest);
const { data: pr } = await github.rest.pulls.create(payloadPullRequest);
return pr.number;
} else {
const upstreamPrOpen = prs[0];
// override the title to contains the latest adf dep number
const payloadUpdatePullRequest = {
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: upstreamPrOpen.number,
title: title,
};
await github.rest.pulls.update(payloadUpdatePullRequest);
return upstreamPrOpen.number;
}