diff --git a/.github/workflows/CargoPublish.yml b/.github/workflows/CargoPublish.yml index edb331cd6..5d80a0523 100644 --- a/.github/workflows/CargoPublish.yml +++ b/.github/workflows/CargoPublish.yml @@ -44,43 +44,79 @@ jobs: else VERSION="${{ github.ref }}" VERSION="${VERSION#refs/heads/release/v}" + echo "VERSION=$VERSION" >> $GITHUB_ENV fi ./dev/verify-version.sh "$VERSION" hyperlight-common hyperlight-guest hyperlight-guest-bin hyperlight-host hyperlight-component-util hyperlight-component-macro + - name: Determine which crates need publishing + run: | + needs_publish() { + local crate=$1 + local crate_env_var=$(echo "$crate" | tr '[:lower:]' '[:upper:]' | tr '-' '_') + + if [ -z "$VERSION" ]; then + echo "No version set (dry run?), skipping crates.io existence checks." + echo "PUBLISH_${crate_env_var}=true" >> "$GITHUB_ENV" + return + fi + + if curl -s "https://crates.io/api/v1/crates/$crate/$VERSION" | jq -e .version > /dev/null; then + echo "PUBLISH_${crate_env_var}=false" >> "$GITHUB_ENV" + echo "✅ $crate@$VERSION already exists." + else + echo "PUBLISH_${crate_env_var}=true" >> "$GITHUB_ENV" + echo "🚀 $crate@$VERSION will be published." + fi + } + + needs_publish hyperlight-common + needs_publish hyperlight-guest + needs_publish hyperlight-guest-bin + needs_publish hyperlight-component-util + needs_publish hyperlight-component-macro + needs_publish hyperlight-host + - name: Publish hyperlight-common continue-on-error: ${{ inputs.dry_run }} run: cargo publish --manifest-path ./src/hyperlight_common/Cargo.toml ${{ inputs.dry_run && '--dry-run' || '' }} env: CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_PUBLISH_TOKEN }} + if: env.PUBLISH_HYPERLIGHT_COMMON != 'false' - name: Publish hyperlight-guest continue-on-error: ${{ inputs.dry_run }} run: cargo publish --manifest-path ./src/hyperlight_guest/Cargo.toml ${{ inputs.dry_run && '--dry-run' || '' }} env: CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_PUBLISH_TOKEN }} + if: env.PUBLISH_HYPERLIGHT_GUEST != 'false' - name: Publish hyperlight-guest-bin continue-on-error: ${{ inputs.dry_run }} run: cargo publish --manifest-path ./src/hyperlight_guest_bin/Cargo.toml ${{ inputs.dry_run && '--dry-run' || '' }} env: CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_PUBLISH_TOKEN }} + if: env.PUBLISH_HYPERLIGHT_GUEST_BIN != 'false' + - name: Publish hyperlight-component-util continue-on-error: ${{ inputs.dry_run }} run: cargo publish --manifest-path ./src/hyperlight_component_util/Cargo.toml ${{ inputs.dry_run && '--dry-run' || '' }} env: CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_PUBLISH_TOKEN }} + if: env.PUBLISH_HYPERLIGHT_COMPONENT_UTIL != 'false' - name: Publish hyperlight-component-macro continue-on-error: ${{ inputs.dry_run }} run: cargo publish --manifest-path ./src/hyperlight_component_macro/Cargo.toml ${{ inputs.dry_run && '--dry-run' || '' }} env: CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_PUBLISH_TOKEN }} + if: env.PUBLISH_HYPERLIGHT_COMPONENT_MACRO != 'false' - name: Publish hyperlight-host continue-on-error: ${{ inputs.dry_run }} run: cargo publish --manifest-path ./src/hyperlight_host/Cargo.toml ${{ inputs.dry_run && '--dry-run' || '' }} env: CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_PUBLISH_TOKEN }} + if: env.PUBLISH_HYPERLIGHT_HOST != 'false' # TODO: Do we want to publish hyperlight-guest-capi to crates.io given that it's not for Rust consumption?