name: Release
on:
push:
branches:
- main
permissions:
contents: write
jobs:
create_release:
runs-on: ubuntu-latest
outputs:
upload_url: ${{ steps.get_upload_url.outputs.upload_url }}
version: ${{ steps.get_version.outputs.version }}
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Set up Rust
uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
- name: Check for version bump
id: check_version
run: |
# Get the current version from Cargo.toml
current_version=$(grep '^version =' Cargo.toml | sed -E 's/version = "(.*)"/\1/')
echo "Current version: $current_version"
# Get the last version before the PR
git checkout $(git rev-list -n 1 HEAD^)
previous_version=$(grep '^version =' Cargo.toml | sed -E 's/version = "(.*)"/\1/')
echo "Previous version: $previous_version"
# Compare versions
if [ "$current_version" != "$previous_version" ]; then
echo "Version was already bumped in PR"
echo "::set-output name=bumped::true"
else
echo "Version was not bumped in PR"
echo "::set-output name=bumped::false"
fi
# Return to the current commit
git checkout -
- name: Bump version
if: steps.check_version.outputs.bumped == 'false'
run: |
./bump_version.sh patch
cargo update --package loop_cmd
git config user.name github-actions
git config user.email github-actions@github.com
git add Cargo.toml Cargo.lock
git commit -m "Bump version to $(grep '^version =' Cargo.toml | sed -E 's/version = "(.*)"/\1/')"
git push
shell: bash
- name: Verify version update
run: |
toml_version=$(grep '^version =' Cargo.toml | sed -E 's/version = "(.*)"/\1/')
lock_version=$(grep '^name = "loop_cmd"' -A 2 Cargo.lock | grep 'version =' | sed -E 's/version = "(.*)"/\1/')
echo "Cargo.toml version: $toml_version"
echo "Cargo.lock version: $lock_version"
if [ "$toml_version" != "$lock_version" ]; then
echo "Error: Version mismatch between Cargo.toml and Cargo.lock"
exit 1
fi
shell: bash
- name: Get version
id: get_version
run: |
version=$(grep '^version =' Cargo.toml | sed -E 's/version = "(.*)"/\1/')
echo "Version from Cargo.toml: $version"
if [ -z "$version" ]; then
echo "Error: Unable to extract version from Cargo.toml"
exit 1
fi
echo "version=$version" >> $GITHUB_OUTPUT
shell: bash
- name: Verify version
run: |
echo "Extracted version: ${{ steps.get_version.outputs.version }}"
if [ "${{ steps.get_version.outputs.version }}" = "v" ]; then
echo "Error: Version extraction failed. Got 'v' instead of a proper version number."
exit 1
fi
shell: bash
- name: Check existing release
id: check_release
run: |
release_id=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
"https://api.github.com/repos/${{ github.repository }}/releases/tags/v${{ steps.get_version.outputs.version }}" \
| jq -r '.id')
if [ "$release_id" != "null" ]; then
echo "release_id=$release_id" >> $GITHUB_OUTPUT
echo "release_exists=true" >> $GITHUB_OUTPUT
else
echo "release_exists=false" >> $GITHUB_OUTPUT
fi
shell: bash
- name: Create Release
id: create_release
if: steps.check_release.outputs.release_exists == 'false'
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: v${{ steps.get_version.outputs.version }}
release_name: Release v${{ steps.get_version.outputs.version }}
draft: false
prerelease: false
- name: Get Release Upload URL
id: get_upload_url
run: |
if [ "${{ steps.check_release.outputs.release_exists }}" == "true" ]; then
upload_url=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
"https://api.github.com/repos/${{ github.repository }}/releases/${{ steps.check_release.outputs.release_id }}" \
| jq -r '.upload_url')
else
upload_url="${{ steps.create_release.outputs.upload_url }}"
fi
echo "upload_url=$upload_url" >> $GITHUB_OUTPUT
build_linux:
needs: create_release
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
ref: main
- name: Set up Rust
uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
- name: Build for Linux (x86_64)
run: |
rustup target add x86_64-unknown-linux-musl
cargo build --release --target x86_64-unknown-linux-musl
- name: Upload Linux (x86_64) Release Asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ needs.create_release.outputs.upload_url }}
asset_path: ./target/x86_64-unknown-linux-musl/release/loop
asset_name: loop-linux-x86_64
asset_content_type: application/octet-stream
build_macos:
needs: create_release
runs-on: macos-latest
steps:
- uses: actions/checkout@v3
with:
ref: main
- name: Set up Rust
uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
- name: Build for macOS (x86_64)
run: |
rustup target add x86_64-apple-darwin
cargo build --release --target x86_64-apple-darwin
- name: Upload macOS (x86_64) Release Asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ needs.create_release.outputs.upload_url }}
asset_path: ./target/x86_64-apple-darwin/release/loop
asset_name: loop-darwin-x86_64
asset_content_type: application/octet-stream
- name: Build for macOS (ARM64)
run: |
rustup target add aarch64-apple-darwin
cargo build --release --target aarch64-apple-darwin
- name: Upload macOS (ARM64) Release Asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ needs.create_release.outputs.upload_url }}
asset_path: ./target/aarch64-apple-darwin/release/loop
asset_name: loop-darwin-arm64
asset_content_type: application/octet-stream
build_windows:
needs: create_release
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
with:
ref: main
- name: Set up Rust
uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
- name: Build for Windows (x86_64)
run: |
cargo build --release
- name: Upload Windows (x86_64) Release Asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ needs.create_release.outputs.upload_url }}
asset_path: ./target/release/loop.exe
asset_name: loop-windows-x86_64.exe
asset_content_type: application/vnd.microsoft.portable-executable