Publish Backend Plugin Manager #583
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 |