Skip to content

CI

CI #15

Workflow file for this run

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 ls -lRa /var/guix
sudo ls -lRa /var/guix/profiles/per-user/root/current-guix/
sudo ls -lRa /var/guix/profiles/per-user/root/current-guix-1-link/
sudo ls -lRa /var/guix/profiles/per-user/root/current-guix/share/guix/../../
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 != '' }}
- 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