Holy Grail #5
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
# Holy Grail: all release steps in one workflow | |
name: Holy Grail | |
on: | |
workflow_dispatch: | |
inputs: | |
version: | |
description: 'Release type' | |
required: true | |
default: 'patch' | |
type: choice | |
options: | |
- minor | |
- patch | |
nodeVersion: | |
description: 'Node version' | |
required: true | |
default: '20.9.0' | |
type: string | |
tags: | |
description: 'Tag' | |
required: true | |
default: 'latest' | |
type: choice | |
options: | |
- latest | |
- beta | |
- dev | |
jobs: | |
#CREATE RELEASE BRANCH | |
create-release-branch: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Check out code | |
uses: actions/checkout@v4 | |
with: | |
ref: develop | |
- name: Set Tegel user | |
run: git config --global user.name "Tegel - Scania" && git config --global user.email "tegel.design.system@gmail.com" | |
- name: Core - Bump version | |
id: core-version | |
working-directory: packages/core | |
run: npm version ${{ github.event.inputs.version }} --no-git-tag-version | |
- name: Angular - Bump version | |
id: angular-version | |
working-directory: packages/angular | |
run: npm version ${{ github.event.inputs.version }} --no-git-tag-version | |
- name: Angular 17 - Bump version | |
id: angular-17-version | |
working-directory: packages/angular-17/projects/components | |
run: npm version ${{ github.event.inputs.version }} --no-git-tag-version | |
- name: React - Bump version | |
id: react-version | |
working-directory: packages/react | |
run: npm version ${{ github.event.inputs.version }} --no-git-tag-version | |
- name: Core - Read package.json Version | |
id: version | |
working-directory: packages/core | |
run: echo "PACKAGE_VERSION=$(jq -r .version package.json)" >> $GITHUB_OUTPUT | |
- name: Save version as artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: version | |
path: packages/core/package.json # assuming the version is saved here | |
- name: Create release branch | |
run: | | |
git checkout -b release/tegel@${{ steps.version.outputs.PACKAGE_VERSION }} | |
git add . | |
git commit -m "chore: bump versions to ${{ steps.version.outputs.PACKAGE_VERSION }}" | |
git push -u --no-verify origin release/tegel@${{ steps.version.outputs.PACKAGE_VERSION }} | |
#Need to output the version to use it in the next jobs | |
outputs: | |
version: ${{ steps.version.outputs.PACKAGE_VERSION }} | |
#RELEASE CORE | |
release-core: | |
needs: create-release-branch | |
runs-on: ubuntu-latest | |
env: | |
WORKING_DIRECTORY: packages/core | |
steps: | |
- name: Check out code | |
uses: actions/checkout@v4 | |
with: | |
ref: release/tegel@${{ needs.create-release-branch.outputs.version }} | |
fetch-depth: 0 # Fetch all branches | |
token: ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }} # Use the token for authentication | |
- name: Set up node | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ github.event.inputs.nodeVersion }} | |
registry-url: 'https://registry.npmjs.org' | |
- name: Set up Git for authentication | |
run: | | |
git config --global user.name "Tegel - Scania" | |
git config --global user.email "tegel.design.system@gmail.com" | |
git remote set-url origin https://x-access-token:${{ secrets.GH_PERSONAL_ACCESS_TOKEN }}@github.com/${{ github.repository }} | |
- name: Core - Read Package.json Version | |
id: version | |
working-directory: ${{ env.WORKING_DIRECTORY }} | |
run: echo "PACKAGE_VERSION=$(jq -r .version package.json)" >> $GITHUB_OUTPUT | |
- name: Install dependencies in root | |
run: npm ci | |
- name: Core - Install | |
working-directory: ${{ env.WORKING_DIRECTORY }} | |
run: npm ci | |
- name: Core - Run build | |
working-directory: ${{ env.WORKING_DIRECTORY }} | |
run: npm run build | |
- name: Core - Publish | |
working-directory: ${{ env.WORKING_DIRECTORY }} | |
run: npm publish --tag ${{ github.event.inputs.tags }} | |
env: | |
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} | |
- name: Core - Commit and push changes | |
run: | | |
git add . | |
if ! git diff-index --quiet HEAD; then | |
git commit -m "ci(release-core-step): files changed in release" | |
git push --force --no-verify | |
else | |
echo "No changes to commit" | |
fi | |
#BUMP WRAPPERS TO NEW VERSION | |
bump-wrappers-to-new-version: | |
needs: release-core | |
runs-on: ubuntu-latest | |
steps: | |
- name: Check out code | |
uses: actions/checkout@v4 | |
with: | |
ref: release/tegel@${{ needs.create-release-branch.outputs.version }} | |
fetch-depth: 1 # Fetch just the release branch | |
- name: Set up node | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ github.event.inputs.nodeVersion }} | |
registry-url: 'https://registry.npmjs.org' | |
- name: Set Tegel user | |
run: git config --global user.name "Tegel - Scania" && git config --global user.email "tegel.design.system@gmail.com" | |
- name: Angular - Install latest tegel package | |
working-directory: packages/angular | |
run: npm install @scania/tegel@${{ needs.create-release-branch.outputs.version }} | |
- name: Angular 17 - Install latest tegel package | |
working-directory: packages/angular-17 | |
run: npm install @scania/tegel@${{ needs.create-release-branch.outputs.version }} | |
- name: Angular 17 components - Install latest tegel package | |
working-directory: packages/angular-17/projects/components | |
run: npm install @scania/tegel@${{ needs.create-release-branch.outputs.version }} | |
- name: React - Install latest tegel package | |
working-directory: packages/react | |
run: npm install @scania/tegel@${{ needs.create-release-branch.outputs.version }} | |
- name: Wrappers Core increase - Commit and push changes | |
run: | | |
git add . | |
if ! git diff-index --quiet HEAD; then | |
git commit -m "ci(wrappers-increase-step): files changed in release" | |
git push --force --no-verify | |
else | |
echo "No changes to commit" | |
fi | |
#RELEASE ANGULAR | |
release-angular: | |
needs: [create-release-branch, release-core, bump-wrappers-to-new-version] | |
runs-on: ubuntu-latest | |
env: | |
WORKING_DIRECTORY: packages/angular | |
steps: | |
- name: Check out code | |
uses: actions/checkout@v4 | |
with: | |
ref: release/tegel@${{ needs.create-release-branch.outputs.version }} | |
fetch-depth: 1 # Fetch just the release branch | |
- name: Set up node | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ github.event.inputs.nodeVersion }} | |
registry-url: 'https://registry.npmjs.org' | |
- name: Install dependencies in root | |
run: npm ci | |
- name: Core - Install | |
working-directory: packages/core | |
run: npm ci | |
- name: Angular - Install | |
working-directory: packages/angular | |
run: npm ci | |
- name: Angular - Run build | |
run: npm run build-angular | |
- name: Angular - Publish | |
working-directory: packages/angular | |
run: npm publish --tag ${{ github.event.inputs.tags }} | |
env: | |
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} | |
#RELEASE ANGULAR 17 | |
release-angular-17: | |
needs: [create-release-branch, release-core, bump-wrappers-to-new-version] | |
runs-on: ubuntu-latest | |
env: | |
WORKING_DIRECTORY: packages/angular-17 | |
steps: | |
- name: Check out code | |
uses: actions/checkout@v4 | |
with: | |
ref: release/tegel@${{ needs.create-release-branch.outputs.version }} | |
fetch-depth: 1 # Fetch just the release branch | |
- name: Set up node | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ github.event.inputs.nodeVersion }} | |
registry-url: 'https://registry.npmjs.org' | |
- name: Install dependencies in root | |
run: npm ci | |
- name: Core - Install | |
working-directory: packages/core | |
run: npm ci | |
- name: Angular-17 workspace - Install | |
working-directory: packages/angular-17 | |
run: npm ci | |
- name: Angular-17 wrapper - Install | |
working-directory: packages/angular-17/projects/components | |
run: npm ci | |
- name: Angular-17 - Run build | |
run: npm run build-angular-17 | |
- name: Angular-17 - Publish | |
working-directory: packages/angular-17/dist/components | |
run: npm publish --tag ${{ github.event.inputs.tags }} | |
env: | |
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} | |
#RELEASE REACT | |
release-react: | |
needs: [create-release-branch, release-core, bump-wrappers-to-new-version] | |
runs-on: ubuntu-latest | |
env: | |
WORKING_DIRECTORY: packages/react | |
steps: | |
- name: Check out code | |
uses: actions/checkout@v4 | |
with: | |
ref: release/tegel@${{ needs.create-release-branch.outputs.version }} | |
fetch-depth: 1 # Fetch just the release branch | |
- name: Set up node | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ github.event.inputs.nodeVersion }} | |
registry-url: 'https://registry.npmjs.org' | |
- name: React - Read package.json Version | |
id: version | |
working-directory: packages/react | |
run: echo "PACKAGE_VERSION=$(jq -r .version package.json)" >> $GITHUB_OUTPUT | |
- name: Install dependencies in root | |
run: npm ci | |
- name: Core - Install | |
working-directory: packages/core | |
run: npm ci | |
- name: React - Install | |
working-directory: packages/react | |
run: npm ci | |
- name: React - Build | |
run: npm run build-react | |
- name: React - Publish | |
working-directory: packages/react | |
run: npm publish --tag ${{ github.event.inputs.tags }} | |
env: | |
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} | |
#ON FAILURE | |
on-failure: | |
needs: [create-release-branch, release-core, release-angular, release-angular-17, release-react] | |
runs-on: ubuntu-latest | |
if: (needs.create-release-branch.result == 'failure' || needs.release-core.result == 'failure' || needs.release-angular.result == 'failure' || needs.release-angular-17.result == 'failure' || needs.release-react.result == 'failure') | |
steps: | |
- name: Download version | |
uses: actions/download-artifact@v4 | |
with: | |
name: version | |
path: packages/core | |
- name: Remove branch on failure | |
run: git push --no-verify origin --delete release/tegel@${{ needs.create-release-branch.outputs.version }} | |
#MERGE RELEASE BRANCH TO DEVELOP | |
merge-release-branch-into-develop: | |
needs: [create-release-branch, release-core, release-angular, release-angular-17, release-react] | |
runs-on: ubuntu-latest | |
if: (needs.create-release-branch.result == 'success' && needs.release-core.result == 'success' && needs.release-angular.result == 'success' && needs.release-angular-17.result == 'success' && needs.release-react.result == 'success') | |
steps: | |
- name: Check out code | |
uses: actions/checkout@v4 | |
with: | |
ref: release/tegel@${{ needs.create-release-branch.outputs.version }} | |
fetch-depth: 0 # Fetch all branches | |
token: ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }} | |
- name: Fetch all branches | |
run: git fetch --all | |
- name: Set up Git for authentication | |
run: | | |
git config --global user.name "Tegel - Scania" | |
git config --global user.email "tegel.design.system@gmail.com" | |
git remote set-url origin https://x-access-token:${{ secrets.GH_PERSONAL_ACCESS_TOKEN }}@github.com/${{ github.repository }} | |
- name: Merge release branch into develop | |
run: | | |
git checkout develop | |
git merge --squash -X theirs release/tegel@${{ needs.create-release-branch.outputs.version }} | |
git add . | |
if ! git diff-index --quiet HEAD; then | |
git commit -m "release: tegel ${{ needs.create-release-branch.outputs.version }}" | |
git push --force --no-verify origin develop | |
else | |
echo "No changes to commit in develop" | |
fi | |
#CREATE GIT TAG | |
create-git-tag: | |
needs: [create-release-branch, merge-release-branch-into-develop] | |
runs-on: ubuntu-latest | |
if: (needs.merge-release-branch-into-develop.result == 'success') | |
env: | |
WORKING_DIRECTORY: packages/core | |
steps: | |
- name: Check out code | |
uses: actions/checkout@v4 | |
with: | |
ref: develop | |
fetch-depth: 0 # Fetch all branches | |
token: ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }} # Use the token for authentication | |
- name: Set up node | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ github.event.inputs.nodeVersion }} | |
registry-url: 'https://registry.npmjs.org' | |
- name: Set up Git for authentication | |
run: | | |
git config --global user.name "Tegel - Scania" | |
git config --global user.email "tegel.design.system@gmail.com" | |
git remote set-url origin https://x-access-token:${{ secrets.GH_PERSONAL_ACCESS_TOKEN }}@github.com/${{ github.repository }} | |
- name: Core - Create git tag | |
run: git tag @scania/tegel@${{ needs.create-release-branch.outputs.version }} | |
- name: Core - Push git tag | |
run: git push --no-verify origin @scania/tegel@${{ needs.create-release-branch.outputs.version }} | |
#MERGE DEVELOP INTO MAIN | |
merge-develop-into-main: | |
needs: [create-release-branch, create-git-tag, merge-release-branch-into-develop] | |
runs-on: ubuntu-latest | |
if: (needs.create-git-tag.result == 'success' && needs.merge-release-branch-into-develop.result == 'success') | |
steps: | |
- name: Check out code | |
uses: actions/checkout@v4 | |
with: | |
ref: develop | |
fetch-depth: 0 # Fetch all branches | |
token: ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }} | |
- name: Fetch all branches | |
run: git fetch --all | |
- name: Set up Git for authentication | |
run: | | |
git config --global user.name "Tegel - Scania" | |
git config --global user.email "tegel.design.system@gmail.com" | |
git remote set-url origin https://x-access-token:${{ secrets.GH_PERSONAL_ACCESS_TOKEN }}@github.com/${{ github.repository }} | |
- name: Merge develop into main | |
run: | | |
git checkout main | |
git merge --squash -X theirs develop | |
git add . | |
if ! git diff-index --quiet HEAD; then | |
git commit -m "release: tegel ${{ needs.create-release-branch.outputs.version }}" | |
git push --force --no-verify origin main | |
else | |
echo "No changes to commit in main" | |
fi |