git-gemini-forge 0.6.6

A simple Gemini server that serves a read-only view of public repositories from a Git forge.
# Builds the crate and publishes to the Forgejo package registry

name: Publish Crate

on:
  push:
    # Publish semver tags as releases.
    tags: ["v*.*.*"]

env:
  REGISTRY: git.average.name
  # gitea.repository as <account>/<repo>
  IMAGE_NAME: ${{ gitea.repository }}

jobs:
  build-and-push-crate:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write

    steps:
      - name: Checkout repository
        uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332

      - name: Install rustup
        run: curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y

      - name: Setup Rust toolchain
        run: |
          . "$HOME/.cargo/env"
          rustup update stable && rustup default stable

      - name: Build
        run: |
          . "$HOME/.cargo/env"
          cargo build --locked --verbose --release

      - name: Test
        run: |
          . "$HOME/.cargo/env"
          cargo test --locked --verbose --release

      - name: Log in to container registry
        # docker/login-action@v3.3.0
        uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ gitea.actor }}
          password: ${{ secrets.PACKAGES_TOKEN }}

      - name: Extract Docker metadata
        id: meta
        # docker/metadata-action@v5.5.1
        uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
          tags: |
            type=ref,event=branch
            type=ref,event=pr
            type=semver,pattern={{version}}
            type=semver,pattern={{major}}.{{minor}}
            type=semver,pattern={{major}}
            type=sha

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

      - name: Publish crate to Forgejo
        run: |
          . "$HOME/.cargo/env"
          cargo publish --locked --verbose --index "$REGISTRY_INDEX" --token "$PACKAGES_TOKEN"
        env:
          # e.g. `sparse+https://git.average.name/api/packages/AverageHelper/cargo/`
          # See https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/contexts#context-availability
          # and https://docs.gitea.com/usage/actions/faq#should-we-use--githubxyz--or--giteaxyz---in-workflow-files
          REGISTRY_INDEX: sparse+${{ gitea.server_url }}/api/packages/${{ gitea.repository_owner }}/cargo/
          PACKAGES_TOKEN: "Bearer ${{ secrets.PACKAGES_TOKEN }}"

      - name: Publish crate to crates.io
        run: |
          . "$HOME/.cargo/env"
          cargo publish --locked --verbose --registry crates-io --token "$PACKAGES_TOKEN"
        env:
          PACKAGES_TOKEN: "${{ secrets.PACKAGES_TOKEN_CRATES_IO }}"