name: Release on: push: tags: - 'v*' env: CARGO_TERM_COLOR: always jobs: test: name: Test before release runs-on: ubuntu-latest defaults: run: working-directory: crates/predict-otron-9000 strategy: fail-fast: false steps: - name: Checkout uses: actions/checkout@v4 - uses: actions/cache@v4 with: path: | ~/.cargo/bin/ ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ target/ key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - name: Setup Rust run: rustup update stable && rustup default stable - name: Setup Bun uses: oven-sh/setup-bun@v2 - name: Install clippy and rustfmt run: rustup component add clippy rustfmt - name: Cargo fmt (check) run: cargo fmt --all -- --check - name: Clippy shell: bash run: cargo clippy --all-targets - name: Tests shell: bash run: cargo test --all # publish: # name: Publish to crates.io # runs-on: ubuntu-latest # permissions: # id-token: write # Required for OIDC token exchange https://crates.io/docs/trusted-publishing # needs: test # defaults: # run: # working-directory: crates/predict-otron-9000 # steps: # - name: Checkout # uses: actions/checkout@v4 # # - uses: actions/cache@v4 # with: # path: | # ~/.cargo/bin/ # ~/.cargo/registry/index/ # ~/.cargo/registry/cache/ # ~/.cargo/git/db/ # target/ # key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} # # - name: Setup Rust # run: rustup update stable && rustup default stable # # - name: Verify tag matches version # run: | # TAG_VERSION=${GITHUB_REF#refs/tags/v} # CARGO_VERSION=$(cargo metadata --no-deps --format-version 1 | jq -r '.packages[0].version') # if [ "$TAG_VERSION" != "$CARGO_VERSION" ]; then # echo "Tag version ($TAG_VERSION) does not match Cargo.toml version ($CARGO_VERSION)" # exit 1 # fi # # # See Trusted publishing: https://crates.io/docs/trusted-publishing # - uses: rust-lang/crates-io-auth-action@v1 # id: auth # # - run: cargo publish # env: # CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }} build-binaries: name: Build binaries runs-on: ${{ matrix.os }} needs: test strategy: fail-fast: false matrix: include: - target: x86_64-unknown-linux-gnu os: ubuntu-latest name: predict-otron-9000-x86_64-unknown-linux-gnu - target: x86_64-apple-darwin os: macos-latest name: predict-otron-9000-x86_64-apple-darwin - target: aarch64-apple-darwin os: macos-latest name: predict-otron-9000-aarch64-apple-darwin - target: x86_64-pc-windows-msvc os: windows-latest name: predict-otron-9000-x86_64-pc-windows-msvc.exe steps: - name: Checkout uses: actions/checkout@v4 - uses: actions/cache@v4 with: path: | ~/.cargo/bin/ ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ target/ key: ${{ runner.os }}-${{ matrix.target }}-cargo-${{ hashFiles('**/Cargo.lock') }} - name: Setup Rust run: rustup update stable && rustup default stable - name: Add target run: rustup target add ${{ matrix.target }} - name: Build binary run: cargo build --release --target ${{ matrix.target }} -p predict-otron-9000 -p cli env: CARGO_TERM_COLOR: always - name: Package binary (Unix) if: matrix.os != 'windows-latest' run: | cd target/${{ matrix.target }}/release tar czf ../../../${{ matrix.name }}.tar.gz predict-otron-9000 cli cd ../../../ - name: Package binary (Windows) if: matrix.os == 'windows-latest' run: | cd target/${{ matrix.target }}/release 7z a ../../../${{ matrix.name }}.zip predict-otron-9000.exe cli.exe cd ../../../ - name: Upload binary artifacts (Unix) if: matrix.os != 'windows-latest' uses: actions/upload-artifact@v4 with: name: ${{ matrix.name }} path: ${{ matrix.name }}.tar.gz - name: Upload binary artifacts (Windows) if: matrix.os == 'windows-latest' uses: actions/upload-artifact@v4 with: name: ${{ matrix.name }} path: ${{ matrix.name }}.zip release: name: Create GitHub Release runs-on: ubuntu-latest needs: [test, build-binaries] permissions: contents: write steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Extract tag name id: tag run: echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT - name: Generate changelog id: changelog run: | # Get the previous tag PREV_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "") # Generate changelog if [ -n "$PREV_TAG" ]; then echo "## What's Changed" > changelog.md echo "" >> changelog.md git log --pretty=format:"* %s (%h)" ${PREV_TAG}..HEAD >> changelog.md echo "" >> changelog.md echo "" >> changelog.md echo "**Full Changelog**: https://github.com/${{ github.repository }}/compare/${PREV_TAG}...${{ steps.tag.outputs.tag }}" >> changelog.md else echo "## What's Changed" > changelog.md echo "" >> changelog.md echo "Initial release of predict-otron-9000" >> changelog.md echo "" >> changelog.md echo "OpenAI Compatible Inference Server" >> changelog.md fi # Set the changelog as output (handle multiline) echo "changelog<> $GITHUB_OUTPUT cat changelog.md >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT - name: Download all artifacts uses: actions/download-artifact@v4 with: path: artifacts - name: Create Release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | if [[ "${{ steps.tag.outputs.tag }}" == *"-"* ]]; then PRERELEASE_FLAG="--prerelease" else PRERELEASE_FLAG="" fi gh release create "${{ steps.tag.outputs.tag }}" \ --title "Release ${{ steps.tag.outputs.tag }}" \ --notes-file changelog.md \ $PRERELEASE_FLAG \ artifacts/predict-otron-9000-x86_64-unknown-linux-gnu/predict-otron-9000-x86_64-unknown-linux-gnu.tar.gz \ artifacts/predict-otron-9000-x86_64-apple-darwin/predict-otron-9000-x86_64-apple-darwin.tar.gz \ artifacts/predict-otron-9000-aarch64-apple-darwin/predict-otron-9000-aarch64-apple-darwin.tar.gz \ artifacts/predict-otron-9000-x86_64-pc-windows-msvc.exe/predict-otron-9000-x86_64-pc-windows-msvc.exe.zip