# vim: set expandtab shiftwidth=2 tabstop=8 textwidth=0 filetype=yaml: {# You're looking at the template here, so you can ignore the below warning. This is the right file to edit #} ######################################## # # # THIS FILE IS GENERATED, DO NOT EDIT # # # ######################################## # # This is a bit complicated for two reasons: # - we really want to run dnf/apt/... only once, updating on the test runner for # each job takes forever. So we create a container image for each distribution # tested, then run the tests on this container image. # # Creating a container image is time-consuming, so we only do so for pushes to # libinput directly (not merge requests) and if the current image is 'old'. # # - GitLab only allows one script: set per job but we have a bunch of commands # we need to re-run for each build (meson && ninja && etc). YAML cannot merge # arrays templates so we're screwed. # # So instead we use a default_build template and override everything with # variables. The only two variables that matter: # MESON_ARGS=-Denable-something=true # NINJA_ARGS=dist ... to run 'ninja -C builddir dist' # Note that you cannot use scripts: in any target if you expect default_build # to work. # # # All jobs must follow the naming scheme of # :@activity: # e.g. fedora:31@build-default .templates_sha: &template_sha 395535ce90eb48e260c0dff12c35d9237e22c539 # see https://docs.gitlab.com/ee/ci/yaml/#includefile include: {% for distro in distributions|sort(attribute="name") %} {% if not distro.does_not_have_ci_templates %} # {{ distro.name.capitalize() }} container builder template - project: 'freedesktop/ci-templates' ref: *template_sha file: '/templates/{{distro.name}}.yml' {% endif %} {% endfor %} stages: - prep # prep work like rebuilding the container images if there is a change - build # for actually building and testing things in a container - VM # for running the test suite in a VM - valgrind # for running the test suite under valgrind in a VM - distro # distribs test - deploy # trigger wayland's website generation - container_clean # clean up unused container images variables: ############################################################################### # This is the list of packages required to build libinput with the default # # configuration. # # # # Run dnf install/apt-get install/.. with the list of packages for your # # distribution # # # # See the documentation here: # # https://wayland.freedesktop.org/libinput/doc/latest/building_libinput.html # ############################################################################### 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' 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' 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' 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' FREEBSD_BUILD_PKGS: 'meson' FREEBSD_PKGS: 'libepoll-shim libudev-devd libevdev libwacom gtk3 libmtdev ' 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' ############################ end of package lists ############################# # these tags should be updated each time the list of packages is updated # changing these will force rebuilding the associated image # Note: these tags have no meaning and are not tied to a particular # libinput version {% for distro in distributions %} {{"%-13s"| format(distro.name.upper() + '_TAG:')}}'{{distro.tag}}' {% endfor %} {% for distro in distributions %} {% if distro.want_qemu %} QEMU_TAG: 'qemu-vm-{{distro.tag}}' {% endif %} {% endfor %} UBUNTU_EXEC: "bash .gitlab-ci/ubuntu_install.sh $UBUNTU_CUSTOM_DEBS" FREEBSD_CONTAINER_IMAGE: $CI_REGISTRY_IMAGE/freebsd/11.2:$FREEBSD_TAG FDO_UPSTREAM_REPO: libinput/libinput MESON_BUILDDIR: "build dir" NINJA_ARGS: '' MESON_ARGS: '' MESON_TEST_ARGS: '--no-suite=hardware' # udev isn't available/working properly in the containers UDEV_NOT_AVAILABLE: 1 GIT_DEPTH: 1 .policy: retry: max: 2 when: - runner_system_failure - stuck_or_timeout_failure # cancel run when a newer version is pushed to the branch interruptible: true .default_artifacts: artifacts: name: "meson-logs-$CI_JOB_NAME" when: always expire_in: 1 week paths: - $MESON_BUILDDIR/meson-logs reports: junit: $MESON_BUILDDIR/junit-*.xml ################################################################# # # # prep stage # # # ################################################################# # Re-generate the CI script and make sure it's the one currently checked in # If this job fails, re-generate the gitlab-ci.yml script, see # $SRCDIR/.gitlab-ci/generate-gitlab-ci.py # check-ci-script: image: golang:alpine stage: prep before_script: - apk add python3 py-pip git - pip3 install git+http://gitlab.freedesktop.org/freedesktop/ci-templates script: - ci-fairy generate-template - git diff --exit-code && exit 0 || true - echo "Committed gitlab-ci.yml differs from generated gitlab-ci.yml. Please verify" - exit 1 # # Verify that commit messages are as expected, signed-off, etc. # check-commit: image: golang:alpine stage: prep before_script: - apk add python3 py-pip git - pip3 install git+http://gitlab.freedesktop.org/freedesktop/ci-templates script: - ci-fairy check-commits --signed-off-by --junit-xml=results.xml except: - master@libinput/libinput variables: GIT_DEPTH: 100 artifacts: reports: junit: results.xml # # Verify that the merge request has the allow-collaboration checkbox ticked # check-merge-request: image: golang:alpine stage: prep before_script: - apk add python3 py-pip git - pip3 install git+http://gitlab.freedesktop.org/freedesktop/ci-templates script: - ci-fairy check-merge-request --require-allow-collaboration --junit-xml=results.xml artifacts: when: on_failure reports: junit: results.xml allow_failure: true # # This stage will recreate the container images only if the image # is too old or if it is missing some dependencies. # .rebuild_for_schedule: before_script: # force rebuild if schedule, reuse otherwise - if [[ $CI_PIPELINE_SOURCE == "schedule" ]] ; then export FDO_FORCE_REBUILD=1; fi {# qemu builds are only done for the latest version of any distribution #} {% for distro in distributions if distro.want_qemu %} {% set version = "{}".format(distro.versions|last()) %} {{distro.name}}:{{version}}@qemu-prep: extends: - .fdo.qemu-build@{{distro.name}} - .policy - .rebuild_for_schedule stage: prep tags: - kvm variables: GIT_STRATEGY: none FDO_DISTRIBUTION_VERSION: {{version}} FDO_DISTRIBUTION_TAG: $QEMU_TAG FDO_DISTRIBUTION_PACKAGES: ${{distro.name.upper()}}_QEMU_RPMS allow_failure: true {% endfor %} {% for distro in distributions %} {% for version in distro.versions %} {{distro.name}}:{{version}}@container-prep: extends: - .fdo.container-build@{{distro.name}} - .policy - .rebuild_for_schedule stage: prep variables: GIT_STRATEGY: none FDO_DISTRIBUTION_VERSION: '{{version}}' FDO_DISTRIBUTION_PACKAGES: ${{distro.name.upper()}}_PACKAGES FDO_DISTRIBUTION_TAG: ${{distro.name.upper()}}_TAG {% if version == 'ubuntu'%} FDO_DISTRIBUTION_EXEC: $UBUNTU_EXEC {% endif %} {% endfor %} {% endfor %} # Note that we want to use the latest buildah image, and for that # we use one of the .fdo.container-build@distribution by replacing the # `script`. .freebsd@container-prep: extends: - .policy - .fdo.container-build@fedora stage: prep script: # log in to the registry - podman login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY # get the full container image name - export IMAGE=freebsd/$FREEBSD_VERSION:$FREEBSD_TAG # force rebuild if schedule, reuse otherwise - if [[ $CI_PIPELINE_SOURCE == "schedule" ]] ; then touch .scheduled; fi # pull the latest upstream image if it exists - test -e .scheduled || skopeo copy --dest-creds $CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD docker://$CI_REGISTRY/$FDO_UPSTREAM_REPO/$IMAGE docker://$CI_REGISTRY_IMAGE/$IMAGE && exit 0 || true ; # check if our image is already in the current registry - test -e .scheduled || skopeo inspect docker://$CI_REGISTRY_IMAGE/$IMAGE > /dev/null && exit 0 || true ; - export BUILDAH_RUN="buildah run --isolation chroot" - export BUILDAH_COMMIT="buildah commit --format docker" - buildcntr=$(buildah from --quiet myfreeweb/freebsd-cross:latest) - $BUILDAH_RUN $buildcntr apk add --no-cache $FREEBSD_BUILD_PKGS - $BUILDAH_RUN $buildcntr pkg -r /freebsd update -f - $BUILDAH_RUN $buildcntr pkg -r /freebsd install -y $FREEBSD_PKGS - buildah config --workingdir /app $buildcntr # tag the current container - $BUILDAH_COMMIT $buildcntr $FREEBSD_CONTAINER_IMAGE # clean up the working container - buildah rm $buildcntr # push the container image to the libinput registry - podman push --quiet $FREEBSD_CONTAINER_IMAGE - skopeo copy --dest-creds $CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD docker://$FREEBSD_CONTAINER_IMAGE docker://$CI_REGISTRY_IMAGE/freebsd/$FREEBSD_VERSION:$CI_JOB_ID freebsd:11.2@container-prep: extends: - .freebsd@container-prep variables: GIT_STRATEGY: none FREEBSD_VERSION: "11.2" ################################################################# # # # container clean stage # # run during the clean stage # # # ################################################################# # # This stage will look for the container images we currently have in # the registry and will remove any that are not tagged with the provided # $container_image:$tag # .container-clean: stage: container_clean extends: - .policy image: golang:alpine before_script: - apk add python3 py-pip git - pip3 install git+http://gitlab.freedesktop.org/freedesktop/ci-templates script: # Go to your Profile, Settings, Access Tokens # Create a personal token with 'api' scope, copy the value. # Go to CI/CD, Schedules, schedule a new monthly job (or edit the existing one) # Define a variable of type File named AUTHFILE. Content is that token # value. - ci-fairy -v --authfile $AUTHFILE delete-image --repository $FDO_DISTRIBUTION_NAME/$FDO_DISTRIBUTION_VERSION --exclude-tag $FDO_DISTRIBUTION_TAG dependencies: [] allow_failure: true only: - schedules {% for distro in distributions %} {% for version in distro.versions %} {{distro.name}}:{{version}}@container-clean: extends: - .container-clean variables: GIT_STRATEGY: none {{distro.name.upper()}}_VERSION: '{{version}}' CURRENT_CONTAINER_IMAGE: $CI_REGISTRY_IMAGE/{{distro.name}}/$FDO_DISTRIBUTION_VERSION:$FDO_DISTRIBUTION_TAG FDO_DISTRIBUTION_VERSION: '{{version}}' FDO_DISTRIBUTION_TAG: ${{distro.name.upper()}}_TAG {% endfor %} {% endfor %} freebsd:11.2@container-clean: extends: - .container-clean variables: GIT_STRATEGY: none CURRENT_CONTAINER_IMAGE: $FREEBSD_CONTAINER_IMAGE ################################################################# # # # build stage # # # ################################################################# .build@template: extends: - .policy - .default_artifacts stage: build script: - .gitlab-ci/meson-build.sh dependencies: [] # # Fedora # .check_tainted: &check_tainted | # make sure the kernel is not tainted if [[ "$(ssh localhost -p 5555 cat /proc/sys/kernel/tainted)" -gt 0 ]]; then echo tainted kernel ; exit 1 ; fi # Run in a test suite. Special variables: # - SUITES: the meson test suites to run, or # - SUITE_NAMES: all elements will be expanded to libinput-test-suite-$value # Set one or the other, not both. .test-suite-vm: extends: - .policy - .fdo.distribution-image@fedora stage: VM tags: - kvm variables: MESON_BUILDDIR: build_dir # remove the global --no-suite=hardware MESON_TEST_ARGS: '' before_script: - if ! [[ -z $SUITE_NAMES ]]; then SUITES=$(echo $SUITE_NAMES | sed 's/\([^ ]*\)/libinput-test-suite-\1/g'); fi - echo "Testing $SUITES" script: # start our vm, no args required - /app/start_vm.sh || (echo "Error - Failed to start the VM." && exit 1) - *check_tainted - "scp -P 5555 -r $PWD localhost:" - echo "CI_JOB_ID=\"$CI_JOB_ID\"" > sshenv - echo "CI_JOB_NAME=\"$CI_JOB_NAME\"" >> sshenv - echo "MESON_ARGS=\"$MESON_ARGS\"" >> sshenv - echo "MESON_BUILDDIR=\"$MESON_BUILDDIR\"" >> sshenv - echo "MESON_TEST_ARGS=\"$MESON_TEST_ARGS $SUITES\"" >> sshenv - echo "NINJA_ARGS=\"$NINJA_ARGS\"" >> sshenv - "scp -P 5555 sshenv localhost:~/$CI_PROJECT_NAME/.meson_environment" - ssh localhost -p 5555 "cd $CI_PROJECT_NAME ; .gitlab-ci/meson-build.sh" && touch .success || true # no matter the results of the tests, we want to fetch the logs - scp -P 5555 -r localhost:$CI_PROJECT_NAME/$MESON_BUILDDIR . - *check_tainted - ssh localhost -p 5555 halt || true - sleep 2 - pkill qemu || true - if [[ ! -e .success ]] ; then exit 1 ; fi artifacts: name: "qemu-meson-logs-$CI_JOB_NAME" when: always expire_in: 1 week paths: - $MESON_BUILDDIR/meson-logs - console.out reports: junit: $MESON_BUILDDIR/junit-*.xml allow_failure: true retry: max: 2 when: script_failure {# qemu tests are only done for the latest version of any distribution #} {% for distro in distributions if distro.want_qemu %} {% set version = "{}".format(distro.versions|last()) %} .{{distro.name}}:{{version}}@test-suite-vm: extends: - .test-suite-vm variables: FDO_DISTRIBUTION_VERSION: {{version}} FDO_DISTRIBUTION_TAG: $QEMU_TAG needs: - "{{distro.name}}:{{version}}@qemu-prep" {% for suite in test_suites %} vm-{{suite.name}}: extends: - .{{distro.name}}:{{version}}@test-suite-vm variables: SUITE_NAMES: '{{suite.suites}}' vm-{{suite.name}}-no-libwacom: extends: - vm-{{suite.name}} variables: MESON_ARGS: '-Dlibwacom=false' {% endfor %} {% for suite in test_suites %} vm-valgrind-{{suite.name}}: stage: valgrind extends: - vm-{{suite.name}} variables: MESON_TEST_ARGS: '--setup=valgrind' {% endfor %} {% endfor %}{# for if distro.want_qemu #} {% for distro in distributions if distro.use_for_custom_build_tests %} {% set version = "{}".format(distro.versions|last()) %} .{{distro.name}}-build@template: extends: - .fdo.distribution-image@fedora - .build@template variables: FDO_DISTRIBUTION_VERSION: '{{version}}' FDO_DISTRIBUTION_TAG: ${{distro.name.upper()}}_TAG needs: - "{{distro.name}}:{{version}}@container-prep" default-build-release@{{distro.name}}:{{version}}: stage: distro extends: - .{{distro.name}}-build@template variables: MESON_ARGS: "-Dbuildtype=release" CFLAGS: "-Werror" scan-build@{{distro.name}}:{{version}}: extends: - .{{distro.name}}-build@template variables: NINJA_ARGS: scan-build MESON_TEST_ARGS: '' before_script: - dnf install -y clang-analyzer findutils after_script: - test ! -d "$MESON_BUILDDIR"/meson-logs/scanbuild && exit 0 - test $(find "$MESON_BUILDDIR"/meson-logs/scanbuild -maxdepth 0 ! -empty -exec echo "not empty" \; | wc -l) -eq 0 && exit 0 - echo "Check scan-build results" - /bin/false # Below jobs are build option combinations. We only # run them on one image, they shouldn't fail on one distro # when they succeed on another. build-no-libwacom@{{distro.name}}:{{version}}: extends: - .{{distro.name}}-build@template variables: MESON_ARGS: "-Dlibwacom=false" build-no-libwacom-nodeps@{{distro.name}}:{{version}}: extends: - .{{distro.name}}-build@template variables: MESON_ARGS: "-Dlibwacom=false" before_script: - dnf remove -y libwacom libwacom-devel build-no-docs@{{distro.name}}:{{version}}: extends: - .{{distro.name}}-build@template variables: MESON_ARGS: "-Ddocumentation=false" build-no-docs-nodeps@{{distro.name}}:{{version}}: extends: - .{{distro.name}}-build@template variables: MESON_ARGS: "-Ddocumentation=false" before_script: - dnf remove -y doxygen graphviz build-no-debuggui@{{distro.name}}:{{version}}: extends: - .{{distro.name}}-build@template variables: MESON_ARGS: "-Ddebug-gui=false" build-no-debuggui-nodeps@{{distro.name}}:{{version}}: extends: - .{{distro.name}}-build@template variables: MESON_ARGS: "-Ddebug-gui=false" before_script: - dnf remove -y gtk3-devel build-no-tests@{{distro.name}}:{{version}}: extends: - .{{distro.name}}-build@template variables: MESON_ARGS: "-Dtests=false" build-no-tests-nodeps@{{distro.name}}:{{version}}: extends: - .{{distro.name}}-build@template variables: MESON_ARGS: "-Dtests=false" before_script: - dnf remove -y check-devel valgrind@{{distro.name}}:{{version}}: extends: - .{{distro.name}}-build@template variables: MESON_TEST_ARGS: '--suite=valgrind --no-suite=hardware --setup=valgrind' before_script: - dnf install -y valgrind # Python checks, only run on Fedora usr-bin-env-python@{{distro.name}}:{{version}}: extends: - .{{distro.name}}-build@template script: - | if git grep -l '^#!/usr/bin/python'; then echo "Use '/usr/bin/env python3' in the above files"; /bin/false fi flake8@{{distro.name}}:{{version}}: extends: - .{{distro.name}}-build@template before_script: - dnf install -y python3-flake8 script: - flake8-3 --ignore=W501,E501,W504 $(git grep -l '^#!/usr/bin/env python3') {% endfor %} ################################################################# # # # distro stage # # # ################################################################# {% for distro in distributions %} {% for version in distro.versions %} {{distro.name}}:{{version}}@default-build: stage: distro extends: - .build@template - .fdo.distribution-image@{{distro.name}} variables: FDO_DISTRIBUTION_VERSION: '{{version}}' FDO_DISTRIBUTION_TAG: ${{distro.name.upper()}}_TAG {# Where we have extra_variables defined, add them to the list #} {% if distro.build is defined and distro.build.extra_variables is defined %} {% for var in distro.build.extra_variables %} {{var}} {% endfor %} {% endif %} needs: - "{{distro.name}}:{{version}}@container-prep" {% endfor %} {% endfor %} # # FreeBSD # .freebsd@template: stage: distro extends: - .build@template image: $FREEBSD_CONTAINER_IMAGE variables: MESON_ARGS: '--cross-file freebsd -Ddocumentation=false -Dtests=false -Depoll-dir=/freebsd/usr/local/' # Can't run FreeBSD tests on Linux machine, so MESON_TEST_ARGS shouldn't be "test" MESON_TEST_ARGS: '' freebsd:11.2@default-build: extends: - .freebsd@template needs: - "freebsd:11.2@container-prep" # # deploy # wayland-web: image: alpine:latest stage: deploy script: - apk add curl # Requirements: # - variable WAYLAND_WEB_TOKEN defined as type File in libinput's CI/CD settings # - content of that file is the token value, as generated by the Pipeline Triggers # of the wayland.freedesktop.org project. - curl --request POST --form "token=<$WAYLAND_WEB_TOKEN" --form ref=master https://gitlab.freedesktop.org/api/v4/projects/wayland${SLASH}wayland${DOT}freedesktop${DOT}org/trigger/pipeline except: refs: - schedules only: refs: - master variables: - $CI_PROJECT_PATH == "libinput/libinput" dependencies: [] variables: DOT: "%2E" SLASH: "%2F"