name: Build RPMs on: push: paths: - "**.spec" - "build-order.txt" - "ci/**" - ".forgejo/workflows/**" workflow_dispatch: 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 [ "${{ github.event_name }}" = "workflow_dispatch" ]; then echo "Mode: manual trigger, full rebuild" python3 ci/build-plan.py > /tmp/build-plan.json elif [ "${{ github.event.before }}" = "0000000000000000000000000000000000000000" ]; then echo "Mode: new branch, full rebuild" python3 ci/build-plan.py > /tmp/build-plan.json else echo "Mode: incremental (diff ${{ github.event.before }}..${{ github.sha }})" python3 ci/build-plan.py "${{ github.event.before }}" "${{ github.sha }}" > /tmp/build-plan.json fi cat /tmp/build-plan.json | python3 -m json.tool TOTAL=$(python3 -c "import json; print(json.load(open('/tmp/build-plan.json'))['total'])") HAS=$(python3 -c "import json; print('true' if json.load(open('/tmp/build-plan.json'))['total'] > 0 else 'false')") # Pass the plan to the build job via base64 to avoid shell escaping issues PLAN_B64=$(base64 -w0 /tmp/build-plan.json) echo "build-plan-b64=$PLAN_B64" >> "$GITHUB_OUTPUT" echo "has-packages=$HAS" >> "$GITHUB_OUTPUT" echo "total=$TOTAL" >> "$GITHUB_OUTPUT" build: needs: plan if: needs.plan.outputs.has-packages == 'true' runs-on: almalinux-10 steps: - name: Checkout uses: actions/checkout@v4 - name: Write build plan run: | echo '${{ needs.plan.outputs.build-plan-b64 }}' | base64 -d > /tmp/build-plan.json python3 -c "import json; d=json.load(open('/tmp/build-plan.json')); print(f'Building {d[\"total\"]} packages')" - 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/*