GitHub Action workflow for mbed-os-env docker image test and publish

pull/15011/head
Saheer 2021-08-17 18:01:44 +01:00
parent f3f55c8c34
commit faac0ed034
4 changed files with 331 additions and 0 deletions

View File

@ -0,0 +1,121 @@
name: Publish or Update docker image for mbed-os-5.15
on:
push:
branches:
- mbed-os-5.15
paths:
- requirements.txt
- docker_images/mbed-os-env/**
- .github/workflows/docker_management.publish.yml
# manual trigger when needed
workflow_dispatch:
jobs:
prepare-tags:
runs-on: ubuntu-latest
steps:
-
name: Extract branch name
shell: bash
run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})"
id: extract_branch
-
name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
-
name: Set UUID
id: generate-uuid
uses: filipstefansson/uuid-action@v1
# set docker tags we are building, and intending to publish
# dev-tag is temporary for testing purpose. This should be considered as unstable.
# dated-tag is created for versioning purpose
# prod-tag-latest could be used by customers, CI etc for keeping up to date
-
name: Get build information
shell: bash
run: |
mkdir -p build_info
date=$(date +"%Y.%m.%dT%H.%M.%S")
echo dev-${{ steps.extract_branch.outputs.branch }}-${date}-${{ steps.generate-uuid.outputs.uuid }} > build_info/dev_tag
echo ${{ steps.extract_branch.outputs.branch }}-${date} > build_info/prod_tag_dated
echo ${{ steps.extract_branch.outputs.branch }}-latest > build_info/prod_tag_latest
echo ${{ steps.extract_branch.outputs.branch }} > build_info/mbed_os_version
echo ${{ github.repository_owner }} | tr '[:upper:]' '[:lower:]' > build_info/repository_owner
-
name: Archive information
uses: actions/upload-artifact@v2
with:
name: build-info
path: build_info
build-container:
runs-on: ubuntu-latest
needs: prepare-tags
steps:
-
name: unarchive artefacts
uses: actions/download-artifact@v2
with:
name: build-info
-
name: Get build info from archive
shell: bash
id: build_info
run: |
value=`cat dev_tag`
echo "DEV TAG is $value"
echo "::set-output name=DOCKER_DEV_TAG::$value"
value=`cat prod_tag_dated`
echo "PROD TAG DATED is $value"
echo "::set-output name=DOCKER_PROD_TAG_DATED::$value"
value=`cat prod_tag_latest`
echo "::set-output name=DOCKER_PROD_TAG_LATEST::$value"
echo "PROD TAG is $value"
value=`cat repository_owner`
echo "::set-output name=REPO_OWNER::$value"
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
-
name: Login to ghcr.io
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
-
name: Checkout
uses: actions/checkout@v2
-
name: Build docker containers
uses: docker/build-push-action@v2
id: docker_build_dev
with:
context: .
platforms: linux/amd64
push: true
file: ./docker_images/mbed-os-env/Dockerfile
tags: ghcr.io/${{ steps.build_info.outputs.REPO_OWNER }}/mbed-os-env:${{ steps.build_info.outputs.DOCKER_PROD_TAG_LATEST }}
# as docker tags are reused, copy also to a "fixed tag"
# for troubleshooting purpose if needed
-
name: copy tag to fixed tag
run: |
docker run quay.io/skopeo/stable --src-creds=${{ github.repository_owner }}:${{ secrets.GITHUB_TOKEN }} --dest-creds=${{ github.repository_owner }}:${{ secrets.GITHUB_TOKEN }} copy --all docker://ghcr.io/${{ steps.build_info.outputs.REPO_OWNER }}/mbed-os-env:${{ steps.build_info.outputs.DOCKER_PROD_TAG_LATEST }} docker://ghcr.io/${{ steps.build_info.outputs.REPO_OWNER }}/mbed-os-env:${{ steps.build_info.outputs.DOCKER_PROD_TAG_DATED }}

View File

@ -0,0 +1,72 @@
name: Build and test docker image
# This workflow is triggered when Dockerfile related or github action itself changes are made in a PR
# The workflow is quite simple - builds and test the image. Release of newer version is done only when PR is merged.
on:
pull_request:
branches: [ mbed-os-5.15 ]
paths:
- docker_images/mbed-os-env/**
- .github/workflows/docker_management.*
- requirements.txt
jobs:
build-container:
runs-on: ubuntu-latest
strategy:
matrix:
platform: [linux/amd64]
steps:
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
# use mbed-os-5.15 branch of blinky
-
name: Checkout
uses: actions/checkout@v2
with:
repository: ARMmbed/mbed-os-example-blinky
path: mbed-os-example-blinky
ref: mbed-os-5.15
-
name: Remove mbed-os from example-application
shell: bash
run: |
cd mbed-os-example-blinky
rm -rf mbed-os
-
name: Checkout
uses: actions/checkout@v2
with:
path: mbed-os-example-blinky/mbed-os
-
name: Build container
uses: docker/build-push-action@v2
id: docker_build_dev
with:
context: ./mbed-os-example-blinky/mbed-os
platforms: ${{ matrix.platform }}
file: ./mbed-os-example-blinky/mbed-os/docker_images/mbed-os-env/Dockerfile
load: true
tags: mbed-os-env:a_pr_test
-
name: test the container
id: test
uses: addnab/docker-run-action@v2
with:
options: -v ${{ github.workspace }}:/work -w=/work
image: mbed-os-env:a_pr_test
shell: bash
run: |
uname -m
cd mbed-os-example-blinky
# build using CLI1
mbed compile -m K64F -t GCC_ARM

View File

@ -0,0 +1,89 @@
# ------------------------------------------------------------------------------
# Pull base image
FROM ubuntu:20.04
# ------------------------------------------------------------------------------
# Arguments
ARG WORKDIR=/root
# ------------------------------------------------------------------------------
# Install tools via apt
ENV DEBIAN_FRONTEND=noninteractive
RUN set -x \
&& apt -y update \
&& apt -y install \
git \
wget \
python3 \
python3-dev \
python3-setuptools \
python3-pip \
build-essential \
astyle \
mercurial \
ninja-build \
libssl-dev \
cargo \
flex \
bison \
doxygen \
aspell \
ccache \
gcovr \
&& apt clean && rm -rf /var/lib/apt/lists \
&& update-alternatives --install /usr/bin/python python /usr/bin/python3.8 1 \
&& : # last line
# Set up Mbed environment
WORKDIR /tmp/
COPY requirements.txt .
RUN set -x \
&& pip3 install -r requirements.txt \
&& : # last line
# ------------------------------------------------------------------------------
# Install Python modules (which are not included in requirements.txt)
RUN set -x \
&& pip3 install -U \
mbed-cli \
&& : # last line
# ------------------------------------------------------------------------------
# install scancode-toolkit, which is available only in x86_64
RUN set -x \
&& [ "$(uname -m)" = "x86_64" ] && \
pip install scancode-toolkit
# ------------------------------------------------------------------------------
# Install arm-none-eabi-gcc
WORKDIR /opt/mbed-os-toolchain
RUN set -x \
&& [ "$(uname -m)" = "aarch64" ] && \
TARBALL="gcc-arm-none-eabi-9-2019-q4-major-aarch64-linux.tar.bz2" || \
TARBALL="gcc-arm-none-eabi-9-2019-q4-major-x86_64-linux.tar.bz2" \
&& wget -q https://developer.arm.com/-/media/Files/downloads/gnu-rm/9-2019q4/${TARBALL} \
&& tar -xjf ${TARBALL} \
&& rm ${TARBALL} \
&& : # last line
# ------------------------------------------------------------------------------
# Configure environment variables
ENV MBED_GCC_ARM_PATH=/opt/mbed-os-toolchain/gcc-arm-none-eabi-9-2019-q4-major/bin/
ENV PATH="${PATH}:${MBED_GCC_ARM_PATH}"
# ------------------------------------------------------------------------------
# Display, check and save environment settings
# NOTE: using bash instead of Ubuntu default bash due to unsupport for pipefail
# Pipefail is crucial here, if the tools didn't install properly, docker build should not pass because of piping
RUN /bin/bash -c \
"set -x -o pipefail \
&& arm-none-eabi-gcc --version | grep arm-none-eabi-gcc | tee env_settings \
&& python --version 2>&1 | tee -a env_settings \
&& (echo -n 'mbed-cli ' && mbed --version) | tee -a env_settings \
&& (echo -n 'mbed-greentea ' && mbedgt --version | grep ^[0-9]) | tee -a env_settings \
&& (echo -n 'mbed-host-tests ' && mbedhtrun --version) | tee -a env_settings \
&& : # LAST LINE"
WORKDIR /root

View File

@ -0,0 +1,49 @@
# Mbed OS development environment Docker image
This Docker image is the official Mbed OS development environment.
* It is based on Ubuntu 20.04
* Arm-none-eabi-gcc toolchain is installed
* Latest released version of mbed-cli and mbed-greentea are installed
* All other Mbed OS dependency tools are installed.
# How to use the Docker image:
## Pull the Docker image
```bash
docker pull ghcr.io/armmbed/mbed-os-env:<label>
```
## Run Mbed OS environment without HW support (build Mbed images only)
Launch the Docker image by
```bash
docker run -it ghcr.io/armmbed/mbed-os-env:<label>
```
Then you will have a container with an Mbed OS development environment.
You should be able to compile Mbed commands/examples as recommended in the documentation
e.g.
```bash
mbed-tools import mbed-os-example-blinky
cd mbed-os-example-blinky
mbed-tools compile -m <TARGET> -t GCC_ARM
```
## Run Mbed OS environment with HW support (USB pass-through)
:warning: This currently works only on Linux host machines with [Mbed CLI 1](https://os.mbed.com/docs/mbed-os/v6.13/build-tools/mbed-cli-1.html).
If you want to use this Docker image to connect and flash your targets, you will need some extra command line option to pass-through your USB devices.
```bash
sudo docker run -it --privileged -v /dev/disk/by-id:/dev/disk/by-id -v /dev/serial/by-id:/dev/serial/by-id ghcr.io/armmbed/mbed-os-env:<label>
```
Then you will have a container with an Mbed OS development environment.
To make sure your Mbed targets have been detected, you might want to manually run the mount command and `mbedls` to check
```bash
mount /dev/sdb /mnt
mbedls
```
If `mbedls` detected your connected target, then you should be able to run Mbed tests/examples as recommended in the Mbed documentation.
``` bash
mbed import mbed-os
cd mbed-os
mbed test -t GCC_ARM -m <target>
```