1 # vim: set expandtab shiftwidth=2 tabstop=8 textwidth=0 filetype=yaml:
3 # This is a bit complicated for two reasons:
4 # - we really want to run dnf/apt/... only once, updating on the test runner for
5 # each job takes forever. So we create a container image for each distribution
6 # tested, then run the tests on this container image.
8 # Creating a container image is time-consuming, so we only do so for pushes to
9 # libinput directly (not merge requests) and if the current image is 'old'.
11 # - GitLab only allows one script: set per job but we have a bunch of commands
12 # we need to re-run for each build (meson && ninja && etc). YAML cannot merge
13 # arrays templates so we're screwed.
15 # So instead we use a default_build template and override everything with
16 # variables. The only two variables that matter:
17 # MESON_ARGS=-Denable-something=true
18 # NINJA_ARGS=dist ... to run 'ninja -C builddir dist'
19 # Note that you cannot use scripts: in any target if you expect default_build
23 # All jobs must follow the naming scheme of
24 # <distribution>:<version>@activity:
25 # e.g. fedora:31@build-default
27 .templates_sha: &template_sha 395535ce90eb48e260c0dff12c35d9237e22c539 # see https://docs.gitlab.com/ee/ci/yaml/#includefile
30 {% for template in templates %}
31 # {{ template.capitalize() }} container builder template
32 - project: 'freedesktop/ci-templates'
34 file: '/templates/{{template}}.yml'
38 - prep # prep work like rebuilding the container images if there is a change
39 - build # for actually building and testing things in a container
40 - VM # for running the test suite in a VM
41 - valgrind # for running the test suite under valgrind in a VM
42 - distro # distribs test
43 - deploy # trigger wayland's website generation
44 - container_clean # clean up unused container images
47 ###############################################################################
48 # This is the list of packages required to build libinput with the default #
51 # Run dnf install/apt-get install/.. with the list of packages for your #
54 # See the documentation here: #
55 # https://wayland.freedesktop.org/libinput/doc/latest/building_libinput.html #
56 ###############################################################################
57 FEDORA_PACKAGES: 'git gcc gcc-c++ pkgconf-pkg-config meson check-devel libudev-devel libevdev-devel doxygen graphviz python3-sphinx python3-recommonmark python3-sphinx_rtd_theme python3-pytest-xdist libwacom-devel cairo-devel gtk3-devel glib2-devel mtdev-devel diffutils'
58 FEDORA_QEMU_RPMS: 'git gcc gcc-c++ pkgconf-pkg-config meson check-devel libudev-devel libevdev-devel doxygen graphviz python3-sphinx python3-recommonmark python3-sphinx_rtd_theme python3-pytest-xdist libwacom-devel cairo-devel gtk3-devel glib2-devel mtdev-devel diffutils valgrind'
59 UBUNTU_PACKAGES: 'git gcc g++ pkg-config meson check libudev-dev libevdev-dev doxygen graphviz python3-sphinx python3-recommonmark python3-sphinx-rtd-theme python3-pytest-xdist libwacom-dev libcairo2-dev libgtk-3-dev libglib2.0-dev libmtdev-dev'
60 ARCH_PACKAGES: 'git gcc pkgconfig meson check libsystemd libevdev doxygen graphviz python-sphinx python-recommonmark python-sphinx_rtd_theme python-pytest-xdist libwacom gtk3 mtdev diffutils'
61 FREEBSD_BUILD_PKGS: 'meson'
62 FREEBSD_PKGS: 'libepoll-shim libudev-devd libevdev libwacom gtk3 libmtdev '
63 ALPINE_PACKAGES: 'git gcc build-base pkgconfig meson check-dev eudev-dev libevdev-dev libwacom-dev cairo-dev gtk+3.0-dev mtdev-dev bash'
64 ############################ end of package lists #############################
66 # these tags should be updated each time the list of packages is updated
67 # changing these will force rebuilding the associated image
68 # Note: these tags have no meaning and are not tied to a particular
70 FEDORA_TAG: '2020-03-17.0'
71 UBUNTU_TAG: '2020-03-17.0'
72 ARCH_TAG: '2020-03-17.0'
73 ALPINE_TAG: '2020-03-17.0'
74 FREEBSD_TAG: '2020-03-17.0'
75 QEMU_TAG: 'qemu-vm-2020-03-17.0'
77 UBUNTU_EXEC: "bash .gitlab-ci/ubuntu_install.sh $UBUNTU_CUSTOM_DEBS"
79 FREEBSD_CONTAINER_IMAGE: $CI_REGISTRY_IMAGE/freebsd/11.2:$FREEBSD_TAG
80 FDO_UPSTREAM_REPO: libinput/libinput
82 MESON_BUILDDIR: "build dir"
85 MESON_TEST_ARGS: '--no-suite=hardware'
87 # udev isn't available/working properly in the containers
95 - runner_system_failure
96 - stuck_or_timeout_failure
97 # cancel run when a newer version is pushed to the branch
102 name: "meson-logs-$CI_JOB_NAME"
106 - $MESON_BUILDDIR/meson-logs
108 junit: $MESON_BUILDDIR/junit-*.xml
110 #################################################################
114 #################################################################
116 # Re-generate the CI script and make sure it's the one currently checked in
117 # If this job fails, re-generate the gitlab-ci.yml script, see
118 # $SRCDIR/.gitlab-ci/generate-gitlab-ci.py
124 - apk add python3 git
125 - pip3 install --user jinja2
127 - python3 ./.gitlab-ci/generate-gitlab-ci.py
128 - git diff --exit-code && exit 0 || true
129 - echo "Committed gitlab-ci.yml differs from generated gitlab-ci.yml. Please verify"
133 # Verify that commit messages are as expected, signed-off, etc.
140 - apk add python3 git
142 - pip3 install GitPython
143 - pip3 install pytest
145 pytest --junitxml=results.xml \
148 ./.gitlab-ci/check-commit.py
150 - master@libinput/libinput
158 # This stage will recreate the container images only if the image
159 # is too old or if it is missing some dependencies.
162 .rebuild_for_schedule:
164 # force rebuild if schedule, reuse otherwise
165 - if [[ $CI_PIPELINE_SOURCE == "schedule" ]] ; then export FDO_FORCE_REBUILD=1; fi
169 - .fdo.qemu-build@fedora
171 - .rebuild_for_schedule
177 FDO_DISTRIBUTION_VERSION: 30
178 FDO_DISTRIBUTION_TAG: $QEMU_TAG
179 FDO_DISTRIBUTION_PACKAGES: $FEDORA_QEMU_RPMS
182 {% for distro in distributions %}
183 {{distro.name}}:{{distro.version}}@container-prep:
185 - .fdo.container-build@{{distro.name}}
187 - .rebuild_for_schedule
191 FDO_DISTRIBUTION_VERSION: '{{distro.version}}'
192 FDO_DISTRIBUTION_PACKAGES: ${{distro.name.upper()}}_PACKAGES
193 FDO_DISTRIBUTION_TAG: ${{distro.name.upper()}}_TAG
194 {% if version == 'ubuntu'%}
195 FDO_DISTRIBUTION_EXEC: $UBUNTU_EXEC
201 # Note that we want to use the latest buildah image, and for that
202 # we use one of the .fdo.container-build@distribution by replacing the
204 .freebsd@container-prep:
207 - .fdo.container-build@fedora
210 # log in to the registry
211 - podman login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
213 # get the full container image name
214 - export IMAGE=freebsd/$FREEBSD_VERSION:$FREEBSD_TAG
216 # force rebuild if schedule, reuse otherwise
217 - if [[ $CI_PIPELINE_SOURCE == "schedule" ]] ; then touch .scheduled; fi
219 # pull the latest upstream image if it exists
220 - test -e .scheduled || skopeo copy --dest-creds $CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD
221 docker://$CI_REGISTRY/$FDO_UPSTREAM_REPO/$IMAGE
222 docker://$CI_REGISTRY_IMAGE/$IMAGE && exit 0 || true ;
224 # check if our image is already in the current registry
225 - test -e .scheduled || skopeo inspect docker://$CI_REGISTRY_IMAGE/$IMAGE > /dev/null && exit 0 || true ;
227 - export BUILDAH_RUN="buildah run --isolation chroot"
228 - export BUILDAH_COMMIT="buildah commit --format docker"
229 - buildcntr=$(buildah from --quiet myfreeweb/freebsd-cross:latest)
230 - $BUILDAH_RUN $buildcntr apk add --no-cache $FREEBSD_BUILD_PKGS
231 - $BUILDAH_RUN $buildcntr pkg -r /freebsd update -f
232 - $BUILDAH_RUN $buildcntr pkg -r /freebsd install -y $FREEBSD_PKGS
233 - buildah config --workingdir /app $buildcntr
234 # tag the current container
235 - $BUILDAH_COMMIT $buildcntr $FREEBSD_CONTAINER_IMAGE
236 # clean up the working container
237 - buildah rm $buildcntr
239 # push the container image to the libinput registry
240 - podman push --quiet $FREEBSD_CONTAINER_IMAGE
241 - skopeo copy --dest-creds $CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD
242 docker://$FREEBSD_CONTAINER_IMAGE
243 docker://$CI_REGISTRY_IMAGE/freebsd/$FREEBSD_VERSION:$CI_JOB_ID
245 freebsd:11.2@container-prep:
247 - .freebsd@container-prep
250 FREEBSD_VERSION: "11.2"
253 #################################################################
255 # container clean stage #
256 # run during the clean stage #
258 #################################################################
261 # This stage will look for the container images we currently have in
262 # the registry and will remove any that are not tagged with the provided
263 # $container_image:$tag
266 stage: container_clean
271 - apk add python3 git
272 - pip3 install git+http://gitlab.freedesktop.org/freedesktop/ci-templates
274 # Go to your Profile, Settings, Access Tokens
275 # Create a personal token with 'api' scope, copy the value.
276 # Go to CI/CD, Schedules, schedule a new monthly job (or edit the existing one)
277 # Define a variable of type File named AUTHFILE. Content is that token
279 - ci-fairy -v --authfile $AUTHFILE delete-image
280 --repository $FDO_DISTRIBUTION_NAME/$FDO_DISTRIBUTION_VERSION
281 --exclude-tag $FDO_DISTRIBUTION_TAG
287 {% for distro in distributions %}
288 {{distro.name}}:{{distro.version}}@container-clean:
293 {{distro.name.upper()}}_VERSION: '{{distro.version}}'
294 CURRENT_CONTAINER_IMAGE: $CI_REGISTRY_IMAGE/{{distro.name}}/$FDO_DISTRIBUTION_VERSION:$FDO_DISTRIBUTION_TAG
295 FDO_DISTRIBUTION_VERSION: '{{distro.version}}'
296 FDO_DISTRIBUTION_TAG: ${{distro.name.upper()}}_TAG
300 freebsd:11.2@container-clean:
305 CURRENT_CONTAINER_IMAGE: $FREEBSD_CONTAINER_IMAGE
307 #################################################################
311 #################################################################
319 - .gitlab-ci/meson-build.sh
326 .check_tainted: &check_tainted |
327 # make sure the kernel is not tainted
328 if [[ "$(ssh localhost -p 5555 cat /proc/sys/kernel/tainted)" -gt 0 ]];
330 echo tainted kernel ;
334 # Run in a test suite. Special variables:
335 # - SUITES: the meson test suites to run, or
336 # - SUITE_NAMES: all elements will be expanded to libinput-test-suite-$value
337 # Set one or the other, not both.
341 - .fdo.distribution-image@fedora
346 MESON_BUILDDIR: build_dir
347 # remove the global --no-suite=hardware
350 - if ! [[ -z $SUITE_NAMES ]]; then SUITES=$(echo $SUITE_NAMES | sed 's/\([^ ]*\)/libinput-test-suite-\1/g'); fi
351 - echo "Testing $SUITES"
353 # start our vm, no args required
354 - /app/start_vm.sh || (echo "Error - Failed to start the VM." && exit 1)
358 - "scp -P 5555 -r $PWD localhost:"
359 - echo "CI_JOB_ID=\"$CI_JOB_ID\"" > sshenv
360 - echo "CI_JOB_NAME=\"$CI_JOB_NAME\"" >> sshenv
361 - echo "MESON_ARGS=\"$MESON_ARGS\"" >> sshenv
362 - echo "MESON_BUILDDIR=\"$MESON_BUILDDIR\"" >> sshenv
363 - echo "MESON_TEST_ARGS=\"$MESON_TEST_ARGS $SUITES\"" >> sshenv
364 - echo "NINJA_ARGS=\"$NINJA_ARGS\"" >> sshenv
365 - "scp -P 5555 sshenv localhost:~/$CI_PROJECT_NAME/.meson_environment"
366 - ssh localhost -p 5555 "cd $CI_PROJECT_NAME ; .gitlab-ci/meson-build.sh" && touch .success || true
367 # no matter the results of the tests, we want to fetch the logs
368 - scp -P 5555 -r localhost:$CI_PROJECT_NAME/$MESON_BUILDDIR .
372 - ssh localhost -p 5555 halt || true
376 - if [[ ! -e .success ]] ;
381 name: "qemu-meson-logs-$CI_JOB_NAME"
385 - $MESON_BUILDDIR/meson-logs
388 junit: $MESON_BUILDDIR/junit-*.xml
396 .fedora:30@test-suite-vm:
400 FDO_DISTRIBUTION_VERSION: 30
401 FDO_DISTRIBUTION_TAG: $QEMU_TAG
402 needs: ['fedora:30@qemu-prep']
405 {% for suite in test_suites %}
408 - .fedora:30@test-suite-vm
410 SUITE_NAMES: '{{suite.suites}}'
412 vm-{{suite.name}}-no-libwacom:
416 MESON_ARGS: '-Dlibwacom=false'
420 {% for suite in test_suites %}
421 vm-valgrind-{{suite.name}}:
426 MESON_TEST_ARGS: '--setup=valgrind'
431 .fedora-build@template:
433 - .fdo.distribution-image@fedora
436 FDO_DISTRIBUTION_VERSION: '30'
437 FDO_DISTRIBUTION_TAG: $FEDORA_TAG
438 needs: ['fedora:30@container-prep']
440 default-build-release@fedora:30:
443 - .fedora-build@template
445 MESON_ARGS: "-Dbuildtype=release"
448 scan-build@fedora:30:
450 - .fedora-build@template
452 NINJA_ARGS: scan-build
455 - dnf install -y clang-analyzer findutils
457 - test ! -d "$MESON_BUILDDIR"/meson-logs/scanbuild && exit 0
458 - test $(find "$MESON_BUILDDIR"/meson-logs/scanbuild -maxdepth 0 ! -empty -exec echo "not empty" \; | wc -l) -eq 0 && exit 0
459 - echo "Check scan-build results"
462 # Below jobs are build option combinations. We only
463 # run them on one image, they shouldn't fail on one distro
464 # when they succeed on another.
466 build-no-libwacom@fedora:30:
468 - .fedora-build@template
470 MESON_ARGS: "-Dlibwacom=false"
472 build-no-libwacom-nodeps@fedora:30:
474 - .fedora-build@template
476 MESON_ARGS: "-Dlibwacom=false"
478 - dnf remove -y libwacom libwacom-devel
480 build-no-docs@fedora:30:
482 - .fedora-build@template
484 MESON_ARGS: "-Ddocumentation=false"
486 build-no-docs-nodeps@fedora:30:
488 - .fedora-build@template
490 MESON_ARGS: "-Ddocumentation=false"
492 - dnf remove -y doxygen graphviz
494 build-no-debuggui@fedora:30:
496 - .fedora-build@template
498 MESON_ARGS: "-Ddebug-gui=false"
500 build-no-debuggui-nodeps@fedora:30:
502 - .fedora-build@template
504 MESON_ARGS: "-Ddebug-gui=false"
506 - dnf remove -y gtk3-devel
508 build-no-tests@fedora:30:
510 - .fedora-build@template
512 MESON_ARGS: "-Dtests=false"
514 build-no-tests-nodeps@fedora:30:
516 - .fedora-build@template
518 MESON_ARGS: "-Dtests=false"
520 - dnf remove -y check-devel
524 - .fedora-build@template
526 MESON_TEST_ARGS: '--suite=valgrind --no-suite=hardware --setup=valgrind'
528 - dnf install -y valgrind
530 # Python checks, only run on Fedora
532 usr-bin-env-python@fedora:30:
534 - .fedora-build@template
537 if git grep -l '^#!/usr/bin/python'; then
538 echo "Use '/usr/bin/env python3' in the above files";
544 - .fedora-build@template
546 - dnf install -y python3-flake8
548 - flake8-3 --ignore=W501,E501,W504 $(git grep -l '^#!/usr/bin/env python3')
550 #################################################################
554 #################################################################
556 {% for distro in distributions %}
557 {{distro.name}}:{{distro.version}}@default-build:
561 - .fdo.distribution-image@{{distro.name}}
563 FDO_DISTRIBUTION_VERSION: '{{distro.version}}'
564 FDO_DISTRIBUTION_TAG: ${{distro.name.upper()}}_TAG
565 {# Where we have extra_variables defined, add them to the list #}
566 {% if distro.build is defined and distro.build.extra_variables is defined %}
567 {% for var in distro.build.extra_variables %}
571 needs: ['{{distro.name}}:{{distro.version}}@container-prep']
583 image: $FREEBSD_CONTAINER_IMAGE
585 MESON_ARGS: '--cross-file freebsd -Ddocumentation=false -Dtests=false -Depoll-dir=/freebsd/usr/local/'
586 # Can't run FreeBSD tests on Linux machine, so MESON_TEST_ARGS shouldn't be "test"
589 freebsd:11.2@default-build:
592 needs: ['freebsd:11.2@container-prep']
604 # - variable WAYLAND_WEB_TOKEN defined as type File in libinput's CI/CD settings
605 # - content of that file is the token value, as generated by the Pipeline Triggers
606 # of the wayland.freedesktop.org project.
607 - curl --request POST
608 --form "token=<$WAYLAND_WEB_TOKEN"
610 https://gitlab.freedesktop.org/api/v4/projects/wayland${SLASH}wayland${DOT}freedesktop${DOT}org/trigger/pipeline
618 - $CI_PROJECT_PATH == "libinput/libinput"