SonicDE-rpmspecs/.forgejo/workflows/build-rpms.yml
test d27cb7278a
Some checks failed
Build RPMs / plan (push) Failing after 27s
Build RPMs / build (push) Has been skipped
Add incremental Forgejo Actions build workflow
2026-08-25 11:45:05 +00:00

145 lines
4.5 KiB
YAML

name: Build RPMs
on:
push:
paths:
- "**.spec"
- "build-order.txt"
- "ci/**"
- ".forgejo/workflows/**"
workflow_dispatch:
inputs:
full_rebuild:
description: "Force full rebuild of all packages"
required: false
default: "false"
jobs:
plan:
runs-on: almalinux-10
outputs:
has-packages: ${{ steps.plan.outputs.has-packages }}
total: ${{ steps.plan.outputs.total }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install rpmspec
run: dnf install -y rpm-build
- name: Compute build plan
id: plan
run: |
if [ "${{ inputs.full_rebuild }}" = "true" ] || [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
PLAN=$(python3 ci/build-plan.py)
elif [ "${{ github.event.before }}" = "0000000000000000000000000000000000000000" ]; then
PLAN=$(python3 ci/build-plan.py)
else
PLAN=$(python3 ci/build-plan.py "${{ github.event.before }}" "${{ github.sha }}")
fi
echo "$PLAN" | python3 -m json.tool
TOTAL=$(echo "$PLAN" | python3 -c "import json,sys; print(json.load(sys.stdin)['total'])")
HAS=$(echo "$PLAN" | python3 -c "import json,sys; print('true' if json.load(sys.stdin)['total'] > 0 else 'false')")
echo "$PLAN" > /tmp/build-plan.json
echo "has-packages=$HAS" >> "$GITHUB_OUTPUT"
echo "total=$TOTAL" >> "$GITHUB_OUTPUT"
- name: Upload build plan
uses: actions/upload-artifact@v4
with:
name: build-plan
path: /tmp/build-plan.json
build:
needs: plan
if: needs.plan.outputs.has-packages == 'true'
runs-on: almalinux-10
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Download build plan
uses: actions/download-artifact@v4
with:
name: build-plan
path: /tmp
- name: Install build tools
run: |
dnf install -y \
rpm-build \
rpmdevtools \
mock \
curl
- name: Add runner user to mock group
run: usermod -aG mock $(whoami) || true
- name: Setup RPM build tree
run: rpmdev-setuptree
- name: Configure mock chroot
run: |
cat > /etc/mock/sonicde.cfg <<'MOCKEOF'
include('/etc/mock/alma+epel-10-x86_64.cfg')
config_opts['root'] = 'sonicde'
config_opts['yum.conf'] += """
[sonicde-rpm]
name=SonicDE RPM
baseurl=${{ github.server_url }}/api/packages/${{ github.repository_owner }}/rpm
enabled=1
gpgcheck=0
[xlibre-xserver]
name=Copr xlibre-xserver
baseurl=https://download.copr.fedorainfracloud.org/results/@xlibre/xlibre-xserver/rhel+epel-10-$basearch/
type=rpm-md
skip_if_unavailable=True
gpgcheck=1
gpgkey=https://download.copr.fedorainfracloud.org/results/@xlibre/xlibre-xserver/pubkey.gpg
repo_gpgcheck=0
enabled=1
"""
MOCKEOF
- name: Initialize mock chroot
run: |
mock --root sonicde --scrub=chroot || true
mock --root sonicde --init
mock --root sonicde --chroot 'groupadd -g 135 mock 2>/dev/null || true; useradd -u 135 -g 135 -d /builddir -s /bin/bash mockbuild 2>/dev/null || true'
- name: Build packages tier by tier
run: |
echo "Building ${{ needs.plan.outputs.total }} packages..."
bash ci/build-tiered.sh /tmp/build-plan.json
- name: Upload RPMs to Forgejo Package Registry
if: always()
run: |
FORGEJO_URL="${{ github.server_url }}"
OWNER="${{ github.repository_owner }}"
TOKEN="${{ secrets.PACKAGE_TOKEN }}"
if [ -z "$TOKEN" ]; then
echo "PACKAGE_TOKEN secret not set, skipping upload"
exit 0
fi
find ~/mock-results -name "*.rpm" ! -name "*.src.rpm" | while read rpm; do
FILENAME=$(basename "$rpm")
echo "Uploading $FILENAME ..."
curl --fail-with-body \
--user "${OWNER}:${TOKEN}" \
--upload-file "$rpm" \
"${FORGEJO_URL}/api/packages/${OWNER}/rpm/upload" || echo " upload failed for $FILENAME"
done
- name: Clean up
if: always()
run: |
rm -rf ~/mock-results
rm -rf ~/rpmbuild/SRPMS/*