appbaseio/dejaVu

View on GitHub
.github/workflows/build.yml

Summary

Maintainability
Test Coverage
name: Dejavu - Node.js Build and Release Workflow

on:
  release:
    types: [published]
  repository_dispatch:
    types: [publish_binary]
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout repository with submodules
      uses: actions/checkout@v3
      with:
        submodules: recursive
        fetch-depth: 0

    - name: Set up Node.js 20 LTS
      uses: actions/setup-node@v3
      with:
        node-version: '20'
        cache: 'yarn'

    - name: Install dependencies
      run: yarn

    - name: Extract version from payload
      id: get_version
      if: ${{ github.event_name == 'repository_dispatch' }}
      run: echo "version=${{ github.event.client_payload.version }}" >> $GITHUB_OUTPUT

    - name: Get Version For Release
      id: get_version_release
      if: ${{ github.event_name != 'repository_dispatch' }}
      uses: battila7/get-version-action@v2.2.1

    - name: Determine Version
      id: set_version
      run: |
        if [ -n "${{ steps.get_version.outputs.version }}" ]; then
          echo "version=${{ steps.get_version.outputs.version }}" >> $GITHUB_OUTPUT
        elif [ -n "${{ steps.get_version_release.outputs.version }}" ]; then
          echo "version=${{ steps.get_version_release.outputs.version }}" >> $GITHUB_OUTPUT
        else
          echo "Error: Version is not set."
          exit 1
        fi

    - name: Build Dejavu App
      run: yarn build:dejavu:app

    - name: Zip the dist folder
      run: |
        zip -r dist-${{ steps.set_version.outputs.version }}.zip ./packages/dejavu-main/dist

    # Fetch release by tag and get upload_url, stripping the placeholder
    - name: Get upload_url for release
      if: ${{ github.event_name == 'repository_dispatch' }}
      id: get_release
      run: |
        release_data=$(curl -s \
          -H "Authorization: token ${{ secrets.PAT }}" \
          "https://api.github.com/repos/${{ github.repository }}/releases/tags/${{ steps.set_version.outputs.version }}")
        upload_url=$(echo "$release_data" | jq -r '.upload_url' | sed -e "s/{?name,label}//")
        if [ "$upload_url" == "null" ]; then
          echo "Error: Release not found for tag ${steps.set_version.outputs.version}"
          exit 1
        fi
        echo "upload_url=$upload_url" >> $GITHUB_OUTPUT

    - name: Upload dist.zip to GitHub Release (using curl)
      run: |
        curl -X POST \
          -H "Authorization: token ${{ secrets.PAT }}" \
          -H "Content-Type: application/zip" \
          --data-binary @./dist-${{ steps.set_version.outputs.version }}.zip \
          "${{ steps.get_release.outputs.upload_url }}?name=dejavu-dist-${{ steps.set_version.outputs.version }}.zip"

    # For release events, use the upload_url from the event payload
    - name: Upload dist.zip to GitHub Release (release event)
      if: ${{ github.event_name == 'release' }}
      run: |
        upload_url="${{ github.event.release.upload_url }}"
        # Strip the placeholder
        upload_url="${upload_url%\{*}"
        curl -X POST \
          -H "Authorization: token ${{ secrets.PAT }}" \
          -H "Content-Type: application/zip" \
          --data-binary @./dist-${{ steps.set_version.outputs.version }}.zip \
          "${upload_url}?name=dejavu-dist-${{ steps.set_version.outputs.version }}.zip"