Skip to content

Frontend Release PR

Frontend Release PR #2

name: Frontend Release PR
on:
workflow_dispatch:
inputs:
type:
type: choice
description: Choose release type
options:
- patch
- minor
- major
default: patch
beta:
type: boolean
description: Prerelease
default: false
permissions:
contents: write
pull-requests: write
issues: write
jobs:
releaseIt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.APP_INSTALLATION_TOKEN }}
- name: git config
run: |
git config user.name "${GITHUB_ACTOR}"
git config user.email "${GITHUB_ACTOR}@users.noreply.github.com"
- name: Setup node
uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
# Try normal install first, fallback to clean install only if needed
- name: Install dependencies
run: |
npm ci || {
echo "npm ci failed, trying clean install with rollup fix..."
rm -rf node_modules services/frontend/node_modules
npm install --no-optional
}
- name: Prepare release
working-directory: services/frontend
env:
GITHUB_TOKEN: ${{ secrets.APP_INSTALLATION_TOKEN }}
TYPE_ARG: ${{ fromJSON('{"patch":"patch", "minor":"minor", "major":"major"}')[github.event.inputs.type] }}
BETA_ARG: ${{ github.event.inputs.beta == 'true' && '--preRelease=beta' || '' }}
run: npm run release -- $TYPE_ARG --ci --verbose --no-git.push --no-git.commit --no-git.tag --no-github $BETA_ARG
- name: get-npm-version
id: package-version
uses: martinbeentjes/npm-get-version-action@main
with:
path: services/frontend
- name: Extract release notes
id: extract-release-notes
working-directory: services/frontend
run: |
VERSION=$(cat package.json | grep '"version"' | cut -d'"' -f4)
echo "Extracting release notes for version $VERSION"
if [ -f CHANGELOG.md ]; then
RELEASE_NOTES=$(awk -v version="$VERSION" '
BEGIN { found=0; content="" }
/^##? [0-9]+\.[0-9]+\.[0-9]+/ {
if (found) exit
if ($0 ~ version) { found=1; next }
}
found && /^##? [0-9]+\.[0-9]+\.[0-9]+/ { exit }
found { content = content $0 "\n" }
END { print content }
' CHANGELOG.md)
CLEAN_NOTES=$(echo "$RELEASE_NOTES" | sed 's/(\[\]([^)]*))//g' | sed '/^$/d')
echo "release_notes<<EOF" >> $GITHUB_OUTPUT
echo "$CLEAN_NOTES" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
echo "Release notes extracted:"
echo "$CLEAN_NOTES"
else
echo "No CHANGELOG.md found"
echo "release_notes=" >> $GITHUB_OUTPUT
fi
- name: Create pull request
uses: peter-evans/create-pull-request@v7
id: cpr
with:
token: ${{ secrets.APP_INSTALLATION_TOKEN }}
branch: frontend-release
delete-branch: true
commit-message: 'chore(frontend): release v${{ steps.package-version.outputs.current-version}}'
title: '[Frontend Release] v${{ steps.package-version.outputs.current-version}}'
body: |
## Frontend Release v${{ steps.package-version.outputs.current-version}}
This PR prepares a new frontend release.
When merged, this will:
1. Create a release tag
2. Build and publish a multi-architecture Docker image to Docker Hub
The Docker image will be available at:
- `deploystack/frontend:latest`
- `deploystack/frontend:v${{ steps.package-version.outputs.current-version}}`
### Supported Architectures
- `linux/amd64` (Intel/AMD)
- `linux/arm64` (Apple Silicon, AWS Graviton)
- `linux/arm/v7` (Raspberry Pi, IoT devices)
### Environment Variables
The Docker image will include `DEPLOYSTACK_FRONTEND_VERSION` environment variable set to the current version.
## Release notes:
${{ steps.extract-release-notes.outputs.release_notes }}
labels: |
frontend
release
automated pr
draft: false
- name: Show PR link
if: ${{ steps.cpr.outputs.pull-request-url }}
run: |
echo "Frontend Release v${{ steps.package-version.outputs.current-version}}' pull request - ${{ steps.cpr.outputs.pull-request-url }}"