eventdbx 1.12.2

An event-sourced, key-value, write-side database system.
Documentation
name: CI

permissions:
  contents: write
  
on:
  push:
    branches: [main]
  pull_request:
  workflow_dispatch:
jobs:
  build:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]

    steps:
      - name: Check out repository
        uses: actions/checkout@v4

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Cache Cargo registry
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
          restore-keys: |
            ${{ runner.os }}-cargo-

      - name: Install Cap'n Proto (Linux)
        if: runner.os == 'Linux'
        run: sudo apt-get update && sudo apt-get install -y capnproto

      - name: Install Cap'n Proto (macOS)
        if: runner.os == 'macOS'
        run: brew install capnp

      - name: Install Cap'n Proto (Windows)
        if: runner.os == 'Windows'
        shell: pwsh
        run: choco install capnproto --yes

      - name: Cargo fmt
        run: cargo fmt -- --check

      - name: Cargo check
        run: cargo check

      - name: Cargo test
        run: cargo test

  prepare_release:
    if: github.event_name == 'workflow_dispatch'
    runs-on: ubuntu-latest
    outputs:
      tag: ${{ steps.tag.outputs.value }}
    steps:
      - name: Check out repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Configure Git user
        run: |
          git config user.name "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"

      - name: Read crate version
        id: version
        run: |
          version=$(cargo metadata --no-deps --format-version 1 | python3 -c "import json,sys; print(json.load(sys.stdin)['packages'][0]['version'])")
          echo "value=$version" >> "$GITHUB_OUTPUT"

      - name: Create tag matching Cargo version
        id: tag
        env:
          VERSION: ${{ steps.version.outputs.value }}
        run: |
          if [ -z "$VERSION" ]; then
            echo "::error::Unable to read version from Cargo.toml."
            exit 1
          fi
          tag="v${VERSION}"
          if git rev-parse "$tag" >/dev/null 2>&1; then
            echo "::error::Tag $tag already exists."
            exit 1
          fi
          git tag "$tag"
          git push origin "$tag"
          echo "value=$tag" >> "$GITHUB_OUTPUT"

  create_release:
    needs:
      - build
      - prepare_release
    if: needs.prepare_release.outputs.tag != ''
    runs-on: ubuntu-latest
    outputs:
      upload_url: ${{ steps.release.outputs.upload_url }}
      tag: ${{ needs.prepare_release.outputs.tag }}
    steps:
      - name: Create GitHub release
        id: release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ needs.prepare_release.outputs.tag }}
          release_name: ${{ needs.prepare_release.outputs.tag }}
          draft: false
          prerelease: false
          body: |
            ## Downloads
            - [Linux (Ubuntu)](https://github.com/${{ github.repository }}/releases/download/${{ needs.prepare_release.outputs.tag }}/eventdbx-ubuntu-latest.tar.gz)
            - [macOS](https://github.com/${{ github.repository }}/releases/download/${{ needs.prepare_release.outputs.tag }}/eventdbx-macos-latest.tar.gz)
            - [Windows](https://github.com/${{ github.repository }}/releases/download/${{ needs.prepare_release.outputs.tag }}/eventdbx-windows-latest.zip)

  publish_binaries:
    needs:
      - create_release
    if: needs.create_release.outputs.tag != ''
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
    steps:
      - name: Check out repository
        uses: actions/checkout@v4

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Install Cap'n Proto (Linux)
        if: runner.os == 'Linux'
        run: sudo apt-get update && sudo apt-get install -y capnproto

      - name: Install Cap'n Proto (macOS)
        if: runner.os == 'macOS'
        run: brew install capnp

      - name: Install Cap'n Proto (Windows)
        if: runner.os == 'Windows'
        shell: pwsh
        run: choco install capnproto --yes

      - name: Build release binary
        run: cargo build --release

      - name: Package binary (Unix)
        if: runner.os != 'Windows'
        run: |
          mkdir -p dist
          cp target/release/eventdbx dist/
          tar -czf eventdbx-${{ matrix.os }}.tar.gz -C dist eventdbx

      - name: Package binary (Windows)
        if: runner.os == 'Windows'
        shell: pwsh
        run: |
          New-Item -ItemType Directory -Force -Path dist | Out-Null
          Copy-Item target\release\eventdbx.exe dist\
          Compress-Archive -Path dist\eventdbx.exe -DestinationPath eventdbx-${{ matrix.os }}.zip

      - name: Upload release asset (Unix)
        if: runner.os != 'Windows'
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ needs.create_release.outputs.upload_url }}
          asset_path: eventdbx-${{ matrix.os }}.tar.gz
          asset_name: eventdbx-${{ matrix.os }}.tar.gz
          asset_content_type: application/gzip

      - name: Upload release asset (Windows)
        if: runner.os == 'Windows'
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ needs.create_release.outputs.upload_url }}
          asset_path: eventdbx-${{ matrix.os }}.zip
          asset_name: eventdbx-${{ matrix.os }}.zip
          asset_content_type: application/zip