v4_cli 0.5.0

CLI tool for V4 VM bytecode deployment
name: Release

on:
  push:
    tags:
      - 'v*'

permissions:
  contents: write

env:
  CARGO_TERM_COLOR: always

jobs:
  create-release:
    name: Create Release
    runs-on: ubuntu-latest
    outputs:
      version: ${{ steps.get_version.outputs.version }}

    steps:
    - name: Get version from tag
      id: get_version
      run: echo "version=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT

    - name: Create Release
      uses: softprops/action-gh-release@v1
      with:
        draft: false
        prerelease: false
        generate_release_notes: true

  build:
    name: Build - ${{ matrix.target }}
    needs: create-release
    runs-on: ${{ matrix.os }}

    strategy:
      fail-fast: false
      matrix:
        include:
          - os: ubuntu-latest
            target: x86_64-unknown-linux-gnu
            artifact_name: v4
            asset_name: v4-linux-amd64
          - os: ubuntu-latest
            target: aarch64-unknown-linux-gnu
            artifact_name: v4
            asset_name: v4-linux-arm64
          - os: macos-latest
            target: x86_64-apple-darwin
            artifact_name: v4
            asset_name: v4-macos-amd64
          - os: macos-latest
            target: aarch64-apple-darwin
            artifact_name: v4
            asset_name: v4-macos-arm64
          - os: windows-latest
            target: x86_64-pc-windows-msvc
            artifact_name: v4.exe
            asset_name: v4-windows-amd64.exe

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

    - name: Setup Rust
      uses: dtolnay/rust-toolchain@stable
      with:
        targets: ${{ matrix.target }}

    - name: Setup CMake
      uses: lukka/get-cmake@latest

    - name: Install C++ compiler (Ubuntu)
      if: matrix.os == 'ubuntu-latest'
      run: |
        sudo apt-get update
        sudo apt-get install -y build-essential libudev-dev

    - name: Install cross for ARM64 Linux
      if: matrix.target == 'aarch64-unknown-linux-gnu'
      run: |
        cargo install cross --git https://github.com/cross-rs/cross

    - name: Build release binary
      shell: bash
      env:
        PKG_CONFIG_ALLOW_CROSS: 1
      run: |
        if [ "${{ matrix.target }}" = "aarch64-unknown-linux-gnu" ]; then
          cross build --release --target ${{ matrix.target }} --verbose
        else
          cargo build --release --target ${{ matrix.target }} --verbose
        fi

    - name: Strip binary (Unix)
      if: matrix.os != 'windows-latest' && matrix.target != 'aarch64-unknown-linux-gnu'
      run: strip target/${{ matrix.target }}/release/${{ matrix.artifact_name }}

    - name: Create archive
      id: create_archive
      shell: bash
      run: |
        cd target/${{ matrix.target }}/release
        if [ "${{ matrix.os }}" = "windows-latest" ]; then
          7z a ../../../${{ matrix.asset_name }}.zip ${{ matrix.artifact_name }}
          echo "archive_path=${{ matrix.asset_name }}.zip" >> $GITHUB_OUTPUT
        else
          tar czf ../../../${{ matrix.asset_name }}.tar.gz ${{ matrix.artifact_name }}
          echo "archive_path=${{ matrix.asset_name }}.tar.gz" >> $GITHUB_OUTPUT
        fi

    - name: Upload Release Asset
      uses: softprops/action-gh-release@v1
      with:
        files: ./${{ steps.create_archive.outputs.archive_path }}

  publish-crate:
    name: Publish to crates.io
    needs: build
    runs-on: ubuntu-latest

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

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

    - name: Setup CMake
      uses: lukka/get-cmake@latest

    - name: Install C++ compiler
      run: |
        sudo apt-get update
        sudo apt-get install -y build-essential libudev-dev

    - name: Publish to crates.io
      run: cargo publish --token ${{ secrets.CARGO_TOKEN }}