---
name: Release Binaries
on:
push:
tags:
- "v*.*.*"
permissions:
contents: write jobs:
build-macos:
name: Build macOS Binaries
runs-on: macos-latest
strategy:
matrix:
target: [aarch64-apple-darwin, x86_64-apple-darwin]
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Add target
run: rustup target add ${{ matrix.target }}
- name: Build binary
run: cargo build --release --target ${{ matrix.target }}
- name: Rename and compress binary
run: |
mkdir -p bin
cp target/${{ matrix.target }}/release/atar bin/atar
tar -czvf bin/atar-${{ matrix.target }}.tar.gz -C bin atar
- name: Upload binary as artifact
uses: actions/upload-artifact@v4
with:
name: atar-${{ matrix.target }}
path: bin/atar-${{ matrix.target }}.tar.gz
build-linux:
name: Build Arch Linux Packages
runs-on: ubuntu-latest
strategy:
matrix:
target: [x86_64-unknown-linux-gnu, aarch64-unknown-linux-gnu]
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Install cross
run: cargo install cross
- name: Add target
run: rustup target add ${{ matrix.target }}
- name: Build binary with cross
run: cross build --release --target ${{ matrix.target }}
- name: Rename and compress binary
run: |
mkdir -p bin
cp target/${{ matrix.target }}/release/atar bin/atar
tar -czvf bin/atar-${{ matrix.target }}.tar.gz -C bin atar
- name: Upload binary as artifact
uses: actions/upload-artifact@v4
with:
name: atar-${{ matrix.target }}
path: bin/atar-${{ matrix.target }}.tar.gz
release:
name: Create GitHub Release
needs: [build-macos, build-linux]
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Download macOS artifacts (aarch64)
uses: actions/download-artifact@v4
with:
name: atar-aarch64-apple-darwin
path: bin
- name: Download macOS artifacts (x86_64)
uses: actions/download-artifact@v4
with:
name: atar-x86_64-apple-darwin
path: bin
- name: Download Linux artifacts (x86_64)
uses: actions/download-artifact@v4
with:
name: atar-x86_64-unknown-linux-gnu
path: bin
- name: Download Linux artifacts (aarch64)
uses: actions/download-artifact@v4
with:
name: atar-aarch64-unknown-linux-gnu
path: bin
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
files: bin/**
token: ${{ secrets.GITHUB_TOKEN }}
draft: false
prerelease: false
- name: Trigger Homebrew Tap Update
run: |
curl -X POST -H "Accept: application/vnd.github.v3+json" \
-H "Authorization: token ${{ secrets.HOMEBREW_PAT }}" \
https://api.github.com/repos/x71c9/homebrew-x71c9/dispatches \
-d '{"event_type": "update-atar", "client_payload": {"tag": "${{ github.ref_name }}"}}'
update-aur:
name: Publish to AUR
runs-on: ubuntu-latest
container:
image: archlinux:latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install dependencies
run: |
pacman -Syu --noconfirm base-devel coreutils curl git openssh sudo
- name: Setup SSH
run: |
mkdir -p ~/.ssh
echo "${{ secrets.AUR_SECRET_KEY }}" > ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
ssh-keyscan -t rsa,ecdsa,ed25519 aur.archlinux.org >> ~/.ssh/known_hosts
- name: Checkout AUR Repository
run: |
GIT_SSH_COMMAND="ssh -i ~/.ssh/id_ed25519 -o IdentitiesOnly=yes -o StrictHostKeyChecking=no" \
git clone ssh://aur@aur.archlinux.org/atar.git aur-atar
- name: Create non-root build user
run: |
useradd -m builduser
echo "builduser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
chown -R builduser:builduser aur-atar
mkdir -p /home/builduser/.ssh
cp ~/.ssh/id_ed25519 /home/builduser/.ssh/id_ed25519
chown -R builduser:builduser /home/builduser/.ssh
chmod 600 /home/builduser/.ssh/id_ed25519
- name: Update PKGBUILD and Push to AUR
run: |
version=${GITHUB_REF_NAME#v}
rustdescr=$(grep '^description' Cargo.toml | sed 's/description = "\(.*\)"/\1/')
curl -OL https://codeload.github.com/x71c9/atar/tar.gz/refs/tags/v${version}
sha256sum=$(sha256sum v${version} | awk '{print $1}')
cat > aur-atar/PKGBUILD <<EOF
pkgname=atar
pkgver=${version}
pkgrel=1
pkgdesc="${rustdescr}"
arch=('x86_64' 'aarch64')
url="https://github.com/x71c9/atar"
license=('MIT')
depends=('glibc')
makedepends=('rust')
source=("\$pkgname-\$pkgver.tar.gz::https://codeload.github.com/x71c9/\$pkgname/tar.gz/refs/tags/v\$pkgver")
sha256sums=("${sha256sum}")
prepare() {
cd "\$pkgname-\$pkgver"
export RUSTUP_TOOLCHAIN=stable
cargo fetch --locked --target "\$(rustc -vV | sed -n 's/host: //p')"
}
build() {
cd "\$pkgname-\$pkgver"
export RUSTUP_TOOLCHAIN=stable
export CARGO_TARGET_DIR=target
cargo build --frozen --release --all-features
}
package() {
cd "\$pkgname-\$pkgver"
install -Dm0755 -t "\$pkgdir/usr/bin/" "target/release/\$pkgname"
}
EOF
sudo -E -H -u builduser bash <<'SCRIPT'
cd aur-atar
cat PKGBUILD
makepkg --printsrcinfo > .SRCINFO
git config user.email "mail@x71c9.com"
git config user.name "x71c9"
git add .
git commit -m "chore(release): release ${version}"
GIT_SSH_COMMAND="ssh -i ~/.ssh/id_ed25519 -o IdentitiesOnly=yes -o StrictHostKeyChecking=no" git push origin master
SCRIPT
publish-debian:
name: Publish Debian using Cloudsmith
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Install tools for cross-build and packaging
run: |
sudo apt-get update
sudo apt-get install -y build-essential jq python3-pip pipx
pipx ensurepath
source ~/.bashrc
pipx install cloudsmith-cli
cargo install cross
cargo install cargo-deb
- name: Add Rust targets and cross-build binaries
run: |
rustup target add x86_64-unknown-linux-gnu aarch64-unknown-linux-gnu
cross build --release --target x86_64-unknown-linux-gnu
cross build --release --target aarch64-unknown-linux-gnu
- name: Package Debian artifacts
run: |
version=${GITHUB_REF_NAME#v}
mkdir -p target/debian
cargo deb --no-strip --no-build --target x86_64-unknown-linux-gnu \
--output target/debian/atar_${version}_amd64.deb
cargo deb --no-strip --no-build --target aarch64-unknown-linux-gnu \
--output target/debian/atar_${version}_arm64.deb
- name: Upload .deb to Cloudsmith
env:
CLOUDSMITH_API_KEY: ${{ secrets.CLOUDSMITH_API_KEY }}
run: |
version=${GITHUB_REF_NAME#v}
cloudsmith push deb x71c9/atar/any-distro/any-version target/debian/atar_${version}_amd64.deb
cloudsmith push deb x71c9/atar/any-distro/any-version target/debian/atar_${version}_arm64.deb
publish-fedora:
name: Publish to Fedora COPR
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install tools
run: |
sudo apt-get update
sudo apt-get install -y build-essential rpm python3-pip pipx
pipx ensurepath
source ~/.bashrc
pipx install copr-cli
cargo install cargo-rpm
- name: Init and publish
env:
COPR_LOGIN: ${{ secrets.COPR_LOGIN }}
COPR_TOKEN: ${{ secrets.COPR_TOKEN }}
run: |
version=${GITHUB_REF_NAME#v}
mkdir -p ~/.config/
touch ~/.config/copr
#######################################################
# Get this from https://copr.fedorainfracloud.org/api #
#######################################################
cat > ~/.config/copr <<EOF
[copr-cli]
login = $COPR_LOGIN
username = x71c9
token = $COPR_TOKEN
copr_url = https://copr.fedorainfracloud.org
EOF
cargo rpm init
cargo rpm build
copr-cli build x71c9/atar target/release/rpmbuild/SRPMS/atar-${version}-1.src.rpm