Continuous integration

Overview

GitHub Actions are configured to build master and develop branches and pull requests.

GitHub Actions build Roc for Linux and macOS. Linux worker uses Docker to run builds on several Linux distros. Linux worker also uses QEMU to run cross-compiled tests.

Docker images for continuous integration and cross-compilation are prepared using Docker Hub automated builds. They are based on official upstream images, adding pre-installed packages required for build. Dockerfiles for images are hosted in a separate GitHub repository. When a Dockerfile or an upstream image changes, Docker Hub automatically triggers rebuild.

Links:

Docker images

The following Docker images are used on our CI builds.

Linux native

Image

Base image

Architecture

Compilers

rocproject/travis-ubuntu:18.04

ubuntu:18.04

x86_64

gcc-6, clang-6

rocproject/travis-ubuntu:16.04

ubuntu:16.04

x86_64

gcc-4.8, gcc-5, clang-3.7

rocproject/travis-ubuntu:14.04

ubuntu:14.04

x86_64

gcc-4.4, gcc-4.6, clang-3.4

rocproject/travis-debian

debian:stable

x86_64

distro default

rocproject/travis-fedora

fedora:latest

x86_64

distro default

rocproject/travis-centos

centos:latest

x86_64

distro default

rocproject/travis-opensuse

opensuse/leap:latest

x86_64

distro default

rocproject/travis-archlinux

archlinux/base:latest

x86_64

distro default

rocproject/travis-alpine

alpine:latest

x86_64

distro default

Linux misc.

Image

Base image

Comment

rocproject/travis-minimal

ubuntu:latest

minimal build environment

rocproject/travis-checks

ubuntu:19.04

sanitizers and valgrind

Linux cross-compilation

Image

Architecture

Compilers

rocproject/cross-arm-bcm2708hardfp-linux-gnueabi:gcc-4.7

armv6

gcc-4.7

rocproject/cross-arm-linux-gnueabihf:gcc-4.9

armv7

gcc-4.9

rocproject/cross-aarch64-linux-gnu:gcc-7.4

armv8

gcc-7.4

Android cross-compilation

Image

API level

Architecture

Compilers

rocproject/cross-aarch64-linux-android:api28

28

armv8

clang-7.0.2

Run locally

It is possible to run Docker-based builds locally, in the same environment as they are run on CI.

For example, this will run Fedora build:

$ scripts/ci/docker-linux.sh rocstreaming/env-fedora scripts/ci/linux-x86_64/fedora.sh

You can also invoke Docker manually:

$ docker run -t --rm --cap-add SYS_PTRACE -u "${UID}" -v "${PWD}:${PWD}" -w "${PWD}" \
    rocproject/travis-fedora \
      scons --build-3rdparty=openfec,cpputest --enable-debug test

Explanation:

  • -t allocates a pseudo-TTY to enable color output

  • --rm removes the container when the command exits

  • --cap-add SYS_PTRACE enables ptracing which is needed for clang sanitizers

  • -u "${UID}" changes the UID inside the container from root to the current user

  • -v "${PWD}:${PWD}" mounts the current directory into the container at the same path

  • -w "${PWD}" chdirs into that directory