name: Release
on:
push:
branches: [main]
workflow_dispatch:
permissions:
contents: write
pull-requests: write
jobs:
release-please:
runs-on: ubuntu-latest
outputs:
release_created: ${{ steps.release.outputs.release_created }}
tag_name: ${{ steps.release.outputs.tag_name }}
version: ${{ steps.release.outputs.version }}
steps:
- uses: googleapis/release-please-action@v5
id: release
with:
config-file: .release-please-config.json
manifest-file: .release-please-manifest.json
publish-crate:
needs: release-please
if: ${{ needs.release-please.outputs.release_created }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
ref: ${{ needs.release-please.outputs.tag_name }}
- uses: dtolnay/rust-toolchain@stable
- run: cargo publish --token ${{ secrets.CRATES_IO_TOKEN }}
build-binaries:
needs: release-please
if: ${{ needs.release-please.outputs.release_created }}
permissions:
contents: write
strategy:
fail-fast: false
matrix:
include:
- target: aarch64-apple-darwin
os: macos-latest
- target: x86_64-apple-darwin
os: macos-latest
- target: aarch64-unknown-linux-gnu
os: ubuntu-latest
- target: x86_64-unknown-linux-gnu
os: ubuntu-latest
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v6
with:
ref: ${{ needs.release-please.outputs.tag_name }}
- uses: houseabsolute/actions-rust-cross@v1.0.7
with:
target: ${{ matrix.target }}
args: --release --locked
strip: true
- name: Create archive
run: |
cd target/${{ matrix.target }}/release
tar -czvf ../../../vacant-${{ matrix.target }}.tar.gz vacant
- name: Upload to release
uses: softprops/action-gh-release@v3
with:
tag_name: ${{ needs.release-please.outputs.tag_name }}
files: vacant-${{ matrix.target }}.tar.gz
brew-formula:
needs: [release-please, build-binaries]
if: ${{ needs.release-please.outputs.release_created }}
runs-on: ubuntu-latest
steps:
- name: Download release tarballs
env:
GH_TOKEN: ${{ github.token }}
TAG: ${{ needs.release-please.outputs.tag_name }}
run: |
for target in aarch64-apple-darwin x86_64-apple-darwin aarch64-unknown-linux-gnu x86_64-unknown-linux-gnu; do
gh release download "$TAG" --repo "$GITHUB_REPOSITORY" --pattern "vacant-$target.tar.gz"
done
- name: Generate and push formula
env:
GH_TOKEN: ${{ secrets.HOMEBREW_TAP_TOKEN }}
VERSION: ${{ needs.release-please.outputs.version }}
run: |
MAC_ARM_SHA=$(sha256sum vacant-aarch64-apple-darwin.tar.gz | awk '{print $1}')
MAC_INTEL_SHA=$(sha256sum vacant-x86_64-apple-darwin.tar.gz | awk '{print $1}')
LINUX_ARM_SHA=$(sha256sum vacant-aarch64-unknown-linux-gnu.tar.gz | awk '{print $1}')
LINUX_INTEL_SHA=$(sha256sum vacant-x86_64-unknown-linux-gnu.tar.gz | awk '{print $1}')
BASE_URL="https://github.com/alltuner/vacant/releases/download/v${VERSION}"
FORMULA_CONTENT=$(cat <<RUBY
class Vacant < Formula
desc "Fast domain availability checker via authoritative DNS"
homepage "https://github.com/alltuner/vacant"
version "${VERSION}"
license "MIT"
on_macos do
if Hardware::CPU.arm?
url "${BASE_URL}/vacant-aarch64-apple-darwin.tar.gz"
sha256 "${MAC_ARM_SHA}"
else
url "${BASE_URL}/vacant-x86_64-apple-darwin.tar.gz"
sha256 "${MAC_INTEL_SHA}"
end
end
on_linux do
if Hardware::CPU.arm?
url "${BASE_URL}/vacant-aarch64-unknown-linux-gnu.tar.gz"
sha256 "${LINUX_ARM_SHA}"
else
url "${BASE_URL}/vacant-x86_64-unknown-linux-gnu.tar.gz"
sha256 "${LINUX_INTEL_SHA}"
end
end
def install
bin.install "vacant"
end
test do
assert_match version.to_s, shell_output("#{bin}/vacant --version")
end
end
RUBY
)
ENCODED=$(echo "$FORMULA_CONTENT" | base64 -w 0)
EXISTING_SHA=$(gh api repos/alltuner/homebrew-tap/contents/Formula/vacant.rb -q '.sha' 2>/dev/null || true)
if [ -n "$EXISTING_SHA" ]; then
gh api repos/alltuner/homebrew-tap/contents/Formula/vacant.rb \
--method PUT \
-f message="vacant: update to v${VERSION}" \
-f content="$ENCODED" \
-f sha="$EXISTING_SHA"
else
gh api repos/alltuner/homebrew-tap/contents/Formula/vacant.rb \
--method PUT \
-f message="vacant: add formula at v${VERSION}" \
-f content="$ENCODED"
fi