name: Release
on:
workflow_dispatch:
push:
tags:
- 'v*.*.*'
- 'v*.*.*-*'
permissions:
contents: write
id-token: write
jobs:
validate:
name: Validate
runs-on: ubuntu-24.04
outputs:
version: ${{ steps.validate.outputs.version }}
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Validate changelog
uses: michaelklishin/rust-build-package-release-action@v3
with:
command: validate-changelog
- name: Validate version
uses: michaelklishin/rust-build-package-release-action@v3
id: validate
with:
command: validate-version
expected-version: ${{ vars.NEXT_RELEASE_VERSION }}
validate-cargo-toml: 'true'
- name: Extract changelog
uses: michaelklishin/rust-build-package-release-action@v3
with:
command: extract-changelog
- name: Upload release notes
uses: actions/upload-artifact@v4
with:
name: release-notes
path: release_notes.md
retention-days: 2
publish-crate:
name: Publish to crates.io
needs: [validate]
runs-on: ubuntu-24.04
environment: release
timeout-minutes: 15
steps:
- name: Checkout
uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
- name: Authenticate with crates.io
id: auth
uses: rust-lang/crates-io-auth-action@v1
- name: Publish crate
uses: michaelklishin/rust-build-package-release-action@v3
with:
command: publish-crate
locked: 'true'
env:
CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }}
build:
name: Build (${{ matrix.target }})
needs: [validate]
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- target: aarch64-apple-darwin
os: macos-latest
- target: x86_64-apple-darwin
os: macos-15-intel
- target: x86_64-pc-windows-msvc
os: windows-latest
- target: x86_64-unknown-linux-gnu
os: ubuntu-22.04
- target: aarch64-unknown-linux-gnu
os: ubuntu-24.04-arm
- target: x86_64-unknown-linux-musl
os: ubuntu-22.04
no_default_features: 'true'
- target: aarch64-unknown-linux-musl
os: ubuntu-24.04-arm
no_default_features: 'true'
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Build release
uses: michaelklishin/rust-build-package-release-action@v3
id: build
with:
command: release
target: ${{ matrix.target }}
binary-name: rabbitmqadmin
locked: 'true'
archive: 'true'
checksum: 'sha256'
include: 'README.md,LICENSE-MIT,LICENSE-APACHE'
no-default-features: ${{ matrix.no_default_features || 'false' }}
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.target }}
path: |
${{ steps.build.outputs.artifact_path }}
${{ steps.build.outputs.artifact_path }}.sha256
${{ steps.build.outputs.bare_artifact_path }}
retention-days: 2
packages:
name: Package (${{ matrix.format }}, ${{ matrix.target }})
needs: [validate]
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- format: deb
command: release-linux-deb
target: x86_64-unknown-linux-gnu
os: ubuntu-22.04
- format: deb
command: release-linux-deb
target: aarch64-unknown-linux-gnu
os: ubuntu-24.04-arm
- format: rpm
command: release-linux-rpm
target: x86_64-unknown-linux-gnu
os: ubuntu-22.04
- format: rpm
command: release-linux-rpm
target: aarch64-unknown-linux-gnu
os: ubuntu-24.04-arm
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Build ${{ matrix.format }} package
uses: michaelklishin/rust-build-package-release-action@v3
id: build
with:
command: ${{ matrix.command }}
target: ${{ matrix.target }}
binary-name: rabbitmqadmin
locked: 'true'
pkg-maintainer: 'Team RabbitMQ <teamrabbitmq@gmail.com>'
pkg-description: 'rabbitmqadmin v2 is a modern CLI for RabbitMQ HTTP API'
pkg-homepage: 'https://www.rabbitmq.com/docs/management-cli'
pkg-license: 'Apache-2.0 OR MIT'
- name: Upload package
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.format }}-${{ matrix.target }}
path: |
${{ steps.build.outputs.artifact_path }}
${{ steps.build.outputs.checksum_file }}
retention-days: 2
msi:
name: MSI Installer
needs: [validate]
runs-on: windows-latest
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Build MSI
uses: michaelklishin/rust-build-package-release-action@v3
id: build
with:
command: release-windows-msi
target: x86_64-pc-windows-msvc
binary-name: rabbitmqadmin
locked: 'true'
- name: Upload MSI
uses: actions/upload-artifact@v4
with:
name: msi-x86_64
path: |
${{ steps.build.outputs.artifact_path }}
${{ steps.build.outputs.checksum_file }}
retention-days: 2
release:
name: Publish
needs: [validate, publish-crate, build, packages, msi]
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Download artifacts
uses: actions/download-artifact@v4
with:
path: artifacts
- name: Collect release files
run: |
mkdir -p release
find artifacts -type f \( -name "rabbitmqadmin-*" -o -name "*.sha256" -o -name "*.deb" -o -name "*.rpm" -o -name "*.msi" \) ! -name "release_notes.md" -exec cp {} release/ \;
- name: Generate SBOM
uses: michaelklishin/rust-build-package-release-action@v3
id: sbom
with:
command: generate-sbom
sbom-format: 'spdx,cyclonedx'
- name: Copy SBOMs to release
run: |
cp ${{ steps.sbom.outputs.sbom_spdx }} release/ || true
cp ${{ steps.sbom.outputs.sbom_cyclonedx }} release/ || true
- name: Install cosign
uses: sigstore/cosign-installer@v3
- name: Sign release archives
run: |
for artifact in release/*.tar.gz release/*.zip; do
if [ -f "$artifact" ]; then
echo "Signing $artifact"
cosign sign-blob --yes \
--output-signature "${artifact}.sig" \
--output-certificate "${artifact}.pem" \
--bundle "${artifact}.sigstore.json" \
"$artifact"
fi
done
- name: Collect artifacts
uses: michaelklishin/rust-build-package-release-action@v3
id: collect
with:
command: collect-artifacts
binary-name: rabbitmqadmin
artifacts-dir: release
base-url: https://github.com/rabbitmq/rabbitmqadmin-ng/releases/download/v${{ needs.validate.outputs.version }}
- name: Format release body
uses: michaelklishin/rust-build-package-release-action@v3
id: body
with:
command: format-release
artifacts-dir: release
notes-file: artifacts/release-notes/release_notes.md
include-checksums: 'true'
- name: Copy checksums
run: cp ${{ steps.collect.outputs.checksums_file }} release/ || true
- name: Generate Homebrew formula
uses: michaelklishin/rust-build-package-release-action@v3
id: homebrew
with:
command: generate-homebrew
binary-name: rabbitmqadmin
version: ${{ needs.validate.outputs.version }}
pkg-description: 'rabbitmqadmin v2 is a modern CLI for RabbitMQ HTTP API'
pkg-homepage: 'https://www.rabbitmq.com/docs/management-cli'
pkg-license: 'Apache-2.0 OR MIT'
brew-copyright: '2023-2026 The rabbitmqadmin v2 Contributors'
brew-macos-arm64-url: https://github.com/rabbitmq/rabbitmqadmin-ng/releases/download/v${{ needs.validate.outputs.version }}/rabbitmqadmin-${{ needs.validate.outputs.version }}-aarch64-apple-darwin.tar.gz
brew-macos-arm64-sha256: ${{ steps.collect.outputs.macos_arm64_sha256 }}
brew-macos-x64-url: https://github.com/rabbitmq/rabbitmqadmin-ng/releases/download/v${{ needs.validate.outputs.version }}/rabbitmqadmin-${{ needs.validate.outputs.version }}-x86_64-apple-darwin.tar.gz
brew-macos-x64-sha256: ${{ steps.collect.outputs.macos_x64_sha256 }}
brew-linux-arm64-url: https://github.com/rabbitmq/rabbitmqadmin-ng/releases/download/v${{ needs.validate.outputs.version }}/rabbitmqadmin-${{ needs.validate.outputs.version }}-aarch64-unknown-linux-gnu.tar.gz
brew-linux-arm64-sha256: ${{ steps.collect.outputs.linux_arm64_sha256 }}
brew-linux-x64-url: https://github.com/rabbitmq/rabbitmqadmin-ng/releases/download/v${{ needs.validate.outputs.version }}/rabbitmqadmin-${{ needs.validate.outputs.version }}-x86_64-unknown-linux-gnu.tar.gz
brew-linux-x64-sha256: ${{ steps.collect.outputs.linux_x64_sha256 }}
- name: Generate AUR PKGBUILD
uses: michaelklishin/rust-build-package-release-action@v3
id: aur
with:
command: generate-aur
binary-name: rabbitmqadmin
aur-name: rabbitmqadmin
version: ${{ needs.validate.outputs.version }}
pkg-description: 'rabbitmqadmin v2 is a modern CLI for RabbitMQ HTTP API'
pkg-homepage: 'https://www.rabbitmq.com/docs/management-cli'
pkg-license: 'Apache-2.0 OR MIT'
aur-maintainer: 'Team RabbitMQ <teamrabbitmq@gmail.com>'
aur-source-url: https://github.com/rabbitmq/rabbitmqadmin-ng/archive/refs/tags/v${{ needs.validate.outputs.version }}.tar.gz
aur-source-sha256: 'SKIP'
- name: Generate Winget manifest
uses: michaelklishin/rust-build-package-release-action@v3
id: winget
with:
command: generate-winget
binary-name: rabbitmqadmin
winget-package-id: rabbitmqadmin
version: ${{ needs.validate.outputs.version }}
pkg-description: 'rabbitmqadmin v2 is a modern CLI for RabbitMQ HTTP API'
pkg-homepage: 'https://www.rabbitmq.com/docs/management-cli'
pkg-license: 'Apache-2.0 OR MIT'
winget-publisher: 'RabbitMQ'
winget-license-url: 'https://github.com/rabbitmq/rabbitmqadmin-ng/blob/main/LICENSE-MIT'
winget-tags: 'rabbitmq,cli,management'
winget-x64-url: https://github.com/rabbitmq/rabbitmqadmin-ng/releases/download/v${{ needs.validate.outputs.version }}/rabbitmqadmin-${{ needs.validate.outputs.version }}-x86_64-pc-windows-msvc.zip
winget-x64-sha256: ${{ steps.collect.outputs.windows_x64_sha256 }}
- name: Copy Homebrew formula to release
run: cp ${{ steps.homebrew.outputs.formula_file }} release/
- name: Upload package manifests
uses: actions/upload-artifact@v4
with:
name: package-manager-manifests
path: |
${{ steps.homebrew.outputs.formula_file }}
${{ steps.aur.outputs.pkgbuild_path }}
${{ steps.aur.outputs.srcinfo_path }}
${{ steps.winget.outputs.manifest_dir }}
retention-days: 7
- name: Publish release
uses: softprops/action-gh-release@v2
with:
tag_name: v${{ needs.validate.outputs.version }}
draft: false
body: ${{ steps.body.outputs.body }}
files: release/*
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}