Build and Publish to AUR #8
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Build and Publish to AUR | |
| on: | |
| push: | |
| branches: | |
| - main | |
| paths: | |
| - 'pkgs/*/PKGBUILD' | |
| workflow_dispatch: | |
| inputs: | |
| package: | |
| description: 'Package to build and publish' | |
| required: true | |
| type: string | |
| skip_publish: | |
| description: 'Skip AUR publishing (dry-run)' | |
| required: false | |
| type: boolean | |
| default: false | |
| permissions: | |
| contents: read | |
| jobs: | |
| detect-changed-packages: | |
| runs-on: ubuntu-latest | |
| outputs: | |
| packages: ${{ steps.detect.outputs.packages }} | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 2 | |
| - name: Detect changed packages | |
| id: detect | |
| run: | | |
| set -euo pipefail | |
| if [[ -n "${{ github.event.inputs.package }}" ]]; then | |
| echo "packages=[\"${{ github.event.inputs.package }}\"]" >> "${GITHUB_OUTPUT}" | |
| exit 0 | |
| fi | |
| # Detect packages with PKGBUILD or .SRCINFO changes | |
| changed_files=$(git diff --name-only HEAD^ HEAD || git diff --name-only HEAD) | |
| packages=$(echo "${changed_files}" | grep -E '^pkgs/[^/]+/(PKGBUILD|\.SRCINFO)$' | cut -d'/' -f2 | sort -u | jq -R -s -c 'split("\n")[:-1]') | |
| if [[ "${packages}" == "[]" || -z "${packages}" ]]; then | |
| echo "No package changes detected" | |
| echo "packages=[]" >> "${GITHUB_OUTPUT}" | |
| else | |
| echo "Detected package changes: ${packages}" | |
| echo "packages=${packages}" >> "${GITHUB_OUTPUT}" | |
| fi | |
| build-and-validate: | |
| needs: detect-changed-packages | |
| if: needs.detect-changed-packages.outputs.packages != '[]' | |
| runs-on: ubuntu-latest | |
| strategy: | |
| matrix: | |
| package: ${{ fromJson(needs.detect-changed-packages.outputs.packages) }} | |
| fail-fast: false | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Build and validate package | |
| uses: heyhusen/archlinux-package-action@v2 | |
| with: | |
| path: pkgs/${{ matrix.package }} | |
| flags: '-s --noconfirm' | |
| namcap: true | |
| srcinfo: true | |
| - name: List generated files | |
| run: | | |
| echo "=== Files in package directory ===" | |
| ls -la "pkgs/${{ matrix.package }}/" || true | |
| echo "=== Looking for .SRCINFO ===" | |
| find "pkgs/${{ matrix.package }}" -name ".SRCINFO" -ls || true | |
| echo "=== Looking for package files ===" | |
| find "pkgs/${{ matrix.package }}" -name "*.pkg.tar.zst" -ls || true | |
| - name: Upload .SRCINFO for publishing | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: ${{ matrix.package }}-srcinfo-${{ github.run_id }} | |
| path: pkgs/${{ matrix.package }}/.SRCINFO | |
| retention-days: 1 | |
| if-no-files-found: error | |
| - name: Upload build artifacts | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: ${{ matrix.package }}-${{ github.run_id }} | |
| path: | | |
| pkgs/${{ matrix.package }}/*.pkg.tar.zst | |
| pkgs/${{ matrix.package }}/*.pkg.tar.zst.sig | |
| retention-days: 90 | |
| if-no-files-found: warn | |
| - name: Upload build logs | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: ${{ matrix.package }}-logs-${{ github.run_id }} | |
| path: | | |
| pkgs/${{ matrix.package }}/*.log | |
| pkgs/${{ matrix.package }}/src/ | |
| retention-days: 30 | |
| if-no-files-found: ignore | |
| publish-to-aur: | |
| needs: [detect-changed-packages, build-and-validate] | |
| if: needs.detect-changed-packages.outputs.packages != '[]' && github.event.inputs.skip_publish != 'true' | |
| runs-on: ubuntu-latest | |
| strategy: | |
| matrix: | |
| package: ${{ fromJson(needs.detect-changed-packages.outputs.packages) }} | |
| fail-fast: false | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Download .SRCINFO artifact | |
| id: download-srcinfo | |
| continue-on-error: true | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: ${{ matrix.package }}-srcinfo-${{ github.run_id }} | |
| path: pkgs/${{ matrix.package }} | |
| - name: Generate .SRCINFO if not present | |
| run: | | |
| pkg_dir="pkgs/${{ matrix.package }}" | |
| if [[ ! -f "${pkg_dir}/.SRCINFO" ]]; then | |
| echo "⚠️ .SRCINFO not found in artifact, generating it now..." | |
| docker run --rm \ | |
| -v "$(pwd)/${pkg_dir}:/pkg" \ | |
| -w /pkg \ | |
| archlinux:latest \ | |
| bash -c "pacman -Sy --noconfirm base-devel && makepkg --printsrcinfo > .SRCINFO" | |
| else | |
| echo "✓ .SRCINFO found in artifact" | |
| fi | |
| # Verify .SRCINFO exists | |
| if [[ ! -f "${pkg_dir}/.SRCINFO" ]]; then | |
| echo "❌ Failed to get .SRCINFO" | |
| exit 1 | |
| fi | |
| - name: Get package version | |
| id: pkgver | |
| run: | | |
| pkg_dir="pkgs/${{ matrix.package }}" | |
| pkgver=$(awk -F'= *' '$1=="pkgver"{print $2; exit}' "${pkg_dir}/PKGBUILD") | |
| echo "version=${pkgver}" >> "${GITHUB_OUTPUT}" | |
| - name: Prepare assets list | |
| id: assets | |
| run: | | |
| pkg_dir="pkgs/${{ matrix.package }}" | |
| assets="${pkg_dir}/.SRCINFO" | |
| # Check for optional files and add to assets if they exist | |
| shopt -s nullglob | |
| for pattern in "*.install" "*.patch" "*.sh" "*.service"; do | |
| for file in "${pkg_dir}"/${pattern}; do | |
| if [[ -f "${file}" ]]; then | |
| assets="${assets}"$'\n'"${file}" | |
| fi | |
| done | |
| done | |
| # Export as multiline output | |
| { | |
| echo "list<<EOF" | |
| echo "${assets}" | |
| echo "EOF" | |
| } >> "${GITHUB_OUTPUT}" | |
| - name: Publish to AUR | |
| uses: KSXGitHub/github-actions-deploy-aur@v2.7.0 | |
| with: | |
| pkgname: ${{ matrix.package }} | |
| pkgbuild: pkgs/${{ matrix.package }}/PKGBUILD | |
| commit_username: github-actions[bot] | |
| commit_email: github-actions[bot]@users.noreply.github.com | |
| ssh_private_key: ${{ secrets.AUR_SSH_KEY }} | |
| ssh_keyscan_types: rsa,ecdsa,ed25519 | |
| commit_message: | | |
| Update to ${{ steps.pkgver.outputs.version }} | |
| Automated build and publish via GitHub Actions. | |
| Co-Authored-By: github-actions[bot] <github-actions[bot]@users.noreply.github.com> | |
| assets: ${{ steps.assets.outputs.list }} |