Merge rust-bitcoin/rust-bitcoin#1758: CI: Only run release job for release PRs

e223cbe6df CI: Only run release job for release PRs (Tobin C. Harding)

Pull request description:

  Currently we run the release jobs for all PRs, this leads to red CI runs any time we have unreleased changes in one crate used by another i.e., basically days after a release comes out.

  Add a `release.sh` script that has more smarts to try and figure out if the patch series currently ontop of tip of mater contains changes that imply its a release PR. To do so we check for changes to the version field in the manifest of each crate.

ACKs for top commit:
  stevenroose:
    ACK e223cbe6df
  apoelstra:
    ACK e223cbe6df

Tree-SHA512: cc5503f68f9d275989acf8d2e8ff3b2b4ceb73606b8b823e408e4cf0bccbbb6dce0c583917d4dcb4b1b7f1b0bc34293251247d088943a5a6d5e06bf5af2ee8c3
This commit is contained in:
Andrew Poelstra 2023-04-10 14:06:21 +00:00
commit 36500b4451
No known key found for this signature in database
GPG Key ID: C588D63CE41B97C1
2 changed files with 43 additions and 23 deletions

View File

@ -10,8 +10,8 @@ on:
name: Release name: Release
jobs: jobs:
bitcoin: release:
name: Release - bitcoin name: Release - dry-run
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout Crate - name: Checkout Crate
@ -19,24 +19,4 @@ jobs:
- name: Checkout Toolchain - name: Checkout Toolchain
uses: dtolnay/rust-toolchain@stable uses: dtolnay/rust-toolchain@stable
- name: run cargo - name: run cargo
run: cargo publish -p bitcoin --dry-run run: contrib/release.sh
private:
name: Release - private
runs-on: ubuntu-latest
steps:
- name: Checkout Crate
uses: actions/checkout@v3
- name: Checkout Toolchain
uses: dtolnay/rust-toolchain@stable
- name: run cargo
run: cargo publish -p bitcoin-private --dry-run
hashes:
name: Release - bitcoin_hashes
runs-on: ubuntu-latest
steps:
- name: Checkout Crate
uses: actions/checkout@v3
- name: Checkout Toolchain
uses: dtolnay/rust-toolchain@stable
- name: run cargo
run: cargo publish -p bitcoin_hashes --dry-run

40
contrib/release.sh Executable file
View File

@ -0,0 +1,40 @@
#!/usr/bin/env bash
#
# Check that we can publish crates in their current form if there are changes on top of the tip of
# master that imply that we are about to do a release.
set -ex
main () {
for crate in "internals" "hashes" "bitcoin"; do
if release_changes $crate; then
echo "$crate has changes implying this is a release PR, checking if we can publish ..."
publish_dry_run $crate
fi
done
}
# Returns 0 if crate ($1) contains changes since tip of master that imply this patch set is done in
# preparation for releasing the crate.
release_changes() {
local crate=$1
git log --patch --reverse master.. -- $crate/Cargo.toml | grep version
}
# Do a dry run publish to crates.io using the correct package name for crate ($1).
# We use `set -e` so this will fail the script if the dry-run fails.
publish_dry_run() {
local crate=$1
if [ "$crate" == "hashes" ]; then
cargo publish -p "bitcoin_hashes" --dry-run
elif [ "$crate" == "internals" ]; then
cargo publish -p "bitcoin-private" --dry-run
elif [ "$crate" == "bitcoin" ]; then
cargo publish -p "bitcoin" --dry-run
fi
}
#
# Main script.
#
main $@