Skip to content

Commit

Permalink
CI: Add automated container build
Browse files Browse the repository at this point in the history
This commit adds a Container which holds the CCS and SDK so they can be
used to build the various firmwares.

The pipeline can be later expanded to also actually build the
firmware(s).

Signed-off-by: Olliver Schinagl <[email protected]>
  • Loading branch information
oliv3r committed Aug 8, 2024
1 parent a51b1a6 commit 47c3d4b
Show file tree
Hide file tree
Showing 4 changed files with 211 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
*
!**/*.patch
!**/znp_*.syscfg
78 changes: 78 additions & 0 deletions .github/workflows/container-build.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
name: Create and publish Container image

on:
push:
branches:
- master
tags:
- 'v*'
pull_request:
branches:
- master

env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}

jobs:
build-and-push-image:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write

steps:
- name: Free Disk Space (Ubuntu)
uses: jlumbroso/free-disk-space@main
with:
android: true
docker-images: true
dotnet: true
haskell: true
large-packages: true
swap-storage: true
tool-cache: true

- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Set up QEMU
uses: docker/setup-qemu-action@v3

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Login to Container registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: |
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=ref,event=branch
type=ref,event=pr
type=edge
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
flavor: |
latest=auto
- name: Build and push
uses: docker/build-push-action@v6
with:
context: .
file: Containerfile
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
load: true
73 changes: 73 additions & 0 deletions Containerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
# SPDX-License-Identifier: MIT
#
# Copyright (C) 2024 Olliver Schinagl <[email protected]>

ARG UBUNTU_VERSION="22.04"
ARG TARGET_ARCH="library"

FROM index.docker.io/${TARGET_ARCH}/ubuntu:${UBUNTU_VERSION}

ARG SLF2_COMPONENTS="PF_CC2X"

# Remember to supply/update both version fields.
ARG SLF2_VERSION="7.10.00.98"
ARG SLF2_VERSION_PATH="7_10_00_98"
ADD "https://dr-download.ti.com/software-development/software-development-kit-sdk/MD-BPlR3djvTV/${SLF2_VERSION}/simplelink_cc13xx_cc26xx_sdk_${SLF2_VERSION_PATH}__linux.zip" "/tmp/ccs_install/"

ARG CCS_VERSION="12.3.0"
ARG CCS_RELEASE="00005"
ADD "https://dr-download.ti.com/software-development/ide-configuration-compiler-or-debugger/MD-J1VdearkvK/${CCS_VERSION}/CCS${CCS_VERSION}.${CCS_RELEASE}_linux-x64.tar.gz" "/tmp/ccs_install/"

ARG SKIP_PATCHING

ENV SKIP_PATCHING="${SKIP_PATCHING}"
ENV HOME="/build"
ENV CCS_VERSION=${CCS_VERSION}.${CCS_RELEASE}
ENV SLF2_VERSION=${SLF2_VERSION}
ENV SLF2_COMPONENTS=${SLF2_COMPONENTS}
ENV SLF2_SDK="${HOME}/simplelink_cc13xx_cc26xx_sdk"

COPY "./coordinator/Z-Stack_3.x.0/znp_*.syscfg" "/src/"
COPY "./coordinator/Z-Stack_3.x.0/patches" "/src/patches/"
RUN apt-get update && apt-get install --yes \
'build-essential' \
'cmake' \
'git' \
'libc6-i386' \
'libgconf-2-4' \
'libncurses5' \
'libtinfo5' \
'libusb-0.1-4' \
'python3' \
'unzip' \
&& \
rm -f -r '/var/cache/apt' && \
rm -f -r '/var/lib/apt' && \
echo 'Extracting CCS ...' && \
tar -xvf "/tmp/ccs_install/CCS${CCS_VERSION:?}_linux-x64.tar.gz" -C '/tmp/ccs_install' && \
echo 'Installing CCS ...' && \
"/tmp/ccs_install/CCS${CCS_VERSION}_linux-x64/ccs_setup_${CCS_VERSION}.run" \
--enable-components "${SLF2_COMPONENTS:?}" \
--mode unattended \
--prefix '/opt/ti/' \
&& \
echo 'Extracting the SDK ...' && \
unzip "/tmp/ccs_install/simplelink_cc13xx_cc26xx_sdk_${SLF2_VERSION_PATH:?}__linux.zip" \
-d "${HOME}" \
&& \
echo 'Wrapping things up' && \
ln -f -s \
"${SLF2_SDK}_${SLF2_VERSION_PATH}" \
"${SLF2_SDK}" \
&& \
ln -f -s \
"$(find '/opt/ti/ccs/utils' -type d -iname 'sysconfig_*')" \
'/opt/ti/ccs/utils/sysconfig' \
&& \
rm -f -r "${SLF2_SDK}/docs" && \
rm -f -r "${SLF2_SDK}/examples/nortos" && \
rm -f -r '/tmp/ccs_install' && \
( test -n "${SKIP_PATCHING:-}" && exit 0 || cd "${SLF2_SDK}" && git apply --ignore-space-change '/src/patches/0'*'.patch' ) && \
echo 'Installation complete'

ENV PATH="/opt/ti/ccs/eclipse/:/opt/ti/ccs/utils/sysconfig/:${PATH}"
57 changes: 57 additions & 0 deletions coordinator/Z-Stack_3.x.0/COMPILE.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,60 @@
- `znp_CC1352P_2_LAUNCHXL_tirtos7_ticlang.hex` -> CC1352P-2 and CC2652P
- `znp_LP_CC1352P7_4_tirtos7_ticlang.hex` -> CC1352P7
- `znp_LP_CC2652R7_tirtos7_ticlang.hex` -> CC2652R7

## Docker build environment
This repo includes a Container file, to help with setting up a build environment without the need to download and install things manually. [Docker](https://docker.com) or [Podman](https://podman.io) can be used. The following example uses docker.

1. This step builds the container locally. This step may be skipped if using a [released container](https://github.com/Koenkk/pkgs/container/Z-Stack-firmware) from this repository instead.
```console
$ docker build \
--file 'Containerfile' \
--rm \
--tag 'z-stack:dev' \
'https://github.com/Koenkk/Z-Stack-firmware.git#master'
```

> __Note:__ The URL in the example can be replace with a '.' when the repository has been cloned locally and having `cd`ed into the repository directory.
> __:Warning:__ The build of the container will download the SDK and CCS. While docker keeps a cached copy on subsequent builds, this download can take a while and is not immediately obvious it is happening.
1. Enter the container so that the firmware can be built.
```console
$ docker run \
--interactive \
--rm \
--tty \
--volume './workspace:/build/workspace' \
--workdir '/build/workspace' \
'z-stack:dev' \
'/bin/bash'
```

> *TIP:* This document assumes that docker is pulling the container directly from git, advanced users, that are modifying patches, probably want to overwrite the included patches by making them available within the container using `--volume './coordinator/Z-Stack-3.x.0/:/src'`.
> __Note:__ The local directory `./workspace` is volume-mounted into the containers `/build/workspace` directory to be able to keep files from the container, but can be freely removed when done.
1. Within the container, import the relevant project into the workspace
`# eclipse -noSplash -data "${HOME}/workspace" -application 'com.ti.ccstudio.apps.projectImport' -ccs.location "${SLF2_SDK}/examples/rtos/CC1352P_2_LAUNCHXL/zstack/znp/tirtos7/ticlang/znp_CC1352P_2_LAUNCHXL_tirtos7_ticlang.projectspec"`

1. Copy the board configuration file
`# cp '/src/znp_CC1352P_2_LAUNCHXL_tirtos7_ticlang.syscfg' "${HOME}/workspace/znp_CC1352P_2_LAUNCHXL_tirtos7_ticlang/znp.syscfg"`

1. Compile!
`# eclipse -noSplash -data "${HOME}/workspace" -application 'com.ti.ccstudio.apps.projectBuild' -ccs.projects 'znp_CC1352P_2_LAUNCHXL_tirtos7_ticlang'`
The output can then be found `./workspace/znp_CC1352P_2_LAUNCHXL_tirtos7_ticlang/default/znp_CC1352P_2_LAUNCHXL_tirtos7_ticlang.hex` on the host.

> __Note:__ The path used here depends on the location used in the previous step.
### Launching eclipse in the container
To launch eclipse in the container to test/check things out, a trick for advanced users is to run the container as root `--user root` (to install additional packages) and pass as a volume the current X session. This does require a X11 compatible host.
```
--env DISPLAY="${DISPLAY}" --volume '/tmp/.X11-unix'
```
Within the container, eclipse does require `libswt-gtk-4-java epiphany-browser` installed (ccs/eclipse does come with chromium, but epiphany is an easy way to full fill its missing dependencies).

Almost certainly some additional security mechanisms need to be bypassed, where a quick (and dangerous) hack is to `xhost +` on the host, best before launching the container.

Finally start `eclipse -data '/build/workspace'` from within the container and it will then pop up a UI window on the host.

> __Note:__ Optionally, a VNC in docker solution can also be used, but that is out of scope for here.

0 comments on commit 47c3d4b

Please sign in to comment.