githttp-fs 1.1.0

A git-backed content management database served over HTTP
on:
  push:
    tags:
      - "v*.*.*"

permissions:
  id-token: write
  contents: write

name: Build and Release

jobs:
  build-releases:
    runs-on: ubuntu-latest

    outputs:
      tag: ${{ steps.current_tag.outputs.tag }}

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Cache build artifacts
        id: cache-cargo
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/bin
            ~/.cargo/registry
            ~/.cargo/git
          key: build-${{ runner.os }}-cargo-any

      - name: Install Rust toolchain
        uses: actions-rs/toolchain@v1
        with:
          toolchain: stable
          components: rustfmt
          override: true

      - name: Install cross-compilation tools (if needed)
        run: which cross >/dev/null || cargo install cross

      - name: Verify versions
        run: rustc --version && rustup --version && cargo --version && cross --version

      - name: Get current tag
        id: current_tag
        uses: WyriHaximus/github-action-get-previous-tag@v1

      - name: Authenticate to registry
        uses: rust-lang/crates-io-auth-action@v1
        id: auth

      - name: Release package
        run: cargo publish --no-verify
        env:
          CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }}

      - name: Release binaries
        run: ./scripts/release_binaries.sh --version=${{ steps.current_tag.outputs.tag }}

      - name: Release new version
        uses: softprops/action-gh-release@v1
        with:
          tag_name: ${{ steps.current_tag.outputs.tag }}
          name: githttp-fs ${{ steps.current_tag.outputs.tag }}
          body: "⚠️ Changelog not yet provided."
          files: ./${{ steps.current_tag.outputs.tag }}-*.tar.gz
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

  build-packages:
    needs: build-releases
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Build packages
        run: ./scripts/build_packages.sh

      - name: Push packages to Packagecloud
        uses: faucetsdn/action-packagecloud-upload-debian-packages@v1
        with:
          path: ./packages
          repo: ${{ secrets.PACKAGECLOUD_REPO }}
          token: ${{ secrets.PACKAGECLOUD_TOKEN }}

  build-docker:
    needs: build-releases
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Acquire Docker image metadata
        id: metadata
        uses: docker/metadata-action@v4
        with:
          images: crispim/githttp-fs

      - name: Login to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Build and push Docker image
        uses: docker/build-push-action@v6
        with:
          context: .
          tags: ${{ steps.metadata.outputs.tags }}
          labels: ${{ steps.metadata.outputs.labels }}
          push: true
          build-args: |
            PREBUILT_TAG=${{ needs.build-releases.outputs.tag }}
          platforms: |
            linux/amd64
            linux/arm64