forked from janus-idp/backstage-plugins
-
Notifications
You must be signed in to change notification settings - Fork 0
225 lines (193 loc) · 9.72 KB
/
publish-backend-plugin-manager.yaml
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
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
# Copyright 2023 Janus Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
name: Publish Backend Plugin Manager
on:
schedule:
- cron: '20 * * * *' # every hour at 20 minutes
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
inputs:
git_ref:
description: Git reference for the upstream repository checkout
type: string
default: 'master'
concurrency:
group: ${{ github.workflow }}
cancel-in-progress: true
env:
SCOPE: '@janus-idp'
jobs:
build:
# build the backend plugin manager in the backstage/backstage GitHub repository
# and publish it to the NPMJS repository @janus-idp organization,
# with changed scope and version
name: Publish Backend Plugin Manager
runs-on: ubuntu-latest
steps:
- name: Set GitHub Ref to checkout
id: get_checkout_ref
run: |
if [[ ${{ github.event_name == 'workflow_dispatch' }} == true ]]; then
GIT_REF=${{ inputs.git_ref }}
else
GIT_REF=master
fi
echo "GIT_REF=$GIT_REF" >> $GITHUB_OUTPUT
- name: Checkout from master
if: steps.get_checkout_ref.outputs.GIT_REF == 'master'
uses: actions/checkout@v4
with:
repository: backstage/backstage
ref: master
# fetch all history, but only for the current ref
fetch-depth: 2147483647
fetch-tags: false
- name: Checkout from a git ref
if: steps.get_checkout_ref.outputs.GIT_REF != 'master'
uses: actions/checkout@v4
with:
repository: backstage/backstage
ref: '${{ steps.get_checkout_ref.outputs.GIT_REF }}'
- name: Get sha of the latest backend-plugin-manager commit
id: get_commit_sha
run: |
if [[ ${{ steps.get_checkout_ref.outputs.GIT_REF }} == "master" ]]; then
echo "COMMIT_ID=$(git rev-list --max-count=1 HEAD -- packages/backend-plugin-manager)" >> "$GITHUB_OUTPUT"
else
echo "COMMIT_ID=$(git rev-list --max-count=1 HEAD)" >> "$GITHUB_OUTPUT"
fi
echo "GH Output: " && cat $GITHUB_OUTPUT
- name: Test if commit is already published
id: test_commit_already_published
env:
COMMIT_ID: ${{ steps.get_commit_sha.outputs.COMMIT_ID }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
run: |
echo //registry.npmjs.org/:_authToken=${NPM_TOKEN} > .npmrc
if [ "_$(npm dist-tag ls $SCOPE/backend-plugin-manager | grep -e ^$COMMIT_ID || echo '')" != "_" ]; then ALREADY_PUSHED="true"; else ALREADY_PUSHED="false"; fi
echo "ALREADY_PUSHED=$ALREADY_PUSHED" >> "$GITHUB_OUTPUT"
echo "GH Output: " && cat $GITHUB_OUTPUT
- name: Setup Node.js
uses: actions/setup-node@v3
if: steps.test_commit_already_published.outputs.ALREADY_PUSHED == 'false'
env:
FORCE_COLOR: 0
with:
node-version: 18
cache: 'yarn'
- name: Get the version of the backend-plugin-manager package
id: get_package_version
run: |
echo "PACKAGE_VERSION=$(node -p "require('./packages/backend-plugin-manager/package.json').version")" >> "$GITHUB_OUTPUT"
echo "GH Output: " && cat $GITHUB_OUTPUT
- name: Get the last version of the backend-plugin-manager package pushed to the NPMJS repository
id: get_last_pushed_version
run: |
echo "LAST_PUSHED_VERSION=$(npm view $SCOPE/backend-plugin-manager version)" >> "$GITHUB_OUTPUT"
echo "GH Output: " && cat $GITHUB_OUTPUT
- name: Get new version to push
id: get_new_version_to_push
if: steps.test_commit_already_published.outputs.ALREADY_PUSHED == 'false'
env:
COMMIT_VERSION: ${{ steps.get_package_version.outputs.PACKAGE_VERSION }}
LAST_PUSHED_VERSION: ${{ steps.get_last_pushed_version.outputs.LAST_PUSHED_VERSION }}
run: |
#
# The new version to push to NPMS is calculated as follows:
#
# upstream version: 0.0.0, already pushed version: none => new version: 0.0.1-janus.0
# upstream version: 0.0.0, already pushed version: 0.0.1-janus.0 => new version: 0.0.1-janus.1
# upstream version: 0.0.1-next.0, already pushed version: 0.0.1-janus.1 => new version: 0.0.1-janus.2
# upstream version: 0.0.1-next.1, already pushed version: 0.0.1-janus.2 => new version: 0.0.1-janus.3
# upstream version: 0.0.1, already pushed version: 0.0.1-janus.3 => new version: 0.0.2-janus.0
# upstream version: 0.0.2-next.0, already pushed version: 0.0.2-janus.0 => new version: 0.0.2-janus.1
# etc ...
#
# Parse the semantic version of the upstream `backend-plugin-manager`
COMMIT_MAJOR=$(echo $COMMIT_VERSION | cut -d. -f1)
COMMIT_MINOR=$(echo $COMMIT_VERSION | cut -d. -f2)
COMMIT_PATCH=$(echo $COMMIT_VERSION | cut -d. -f3 | cut -d- -f1)
if [ "$COMMIT_MAJOR.$COMMIT_MINOR.$COMMIT_PATCH" == "$COMMIT_VERSION" ]; then
COMMIT_PRERELEASE=""
else
COMMIT_PRERELEASE=$(echo $COMMIT_VERSION | cut -d- -f2)
fi
# If there is a pre-release part, then the effective last released version is the previous one
if [ -n "$COMMIT_PRERELEASE" ]; then
COMMIT_PATCH=$((COMMIT_PATCH-1))
fi
# The PATCH part of the version pushed to NPMJS will always contain a pre-release part
# => increment it
PATCH=$((COMMIT_PATCH+1))
# If the last pushed version is not empty, set it to a default value, and then parse it
if [ -z "$LAST_PUSHED_VERSION" ]; then
LAST_PUSHED_VERSION=$COMMIT_MAJOR.$COMMIT_MINOR.$PATCH-janus.0
fi
LAST_PUSHED_MAJOR=$(echo $LAST_PUSHED_VERSION | cut -d. -f1)
LAST_PUSHED_MINOR=$(echo $LAST_PUSHED_VERSION | cut -d. -f2)
LAST_PUSHED_PATCH=$(echo $LAST_PUSHED_VERSION | cut -d. -f3 | cut -d- -f1)
LAST_PUSHED_PRERELEASE_WITHOUT_NUMBER=$(echo $LAST_PUSHED_VERSION | cut -d- -f2 | cut -d. -f1)
LAST_PUSHED_PRERELEASE_NUMBER=$(echo $LAST_PUSHED_VERSION | cut -d- -f2 | cut -d. -f2)
# if base version (without pre-release part) is the same for upstream package and pushed NPM package,
# then just increment the pre-release number,
# otherwise, use the base version of the upstream package, and reset the `.janus.` pre-release number to 0.
if [ "$COMMIT_MAJOR.$COMMIT_MINOR.$PATCH" == "$LAST_PUSHED_MAJOR.$LAST_PUSHED_MINOR.$LAST_PUSHED_PATCH" ]; then
PRERELEASE="janus.$((LAST_PUSHED_PRERELEASE_NUMBER+1))"
else
PRERELEASE="janus.0"
fi
echo "VERSION=$COMMIT_MAJOR.$COMMIT_MINOR.$PATCH-$PRERELEASE" >> "$GITHUB_OUTPUT"
echo "GH Output: " && cat $GITHUB_OUTPUT
- name: Update BackendPluginManager package.json with changed scope and version, and make it public
if: steps.test_commit_already_published.outputs.ALREADY_PUSHED == 'false'
env:
VERSION: ${{ steps.get_new_version_to_push.outputs.VERSION }}
run: |
sed -i "s/\"version\": \".*\"/\"version\": \"$VERSION\"/" packages/backend-plugin-manager/package.json
sed -i "s/\"name\": \"@backstage\/backend-plugin-manager\"/\"name\": \"$SCOPE\/backend-plugin-manager\"/" packages/backend-plugin-manager/package.json
sed -i "s/\"private\": true/\"private\": false/" packages/backend-plugin-manager/package.json
echo "Package.JSON:" && cat packages/backend-plugin-manager/package.json
- name: Install Dependencies
env:
YARN_ENABLE_IMMUTABLE_INSTALLS: 'false'
if: steps.test_commit_already_published.outputs.ALREADY_PUSHED == 'false'
run: yarn install
- name: Build the backend-plugin-manager package
if: steps.test_commit_already_published.outputs.ALREADY_PUSHED == 'false'
env:
NODE_OPTIONS: '--max-old-space-size=4096'
run: |
yarn tsc
yarn workspace $SCOPE/backend-plugin-manager build
- name: Publish to NPM with the tag as the commit sha
if: steps.test_commit_already_published.outputs.ALREADY_PUSHED == 'false'
env:
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
COMMIT_ID: ${{ steps.get_commit_sha.outputs.COMMIT_ID }}
VERSION: ${{ steps.get_new_version_to_push.outputs.VERSION }}
run: |
yarn config set 'npmAuthToken' "$NPM_TOKEN"
yarn workspace $SCOPE/backend-plugin-manager npm publish --access public --tag latest
yarn npm tag add $SCOPE/backend-plugin-manager@$VERSION $COMMIT_ID
- name: Tag the package with backstage release tag if is a release commit
if:
steps.test_commit_already_published.outputs.ALREADY_PUSHED == 'false' &&
startsWith(steps.get_checkout_ref.outputs.GIT_REF, 'v')
env:
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
GIT_REF: ${{ steps.get_checkout_ref.outputs.GIT_REF }}
VERSION: ${{ steps.get_new_version_to_push.outputs.VERSION }}
run: |
yarn config set 'npmAuthToken' "$NPM_TOKEN"
yarn npm tag add $SCOPE/backend-plugin-manager@$VERSION $GIT_REF