diff options
Diffstat (limited to '.github/workflows/ci_build_major_branch_keymap.yml')
-rw-r--r-- | .github/workflows/ci_build_major_branch_keymap.yml | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/.github/workflows/ci_build_major_branch_keymap.yml b/.github/workflows/ci_build_major_branch_keymap.yml new file mode 100644 index 0000000000..f722f9f106 --- /dev/null +++ b/.github/workflows/ci_build_major_branch_keymap.yml @@ -0,0 +1,181 @@ +name: CI Build Major Branch Keymap + +permissions: + contents: read + actions: write + +on: + workflow_call: + inputs: + branch: + type: string + required: true + keymap: + type: string + required: true + slice_length: + type: string + required: true + +jobs: + generate_targets: + name: "Generate targets (${{ inputs.keymap }})" + runs-on: ubuntu-latest + container: ghcr.io/qmk/qmk_cli + + outputs: + targets: ${{ steps.generate_targets.outputs.targets }} + + steps: + - name: Install prerequisites + run: | + apt-get update + apt-get install -y jq + + - name: Disable safe.directory check + run: | + git config --global --add safe.directory '*' + + - name: Checkout QMK Firmware + uses: actions/checkout@v4 + + - name: Generate build targets + id: generate_targets + run: | + { # Intentionally use `shuf` here so that we share manufacturers across all build groups -- some have a lot of ARM-based boards which inherently take longer + counter=0 + echo -n '{' + qmk find -km ${{ inputs.keymap }} 2>/dev/null | sort | uniq | shuf | xargs -L${{ inputs.slice_length }} | while IFS=$'\n' read target ; do + if [ $counter -gt 0 ]; then + echo -n ',' + fi + counter=$((counter+1)) + printf "\"group %02d\":{" $counter + echo -n '"targets":"' + echo $target | tr ' ' '\n' | sort | uniq | xargs echo -n + echo -n '"}' + done + echo -n '}' + } | sed -e 's@\n@@g' > targets.json + + # Output the target keys as a variable + echo "targets=$(jq -c 'keys' targets.json)" >> $GITHUB_OUTPUT + + - name: Upload targets json + uses: actions/upload-artifact@v4 + with: + name: targets-${{ inputs.keymap }} + path: targets.json + + build_targets: + name: "Compile ${{ matrix.target }} (${{ inputs.keymap }})" + needs: generate_targets + runs-on: ubuntu-latest + container: ghcr.io/qmk/qmk_cli + continue-on-error: true + + strategy: + matrix: + target: ${{ fromJson(needs.generate_targets.outputs.targets) }} + + steps: + - name: Install prerequisites + run: | + apt-get update + apt-get install -y jq + + - name: Disable safe.directory check + run: | + git config --global --add safe.directory '*' + + - name: Checkout QMK Firmware + uses: actions/checkout@v4 + + - name: Get target definitions + uses: actions/download-artifact@v4 + with: + name: targets-${{ inputs.keymap }} + path: . + + - name: Deploy submodules + run: | + qmk git-submodule -f + + - name: Dump targets + run: | + jq -r '.["${{ matrix.target }}"].targets' targets.json | tr ' ' '\n' | sort + + - name: Build targets + continue-on-error: true + run: | + export NCPUS=$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || getconf _NPROCESSORS_ONLN 2>/dev/null) + qmk mass-compile -t -j $NCPUS -e DUMP_CI_METADATA=yes $(jq -r '.["${{ matrix.target }}"].targets' targets.json) || touch .failed + + - name: Upload binaries + uses: actions/upload-artifact@v4 + with: + name: firmware-${{ inputs.keymap }}-${{ matrix.target }} + if-no-files-found: ignore + path: | + *.bin + *.hex + *.uf2 + .build/failed.* + .failed + + - name: Fail build if any group failed + run: | + # Exit with failure if the compilation stage failed + [ ! -f .failed ] || exit 1 + + repack_firmware: + if: always() + name: "Repack artifacts" + needs: build_targets + runs-on: ubuntu-latest + + steps: + - name: Checkout QMK Firmware + uses: actions/checkout@v4 + + - name: Download firmwares + uses: actions/download-artifact@v4 + with: + pattern: firmware-${{ inputs.keymap }}-* + path: . + merge-multiple: true + + - name: Upload all firmwares + uses: actions/upload-artifact@v4 + with: + name: firmware-${{ inputs.keymap }} + if-no-files-found: ignore + path: | + *.bin + *.hex + *.uf2 + .build/failed.* + .failed + + - name: Generate output logs + run: | + # Generate the step summary markdown + ./util/ci/generate_failure_markdown.sh > $GITHUB_STEP_SUMMARY || true + # Truncate to a maximum of 1MB to deal with GitHub workflow limit + truncate --size='<960K' $GITHUB_STEP_SUMMARY || true + + - name: Delete temporary build artifacts + uses: geekyeggo/delete-artifact@v4 + with: + name: | + firmware-${{ inputs.keymap }}-* + targets-${{ inputs.keymap }} + + - name: 'CI Discord Notification' + if: always() + working-directory: util/ci/ + env: + DISCORD_WEBHOOK: ${{ secrets.CI_DISCORD_WEBHOOK }} + run: | + python3 -m pip install -r requirements.txt + python3 ./discord-results.py --branch ${{ inputs.branch || github.ref_name }} --keymap ${{ inputs.keymap }} --url ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} |