From 94521d0b1b1d0bc2302d11eb1b69274b4fd567ea Mon Sep 17 00:00:00 2001
From: Marty Oehme <contact@martyoeh.me>
Date: Tue, 4 Mar 2025 09:54:02 +0100
Subject: [PATCH] Add build workflow

---
 .github/workflows/build.yaml | 159 +++++++++++++++++++++++++++++++++++
 1 file changed, 159 insertions(+)
 create mode 100644 .github/workflows/build.yaml

diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
new file mode 100644
index 0000000..a2cb53a
--- /dev/null
+++ b/.github/workflows/build.yaml
@@ -0,0 +1,159 @@
+name: build
+
+on:
+  # TODO: Enable once we have conditional build logic built
+  # pull_request:
+  #   paths:
+  #     - 'srcpkgs/**'
+  push:
+    paths:
+      - 'srcpkgs/**'
+      - '.github/**' # for easier debugging
+
+concurrency:
+  group: ${{ github.workflow }}-${{ github.ref }}
+  cancel-in-progress: true
+
+jobs:
+  changedpkgs:
+    name: Check package changes
+    runs-on: ubuntu-latest
+    if: "!contains(github.event.pull_request.title, '[ci skip]') && !contains(github.event.pull_request.body, '[ci skip]')"
+
+    outputs:
+      changed: ${{ steps.grabchanged.outputs.changed }}
+
+    steps:
+      - name: checkout local templates
+        uses: actions/checkout@v4
+        with:
+          ref: ${{ github.head_ref }}
+          fetch-depth: 0
+
+      - id: grabchanged
+        run: |
+          # write changes to detected_templates
+          .github/changed_templates.sh
+          # move them to step output
+          echo changed="$(cat detected_templates)" >> $GITHUB_OUTPUT
+      - run: |
+          echo "${{ steps.grabchanged.outputs.changed }}"
+
+  build:
+    name: Build packages
+    runs-on: ubuntu-latest
+    needs: [ changedpkgs ]
+    if: "needs.changedpkgs.outputs.changed != '' && !contains(github.event.pull_request.title, '[ci skip]') && !contains(github.event.pull_request.body, '[ci skip]')"
+
+    strategy:
+      fail-fast: false
+      matrix:
+        config:
+          - { arch: x86_64,       host: x86_64,      libc: glibc, platform: linux/amd64, test: 1 }
+          # - { arch: i686,         host: i686,        libc: glibc, platform: linux/386,   test: 1 }
+          # - { arch: aarch64,      host: x86_64,      libc: glibc, platform: linux/amd64, test: 0 }
+          # - { arch: armv7l,       host: x86_64,      libc: glibc, platform: linux/amd64, test: 0 }
+          # - { arch: x86_64-musl,  host: x86_64-musl, libc: musl,  platform: linux/amd64, test: 1 }
+          # - { arch: armv6l-musl,  host: x86_64-musl, libc: musl,  platform: linux/amd64, test: 0 }
+          # - { arch: aarch64-musl, host: x86_64-musl, libc: musl,  platform: linux/amd64, test: 0 }
+
+    container:
+      image: ghcr.io/void-linux/void-${{ matrix.config.libc }}-full:20250227R1
+      options: --platform ${{ matrix.config.platform }} --privileged
+      volumes:
+        - /dev:/dev
+      env:
+        ARCH: '${{ matrix.config.arch }}'
+        BOOTSTRAP: '${{ matrix.config.host }}'
+        TEST: '${{ matrix.config.test }}'
+
+    steps:
+      - name: Prepare container
+        run: |
+          # switch to repo-ci mirror
+          mkdir -p /etc/xbps.d && cp /usr/share/xbps.d/*-repository-*.conf /etc/xbps.d/
+          sed -i 's|repo-default|repo-ci|g' /etc/xbps.d/*-repository-*.conf
+          # install dependencies
+          xbps-install -Syu xbps && xbps-install -yu && xbps-install -y sudo bash curl git
+          # create non-root user
+          useradd -G xbuilder -M builder
+
+      - name: checkout upstream templates
+        uses: actions/checkout@v4
+        with:
+          repository: void-linux/void-packages
+          ref: master
+          fetch-depth: 1
+
+      - name: checkout local templates
+        uses: actions/checkout@v4
+        with:
+          ref: ${{ github.head_ref }}
+          path: added-packages
+
+      - name: copy
+        run: cp -rv added-packages/srcpkgs/* srcpkgs
+
+      - name: Prepare masterdir
+        run: |
+          chown -R builder:builder . &&
+          sudo -Eu builder common/travis/set_mirror.sh &&
+          sudo -Eu builder common/travis/prepare.sh &&
+          common/travis/fetch-xtools.sh
+
+      - name: Find changed templates
+        env:
+          CHANGED: ${{ needs.changedpkgs.outputs.changed }}
+        run: sudo -Eu builder echo "$CHANGED" | sed 's/ /\n/g' > /tmp/templates
+
+      - name: Build and check packages
+        run: sudo -Eu builder common/travis/build.sh "$BOOTSTRAP" "$ARCH" "$TEST"
+
+      - name: Show files
+        run: sudo -Eu builder common/travis/show_files.sh "$BOOTSTRAP" "$ARCH"
+
+      # - name: Compare to previous
+      #   run: sudo -Eu builder common/travis/xpkgdiff.sh "$BOOTSTRAP" "$ARCH"
+
+      # - name: Check file conflicts
+      #   if: matrix.config.arch == 'x86_64' # the arch indexed in xlocate
+      #   run: |
+      #     if [ -s /tmp/templates ]; then
+      #         export XDG_CACHE_HOME="$PWD/.cache"
+      #         sudo -Eu builder xlocate -S &&
+      #         sudo -Eu builder common/scripts/lint-conflicts
+      #     fi
+
+      # - name: Verify repository state
+      #   run: |
+      #     mkdir -p /check-install &&
+      #     chown builder:builder /check-install &&
+      #     sudo -Eu builder common/travis/check-install.sh "$BOOTSTRAP" "$ARCH"
+
+      - name: sign
+        working-directory: hostdir/binpkgs/
+        run: |
+          xbps-rindex -r $PWD
+
+          echo "${{ secrets.PRIV_KEY }}" > $HOME/privkey
+          xbps-rindex -s --signedby "${{ secrets.SIGNER }}" --privkey $HOME/privkey $PWD
+          xbps-rindex -S --privkey $HOME/privkey $PWD/*.xbps
+          rm $HOME/privkey
+
+          xbps-rindex -c $PWD
+
+      - name: checksum
+        working-directory: hostdir/binpkgs/
+        run: |
+          for pkg in *.xbps; do sha256sum "$pkg" | tee "$pkg".sha256sum; done
+          for pkg in *.xbps; do sha512sum "$pkg" | tee "$pkg".sha512sum; done
+
+      - name: publish to pages
+        uses: peaceiris/actions-gh-pages@v4
+        # If you're changing the branch from main,
+        # also change the `main` in `refs/heads/main`
+        # below accordingly.
+        if: github.ref == 'refs/heads/main'
+        with:
+          github_token: ${{ secrets.GITHUB_TOKEN }}
+          publish_dir: hostdir/binpkgs