name: Publish
on:
release:
types: [published]
jobs:
checks:
name: Pre-publish checks
runs-on: ubuntu-24.04
outputs:
version: ${{ steps.expected-version.outputs.expected_version }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Rust version of rtactor
id: rust-version
run: |
echo "app_version=$(head -6 Cargo.toml | grep version | sed 's/"/ /g' | awk '{print $3}')" >> $GITHUB_OUTPUT
- name: Rust version of rtactor-macros
id: rust-version-macros
run: |
echo "app_version=$(head -6 rtactor-macros/Cargo.toml | grep version | sed 's/"/ /g' | awk '{print $3}')" >> $GITHUB_OUTPUT
- name: Expected version
id: expected-version
run: |
expected_version="${{ github.event_name == 'workflow_dispatch' && inputs.tag_name || github.event.release.tag_name }}"
echo "expected_version=$expected_version" >> $GITHUB_OUTPUT
- name: Display versions
run: |
echo "rtactor version: '${{ steps.rust-version.outputs.app_version }}'"
echo "rtactor-macros version: '${{ steps.rust-version-macros.outputs.app_version }}'"
echo "Expected version: '${{ steps.expected-version.outputs.expected_version }}'"
- name: Validate that the crates versions matches the release TAG/version
run: |
if [[ "${{ steps.rust-version-macros.outputs.app_version }}" != "${{ steps.expected-version.outputs.expected_version }}" ]]; then
echo "rtactor macros version mismatch: ${{ steps.rust-version-macros.outputs.app_version }} != ${{ steps.expected-version.outputs.expected_version }}"
exit 1
fi
if [[ "${{ steps.rust-version.outputs.app_version }}" != "${{ steps.expected-version.outputs.expected_version }}" ]]; then
echo "rtactor version mismatch: ${{ steps.rust-version.outputs.app_version }} != ${{ steps.expected-version.outputs.expected_version }}"
exit 1
fi
- name: Validate token
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
run: |
# Ensure the Cargo registry token is available
if [ -z "$CARGO_REGISTRY_TOKEN" ]; then
echo "Error: CARGO_REGISTRY_TOKEN is not set" >&2
exit 1
fi
publish-macros:
name: Publish rtactor-macros
runs-on: ubuntu-24.04
needs: checks
steps:
- name: Install toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: 1.64.0
- name: Checkout repository
uses: actions/checkout@v4
- name: Display version
run: |
echo "publish version: '${{ needs.checks.outputs.version }}'"
- name: Test publish rtactor-macros
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
run: cd rtactor-macros && cargo publish --dry-run
- name: Publish rtactor-macros to crates.io
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
run: cd rtactor-macros && cargo publish
wait:
name: Wait for it to be available
runs-on: ubuntu-24.04
needs: [checks, publish-macros]
steps:
- name: Install toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: 1.64.0
- name: Display version
run: |
echo "publish version: '${{ needs.checks.outputs.version }}'"
- name: Wait for crate availability
run: |
set -e
for i in {1..2}; do
if cargo search rtactor-macros | grep -q '${{ needs.checks.outputs.version }}'; then
echo "rtactor-macros version '${{ needs.checks.outputs.version }}' is available!"
exit 0
fi
echo "Waiting for rtactor-macros version '${{ needs.checks.outputs.version }}' to be available..."
sleep 30
done
echo "Timed out waiting for rtactor-macros version '${{ needs.checks.outputs.version }}'."
exit 1
publish-rtactor:
name: Publish rtactor
runs-on: ubuntu-24.04
needs: [checks, publish-macros, wait]
steps:
- name: Install toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: 1.64.0
- name: Checkout repository
uses: actions/checkout@v4
- name: Display version
run: |
echo "publish version: '${{ needs.checks.outputs.version }}'"
- name: Test publish rtactor
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
run: cargo publish --dry-run
- name: Publish rtactor to crates.io
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
run: cargo publish