2024-05-06 07:24:53 +00:00
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 : |
2024-05-30 00:43:45 +00:00
export NCPUS=$(( $(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || getconf _NPROCESSORS_ONLN 2>/dev/null) -1 ))
2024-05-06 07:24:53 +00:00
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
2024-05-06 20:00:27 +00:00
uses : geekyeggo/delete-artifact@v5
2024-05-06 07:24:53 +00:00
with :
name : |
firmware-${{ inputs.keymap }}-*
targets-${{ inputs.keymap }}
- name : 'CI Discord Notification'
2024-07-12 00:19:33 +00:00
if : always() && !cancelled()
2024-05-06 07:24:53 +00:00
working-directory : util/ci/
env :
DISCORD_WEBHOOK : ${{ secrets.CI_DISCORD_WEBHOOK }}
run : |
python3 -m pip install -r requirements.txt
2024-07-12 00:19:33 +00:00
python3 ./discord-results.py --branch ${{ inputs.branch || github.ref_name }} --sha $(git rev-parse HEAD) --keymap ${{ inputs.keymap }} --url ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}