* Feature: add GitHub Actions workflow for publishing Arch Linux AUR package * Fix issues in Arch Linux AUR publishing process * Add patch to fix default Arch Linux binary path location issues * fix: PKGBUILD compatibility with numa v0.10.1, fix QEMU action SHA pin Three small bug fixes that make this PR mergeable end-to-end against current main, without changing the package design (still numa-git, still pushed on every main commit, still tracking HEAD via pkgver()): 1. Simplified prepare() — drop the obsolete sed patching for /usr/local/bin/numa. That literal only appears in a comment in current main; the actual binary path is determined at runtime via std::env::current_exe(). Additionally, numa v0.10.1 ships PR #43 which makes numa FHS-compliant on Linux out of the box (/var/lib/numa for data dir), so no source patching is needed at all on Arch. 2. Fixed package() sed for the systemd unit. The previous sed targeted "ExecStart=/usr/local/bin/numa" but numa.service actually uses "{{exe_path}}" as a templating placeholder that's substituted at runtime by replace_exe_path() when `numa install` runs. The sed silently did nothing, and the AUR-installed unit file would have a literal "{{exe_path}}" that systemd cannot start. Fixed sed: sed 's|{{exe_path}}|/usr/bin/numa /etc/numa.toml|g' \ numa.service > numa.service.patched 3. Fixed broken docker/setup-qemu-action SHA pin in publish-aur.yml. The pinned SHA 6882732593b27c7f95a044d559b586a46371a68e doesn't exist as a commit in upstream docker/setup-qemu-action. Verified v3.0.0 SHA is 68827325e0b33c7199eb31dd4e31fbe9023e06e3. Without this fix the aarch64 validate job would fail to load the action at workflow start. Also refreshed the stale pkgver placeholder in PKGBUILD and .SRCINFO from 0.9.1.r0.g1234abc to 0.10.1.r0.g0000000 — purely cosmetic since pkgver() auto-overrides on every makepkg run, but at least the in-VC value reflects the current era. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: make AUR packaging x86_64-only and stabilize local validation Turns out Arch Linux doesn't officially support aarch64 architecture, so we will drop if from this AUR build process. Changes: - drop aarch64 from PKGBUILD, .SRCINFO, and AUR validation workflow - keep AUR process aligned with official Arch Linux x86_64 support - install rust directly in CI to avoid Arch cargo provider prompts - fetch sources before running cargo audit and audit inside the fetched repo - disable makepkg LTO for this package to avoid Arch packaging link failures - mark /etc/numa.toml as a backup file - Add local AUR build scratch directory exclusion to .gitignore * Add temporary AUR test workflow * Update github actions checkout workflow version * remove temporary AUR test workflow * fix: correct AUR SSH host key fingerprint The previously pinned ed25519 key was truncated (52 chars) and did not match the actual aur.archlinux.org host key. Verified via ssh-keyscan. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Razvan Dimescu <ssaricu@gmail.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
151 lines
6.2 KiB
YAML
151 lines
6.2 KiB
YAML
# `publish-aur.yml` - Arch Linux AUR Package Workflow
|
|
# --------------------
|
|
# This workflow automates the validation and publishing of the 'numa-git' package to the
|
|
# Arch User Repository (AUR). The AUR is a community-driven repository for Arch Linux users.
|
|
#
|
|
# Workflow Overview:
|
|
# 1. Validate: Builds and tests the package for Arch Linux x86_64 using a clean
|
|
# Arch Linux container.
|
|
# 2. Audit: Checks Rust dependencies for known security vulnerabilities using
|
|
# 'cargo-audit'.
|
|
# 3. Publish: If on the 'main' branch, it pushes the updated PKGBUILD and
|
|
# .SRCINFO to the AUR.
|
|
#
|
|
# Security Best Practices:
|
|
# - SHA Pinning: All GitHub Actions are pinned to a full-length commit SHA (e.g., v6.0.2 @ SHA)
|
|
# to ensure the code is immutable and protects against supply-chain attacks where a tag
|
|
# might be maliciously moved to a compromised commit.
|
|
# - SSH Hygiene: Uses ssh-agent to keep the private key in memory rather than on disk.
|
|
# - Audit: Runs 'cargo audit' to prevent publishing known vulnerable dependencies.
|
|
|
|
name: Publish - Arch Linux AUR Package
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
workflow_dispatch:
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
jobs:
|
|
# The 'validate' job ensures that the PKGBUILD is correct and the software builds/tests
|
|
# successfully on Arch Linux before we attempt to publish it.
|
|
validate:
|
|
name: Validate PKGBUILD (${{ matrix.arch }})
|
|
runs-on: ubuntu-latest
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
arch: [x86_64]
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
|
|
- name: Build and Test Package
|
|
timeout-minutes: 60
|
|
env:
|
|
AUR_PKGNAME: ${{ secrets.AUR_PACKAGE_NAME }}
|
|
run: |
|
|
# We use a temporary directory to avoid Docker permission issues with the workspace.
|
|
mkdir -p build-dir
|
|
cp PKGBUILD build-dir/
|
|
|
|
docker run --rm -v $PWD/build-dir:/pkg -w /pkg archlinux:latest /bin/bash -c "
|
|
# ARCH LINUX SECURITY REQUIREMENT:
|
|
# 'makepkg' (the tool that builds Arch packages) refuses to run as root for safety.
|
|
# We must create a standard user and give them sudo access.
|
|
|
|
# Install build-time dependencies.
|
|
# 'base-devel' includes essential tools like gcc, make, and binutils.
|
|
# Install 'rust' directly to avoid the interactive virtual-package
|
|
# prompt for 'cargo' on current Arch images.
|
|
pacman -Syu --noconfirm --needed base-devel rust git sudo cargo-audit
|
|
|
|
useradd -m builduser
|
|
chown -R builduser:builduser /pkg
|
|
|
|
# Allow the build user to install dependencies during the build process.
|
|
echo 'builduser ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/builduser
|
|
|
|
# Fetch the source tree first so pkgver() and cargo-audit have a
|
|
# real Cargo.lock to inspect.
|
|
sudo -u builduser makepkg -o --nobuild --nocheck --nodeps --noprepare
|
|
|
|
# SECURITY AUDIT:
|
|
# Fail early if any dependencies have known security vulnerabilities.
|
|
sudo -u builduser sh -lc 'cd /pkg/src/numa && cargo audit'
|
|
|
|
# BUILD & TEST:
|
|
# 'makepkg -s' will:
|
|
# 1. Download source files (cloning this repo)
|
|
# 2. Run prepare(), build(), and check() (running cargo test)
|
|
# 3. Create the final .pkg.tar.zst package
|
|
sudo -u builduser makepkg -s --noconfirm
|
|
"
|
|
|
|
# The 'publish' job updates the AUR repository with our latest PKGBUILD and .SRCINFO.
|
|
publish:
|
|
name: Publish to AUR
|
|
needs: validate
|
|
runs-on: ubuntu-latest
|
|
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
|
|
# Securely configure SSH for AUR access.
|
|
- name: Configure SSH
|
|
run: |
|
|
mkdir -p ~/.ssh
|
|
# Official AUR Ed25519 fingerprint (prevents Man-in-the-Middle attacks).
|
|
echo "aur.archlinux.org ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEuBKrPzbawxA/k2g6NcyV5jmqwJ2s+zpgZGZ7tpLIcN" >> ~/.ssh/known_hosts
|
|
|
|
# Use ssh-agent to keep the private key in memory rather than writing it to disk.
|
|
eval $(ssh-agent -s)
|
|
echo "${{ secrets.AUR_SSH_PRIVATE_KEY }}" | tr -d '\r' | ssh-add -
|
|
|
|
# Export the agent socket so subsequent 'git' commands can use it.
|
|
echo "SSH_AUTH_SOCK=$SSH_AUTH_SOCK" >> $GITHUB_ENV
|
|
echo "SSH_AGENT_PID=$SSH_AGENT_PID" >> $GITHUB_ENV
|
|
|
|
- name: Push to AUR
|
|
env:
|
|
AUR_PKGNAME: ${{ secrets.AUR_PACKAGE_NAME }}
|
|
AUR_EMAIL: ${{ secrets.AUR_EMAIL }}
|
|
AUR_USER: ${{ secrets.AUR_USERNAME }}
|
|
run: |
|
|
# AUR repos are managed via Git. Each package has its own repo at:
|
|
# ssh://aur@aur.archlinux.org/<package-name>.git
|
|
git clone ssh://aur@aur.archlinux.org/$AUR_PKGNAME.git aur-repo
|
|
|
|
cp PKGBUILD aur-repo/
|
|
cd aur-repo
|
|
|
|
# METADATA GENERATION:
|
|
# '.SRCINFO' is a machine-readable version of the PKGBUILD.
|
|
# We must run this as a non-root user ('builduser') inside the container.
|
|
docker run --rm -v $(pwd):/pkg archlinux:latest /bin/bash -c "
|
|
pacman -Syu --noconfirm --needed binutils git sudo
|
|
useradd -m builduser
|
|
chown -R builduser:builduser /pkg
|
|
cd /pkg
|
|
sudo -u builduser git config --global --add safe.directory '*'
|
|
# "makepkg -od" fetches the source first so pkgver() can calculate the version.
|
|
sudo -u builduser makepkg -od && sudo -u builduser makepkg --printsrcinfo > .SRCINFO
|
|
"
|
|
|
|
# Set the commit identity using secrets for security and auditability.
|
|
git config user.name "$AUR_USER"
|
|
git config user.email "$AUR_EMAIL"
|
|
|
|
# Stage and commit both the human-readable PKGBUILD and machine-readable .SRCINFO.
|
|
git add PKGBUILD .SRCINFO
|
|
|
|
if ! git diff --cached --quiet; then
|
|
git commit -m "chore: update PKGBUILD to ${{ github.sha }}"
|
|
git push origin master
|
|
else
|
|
echo "No changes to commit (metadata and PKGBUILD are already up-to-date)."
|
|
fi
|