CI #8
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: CI | |
on: | |
pull_request: | |
push: | |
branches: | |
- main | |
- master | |
workflow_dispatch: | |
inputs: | |
source: | |
description: 'Branch (user[/repo]:branch)' | |
type: string | |
required: false | |
os: | |
description: 'Machine type' | |
type: string | |
required: false | |
schedule: | |
- cron: '15 3 * * *' | |
jobs: | |
# The `setup` job determines the strategy for the real build job. | |
setup: | |
name: Setup | |
runs-on: ubuntu-latest | |
outputs: | |
strategy: ${{ steps.strategy.outputs.result }} | |
steps: | |
- id: strategy | |
name: Determine build strategy | |
uses: actions/github-script@v6.4.1 | |
with: | |
script: | | |
// Default settings. | |
const defaultSource = [ | |
{ repo: "qmk/qmk_firmware", branch: "master" }, | |
{ repo: "qmk/qmk_firmware", branch: "develop" }, | |
]; | |
const defaultOS = [ | |
"ubuntu-latest", | |
]; | |
// Read workflow inputs. | |
let inputSource = ""; | |
let inputOS = ""; | |
if (context.eventName == "workflow_dispatch") { | |
const payload = context.payload; | |
const inputs = payload && payload.inputs; | |
inputSource = inputs && inputs.source && inputs.source.trim() || ""; | |
inputOS = inputs && inputs.os && inputs.os.trim() || ""; | |
} | |
// Parse the `source` input. | |
let matrixSource = defaultSource; | |
if (inputSource != "") { | |
const sourceParts = inputSource.split(":", 2); | |
if (sourceParts.length == 2 ) { | |
let repoParts = sourceParts[0].split("/", 2); | |
if (repoParts.length == 1) { | |
repoParts.push("qmk_firmware"); | |
} | |
matrixSource = [ | |
{ repo: repoParts.join("/"), branch: sourceParts[1] }, | |
]; | |
} | |
} | |
// Parse the `os` input. | |
let matrixOS = defaultOS; | |
if (inputOS != "") { | |
matrixOS = [ inputOS ]; | |
} | |
// Determine build strategy. | |
const strategy = { | |
"fail-fast": false, | |
"matrix": { | |
"source": matrixSource, | |
"os": matrixOS, | |
}, | |
}; | |
// Print the resulting strategy to the log. | |
core.startGroup("Job strategy:"); | |
core.info(JSON.stringify(strategy, null, 2)); | |
core.endGroup(); | |
// Return the strategy as the step output in the JSON format. | |
return strategy; | |
test: | |
needs: setup | |
strategy: ${{ fromJSON(needs.setup.outputs.strategy) }} | |
defaults: | |
run: | |
shell: bash | |
working-directory: qmk_firmware | |
runs-on: ${{ matrix.os }} | |
steps: | |
- name: Prepare the Guix store before restoring from cache | |
working-directory: . | |
run: | | |
# Make the Guix store writable for the current user | |
sudo mkdir -p /gnu/store /var/guix/db /var/guix/gcroots /var/guix/profiles | |
sudo chown -R ${USER}: /gnu /var/guix | |
sudo chmod -R u+w /gnu /var/guix | |
- name: Restore the Guix store from cache | |
id: restore_cache | |
uses: actions/cache/restore@v3.3.2 | |
with: | |
path: | | |
~/.cache/guix | |
/gnu | |
/var/guix/db/db.sqlite | |
/var/guix/gcroots | |
/var/guix/profiles | |
key: guix-store-${{ github.sha }}-${{ github.run_id }} | |
restore-keys: | | |
guix-store-${{ github.sha }}- | |
guix-store- | |
- name: Fix up permissions for the Guix store | |
working-directory: . | |
run: | | |
# Fix up permissions for the Guix store when restoring from cache | |
sudo chown -R root:root /gnu /var/guix | |
sudo chmod 755 /gnu | |
sudo chmod -R u-w /gnu/store | |
sudo chmod 1775 /gnu/store | |
- name: Install Guix | |
uses: sigprof/guix-install-action@65e5b79e7f00e3f72ea1beb13431e036cc8ca2d2 | |
with: | |
useExistingGuix: ${{ steps.restore_cache.outputs.cache-matched-key != '' }} | |
pullAfterInstall: false | |
- name: Ensure no locale warning | |
id: guix_setup_check | |
working-directory: . | |
run: test -z "$(guix --version 2>&1 >/dev/null)" | |
- name: Fail | |
working-directory: . | |
run: false | |
- name: Checkout the project source | |
uses: actions/checkout@v4.1.1 | |
with: | |
path: guix-qmk | |
- name: Build the Guix shell environment | |
working-directory: guix-qmk | |
run: guix shell -m manifest.scm -- true | |
- name: Checkout the QMK firmware source code | |
uses: actions/checkout@v4.1.1 | |
with: | |
path: qmk_firmware | |
repository: ${{ matrix.source.repo }} | |
ref: ${{ matrix.source.branch }} | |
submodules: recursive | |
- name: Configure the 'upstream' remote | |
run: git remote add upstream https://github.com/qmk/qmk_firmware | |
- name: Configure the udev rules | |
if: ${{ runner.os == 'Linux' }} | |
run: sudo install -o root -g root -m 0644 util/udev/50-qmk.rules /etc/udev/rules.d/ | |
- name: Update submodules | |
run: guix shell -m ../guix-qmk/manifest.scm -- make git-submodule | |
- name: Test 'qmk doctor' | |
run: guix shell -m ../guix-qmk/manifest.scm -- qmk doctor | |
- name: Test 'qmk setup' | |
run: | | |
# Test 'qmk setup' | |
# 'qmk setup' does not return the exit code of 'qmk doctor', | |
# therefore grepping the text output is needed. | |
guix shell -m ../guix-qmk/manifest.scm -- qmk setup 2>&1 | tee qmk-setup.log | |
grep -q "QMK is ready to go" qmk-setup.log | |
- name: Test AVR build using 'make' | |
run: guix shell -m ../guix-qmk/manifest.scm -- make planck/rev5:default | |
- name: Test Arm build using 'make' | |
run: guix shell -m ../guix-qmk/manifest.scm -- make planck/rev6:default | |
- name: Test 'make clean' | |
run: guix shell -m ../guix-qmk/manifest.scm -- make clean | |
- name: Force clean before testing 'qmk compile' | |
run: git clean -fdx | |
- name: Test AVR build using 'qmk compile' | |
run: guix shell -m ../guix-qmk/manifest.scm -- qmk compile -kb planck/rev5 -km default | |
- name: Test Arm build using 'qmk compile' | |
run: guix shell -m ../guix-qmk/manifest.scm -- qmk compile -kb planck/rev6 -km default | |
- name: Test 'qmk clean' | |
run: guix shell -m ../guix-qmk/manifest.scm -- qmk clean | |
- name: Prepare to save the Guix store | |
id: guix_shutdown | |
if: always() && !cancelled() && (steps.guix_setup_check.outcome == 'success') | |
working-directory: . | |
run: | | |
sudo systemctl stop guix-daemon.service | |
sudo systemctl stop gnu-store.mount | |
- name: Save the Guix store in the cache | |
if: always() && !cancelled() && (steps.guix_shutdown.outcome == 'success') | |
uses: actions/cache/save@v3.3.2 | |
with: | |
path: | | |
~/.cache/guix | |
/gnu | |
/var/guix/db/db.sqlite | |
/var/guix/gcroots | |
/var/guix/profiles | |
key: guix-store-${{ github.sha }}-${{ github.run_id }} | |
finish: | |
needs: | |
- setup | |
- test | |
runs-on: ubuntu-latest | |
if: always() | |
env: | |
ci_success: >- | |
${{ | |
(needs.setup.result == 'success') | |
&& (needs.test.result == 'success') | |
}} | |
steps: | |
- name: Report CI status | |
run: $ci_success |