Skip to content

Prepare Self-hosted Release #16

Prepare Self-hosted Release

Prepare Self-hosted Release #16

name: Prepare Self-hosted Release
on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'
workflow_dispatch:
permissions:
contents: write
packages: write
deployments: write
id-token: write
jobs:
prepare:
runs-on: ubuntu-latest
timeout-minutes: 60
outputs:
latest-version: ${{ steps.get_version.outputs.latest-version }}
steps:
- uses: actions/checkout@v4
- name: Get Current Lerna Release version and comparing with the Git tag
id: get_version
shell: bash
run: |
LATEST_VERSION="v$(jq -r '.version' lerna.json)"
CURRENT_GIT_TAG="${{ github.ref_name }}"
if [ "$LATEST_VERSION" == "$CURRENT_GIT_TAG" ]
then
echo "latest-version=$(jq -r '.version' lerna.json)" >> $GITHUB_OUTPUT
else
echo "::error::The version in the file lerna.json does not match the git tag. The version in lerna.json is $LATEST_VERSION. The git version is $CURRENT_GIT_TAG"
exit 1
fi
build_docker:
runs-on: ubuntu-latest
needs: prepare
timeout-minutes: 90
strategy:
fail-fast: false
matrix:
name: ['novu/api','novu/worker','novu/web','novu/webhook','novu/ws']
steps:
- name: Git Checkout
uses: actions/checkout@v4
- name: Variables
shell: bash
run: |
echo "The release version is ${{ needs.prepare.outputs.latest-version }}"
service=${{ matrix.name }}
SERVICE_NAME=$(basename "${service//-/-}")
SERVICE_COMMON_NAME=$(echo "$SERVICE_NAME" | sed 's/-ee$//')
echo "SERVICE_NAME=$SERVICE_NAME" >> $GITHUB_ENV
echo "SERVICE_COMMON_NAME=$SERVICE_COMMON_NAME" >> $GITHUB_ENV
echo "REGISTRY_OWNER=novuhq" >> $GITHUB_ENV
- name: Install pnpm
uses: pnpm/action-setup@v3
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: 20.8.1
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- uses: ./.github/actions/free-space
name: Extend space in Action Container
- uses: ./.github/actions/setup-qemu
name: Setup QEMU and Docker Buildx
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build ${{ env.SERVICE_NAME }} Community Docker Image
shell: bash
env:
DOCKER_BUILD_ARGUMENTS: >
--platform=linux/amd64,linux/arm64 --provenance=false
--output=type=image,name=ghcr.io/${{ env.REGISTRY_OWNER }}/${{ env.SERVICE_NAME }},push-by-digest=true,name-canonical=true
run: |
cd apps/$SERVICE_COMMON_NAME
if [ "${{ env.SERVICE_NAME }}" == "worker" ]; then
cd src/ && echo -e "\nIS_SELF_HOSTED=true\nOS_TELEMETRY_URL=\"${{ secrets.OS_TELEMETRY_URL }}\"" >> .example.env && cd ..
elif [ "${{ env.SERVICE_NAME }}" == "web" ]; then
cd src/ && echo -e "\nIS_V2_ENABLED=true" >> .env.sample && cd ..
fi
pnpm run docker:build
docker images
- name: Check for EE files
if: "!contains(matrix.name, '-ee')"
id: check-ee-files
run: |
patterns=(
'./node_modules/@novu/ee-**/dist/index.js'
'./node_modules/@taskforcesh/bullmq-pro' # Add more patterns as needed
)
for pattern in "${patterns[@]}"; do
if docker run --rm novu-$SERVICE_COMMON_NAME sh -c "ls $pattern 2>/dev/null"; then
echo "::error::'$pattern' files were detected in ${{ matrix.name }}."
exit 1
fi
done
echo "No matching EE files found in the Docker image ${{ matrix.name }}"
- name: Tag and Push docker image
shell: bash
run: |
docker tag novu-$SERVICE_COMMON_NAME ghcr.io/$REGISTRY_OWNER/${{ matrix.name }}:${{ needs.prepare.outputs.latest-version }}
docker tag novu-$SERVICE_COMMON_NAME ghcr.io/$REGISTRY_OWNER/${{ matrix.name }}:latest
docker push ghcr.io/$REGISTRY_OWNER/${{ matrix.name }}:${{ needs.prepare.outputs.latest-version }}
docker push ghcr.io/$REGISTRY_OWNER/${{ matrix.name }}:latest