Skip to content

Prepare Self-hosted Release #28

Prepare Self-hosted Release

Prepare Self-hosted Release #28

name: Prepare Self-hosted Release
on:
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 }}
check_tag_result: ${{ steps.check_tag.outputs.result }}
steps:
- uses: actions/checkout@v4
- name: Get Current Lerna Release version
id: get_version
shell: bash
run: |
echo "latest-version=$(jq -r '.version' lerna.json)" >> $GITHUB_OUTPUT
- name: Check if tag already exists
id: check_tag
uses: actions/github-script@v7
with:
script: |
const { data: tags } = await github.rest.git.listMatchingRefs({
owner: context.repo.owner,
repo: context.repo.repo,
ref: 'tags/v${{ steps.get_version.outputs.latest-version }}'
});
const tagExists = tags.length > 0;
console.log(`Tag exists: ${tagExists}`);
return tagExists;
- name: The v${{ steps.get_version.outputs.latest-version }} tag already exists
if: steps.check_tag.outputs.result == 'true'
run: |
echo "::notice::The v${{ steps.get_version.outputs.latest-version }} tag already exists."
build_docker:
runs-on: ubuntu-latest
needs: prepare
timeout-minutes: 90
environment: Development
strategy:
fail-fast: false
matrix:
name: ['novu/api','novu/worker','novu/inbound-mail','novu/web','novu/webhook','novu/widget','novu/ws','novu/embed','novu/inbound-mail-ee','novu/worker-ee','novu/api-ee','novu/web-ee','novu/widget-ee','novu/embed-ee']
steps:
- name: Git Checkout with Submodules
uses: actions/checkout@v4
if: contains(matrix.name, '-ee')
with:
submodules: true
token: ${{ secrets.SUBMODULES_TOKEN }}
- name: Git Checkout without Submodules
if: "!contains(matrix.name, '-ee')"
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
with:
version: 8.9.0
- 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
- uses: ./.github/actions/setup-qemu
- name: Login To Registry
shell: bash
env:
GH_ACTOR: ${{ github.actor }}
GH_PASSWORD: ${{ secrets.GH_PACKAGES }}
run: |
echo $GH_PASSWORD | docker login ghcr.io -u $GH_ACTOR --password-stdin
- name: Set Bull MQ Env variable for EE
if: contains(matrix.name, '-ee')
shell: bash
run: |
echo "BULL_MQ_PRO_NPM_TOKEN=${{ secrets.BULL_MQ_PRO_NPM_TOKEN }}" >> $GITHUB_ENV
- name: Build ${{ env.SERVICE_NAME }} Community Docker Image
shell: bash
env:
DOCKER_BUILD_ARGUMENTS: >
--cache-from type=registry,ref=ghcr.io/${{ env.REGISTRY_OWNER }}/cache:build-cache-${{ env.SERVICE_NAME }}-community
--cache-to type=registry,ref=ghcr.io/${{ env.REGISTRY_OWNER }}/cache:build-cache-${{ env.SERVICE_NAME }}-community,mode=max
--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: |
if [ "${{ env.SERVICE_NAME }}" = "embed" ] || [ "${{ env.SERVICE_NAME }}" = "embed-ee" ]; then
cd libs/$SERVICE_COMMON_NAME
else
cd apps/$SERVICE_COMMON_NAME
fi
pnpm run docker:build
docker images
- 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
tag_create:
runs-on: ubuntu-latest
needs:
- prepare
- build_docker
timeout-minutes: 80
steps:
- name: Create tag v${{ needs.prepare.outputs.latest-version }} in the GIT Repo
if: ${{ needs.prepare.outputs.check_tag_result != 'true' }}
uses: actions/github-script@v7
with:
script: |
github.rest.git.createRef({
owner: context.repo.owner,
repo: context.repo.repo,
ref: 'refs/tags/v${{ needs.prepare.outputs.latest-version }}',
sha: context.sha
})