diff --git a/.forgejo/workflows/auto-update.yaml b/.forgejo/workflows/auto-update.yaml index 8d0d95e..96506bd 100644 --- a/.forgejo/workflows/auto-update.yaml +++ b/.forgejo/workflows/auto-update.yaml @@ -107,21 +107,9 @@ jobs: build: needs: check-updates - if: needs.check-updates.outputs.changed == 'true' && needs.check-updates.outputs.hosts != '[]' && needs.check-updates.outputs.hosts != '' + if: needs.check-updates.outputs.changed == 'true' runs-on: nix - strategy: - fail-fast: false - matrix: - host: ${{ fromJson(needs.check-updates.outputs.hosts || '[]') }} steps: - - name: Debug - show received values - run: | - echo "=== DEBUG: Values received from check-updates job ===" - echo "needs.check-updates.outputs.changed = '${{ needs.check-updates.outputs.changed }}'" - echo "needs.check-updates.outputs.hosts = '${{ needs.check-updates.outputs.hosts }}'" - echo "matrix.host = '${{ matrix.host }}'" - echo "=== END DEBUG ===" - - name: Checkout repository uses: actions/checkout@v4 @@ -130,33 +118,81 @@ jobs: with: name: flake-lock - - name: Build ${{ matrix.host }} + - name: Download hosts list + uses: forgejo/download-artifact@v4 + with: + name: hosts-list + + - name: Build all hosts id: build run: | - HOST="${{ matrix.host }}" - echo "DEBUG: matrix.host='$HOST'" - echo "DEBUG: raw matrix.host='${{ matrix.host }}'" - if [ -z "$HOST" ]; then - echo "Error: Host name is empty" - echo "This usually means the 'hosts' output from check-updates job was not received properly" + set -euo pipefail + + if [ ! -f hosts.json ]; then + echo "Error: hosts.json not found" + exit 1 + fi + + HOSTS=$(cat hosts.json) + echo "Building hosts: $HOSTS" + + FAILED_HOSTS="" + SUCCESS_HOSTS="" + + for HOST in $(echo "$HOSTS" | jq -r '.[]'); do + echo "" + echo "==========================================" + echo "Building: $HOST" + echo "==========================================" + + if nix build ".#nixosConfigurations.${HOST}.config.system.build.toplevel" --no-link 2>&1 | tee "build-${HOST}.txt"; then + echo "✓ Build succeeded: $HOST" + SUCCESS_HOSTS="$SUCCESS_HOSTS $HOST" + else + echo "✗ Build failed: $HOST" + FAILED_HOSTS="$FAILED_HOSTS $HOST" + fi + done + + echo "" + echo "==========================================" + echo "Build Summary" + echo "==========================================" + echo "Succeeded:$SUCCESS_HOSTS" + echo "Failed:$FAILED_HOSTS" + + # Save results for report job + echo "$FAILED_HOSTS" > failed-hosts.txt + echo "$SUCCESS_HOSTS" > success-hosts.txt + + if [ -n "$FAILED_HOSTS" ]; then + echo "Some builds failed" exit 1 fi - echo "Building host: $HOST" - nix build ".#nixosConfigurations.${HOST}.config.system.build.toplevel" --no-link 2>&1 | tee build-output.txt continue-on-error: true - - name: Upload build log on failure - if: failure() || steps.build.outcome == 'failure' + - name: Upload build logs + if: always() uses: forgejo/upload-artifact@v4 with: - name: build-failure-${{ matrix.host }} - path: build-output.txt + name: build-logs + path: build-*.txt retention-days: 7 + - name: Upload build results + if: always() + uses: forgejo/upload-artifact@v4 + with: + name: build-results + path: | + failed-hosts.txt + success-hosts.txt + retention-days: 1 + - name: Check build result run: | if [ "${{ steps.build.outcome }}" == "failure" ]; then - echo "Build failed for ${{ matrix.host }}" + echo "Some builds failed - check build-logs artifact" exit 1 fi @@ -180,32 +216,48 @@ jobs: with: name: flake-lock - - name: Download failure artifacts + - name: Download build results + uses: forgejo/download-artifact@v4 + with: + name: build-results + continue-on-error: true + + - name: Download hosts list + uses: forgejo/download-artifact@v4 + with: + name: hosts-list + + - name: Download build logs if: needs.build.result == 'failure' uses: forgejo/download-artifact@v4 with: - pattern: build-failure-* - path: failures - merge-multiple: false + name: build-logs + path: logs continue-on-error: true - name: Create branch and commit id: branch run: | + set_output() { + echo "::set-output name=$1::$2" + if [ -n "${GITHUB_OUTPUT:-}" ]; then + echo "$1=$2" >> "$GITHUB_OUTPUT" + fi + } BRANCH_NAME="auto-update/$(date +%Y-%m-%d)" git checkout -b "$BRANCH_NAME" git add flake.lock git commit -m "chore: update flake inputs $(date +%Y-%m-%d)" git push origin "$BRANCH_NAME" - echo "branch_name=$BRANCH_NAME" >> $GITHUB_OUTPUT + set_output branch_name "$BRANCH_NAME" - name: Create Pull Request if: needs.build.result == 'success' env: FORGEJO_TOKEN: ${{ secrets.FORGEJO_TOKEN }} run: | - HOSTS='${{ needs.check-updates.outputs.hosts }}' - HOST_LIST=$(echo "$HOSTS" | jq -r '.[] | "- " + .' | tr '\n' '\n') + HOSTS=$(cat hosts.json) + HOST_LIST=$(echo "$HOSTS" | jq -r '.[] | "- " + .') curl -X POST \ -H "Authorization: token $FORGEJO_TOKEN" \ @@ -223,26 +275,22 @@ jobs: env: FORGEJO_TOKEN: ${{ secrets.FORGEJO_TOKEN }} run: | - # Collect failed hosts from artifact directories FAILED_HOSTS="" FAILURE_DETAILS="" - if [ -d "failures" ]; then - for dir in failures/build-failure-*; do - if [ -d "$dir" ]; then - HOST=$(basename "$dir" | sed 's/build-failure-//') - FAILED_HOSTS="$FAILED_HOSTS\n- $HOST" - - if [ -f "$dir/build-output.txt" ]; then - # Get last 50 lines of build output - LOG_TAIL=$(tail -50 "$dir/build-output.txt" | sed 's/"/\\"/g' | sed ':a;N;$!ba;s/\n/\\n/g') - FAILURE_DETAILS="$FAILURE_DETAILS\n\n
\n$HOST build log (last 50 lines)\n\n\`\`\`\n$LOG_TAIL\n\`\`\`\n
" - fi + # Read failed hosts from build results + if [ -f "failed-hosts.txt" ]; then + for HOST in $(cat failed-hosts.txt); do + FAILED_HOSTS="$FAILED_HOSTS\n- $HOST" + + # Get build log if available + if [ -f "logs/build-${HOST}.txt" ]; then + LOG_TAIL=$(tail -50 "logs/build-${HOST}.txt" | sed 's/"/\\"/g' | sed ':a;N;$!ba;s/\n/\\n/g') + FAILURE_DETAILS="$FAILURE_DETAILS\n\n
\n$HOST build log (last 50 lines)\n\n\`\`\`\n$LOG_TAIL\n\`\`\`\n
" fi done fi - # If no failure artifacts found, list from matrix if [ -z "$FAILED_HOSTS" ]; then FAILED_HOSTS="\n- (Unable to determine failed hosts - check workflow logs)" fi