# vim:foldmethod=marker variables: DEBIAN_FRONTEND: noninteractive LC_ALL: C.UTF-8 GIT_SUBMODULE_STRATEGY: recursive GIT_STRATEGY: clone # sometimes unclean submodule dirs otherwise RESPDIFF_PRIORITY: 5 DISTROTEST_PRIORITY: 6 RESPDIFF_COUNT: 1 RESPDIFF_FORCE: 0 RESPERF_FORCE: 0 KNOT_VERSION: '2.8' LIBKRES_ABI: 9 LIBKRES_NAME: libkres MESON_TEST: meson test -C build_ci* -t 2 --print-errorlogs PREFIX: $CI_PROJECT_DIR/.local image: $CI_REGISTRY/knot/knot-resolver/ci/debian-buster:knot-$KNOT_VERSION stages: - build - test - extended - deploy - deploy-test # build {{{ .build: &build stage: build except: refs: - master variables: - $SKIP_CI == "1" artifacts: when: always paths: - .local - build_ci* - build_dist/meson-dist/*.tar.xz tags: - docker - linux - amd64 archive: <<: *build variables: GIT_COMMITER_NAME: 'ci' EMAIL: 'ci@nic' except: null script: - > if [[ -z "${CI_COMMIT_TAG}" ]]; then ./scripts/make-dev-archive.sh else meson build_dist; ninja -C build_dist dist fi build: <<: *build script: # sendmmsg: deckard can't handle that syscall - meson build_ci --default-library=static --prefix=$PREFIX -Dwerror=true -Dextra_tests=enabled -Dsendmmsg=disabled - ninja -C build_ci - ninja -C build_ci install >/dev/null - ${MESON_TEST} --suite unit --suite config build-asan: <<: *build script: - meson build_ci_asan --default-library=static --prefix=$PREFIX -Db_sanitize=address -Dextra_tests=enabled - ninja -C build_ci_asan - ninja -C build_ci_asan install >/dev/null # TODO _leaks: not sure what exactly is wrong in leak detection on config tests # TODO skip_asan: all three of these disappear locally when using gcc 9.1 (except some leaks) - ASAN_OPTIONS=detect_leaks=0 ${MESON_TEST} --suite unit --suite config --no-suite skip_asan # NOTE: build for turris when meson is available and packaging files updated #build:turris: # <<: *build # image: $CI_REGISTRY/knot/knot-resolver/ci/turris:omnia # script: # - ./scripts/make-archive.sh # - cp knot-resolver*.tar.xz /tmp/turris/dl/ # - ./scripts/make-distrofiles.sh # - cp -r distro/turris /tmp/turris/package/knot-resolver # - pushd /tmp/turris # - export PATH=$PATH:$PWD/staging_dir/toolchain-*/bin # - USE_CCACHE=n make CC=arm-openwrt-linux-gcc CXX=arm-openwrt-linux-g++ LD=arm-openwrt-linux-ld -C $PWD V=s # - popd # - cp /tmp/turris/bin/mvebu-musl/packages/base/*.ipk ./ # artifacts: # paths: # - "*.ipk" kres-gen: <<: *build tags: - docker script: - meson build_ci_lib --prefix=$PREFIX - ninja -C build_ci_lib daemon/kresd - ninja -C build_ci_lib kres-gen - git diff --quiet || (git diff; exit 1) # }}} # test {{{ .test: &test stage: test except: refs: - master variables: - $SKIP_CI == "1" tags: - docker - linux - amd64 dependencies: - build before_script: # meson detects changes and performs useless rebuild; hide the log - ninja -C build_ci* &>/dev/null - rm build_ci*/meson-logs/testlog*.txt # start with clean testlog artifacts: when: always paths: - build_ci*/meson-logs/testlog*.txt - tmpdeckard* .test_flaky: &test_flaky <<: *test retry: max: 1 when: - script_failure .test_nodep: &test_nodep stage: test except: refs: - master variables: - $SKIP_CI == "1" dependencies: [] # do not download build artifacts tags: - docker build:darwin: <<: *test_nodep when: delayed start_in: 3 minutes # give the build in Travis CI time to finish script: - ci/travis.py ${CI_COMMIT_REF_NAME} deckard: <<: *test_flaky variables: TMPDIR: $CI_PROJECT_DIR script: - ${MESON_TEST} --suite integration doc: <<: *test_nodep when: delayed start_in: '30 seconds' script: - meson build_doc -Ddoc=enabled - ninja -C build_doc doc artifacts: expire_in: 1 hour paths: - doc/html docker: <<: *test_nodep image: docker:latest tags: - dind variables: DOCKER_IMAGE_NAME: knot-resolver-test:${CI_COMMIT_SHA} script: - docker build --no-cache -t ${DOCKER_IMAGE_NAME} . - echo "quit()" | docker run -i ${DOCKER_IMAGE_NAME} after_script: # remove dangling images to avoid running out of disk space - docker rmi ${DOCKER_IMAGE_NAME} - docker rmi $(docker images -f "dangling=true" -q) lint:other: <<: *test_nodep when: delayed start_in: '30 seconds' stage: test script: - meson build_ci_lint &>/dev/null - ninja -C build_ci* pylint - ninja -C build_ci* flake8 - ninja -C build_ci* luacheck lint:pedantic: <<: *test_nodep when: delayed start_in: '30 seconds' tags: - docker - linux - amd64 script: - meson build_pedantic_gcc -Dwerror=true -Dc_args='-Wpedantic' -Dextra_tests=enabled - ninja -C build_pedantic_gcc - > CC=clang CXX=clang++ meson build_pedantic_clang -Dwerror=true -Dextra_tests=enabled -Dc_args=' -Wpedantic -Wno-newline-eof -Wno-gnu-zero-variadic-macro-arguments -Wno-gnu-folding-constant' - ninja -C build_pedantic_clang lint:scan-build: <<: *test stage: test artifacts: when: on_failure expire_in: '1 day' paths: - build_ci*/meson-logs/scanbuild before_script: [] script: - export SCANBUILD="scan-build --status-bugs -no-failure-reports $(./scripts/get-scanbuild-args.sh)" - ninja -C build_ci* scan-build || true - test "$(ls build_ci*/meson-logs/scanbuild/*/report-*.html | wc -l)" = 29 # we have this many errors ATM :-) lint:tidy: <<: *test artifacts: script: - ninja -C build_ci* tidy .pkgbuild: &pkgbuild stage: test except: refs: - master variables: - $SKIP_CI == "1" image: $CI_REGISTRY/knot/knot-resolver/ci/fedora only: # trigger job only in repos under our control - branches@knot/knot-resolver - branches@knot/knot-resolver-security dependencies: - archive artifacts: when: always paths: - epel-7-x86_64/ - fedora-29-x86_64/ - "*.src.rpm" tags: - privileged # mock requires additional capabilities (e.g. mount) retry: max: 1 when: - script_failure pkg:epel-7: <<: *pkgbuild script: - ./scripts/make-srpm.sh - mock --no-clean --dnf --old-chroot -r epel-7-x86_64 --rebuild *.src.rpm || (cat /var/lib/mock/epel-7-x86_64/result/build.log; false) after_script: - mv /var/lib/mock/epel-7-x86_64/result epel-7-x86_64 pkg:fedora-29: <<: *pkgbuild script: - ./scripts/make-srpm.sh - mock --no-clean --old-chroot -r fedora-29-x86_64 --rebuild *.src.rpm || (cat /var/lib/mock/fedora-29-x86_64/result/build.log; false) after_script: - mv /var/lib/mock/fedora-29-x86_64/result fedora-29-x86_64 respdiff:basic: <<: *test dependencies: - build-asan script: - ulimit -n "$(ulimit -Hn)" # applies only for kresd ATM - ./ci/respdiff/start-resolvers.sh - ./ci/respdiff/run-respdiff-tests.sh udp - cat results/respdiff.txt - echo 'test if mismatch rate < 1.0 %' - grep -q '^target disagrees.*0\.[0-9][0-9] %' results/respdiff.txt after_script: - killall --wait kresd artifacts: when: always paths: - kresd.log* - results/*.txt - results/*.png - results/respdiff.db/data.mdb* - ./*.info tags: - docker - linux - amd64 root.hints: <<: *test_nodep only: refs: - /^release.*$/ script: - scripts/update-root-hints.sh test:valgrind: <<: *test when: delayed start_in: '30 seconds' script: - ${MESON_TEST} --suite unit --suite config --no-suite snowflake --wrap="valgrind --leak-check=full --trace-children=yes --quiet --suppressions=/lj.supp" - MESON_TESTTHREADS=1 ${MESON_TEST} --wrap="valgrind --leak-check=full --trace-children=yes --quiet --suppressions=/lj.supp" --suite snowflake # }}} # extended {{{ pytests: <<: *test_flaky dependencies: - build-asan stage: extended # use this stage to avoid clash with other resource-intensive jobs script: - ${MESON_TEST} --suite pytests .respdiff: &respdiff stage: extended dependencies: [] only: # trigger job only in repos under our control - branches@knot/knot-resolver - branches@knot/knot-resolver-security except: refs: - master variables: - $SKIP_CI == "1" script: - git diff-index --name-only origin/master | grep -qEv '^(AUTHORS|ci/|config.mk|COPYING|distro/|doc/|etc/|NEWS|README.md|scripts/|tests/|\.gitignore|\.gitlab-ci\.yml|\.travis\.yml)' || test $RESPDIFF_FORCE -gt 0 || exit 0 - test ! -f /var/tmp/respdiff-jobs/buffer/buffer_$RESPDIFF_TEST_stats.json || test $RESPDIFF_FORCE -gt 0 || ( echo "Reference unstable, try again in ~3h or use RESPDIFF_FORCE=1."; exit 1 ) - export LABEL=gl$(date +%s) - export COMMITDIR="/var/tmp/respdiff-jobs/$(git rev-parse --short HEAD)-$LABEL" - export TESTDIR="$COMMITDIR/$RESPDIFF_TEST" - ln -s $COMMITDIR respdiff_commitdir - > sudo -u respdiff /var/opt/respdiff/contrib/job_manager/submit.py -w -p $RESPDIFF_PRIORITY -c $RESPDIFF_COUNT $(sudo -u respdiff /var/opt/respdiff/contrib/job_manager/create.py "$(git rev-parse --short HEAD)" -l $LABEL -t $RESPDIFF_TEST --knot-branch=$KNOT_VERSION --respdiff-stats /var/tmp/respdiff-jobs/ref_current/*_${RESPDIFF_TEST}_stats.json) - for f in $TESTDIR/*.json; do test -s "$f" || (cat $TESTDIR/*stderr*; exit 1); done - sudo -u respdiff /var/opt/respdiff/contrib/job_manager/plot_ref.sh $TESTDIR/.. /var/tmp/respdiff-jobs/ref_current $RESPDIFF_TEST after_script: - 'cp -t . respdiff_commitdir/$RESPDIFF_TEST/j* ||:' - 'cp -t . respdiff_commitdir/*$RESPDIFF_TEST*.png ||:' - 'cat respdiff_commitdir/$RESPDIFF_TEST/*histogram.tar.gz | tar -xf - -i ||:' artifacts: when: always expire_in: 1 week paths: - ./j* - ./*.png - ./*histogram/* tags: - respdiff fwd-tls6-kresd.udp6: <<: *respdiff variables: RESPDIFF_TEST: shortlist.fwd-tls6-kresd.udp6.j256 fwd-udp6-kresd.udp6: <<: *respdiff variables: RESPDIFF_TEST: shortlist.fwd-udp6-kresd.udp6.j384 iter.udp6: <<: *respdiff variables: RESPDIFF_TEST: shortlist.iter.udp6.j384 iter.tls6: <<: *respdiff variables: RESPDIFF_TEST: shortlist.iter.tls6.j384 fwd-udp6-unbound.udp6: <<: *respdiff variables: RESPDIFF_TEST: shortlist.fwd-udp6-unbound.udp6.j256 fwd-udp6-unbound.tcp6: <<: *respdiff variables: RESPDIFF_TEST: shortlist.fwd-udp6-unbound.tcp6.j256 fwd-udp6-unbound.tls6: <<: *respdiff variables: RESPDIFF_TEST: shortlist.fwd-udp6-unbound.tls6.j256 .resperf: &resperf stage: extended dependencies: [] only: # trigger job only in repos under our control - branches@knot/knot-resolver - branches@knot/knot-resolver-security except: refs: - master variables: - $SKIP_CI == "1" script: - git diff-index --name-only origin/master | grep -qEv '^(AUTHORS|ci/|config.mk|COPYING|distro/|doc/|etc/|NEWS|README.md|scripts/|tests/|\.gitignore|\.gitlab-ci\.yml|\.travis\.yml)' || test $RESPERF_FORCE -gt 0 || exit 0 - export LABEL=gl$(date +%s) - export COMMITDIR="/var/tmp/respdiff-jobs/$(git rev-parse --short HEAD)-$LABEL" - export TESTDIR="$COMMITDIR/$RESPERF_TEST" - ln -s $COMMITDIR resperf_commitdir - > sudo -u respdiff /var/opt/respdiff/contrib/job_manager/submit.py -w $(sudo -u respdiff /var/opt/respdiff/contrib/job_manager/create.py "$(git rev-parse --short HEAD)" -l $LABEL --asan -t $RESPERF_TEST --knot-branch=$KNOT_VERSION) - export EXITCODE=$(cat $TESTDIR/j*_exitcode) - if [[ "$EXITCODE" == "0" ]]; then cat $TESTDIR/j*_resperf.txt; else cat $TESTDIR/j*_kresd.docker.txt; fi - exit $EXITCODE after_script: - 'cp -t . resperf_commitdir/$RESPERF_TEST/j* ||:' artifacts: when: always expire_in: 1 week paths: - ./j* tags: - respdiff resperf:fwd-tls6.udp-asan: <<: *resperf variables: RESPERF_TEST: resperf.fwd-tls6.udp resperf:fwd-udp6.udp-asan: <<: *resperf variables: RESPERF_TEST: resperf.fwd-udp6.udp resperf:iter.udp-asan: <<: *resperf variables: RESPERF_TEST: resperf.iter.udp # }}} # deploy {{{ # copy snapshot of current master to nightly branch for further processing # (this is workaround for missing complex conditions for job limits in Gitlab) nightly:copy: stage: deploy only: variables: - $CREATE_NIGHTLY == "1" refs: - master@knot/knot-resolver dependencies: [] script: # delete nightly branch - 'curl --request PUT --header "PRIVATE-TOKEN: $GITLAB_API_TOKEN" "https://gitlab.labs.nic.cz/api/v4/projects/147/repository/branches/nightly/unprotect"' - 'curl --request DELETE --header "PRIVATE-TOKEN: $GITLAB_API_TOKEN" "https://gitlab.labs.nic.cz/api/v4/projects/147/repository/branches/nightly"' # recreate nightly branch from current master - 'curl --request POST --header "PRIVATE-TOKEN: $GITLAB_API_TOKEN" "https://gitlab.labs.nic.cz/api/v4/projects/147/repository/branches?branch=nightly&ref=master"' - 'curl --request PUT --header "PRIVATE-TOKEN: $GITLAB_API_TOKEN" "https://gitlab.labs.nic.cz/api/v4/projects/147/repository/branches/nightly/protect"' obs:trigger: &obs_trigger stage: deploy only: variables: - $OBS_REPO dependencies: - archive environment: name: OBS/$OBS_REPO url: https://build.opensuse.org/package/show/home:CZ-NIC:$OBS_REPO/knot-resolver tags: - respdiff allow_failure: false script: - scripts/make-distrofiles.sh - echo y | scripts/build-in-obs.sh $OBS_REPO obs:release: <<: *obs_trigger only: - tags variables: OBS_REPO: knot-resolver-latest when: manual # }}} # deploy-test {{{ .deploytest: &deploytest stage: deploy-test only: variables: - $OBS_REPO =~ /^knot-resolver-devel|knot-dns-devel|knot-resolver-testing$/ - $CI_COMMIT_TAG variables: OBS_REPO: knot-resolver-latest when: delayed start_in: 3 minutes # give OBS build some time tags: - respdiff obs:build:all: <<: *deploytest script: - "osc results home:CZ-NIC:$OBS_REPO knot-resolver -w" - version=$(sed 's/^v//' <(git describe --exact-match HEAD || git rev-parse --short HEAD) ) - > # check version only for one (reliable) repo to avoid false negatives ! osc ls -b home:CZ-NIC:$OBS_REPO knot-resolver Debian_9.0 x86_64 | \ grep -E '(rpm|deb|tar\.xz)$' | grep -v $version || \ (echo "ERROR: version mismatch"; exit 1) - > ! osc results home:CZ-NIC:$OBS_REPO knot-resolver --csv | \ grep -Ev 'disabled|excluded|Rawhide' | grep -v 'succeeded' -q || \ (echo "ERROR: build(s) failed"; exit 1) .distrotest: &distrotest <<: *deploytest script: - "osc results home:CZ-NIC:$OBS_REPO knot-resolver -a x86_64 -r $DISTROTEST_REPO -w" - > osc results home:CZ-NIC:$OBS_REPO knot-resolver -a x86_64 -r $DISTROTEST_REPO --csv | grep 'succeeded|$' -q || \ (echo "ERROR: build failed"; exit 1) - export LABEL="gl$(date +%s)_$OBS_REPO" - export COMMITDIR="/var/tmp/respdiff-jobs/$(git rev-parse --short HEAD)-$LABEL" - export TESTDIR="$COMMITDIR/distrotest.$DISTROTEST_NAME" - ln -s $COMMITDIR distrotest_commitdir - sudo -u respdiff /var/opt/respdiff/contrib/job_manager/submit.py -w -p $DISTROTEST_PRIORITY $(sudo -u respdiff /var/opt/respdiff/contrib/job_manager/create.py "$(git rev-parse --short HEAD)" -l $LABEL -t distrotest.$DISTROTEST_NAME --obs-repo $OBS_REPO) - export EXITCODE=$(cat $TESTDIR/j*_exitcode) - if [[ "$EXITCODE" != "0" ]]; then cat $TESTDIR/j*_{vagrant.log.txt,stdout.txt}; fi - exit $EXITCODE after_script: - 'cp -t . distrotest_commitdir/distrotest.$DISTROTEST_NAME/j* ||:' artifacts: when: always expire_in: 1 week paths: - ./j* obs:centos7:x86_64: <<: *distrotest variables: OBS_REPO: knot-resolver-latest DISTROTEST_NAME: centos7 DISTROTEST_REPO: CentOS_7_EPEL obs:debian9:x86_64: <<: *distrotest variables: OBS_REPO: knot-resolver-latest DISTROTEST_NAME: debian9 DISTROTEST_REPO: Debian_9.0 obs:debian10:x86_64: <<: *distrotest variables: OBS_REPO: knot-resolver-latest DISTROTEST_NAME: debian10 DISTROTEST_REPO: Debian_10 obs:fedora29:x86_64: <<: *distrotest variables: OBS_REPO: knot-resolver-latest DISTROTEST_NAME: fedora29 DISTROTEST_REPO: Fedora_29 obs:fedora30:x86_64: <<: *distrotest variables: OBS_REPO: knot-resolver-latest DISTROTEST_NAME: fedora30 DISTROTEST_REPO: Fedora_30 obs:leap15:x86_64: <<: *distrotest variables: OBS_REPO: knot-resolver-latest DISTROTEST_NAME: leap15 DISTROTEST_REPO: openSUSE_Leap_15.0 obs:ubuntu1604:x86_64: <<: *distrotest variables: OBS_REPO: knot-resolver-latest DISTROTEST_NAME: ubuntu1604 DISTROTEST_REPO: xUbuntu_16.04 obs:ubuntu1804:x86_64: <<: *distrotest variables: OBS_REPO: knot-resolver-latest DISTROTEST_NAME: ubuntu1804 DISTROTEST_REPO: xUbuntu_18.04 obs:ubuntu1904:x86_64: <<: *distrotest variables: OBS_REPO: knot-resolver-latest DISTROTEST_NAME: ubuntu1904 DISTROTEST_REPO: xUbuntu_19.04 # }}}