name: "Release Pipeline"
on:
  push:
    tags:
      - v*
env:
  CYCLONEDX_NPM_VERSION: '^2.0.0||^3.0.0||^4.0.0'   # keep in sync with package.json
  TYPESCRIPT_VERSION: '^6.0.3'                      # keep in sync with package.json
jobs:
  create-release:
    runs-on: ubuntu-latest
    steps:
      - name: "Check out Git repository"
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2
      - name: "Create Release"
        uses: softprops/action-gh-release@da05d552573ad5aba039eaac05058a918a7bf631 #v2.2.2
        with:
          draft: true
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  package:
    needs: create-release
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest]
        node-version: [22, 24, 26]
      fail-fast: false
    steps:
      - name: "Check out Git repository"
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2
      - name: "Use Node.js ${{ matrix.node-version }}"
        uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af #v4.1.0
        with:
          node-version: ${{ matrix.node-version }}
      - name: "Install CLI tools"
        run: |
          npm install -g typescript@${{ env.TYPESCRIPT_VERSION }}
          npm install -g @cyclonedx/cyclonedx-npm@${{ env.CYCLONEDX_NPM_VERSION }}
          npm install -g grunt-cli
      - name: "Set packaging options for Grunt"
        run: |
          if [ "$RUNNER_OS" == "Windows" ]; then
          echo "PCKG_OS_NAME=win32" >> $GITHUB_ENV
          elif [ "$RUNNER_OS" == "macOS" ]; then
          echo "PCKG_OS_NAME=darwin" >> $GITHUB_ENV
          else
          echo "PCKG_OS_NAME=linux" >> $GITHUB_ENV
          fi
          echo "PCKG_CPU_ARCH=x64" >> $GITHUB_ENV
          echo "PCKG_NODE_VERSION=${{ matrix.node-version }}" >> $GITHUB_ENV
        shell: bash
      - name: "Package application"
        run: |
          npm install --production
          npm run package:ci
      - name: 'Attach packaged archive to tag release'
        uses: softprops/action-gh-release@da05d552573ad5aba039eaac05058a918a7bf631 #v2.2.2
        with:
          draft: true
          files: dist/*
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  docker:
    runs-on: ubuntu-latest
    steps:
      - name: "Check out Git repository"
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2
      - name: "Set up QEMU"
        uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf #v3.2.0
      - name: "Set up Docker Buildx"
        uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 #v3.8.0
      - name: "Login to DockerHub"
        uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 #v3.3.0
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      - name: "Get tag name"
        id: tag
        uses: dawidd6/action-get-tag@727a6f0a561be04e09013531e73a3983a65e3479 #v1.1.0 TODO Action is archived and should be replaced eventually
      - name: "Set labels for ${{ github.ref }}"
        run: |
          echo "VCS_REF=`git rev-parse --short HEAD`" >> $GITHUB_ENV
          echo "BUILD_DATE=`date -u +”%Y-%m-%dT%H:%M:%SZ”`" >> $GITHUB_ENV
      - name: "Build and push for AMD64 and ARM64 processors"
        uses: docker/build-push-action@48aba3b46d1b1fec4febb7c5d0c644b249a11355 #v6.1.0
        with:
          context: .
          file: ./Dockerfile
          platforms: linux/amd64,linux/arm64
          push: true
          tags: |
            bkimminich/juice-shop:${{ steps.tag.outputs.tag }}
          build-args: |
            VCS_REF=${{ env.VCS_REF }}
            BUILD_DATE=${{ env.BUILD_DATE }}
            CYCLONEDX_NPM_VERSION=${{ env.CYCLONEDX_NPM_VERSION }}
  notify-slack:
    if: always()
    needs:
      - package
      - docker
    runs-on: ubuntu-latest
    steps:
      - name: "Slack workflow notification"
        uses: Gamesight/slack-workflow-status@68bf00d0dbdbcb206c278399aa1ef6c14f74347a #v1.3.0
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          slack_webhook_url: ${{ secrets.SLACK_WEBHOOK_URL }}
