name: Release

defaults:
  run:
    shell: bash

on:
  push:
    tags:
      - v[0-9]+.*

jobs:
  base:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - uses: taiki-e/install-action@v2
        with:
          tool: parse-changelog
      - name: Generate changelog
        run: |
          VERSION_MINUS_V=${GITHUB_REF_NAME/#v/}
          parse-changelog CHANGELOG.md $VERSION_MINUS_V > CHANGELOG-$GITHUB_REF_NAME.md
      - uses: actions/setup-node@v3
        with:
          node-version: 18
      - run: cd ui && npm ci
      - run: cd ui && npm run build
      - run: cd ui && npm run test
      # Upload the UI and changelog as *job* artifacts (not *release* artifacts), used below.
      - uses: actions/upload-artifact@v3
        with:
          name: moonfire-nvr-ui-${{ github.ref_name }}
          path: ui/build
          if-no-files-found: error
      - uses: actions/upload-artifact@v3
        with:
          name: CHANGELOG-${{ github.ref_name }}
          path: CHANGELOG-${{ github.ref_name }}.md
          if-no-files-found: error

  cross:
    needs: base # for bundled ui
    strategy:
      matrix:
        include:
        - target: x86_64-unknown-linux-musl
        - target: aarch64-unknown-linux-musl
        - target: armv7-unknown-linux-musleabihf
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Download UI
        uses: actions/download-artifact@v3
        with:
          name: moonfire-nvr-ui-${{ github.ref_name }}
          path: ui/build

      # actions-rust-cross doesn't actually use cross for x86_64.
      # Install the needed musl-tools in the host.
      - name: Install musl-tools
        run: sudo apt-get --option=APT::Acquire::Retries=3 update && sudo apt-get --option=APT::Acquire::Retries=3 install musl-tools
        if: matrix.target == 'x86_64-unknown-linux-musl'
      - name: Build
        uses: houseabsolute/actions-rust-cross@v0
        env:
          UI_BUILD_DIR: ../ui/build

          # cross doesn't install `git` within its Docker container, so plumb
          # the version through rather than try `git describe` from `build.rs`.
          VERSION: ${{ github.ref_name }}
        with:
          working-directory: server
          target: ${{ matrix.target }}
          command: build
          args: --release --features bundled
      # Upload as a *job* artifact (not *release* artifact), used below.
      - name: Upload
        uses: actions/upload-artifact@v3
        with:
          name: moonfire-nvr-${{ github.ref_name }}-${{ matrix.target }}
          path: server/target/${{ matrix.target }}/release/moonfire-nvr
          if-no-files-found: error

  release:
    needs: [ base, cross ]
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - uses: actions/download-artifact@v3
        with:
          path: artifacts
      - name: ls before rearranging
        run: find . -ls
      - name: Rearrange
        run: |
          (cd artifacts/moonfire-nvr-ui-${GITHUB_REF_NAME} && zip -r ../../moonfire-nvr-ui-${GITHUB_REF_NAME}.zip .)
          (cd artifacts; for i in moonfire-nvr-*/moonfire-nvr; do mv $i "../$(dirname $i)"; done)
      - name: ls after rearranging
        run: find . -ls
      - name: Create GitHub release
        uses: softprops/action-gh-release@v1
        with:
          body_path: artifacts/CHANGELOG-${{ github.ref_name }}/CHANGELOG-${{ github.ref_name }}.md
          files: |
            moonfire-nvr-*
