Skip to content

Allow PRs to build images #66

Allow PRs to build images

Allow PRs to build images #66

Workflow file for this run

name: Build firmwares
on:
pull_request:
push:
env:
REGISTRY: ghcr.io
jobs:
get-build-container-names:
name: Get the possible build containers
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4.1.4
- name: Create container name
id: create-container-name
run: |
current_user=$(echo $GITHUB_REPOSITORY_OWNER | tr [:upper:] [:lower:])
current_repo=$(echo ${{ github.event.repository.name }} | tr [:upper:] [:lower:])
current_image_name="${{ env.REGISTRY }}/$current_user/$current_repo"
tag_name="${{ hashFiles('Dockerfile') }}"
echo "tag_name=$tag_name" >> $GITHUB_OUTPUT
echo "image_name=$current_image_name" >> $GITHUB_OUTPUT
outputs:
tag_name: ${{ steps.create-container-name.outputs.tag_name }}
image_name: ${{ steps.create-container-name.outputs.image_name }}
container_name: ${{ steps.create-container-name.outputs.image_name }}:${{ steps.create-container-name.outputs.tag_name }}
maybe-build-container:
name: Create build container image
needs: [get-build-container-names]
if: >-
(github.event_name != 'pull_request') ||
(github.event.pull_request.author_association == 'COLLABORATOR') ||
(github.event.pull_request.author_association == 'MEMBER') ||
(github.event.pull_request.author_association == 'OWNER')
runs-on: ubuntu-latest
permissions:
packages: write
steps:
- uses: actions/checkout@v4.1.4
- name: Log in to the GitHub container registry
uses: docker/login-action@v3.1.0
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3.3.0
- name: Build and Push
uses: docker/build-push-action@v5.3.0
with:
context: .
file: Dockerfile
tags: ${{ needs.get-build-container-names.outputs.container_name }}
cache-from: ${{ needs.get-build-container-names.outputs.image_name }}:cache-${{ needs.get-build-container-names.outputs.tag_name }}
cache-to: ${{ needs.get-build-container-names.outputs.image_name }}:cache-${{ needs.get-build-container-names.outputs.tag_name }}
push: true
get-build-container:
name: Get the image name of the build container to use
needs: [maybe-build-container, get-build-container-names]
if: always() # If `maybe-build-container` runs, we should run after it
runs-on: ubuntu-latest
steps:
- id: noop
run: echo "noop"
outputs:
container_name: ${{ needs.get-build-container-names.outputs.container_name }}
list-manifests:
name: List firmware manifests
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- uses: actions/checkout@v4.1.4
- id: set-matrix
run: |
echo "matrix=$(find manifests -type f \( -name "*.yaml" -o -name "*.yml" \) -print | sort | jq -R -s -c 'split("\n")[:-1]')" >> $GITHUB_OUTPUT
build-firmwares:
name: Firmware builder
needs: [list-manifests, get-build-container]
runs-on: ubuntu-latest
container:
image: ${{ needs.get-build-container.outputs.container_name }}
options: --user root
strategy:
matrix:
manifest: ${{ fromJson(needs.list-manifests.outputs.matrix) }}
steps:
- uses: actions/checkout@v4.1.4
- name: Parse firmware manifest
id: read_manifest_yaml
run: |
yq -r '
to_entries
| .[]
| select(.value | type == "string")
| .key + "=" + .value
' "${{ matrix.manifest }}" >> $GITHUB_OUTPUT
manifest_filename=$(basename "${{ matrix.manifest }}")
manifest_base="${manifest_filename%%.*}"
echo "manifest_base=$manifest_base" >> $GITHUB_OUTPUT
- name: Install SDK extensions
run: |
# XXX: slc-cli does not actually work when the extensions aren't in the SDK!
for sdk in /gecko_sdk_*; do
slc signature trust --sdk "$sdk"
ln -s $PWD/gecko_sdk_extensions "$sdk"/extension
for ext in "$sdk"/extension/*/; do
slc signature trust --sdk "$sdk" --extension-path "$ext"
done
done
- name: Build firmware
run: |
# Fix `fatal: detected dubious ownership in repository at`
git config --global --add safe.directory "$GITHUB_WORKSPACE"
# Pass all SDKs as consecutive `--sdk ...` arguments
sdk_args=""
for sdk_dir in /gecko_sdk*; do
sdk_args="$sdk_args --sdk $sdk_dir"
done
# Pass all toolchains as consecutive `--toolchain ...` arguments
toolchain_args=""
for toolchain_dir in /opt/*arm-none-eabi*; do
toolchain_args="$toolchain_args --toolchain $toolchain_dir"
done
# Build it
mkdir outputs
filename="${{ steps.read_manifest_yaml.outputs['manifest_base'] }}"
python3 tools/build_project.py \
$sdk_args \
$toolchain_args \
--manifest "${{ matrix.manifest }}" \
--build-dir build \
--build-system makefile \
--output "gbl:outputs/$filename.gbl" \
--output "hex:outputs/$filename.hex" \
--output "out:outputs/$filename.out"
- name: Install node within container (act)
if: ${{ env.ACT }}
run: |
curl -fsSL https://deb.nodesource.com/nsolid_setup_deb.sh | bash -s 20
apt-get install -y nodejs
- name: Upload artifact
uses: actions/upload-artifact@v4.3.3
with:
name: ${{ steps.read_manifest_yaml.outputs['manifest_base'] }}
path: outputs/*
compression-level: 9
if-no-files-found: error