From 1dc84af095873a775e8378623f86feccb59aaee9 Mon Sep 17 00:00:00 2001 From: Richard Alpe Date: Mon, 26 May 2025 11:23:25 +0200 Subject: [PATCH] .github: use workflow calls to build and test Redesign how GH actions are triggered. This new design uses a self-trigger to start jobs which are only started via workflow_calls. The main benefit of this is to be able to start workflows from various Infix Spins without needing to duplicate the workflow files in them. Upcoming patches are intended to parameterize to allow Spins to pass different architectures, brand names and such. Signed-off-by: Richard Alpe --- .github/workflows/build.yml | 144 +++++----------------------------- .github/workflows/publish.yml | 43 ++++++++++ .github/workflows/test.yml | 78 ++++++++++++++++++ .github/workflows/trigger.yml | 32 ++++++++ 4 files changed, 171 insertions(+), 126 deletions(-) create mode 100644 .github/workflows/publish.yml create mode 100644 .github/workflows/test.yml create mode 100644 .github/workflows/trigger.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8ca72ff1..ac47d77e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,11 +1,6 @@ -name: Bob the Builder +name: Build Infix on: - pull_request: - types: [opened, synchronize, reopened, labeled] - push: - branches: - - main workflow_dispatch: inputs: minimal: @@ -18,13 +13,17 @@ on: required: false default: true type: boolean + + workflow_call: + inputs: + target: + required: true + type: string jobs: build: - name: Build Infix ${{ matrix.target }} + name: Build Infix ${{ inputs.target }} runs-on: [ self-hosted, latest ] strategy: - matrix: - target: [aarch64, x86_64] fail-fast: false outputs: build_id: ${{ steps.vars.outputs.INFIX_BUILD_ID }} @@ -70,7 +69,7 @@ jobs: flavor="" fi fi - target=${{ matrix.target }} + target=${{ inputs.target }} echo "dir=infix-$target" >> $GITHUB_OUTPUT echo "tgz=infix-$target.tar.gz" >> $GITHUB_OUTPUT echo "flv=$flavor" >> $GITHUB_OUTPUT @@ -88,16 +87,16 @@ jobs: uses: actions/cache@v4 with: path: .ccache/ - key: ccache-${{ matrix.target }}-${{ hashFiles('.git/modules/buildroot/HEAD', 'package/*/*.hash') }} + key: ccache-${{ inputs.target }}-${{ hashFiles('.git/modules/buildroot/HEAD', 'package/*/*.hash') }} restore-keys: | - ccache-${{ matrix.target }}- + ccache-${{ inputs.target }}- ccache- - - name: Configure ${{ matrix.target }}${{ steps.vars.outputs.flv }} + - name: Configure ${{ inputs.target }}${{ steps.vars.outputs.flv }} run: | - make ${{ matrix.target }}${{ steps.vars.outputs.flv }}_defconfig + make ${{ inputs.target }}${{ steps.vars.outputs.flv }}_defconfig - - name: Unit Test ${{ matrix.target }} + - name: Unit Test ${{ inputs.target }} run: | make test-unit @@ -115,9 +114,9 @@ jobs: fi echo "MAKE=$MAKE" >> $GITHUB_OUTPUT - - name: Build ${{ matrix.target }}${{ steps.vars.outputs.flv }} + - name: Build ${{ inputs.target }}${{ steps.vars.outputs.flv }} run: | - echo "Building ${{ matrix.target }}${{ steps.vars.outputs.flv }}_defconfig ..." + echo "Building ${{ inputs.target }}${{ steps.vars.outputs.flv }}_defconfig ..." eval "${{ steps.parallel.outputs.MAKE }}" - name: Check SBOM from Build @@ -139,7 +138,7 @@ jobs: printf "Size of output/images/: " ls -l output/images/ - - name: Prepare ${{ matrix.target }} Artifact + - name: Prepare ${{ inputs.target }} Artifact run: | cd output/ mv images ${{ steps.vars.outputs.dir }} @@ -149,111 +148,4 @@ jobs: - uses: actions/upload-artifact@v4 with: path: output/${{ steps.vars.outputs.tgz }} - name: artifact-${{ matrix.target }} - - test: - name: Regression Test of Infix x86_64 - needs: build - runs-on: [ self-hosted, regression ] - steps: - - uses: actions/checkout@v4 - with: - clean: true - submodules: recursive - - - name: Set Build Variables - id: vars - run: | - if [ -n "${{ needs.build.outputs.build_id }}" ]; then - echo "INFIX_BUILD_ID=${{ needs.build.outputs.build_id }}" \ - >>$GITHUB_ENV - fi - - if [ "$GITHUB_REF_NAME" != "main" ]; then - flavor="_minimal" - else - flavor="" - fi - echo "flv=$flavor" >> $GITHUB_OUTPUT - - - name: Configure x86_64${{ steps.vars.outputs.flv }} - run: | - make x86_64${{ steps.vars.outputs.flv }}_defconfig - - - uses: actions/download-artifact@v4 - with: - pattern: "artifact-*" - merge-multiple: true - - - name: Restore x86-64${{ steps.vars.outputs.flv }} output/ - run: | - ls -l - mkdir -p output - mv infix-x86_64.tar.gz output/ - cd output/ - tar xf infix-x86_64.tar.gz - ln -s infix-x86_64 images - - - name: Regression Test x86_64${{ steps.vars.outputs.flv }} - run: | - make test - - - name: Publish Test Result for x86_64${{ steps.vars.outputs.flv }} - # Ensure this runs even if Regression Test fails - if: always() - run: cat test/.log/last/result-gh.md >> $GITHUB_STEP_SUMMARY - - - name: Generate Test Report for x86_64${{ steps.vars.outputs.flv }} - # Ensure this runs even if Regression Test fails - if: always() - run: | - asciidoctor-pdf \ - --theme test/9pm/report/theme.yml \ - -a pdf-fontsdir=test/9pm/report/fonts \ - test/.log/last/report.adoc \ - -o test/.log/last/report.pdf - - - name: Upload Test Report as Artifact - uses: actions/upload-artifact@v4 - with: - name: test-report - path: test/.log/last/report.pdf - - release: - if: ${{github.repository_owner == 'kernelkit' && github.ref_name == 'main'}} - name: Upload Latest Build - needs: test - runs-on: ubuntu-latest - permissions: - contents: write - steps: - - uses: actions/download-artifact@v4 - with: - pattern: "artifact-*" - merge-multiple: true - - - name: Create checksums ... - run: | - for file in *.tar.gz; do - sha256sum $file > $file.sha256 - done - - - uses: ncipollo/release-action@v1 - with: - allowUpdates: true - omitName: true - omitBody: true - omitBodyDuringUpdate: true - prerelease: true - tag: "latest" - token: ${{ secrets.GITHUB_TOKEN }} - artifacts: "*.tar.gz*" - - - name: Summary - run: | - cat <> $GITHUB_STEP_SUMMARY - # Latest Build Complete! :rocket: - - For the public download links of these build artifacts, please see: - - EOF + name: artifact-${{ inputs.target }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 00000000..353fef69 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,43 @@ +name: Publish latest Infix + +on: + workflow_dispatch: + workflow_call: + +jobs: + publish: + name: Upload Latest Build + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/download-artifact@v4 + with: + pattern: "artifact-*" + merge-multiple: true + + - name: Create checksums ... + run: | + for file in *.tar.gz; do + sha256sum $file > $file.sha256 + done + + - uses: ncipollo/release-action@v1 + with: + allowUpdates: true + omitName: true + omitBody: true + omitBodyDuringUpdate: true + prerelease: true + tag: "latest" + token: ${{ secrets.GITHUB_TOKEN }} + artifacts: "*.tar.gz*" + + - name: Summary + run: | + cat <> $GITHUB_STEP_SUMMARY + # Latest Build Complete! :rocket: + + For the public download links of these build artifacts, please see: + + EOF diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..e0b942cd --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,78 @@ +name: Test Infix + +on: + workflow_dispatch: + workflow_call: + inputs: + target: + required: true + type: string + +jobs: + test: + name: Regression Test of Infix x86_64 + runs-on: [ self-hosted, regression ] + steps: + - uses: actions/checkout@v4 + with: + clean: true + submodules: recursive + + - name: Set Build Variables + id: vars + run: | + if [ -n "${{ needs.build.outputs.build_id }}" ]; then + echo "INFIX_BUILD_ID=${{ needs.build.outputs.build_id }}" \ + >>$GITHUB_ENV + fi + + if [ "$GITHUB_REF_NAME" != "main" ]; then + flavor="_minimal" + else + flavor="" + fi + echo "flv=$flavor" >> $GITHUB_OUTPUT + + - name: Configure x86_64${{ steps.vars.outputs.flv }} + run: | + make x86_64${{ steps.vars.outputs.flv }}_defconfig + + - uses: actions/download-artifact@v4 + with: + pattern: "artifact-*" + merge-multiple: true + + - name: Restore x86-64${{ steps.vars.outputs.flv }} output/ + run: | + ls -l + mkdir -p output + mv infix-x86_64.tar.gz output/ + cd output/ + tar xf infix-x86_64.tar.gz + ln -s infix-x86_64 images + + - name: Regression Test x86_64${{ steps.vars.outputs.flv }} + run: | + make test + + - name: Publish Test Result for x86_64${{ steps.vars.outputs.flv }} + # Ensure this runs even if Regression Test fails + if: always() + run: cat test/.log/last/result-gh.md >> $GITHUB_STEP_SUMMARY + + - name: Generate Test Report for x86_64${{ steps.vars.outputs.flv }} + # Ensure this runs even if Regression Test fails + if: always() + run: | + asciidoctor-pdf \ + --theme test/9pm/report/theme.yml \ + -a pdf-fontsdir=test/9pm/report/fonts \ + test/.log/last/report.adoc \ + -o test/.log/last/report.pdf + + - name: Upload Test Report as Artifact + uses: actions/upload-artifact@v4 + with: + name: test-report + path: test/.log/last/report.pdf + diff --git a/.github/workflows/trigger.yml b/.github/workflows/trigger.yml new file mode 100644 index 00000000..ff602bfe --- /dev/null +++ b/.github/workflows/trigger.yml @@ -0,0 +1,32 @@ +name: Self Trigger + +on: + pull_request: + types: [opened, synchronize, reopened, labeled] + push: + branches: + - main + - ci-workflow-redesign + workflow_dispatch: + +jobs: + build-x86_64: + uses: ./.github/workflows/build.yml + with: + target: x86_64 + + build-aarch64: + uses: ./.github/workflows/build.yml + with: + target: aarch64 + + test-run-x86_64: + needs: build-x86_64 + uses: ./.github/workflows/test.yml + with: + target: x86_64 + + test-publish-x86_64: + needs: test-run-x86_64 + uses: ./.github/workflows/publish.yml +