diff --git a/.github/workflows/rust-publish-dry-run-v2.yml b/.github/workflows/rust-publish-dry-run-v2.yml index 73f2038..14fe412 100644 --- a/.github/workflows/rust-publish-dry-run-v2.yml +++ b/.github/workflows/rust-publish-dry-run-v2.yml @@ -5,7 +5,7 @@ on: inputs: crates: description: 'Space separated list of crate names in the order to be published.' - required: true + required: false type: string runs-on: required: false @@ -65,6 +65,16 @@ jobs: name: cargo-hack version: 0.5.28 + - uses: stellar/binaries@v25 + with: + name: cargo-workspaces + version: 0.2.35 + + # Create the vendor directory because it'll only be created in the next step + # if the crate has dependencies, but it's needed for the latter steps in all + # cases. + - run: mkdir -p vendor + # Vendor all the dependencies into the vendor/ folder. Temporarily remove # [patch.crates-io] entries in the workspace Cargo.toml that reference git # repos. These will be removed when published. @@ -76,12 +86,44 @@ jobs: rm Cargo.toml mv Cargo.toml.bak Cargo.toml + # If a list of crates weren't provided, prepare a list by asking + # cargo-workspaces for the order it would publish the crates in, and filter + # the list of returned crates by crates that are marked for publishing. + - name: Prepare List of Crates Ordered by Publish-Order + uses: actions/github-script@v7 + id: crates + with: + script: | + // Get list of crates in publish order. + let crates_str = ""; + await exec.exec( + "cargo", [ "workspaces", "exec", "--no-bail", "sh", "-c", "basename $(pwd)" ], + { listeners: { stdout: (buf) => { crates_str += buf.toString(); } } }, + ); + let crates = crates_str.split("\n"); + + // Get list of crates that need publishing, but out of order. + let crates_need_publish_str = ""; + await exec.exec( + "cargo", [ "workspaces", "list" ], + { listeners: { stdout: (buf) => { crates_need_publish_str += buf.toString(); } } }, + ); + let crates_need_publish = crates_need_publish_str.split("\n"); + + // Filter the crates to those that publish. + let crates_to_publish = crates.filter((c) => crates_need_publish.includes(c)); + + return crates_to_publish.join(" "); + result-encoding: string + - name: List of Crates + run: echo "${{steps.crates.outputs.result}}" + # Package the crates that will be published. Verification is disabled # because we aren't ready to verify yet. Add each crate that was packaged to # the vendor/ directory. - - name: Package Crates ${{ inputs.crates }} + - name: Package Crates ${{ steps.crates.outputs.result }} run: | - for name in ${{ inputs.crates }} + for name in ${{ steps.crates.outputs.result }} do version=$(cargo metadata --format-version 1 --no-deps | jq -r '.packages[] | select(.name=="'$name'") | .version') cargo package \ diff --git a/.github/workflows/rust-publish-dry-run.yml b/.github/workflows/rust-publish-dry-run.yml index 70c7bd3..0bb7588 100644 --- a/.github/workflows/rust-publish-dry-run.yml +++ b/.github/workflows/rust-publish-dry-run.yml @@ -1,9 +1,6 @@ -# WARNING: This publish dry run process will not work on repositories that have -# a crate containing bin targets that are dependent on other crates in the -# repository. Please use `rust-publish-dry-run-v2` for any repository containing -# binaries. +# Deprecated. Use publish-dry-run-v2.yml. # -# For more details, see https://github.com/rust-lang/cargo/issues/11181. +# This workflow calls through to the v2 workflow. name: Publish Dry Run @@ -26,67 +23,8 @@ on: jobs: publish-dry-run: - runs-on: ${{ inputs.runs-on }} - defaults: - run: - shell: bash - env: - CARGO_BUILD_TARGET: ${{ inputs.target }} - CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc - steps: - - uses: actions/checkout@v3 - - - uses: stellar/actions/rust-cache@main - - - run: rustup update - - run: rustup target add ${{ inputs.target }} - - if: inputs.target == 'aarch64-unknown-linux-gnu' - run: sudo apt-get update && sudo apt-get -y install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu - - - uses: stellar/binaries@v21 - with: - name: cargo-hack - version: 0.5.28 - - # Create the vendor directory because it'll only be created in the next step - # if the crate has dependencies, but it's needed for the latter steps in all - # cases. - - run: mkdir -p vendor - - # Vendor all the dependencies into the vendor/ folder. Temporarily remove - # [patch.crates-io] entries in the workspace Cargo.toml that reference git - # repos. These will be removed when published. - - run: | - cp Cargo.toml Cargo.toml.bak - sed -r '/(git|rev) ?=/d' Cargo.toml.bak > Cargo.toml - cargo vendor --versioned-dirs - rm Cargo.toml - mv Cargo.toml.bak Cargo.toml - - # Package the crates that will be published. Verification is disabled because - # we aren't ready to verify yet. - - run: cargo-hack hack --ignore-private package --no-verify ${{ inputs.cargo-package-options }} - - # Add each crate that was packaged to the vendor/ directory. - - run: | - for crate in target/package/*.crate - do - name=$(basename "$crate" .crate) - tar xvfz "$crate" -C vendor/ - # Crates in the vendor directory require a checksum file, but it doesn't - # matter if it is empty. - echo '{"files":{}}' > vendor/$name/.cargo-checksum.json - done - - # Rerun the package command but with verification enabled this time. Tell - # cargo to use the local vendor/ directory as the source for all packages. Run - # the package command on the full feature powerset so that all features of - # each crate are verified to compile. - - run: > - cargo-hack hack - ${{ inputs.cargo-hack-feature-options }} - --ignore-private - --config "source.crates-io.replace-with = 'vendored-sources'" - --config "source.vendored-sources.directory = 'vendor'" - package - --target ${{ inputs.target }} + uses: ./.github/workflows/rust-publish-dry-run-v2.yml + with: + runs-on: ${{ inputs.runs-on }} + target: ${{ inputs.target }} + cargo-hack-feature-options: ${{ inputs.cargo-hack-feature-options }}