# Meson CI setup

This document is aimed for Meson contributors and documents the CI
setup used for testing Meson itself. The Meson project uses multiple
CI platforms for covering a wide range of target systems.

## GitHub actions

The configuration files for GitHub actions are located in
`.github/workflows`. Here, all [images](#docker-images) are tested
with the full `run_tests.py` run. Additionally, some other, smaller,
tests are run.

## Docker images

The Linux docker images are automatically built and uploaded by GitHub
actions. An image rebuild is triggerd when any of the image definition
files are changed (in `ci/ciimage`) in the master branch.
Additionally, the images are also updated weekly.

Each docker image has one corresponding dirctory in `ci/ciimage` with
an `image.json` and an `install.sh`.

### Image generation

There are no manual Dockerfiles. Instead the Dockerfile is
automatically generated by the `build.py` script. This is done to
ensure that all images have the same layout and can all be built and
tested automatically.

The Dockerfile is generated from the `image.json` file and basically
only adds a few common files and runs the `install.sh` script which
should contain all distribution specific setup steps. The `common.sh`
can be sourced via `source /ci/common.sh` to access some shared
functionalety.

To generate the image run `build.py -t build <image>`. A generated
image can be tested with `build.py -t test <image>`.

### Common image setup

Each docker image has a `/ci` directory with an `env_vars.sh` script.
This script has to be sourced before running the Meson test suite.
