enprot 0.4.1

Engyon Protected Text (EPT) — confidentiality processor and capability ledger
name: deploy

on:
  push:
    tags: '[0-9]+.[0-9]+.[0-9]+'

env:
  CROSS_VERSION: 0.2.5
  BOTAN_VERSION: 3.7.0
  PROJECT_NAME: enprot
  EXE_NAME: enprot

jobs:
  checks:
    name: Checks
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - uses: actions/checkout@v7
      - name: Check version
        run: |
          set -euxo pipefail
          if [ "$(grep '^version' Cargo.toml | cut -d '"' -f2)" != "${GITHUB_REF#refs/tags/}" ]; then
            echo "Version tag does not match manifest"
            exit 1
          fi

  release-archive:
    needs: [checks]
    name: archive
    timeout-minutes: 20
    strategy:
      matrix:
        target:
          - x86_64-unknown-linux-musl
          - x86_64-apple-darwin
          - x86_64-pc-windows-gnu
          - x86_64-pc-windows-msvc
        include:
          - os: ubuntu-latest
            target: x86_64-unknown-linux-musl
            env:
              TARGET: x86_64-unknown-linux-musl
              PREFIX: /usr/local/x86_64-linux-musl
              TARGET_CC: x86_64-linux-musl-gcc
              TARGET_CXX: x86_64-linux-musl-g++
              TARGET_AR: x86_64-linux-musl-gcc-ar
          - os: macos-latest
            target: x86_64-apple-darwin
            env:
              TARGET: x86_64-apple-darwin
              PREFIX: /usr/local
          - os: ubuntu-latest
            target: x86_64-pc-windows-gnu
            env:
              TARGET: x86_64-pc-windows-gnu
              TARGET_CC: x86_64-w64-mingw32-gcc-posix
              TARGET_CXX: x86_64-w64-mingw32-g++-posix
              TARGET_AR: x86_64-w64-mingw32-gcc-ar-posix
              EXE_NAME: enprot.exe
          - os: windows-latest
            target: x86_64-pc-windows-msvc
            env:
              TARGET: x86_64-pc-windows-msvc
              EXE_NAME: enprot.exe
              GIT_REDIRECT_STDERR: '2>&1'

    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v7

      - name: Set environment (unix)
        if: "!startsWith(matrix.os, 'windows')"
        env: ${{ matrix.env }}
        run: |
          set -euxo pipefail
          echo "RELEASE_TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
          echo "PREFIX=${PREFIX-$GITHUB_WORKSPACE/installs}" >> $GITHUB_ENV
          echo "EXE_PATH=target/$TARGET/release/$EXE_NAME" >> $GITHUB_ENV
      - name: Set environment (windows)
        if: startsWith(matrix.os, 'windows')
        env: ${{ matrix.env }}
        run: |
          Set-StrictMode -Version 3.0
          Set-PSDebug -Trace 2
          "RELEASE_TAG=$($Env:GITHUB_REF.Replace('refs/tags/', ''))" | Out-File -Append -Encoding UTF8 -LiteralPath $Env:GITHUB_ENV
          "PREFIX=$($($PWD -join 'installs').Replace('\', '/'))" | Out-File -Append -Encoding UTF8 -LiteralPath $Env:GITHUB_ENV
          "EXE_PATH=target/$Env:TARGET/release/$Env:EXE_NAME" | Out-File -Append -Encoding UTF8 -LiteralPath $Env:GITHUB_ENV

      - name: Install rust toolchain
        uses: dtolnay/rust-toolchain@stable
        with:
          target: ${{ matrix.env.TARGET }}

      - name: Install python (windows)
        if: startsWith(matrix.os, 'windows')
        uses: actions/setup-python@v7
        with:
          python-version: '3.x'

      - name: Build (unix)
        if: "!startsWith(matrix.os, 'windows')"
        env: ${{ matrix.env }}
        run: |
          set -euxo pipefail
          . ci/build-static.sh
      - name: Build (windows)
        if: startsWith(matrix.os, 'windows')
        env: ${{ matrix.env }}
        shell: powershell
        run: |
          Set-StrictMode -Version 3.0
          Set-PSDebug -Trace 2
          . .\ci\build-static.ps1

      - name: Archive (unix)
        if: "!startsWith(matrix.os, 'windows')"
        env: ${{ matrix.env }}
        run: |
          set -euxo pipefail
          . ci/archive.sh
      - name: Archive (windows)
        if: startsWith(matrix.os, 'windows')
        env: ${{ matrix.env }}
        shell: powershell
        run: |
          Set-StrictMode -Version 3.0
          Set-PSDebug -Trace 2
          . .\ci\archive.ps1

      - name: Upload artifacts
        uses: actions/upload-artifact@v7
        with:
          name: archives
          path: archives

  github-release:
    name: github release
    needs: [release-archive]
    runs-on: ubuntu-latest
    steps:
      - name: Download artifacts
        uses: actions/download-artifact@v8
        with:
          name: archives
      - name: Create release
        env:
          GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          set -euxo pipefail
          RELEASE_TAG=${GITHUB_REF#refs/tags/}
          git clone https://github.com/riboseinc/create-github-release
          cd create-github-release
          sudo apt-get -y install ruby
          export GEM_HOME="$(ruby -e 'print Gem.user_dir')"
          export PATH="$PATH:$GEM_HOME/bin"
          gem install --no-document bundler -v "$(grep -A 1 "BUNDLED WITH" Gemfile.lock | tail -n 1)"
          bundle install
          bundle exec ./create-github-release.rb \
            ${{ github.repository }} \
            "$RELEASE_TAG" \
            ../archives/*

  publish-crate:
    name: crates.io
    needs: [checks]
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7
      - name: Install rust toolchain
        uses: dtolnay/rust-toolchain@stable
      - name: Publish
        env:
          CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
        run: |
          cargo publish --no-verify

  publish-snap:
    name: snap
    needs: [checks]
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7
      - name: Install snapcraft
        uses: snapcore/action-build@v1
        with:
          snapcraft_token: ${{ secrets.SNAPCRAFT_RELEASE_LOGIN }}
      - name: Install review-tools
        run: sudo snap install review-tools
      - name: Build
        run: |
          RELEASE_TAG="${GITHUB_REF#refs/tags/}"
          sed -i "s/RELEASE_TAG/${RELEASE_TAG}/g" snap/snapcraft.yaml
          sg lxd -c 'snapcraft --use-lxd'
      - name: Publish
        uses: snapcore/action-publish@v1
        with:
          store_token: ${{ secrets.SNAPCRAFT_RELEASE_LOGIN }}
          snap: ${{ steps.build.outputs.snap }}
          release: stable