# Run `release-please` and build and release Docker image.
#
# This builds the containers with version tags.  The `main` and `latest` tags are
# pushed in `docker-build.yml`.
name: Release

on:
  push:
    branches:
      - main

env:
  REGISTRY: ghcr.io
  PACKAGE_NAME: annonars
  IMAGE_NAME: ${{ github.repository }}

jobs:
  release-please:
    if: github.repository_owner == 'bihealth'
    runs-on: ubuntu-latest
    outputs:
      release_created: ${{ steps.release.outputs.release_created }}
      release_name: ${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }}.${{ steps.release.outputs.patch }}
    steps:
      - uses: GoogleCloudPlatform/release-please-action@v3
        id: release
        with:
          release-type: rust
          package-name: ${{ env.PACKAGE_NAME}}
          token: ${{ secrets.BOT_TOKEN }}

  cargo-release:
    needs: release-please
    runs-on: ubuntu-latest
    if: ${{ needs.release-please.outputs.release_created }}
    steps:
      - uses: actions/checkout@v3
        if: ${{ needs.release-please.outputs.release_created }}

      - name: Install stable toolchain
        uses: actions-rs/toolchain@v1
        if: ${{ needs.release-please.outputs.release_created }}
        with:
          toolchain: stable
          override: true

      - name: Setup protoc
        uses: arduino/setup-protoc@v1.1.2
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}

      - uses: Swatinem/rust-cache@v2
        if: ${{ needs.release-please.outputs.release_created }}
        with:
          cache-directories: |
            ~/.cargo/registry/src/**/librocksdb-sys-*

      - name: Publish crate
        if: ${{ needs.release-please.outputs.release_created }}
        uses: actions-rs/cargo@v1
        with:
          command: publish
          args: --token ${{ secrets.CRATES_IO_TOKEN }}

  container-release:
    needs: release-please
    runs-on: ubuntu-latest
    if: ${{ needs.release-please.outputs.release_created }}
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Log in to the Container registry
        uses: docker/login-action@v2
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@v4
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
          tags: |
            type=raw,value=latest,enable={{is_default_branch}}
            type=semver,pattern={{version}},value=${{ needs.release-please.outputs.release_name }}
            type=semver,pattern={{major}}.{{minor}},value=${{ needs.release-please.outputs.release_name }}
            type=semver,pattern={{major}},value=${{ needs.release-please.outputs.release_name }}
            type=sha

      - name: Build and push Docker image
        uses: docker/build-push-action@v4
        with:
          context: .
          file: utils/docker/Dockerfile
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          push: true
