variables: # Not normally needed, but may be if some script uses `apt-get install`. DEBIAN_FRONTEND: noninteractive # Locale settings do not affect the build, but might affect tests. LC_ALL: C CI_REGISTRY_IMAGE: registry.gitlab.isc.org/isc-projects/images/bind9 CCACHE_DIR: "/ccache" SOFTHSM2_CONF: "/var/tmp/softhsm2/softhsm2.conf" # VirtualBox driver needs to set build_dir to "/builds" in gitlab-runner.toml KYUA_RESULT: "$CI_PROJECT_DIR/kyua.results" GIT_DEPTH: 1 BUILD_PARALLEL_JOBS: 6 TEST_PARALLEL_JOBS: 6 CONFIGURE: ./configure CLANG: clang-12 SCAN_BUILD: scan-build-12 ASAN_SYMBOLIZER_PATH: /usr/lib/llvm-12/bin/llvm-symbolizer CLANG_FORMAT: clang-format-12 CFLAGS_COMMON: -fno-omit-frame-pointer -fno-optimize-sibling-calls -O1 -g -Wall -Wextra # Pass run-time flags to AddressSanitizer to get core dumps on error. ASAN_OPTIONS_COMMON: abort_on_error=1:disable_coredump=0:unmap_shadow_on_exit=1 TSAN_OPTIONS_COMMON: "disable_coredump=0 second_deadlock_stack=1 history_size=7 log_exe_name=true log_path=tsan external_symbolizer_path=/usr/lib/llvm-12/bin/llvm-symbolizer" TARBALL_COMPRESSOR: xz TARBALL_EXTENSION: xz INSTALL_PATH: "${CI_PROJECT_DIR}/.local" # Disable pytest's "cacheprovider" plugin to prevent it from creating # cross-testrun files as there is no need to use that feature in CI. PYTEST_ADDOPTS: "-p no:cacheprovider" # Default platforms to run "stress" tests on BIND_STRESS_TEST_OS: linux BIND_STRESS_TEST_ARCH: amd64 stages: - precheck - build - unit - system - performance - docs - push - postcheck - release ### Runner Tag Templates .libvirt-amd64: &libvirt_amd64 tags: - libvirt - amd64 .linux-amd64: &linux_amd64 tags: - linux - amd64 .linux-i386: &linux_i386 tags: - linux - i386 .linux-stress-amd64: &linux_stress_amd64 tags: - amd64 - aws - linux-stress - stress .linux-stress-arm64: &linux_stress_arm64 tags: - aarch64 - aws - linux-stress - stress .freebsd-stress-amd64: &freebsd_stress_amd64 tags: - amd64 - aws - bsd-stress - stress .windows-amd64: &windows_amd64 tags: - windows - amd64 ### Docker Image Templates # Alpine Linux .alpine-3.14-amd64: &alpine_3_14_amd64_image image: "$CI_REGISTRY_IMAGE:alpine-3.14-amd64" <<: *linux_amd64 # CentOS .centos-centos7-amd64: ¢os_centos7_amd64_image image: "$CI_REGISTRY_IMAGE:centos-centos7-amd64" <<: *linux_amd64 .centos-centos8-amd64: ¢os_centos8_amd64_image image: "$CI_REGISTRY_IMAGE:centos-centos8-amd64" <<: *linux_amd64 # Debian .debian-stretch-amd64: &debian_stretch_amd64_image image: "$CI_REGISTRY_IMAGE:debian-stretch-amd64" <<: *linux_amd64 .debian-buster-amd64: &debian_buster_amd64_image image: "$CI_REGISTRY_IMAGE:debian-buster-amd64" <<: *linux_amd64 .debian-sid-amd64: &debian_sid_amd64_image image: "$CI_REGISTRY_IMAGE:debian-sid-amd64" <<: *linux_amd64 .debian-sid-i386: &debian_sid_i386_image image: "$CI_REGISTRY_IMAGE:debian-sid-i386" <<: *linux_i386 # openSUSE Tumbleweed .tumbleweed-latest-amd64: &tumbleweed_latest_amd64_image image: "$CI_REGISTRY_IMAGE:tumbleweed-latest-amd64" <<: *linux_amd64 # Fedora .fedora-34-amd64: &fedora_34_amd64_image image: "$CI_REGISTRY_IMAGE:fedora-34-amd64" <<: *linux_amd64 .fedora-34-arm64: &fedora_34_arm64_image image: "$CI_REGISTRY_IMAGE:fedora-34-arm64" <<: *linux_stress_arm64 # Ubuntu .ubuntu-bionic-amd64: &ubuntu_bionic_amd64_image image: "$CI_REGISTRY_IMAGE:ubuntu-bionic-amd64" <<: *linux_amd64 .ubuntu-focal-amd64: &ubuntu_focal_amd64_image image: "$CI_REGISTRY_IMAGE:ubuntu-focal-amd64" <<: *linux_amd64 # Windows .windows-server-2016-amd64: &windows_server_2016_amd64_image image: "$CI_REGISTRY_IMAGE:windows-server-2016-amd64" <<: *windows_amd64 # Base image # This is a meta image that is used as a base for non-specific jobs .base: &base_image <<: *debian_buster_amd64_image ### QCOW2 Image Templates .freebsd-11-amd64: &freebsd_11_amd64_image image: "freebsd-11.4-x86_64" <<: *libvirt_amd64 .freebsd-12-amd64: &freebsd_12_amd64_image image: "freebsd-12.2-x86_64" <<: *libvirt_amd64 .freebsd-13-amd64: &freebsd_13_amd64_image image: "freebsd-13.0-x86_64" <<: *libvirt_amd64 .openbsd-amd64: &openbsd_amd64_image image: "openbsd-6.9-x86_64" <<: *libvirt_amd64 ### Job Templates .default-triggering-rules: &default_triggering_rules only: - merge_requests - tags - web - schedules .release-branch-triggering-rules: &release_branch_triggering_rules only: - merge_requests - tags - web - schedules - main@isc-projects/bind9 - /^v9_[1-9][0-9]$/@isc-projects/bind9 .schedules-tags-web-triggering-rules: &schedules_tags_web_triggering_rules only: - schedules - tags - web .precheck: &precheck_job <<: *default_triggering_rules <<: *base_image stage: precheck .autoconf: &autoconf_job <<: *release_branch_triggering_rules <<: *base_image stage: precheck script: - autoreconf -fi artifacts: untracked: true expire_in: "1 day" .configure: &configure | ${CONFIGURE} \ --disable-maintainer-mode \ --enable-developer \ --with-libtool \ --disable-static \ --enable-option-checking=fatal \ --enable-dnstap \ --with-cmocka \ --with-libxml2 \ --with-json-c \ --without-make-clean \ $EXTRA_CONFIGURE \ || (test -s config.log && cat config.log; exit 1) .build: &build_job <<: *default_triggering_rules stage: build before_script: - test -w "${CCACHE_DIR}" && export PATH="/usr/lib/ccache:${PATH}" - test -n "${OOT_BUILD_WORKSPACE}" && mkdir "${OOT_BUILD_WORKSPACE}" && cd "${OOT_BUILD_WORKSPACE}" script: - *configure - test -n "${SKIP_MAKE_DEPEND}" || make -j${BUILD_PARALLEL_JOBS:-1} depend 2>&1 | tee make-depend.log - test -n "${SKIP_MAKE_DEPEND}" || ( ! grep -F "error:" make-depend.log ) - make -j${BUILD_PARALLEL_JOBS:-1} -k all V=1 - test -z "${RUN_MAKE_INSTALL}" || make DESTDIR="${INSTALL_PATH}" install - test -z "${RUN_MAKE_INSTALL}" || DESTDIR="${INSTALL_PATH}" sh util/check-make-install - if [[ "${CFLAGS}" == *"-fsanitize=address"* ]]; then ( ! grep -F AddressSanitizer config.log ); fi needs: - job: autoreconf artifacts: true artifacts: untracked: true expire_in: "1 day" .windows_build: &windows_build_job stage: build script: - 'Push-Location "C:/Program Files (x86)/Microsoft Visual Studio/2017/BuildTools/VC/Auxiliary/Build"' - '& cmd.exe /C "vcvarsall.bat x64 & set" | Foreach-Object { if ($_ -match "(.*?)=(.*)") { Set-Item -force -path "Env:\$($matches[1])" -value "$($matches[2])" } }' - 'Pop-Location' - 'Set-Location win32utils' - '& "C:/Strawberry/perl/bin/perl.exe" Configure "with-tools-version=15.0" "with-platform-toolset=v141" "with-platform-version=10.0.17763.0" "with-vcredist=C:/Program Files (x86)/Microsoft Visual Studio/2017/BuildTools/VC/Redist/MSVC/14.16.27012/vcredist_x64.exe" "with-openssl=C:/OpenSSL" "with-libxml2=C:/libxml2" "with-libuv=C:/libuv" "without-python" "with-system-tests" x64' - 'Set-Item -path "Env:CL" -value "/MP$([Math]::Truncate($BUILD_PARALLEL_JOBS/2))"' - '& msbuild.exe /maxCpuCount:2 /t:Build /p:Configuration=$VSCONF bind9.sln' needs: [] artifacts: untracked: true expire_in: "1 day" .setup_interfaces: &setup_interfaces | if [ "$(id -u)" -eq "0" ]; then sh -x bin/tests/system/ifconfig.sh up; else sudo sh -x bin/tests/system/ifconfig.sh up; fi .setup_softhsm: &setup_softhsm | export SLOT=$(sh -x bin/tests/prepare-softhsm2.sh) test -n "${SLOT}" && test "${SLOT}" -gt 0 .system_test_common: &system_test_common <<: *default_triggering_rules stage: system before_script: - *setup_interfaces - *setup_softhsm script: - ( cd bin/tests/system && make -j${TEST_PARALLEL_JOBS:-1} -k test V=1 ) - test -s bin/tests/system/systests.output - if git rev-parse > /dev/null 2>&1; then ( ! grep "^I:.*:file.*not removed$" bin/tests/system/systests.output ); fi .system_test: &system_test_job <<: *system_test_common artifacts: untracked: true expire_in: "1 day" when: on_failure .system_test_gcov: &system_test_gcov_job <<: *system_test_common artifacts: untracked: true expire_in: "1 day" when: always .system_test_tsan: &system_test_tsan_job <<: *system_test_common after_script: - find bin -name 'tsan.*' -exec python3 util/parse_tsan.py {} \; artifacts: expire_in: "1 day" untracked: true when: on_failure .kyua_report: &kyua_report_html | kyua --logfile /dev/null report-html \ --force \ --results-file "$KYUA_RESULT" \ --results-filter "" \ --output kyua_html > /dev/null .windows_system_test: &windows_system_test_job <<: *schedules_tags_web_triggering_rules stage: system script: - 'Push-Location bin/tests/system' - '$ifIndex = Get-NetIPInterface -AddressFamily IPv4 -InterfaceMetric 75 | Select-Object -ExpandProperty ifIndex' - '& C:/tools/cygwin/bin/sed.exe -i "s/^exit.*/netsh interface ipv4 set dnsservers $ifIndex dhcp/; s/\(name\|interface\)=Loopback/$ifIndex/;" ifconfig.bat' - '& C:/tools/cygwin/bin/sed.exe -i "s/kill -f/kill -W/;" conf.sh stop.pl' - '& cmd.exe /C ifconfig.bat up; ""' - 'Start-Sleep 2' - '$Env:Path = "C:/tools/cygwin/bin;$Env:Path"' - '& sh.exe runall.sh $TEST_PARALLEL_JOBS' - 'If (Test-Path C:/CrashDumps/*) { dir C:/CrashDumps; Throw }' artifacts: untracked: true expire_in: "1 day" when: on_failure .unit_test_common: &unit_test_common <<: *default_triggering_rules stage: unit before_script: - *setup_softhsm script: - make unit after_script: - *kyua_report_html .unit_test: &unit_test_job <<: *unit_test_common artifacts: untracked: true expire_in: "1 day" when: on_failure .unit_test_gcov: &unit_test_gcov_job <<: *unit_test_common artifacts: untracked: true expire_in: "1 day" when: always .unit_test_tsan: &unit_test_tsan_job <<: *unit_test_common after_script: - *kyua_report_html - for f in tsan.* ; do test -f "$f" && python3 util/parse_tsan.py "$f" ; done - find lib -name 'tsan.*' -exec python3 util/parse_tsan.py {} \; artifacts: expire_in: "1 day" paths: - lib/*/tests/tsan.* - tsan/ - kyua.log - kyua.results - kyua_html/ when: on_failure .cppcheck_args: &run_cppcheck | cppcheck --enable=warning,performance,portability,information,missingInclude --include=config.h --std=c11 --language=c --project=compile_commands.json --error-exitcode=2 -j ${TEST_PARALLEL_JOBS:-1} --xml --output-file=cppcheck.results --relative-paths="$CI_PROJECT_DIR" --inline-suppr --suppressions-list=util/suppressions.txt .cppcheck_report: &cppcheck_report_html | cppcheck-htmlreport --title="BIND 9 ($CI_COMMIT_SHORT_SHA) Cppcheck Report" --file=cppcheck.results --report-dir=cppcheck_html/ .cppcheck: &cppcheck_job <<: *default_triggering_rules stage: postcheck script: - *configure - (make -nwk all || true) | compiledb - export GCC_VERSION=$(gcc --version | sed -n 's/.* \([0-9]\+\)\.[0-9]\+\.[0-9]\+.*/\1/p') - sed -i "/gcc\",/a\"-DCPPCHECK\", \"-D__STDC__\", \"-D__GNUC__=${GCC_VERSION}\"," compile_commands.json - *run_cppcheck after_script: - *cppcheck_report_html artifacts: paths: - compile_commands.json - cppcheck.results - cppcheck_html/ expire_in: "1 day" when: on_failure needs: - job: autoreconf artifacts: true ### Job Definitions # Jobs in the precheck stage autoreconf: <<: *autoconf_job misc: <<: *precheck_job script: - sh util/check-ans-prereq.sh - sh util/checklibs.sh > checklibs.out - sh util/tabify-changes < CHANGES > CHANGES.tmp - diff -urNap CHANGES CHANGES.tmp - perl util/check-changes CHANGES - sh util/check-line-length.sh CHANGES - test ! -f CHANGES.SE || sh util/tabify-changes < CHANGES.SE > CHANGES.tmp - test ! -f CHANGES.SE || diff -urNap CHANGES.SE CHANGES.tmp - test ! -f CHANGES.SE || perl util/check-changes master=0 CHANGES.SE - test ! -f CHANGES.SE || sh util/check-line-length.sh CHANGES.SE - rm CHANGES.tmp - perl -w util/merge_copyrights - diff -urNap util/copyrights util/newcopyrights - rm util/newcopyrights - perl -w util/update_copyrights < util/copyrights - if test "$(git status --porcelain | grep -Ev '\?\?' | wc -l)" -gt "0"; then git status --short; exit 1; fi - xmllint --noout --nonet `git ls-files '*.xml' '*.docbook'` - sh util/check-win32util-configure - sh util/check-categories.sh needs: [] artifacts: paths: - util/newcopyrights - checklibs.out expire_in: "1 day" when: on_failure clang-format: <<: *precheck_job needs: [] script: - if [ -r .clang-format ]; then "${CLANG_FORMAT}" -i -style=file $(git ls-files '*.c' '*.h'); fi - if test "$(git status --porcelain | grep -Ev '\?\?' | wc -l)" -gt "0"; then git status --short; exit 1; fi coccinelle: <<: *precheck_job needs: [] script: - util/check-cocci - if test "$(git status --porcelain | grep -Ev '\?\?' | wc -l)" -gt "0"; then git status --short; exit 1; fi danger: <<: *precheck_job needs: [] script: - danger-python ci -f only: refs: - merge_requests variables: - $DANGER_GITLAB_API_TOKEN flake8: <<: *default_triggering_rules <<: *base_image stage: postcheck needs: - job: autoreconf artifacts: true script: - *configure - flake8 --max-line-length=80 $(git ls-files '*.py' | grep -vE '(ans\.py|dangerfile\.py)') pylint: <<: *default_triggering_rules <<: *base_image stage: postcheck needs: - job: autoreconf artifacts: true script: - *configure - PYTHONPATH="$PYTHONPATH:$CI_PROJECT_DIR/bin/python" - pylint --rcfile $CI_PROJECT_DIR/.pylintrc $(git ls-files '*.py' | grep -vE '(ans\.py|dangerfile\.py)') tarball-create: stage: precheck <<: *base_image <<: *default_triggering_rules script: - source version - export BIND_DIRECTORY="bind-${MAJORVER}.${MINORVER}.${PATCHVER}${RELEASETYPE}${RELEASEVER}" - git archive --prefix="${BIND_DIRECTORY}/" --output="${BIND_DIRECTORY}.tar" HEAD - mkdir "${BIND_DIRECTORY}" - echo "SRCID=$(git rev-list --max-count=1 HEAD | cut -b1-7)" > "${BIND_DIRECTORY}/srcid" - tar --append --file="${BIND_DIRECTORY}.tar" "${BIND_DIRECTORY}/srcid" - ${TARBALL_COMPRESSOR} "${BIND_DIRECTORY}.tar" artifacts: paths: - bind-*.tar.${TARBALL_EXTENSION} # Jobs for doc builds on Debian 10 "buster" (amd64) docs: <<: *release_branch_triggering_rules <<: *base_image stage: docs before_script: - test -w "${CCACHE_DIR}" && export PATH="/usr/lib/ccache:${PATH}" - test -n "${OOT_BUILD_WORKSPACE}" && mkdir "${OOT_BUILD_WORKSPACE}" && cd "${OOT_BUILD_WORKSPACE}" script: - *configure - make maintainer-clean - autoreconf -fi - *configure - make -j${BUILD_PARALLEL_JOBS:-1} all V=1 - make -j${BUILD_PARALLEL_JOBS:-1} doc V=1 - if test "$(git status --porcelain | grep -Ev '\?\?' | grep -v -F -e aclocal.m4 -e configure -e ltmain.sh -e m4/ | wc -l)" -gt "0"; then git status --short; exit 1; fi - qpdf --check doc/arm/_build/latex/Bv9ARM.pdf - find doc/man/ -maxdepth 1 -name "*.[0-9]" -exec mandoc -T lint "{}" \; | ( ! grep -v -e "skipping paragraph macro. sp after" -e "unknown font, skipping request. ft C" ) needs: - job: autoreconf artifacts: true allow_failure: false artifacts: paths: - doc/arm/ - doc/man/ - doc/misc/ expire_in: "1 month" push:docs: <<: *base_image stage: push needs: - job: docs artifacts: false script: - curl -X POST -F token=$GITLAB_PAGES_DOCS_TRIGGER_TOKEN -F ref=main $GITLAB_PAGES_DOCS_TRIGGER_URL only: - main@isc-projects/bind9 - /^v9_[1-9][0-9]$/@isc-projects/bind9 # Jobs for regular GCC builds on Alpine Linux 3.14 (amd64) gcc:alpine3.14:amd64: variables: CC: gcc CFLAGS: "${CFLAGS_COMMON}" <<: *alpine_3_14_amd64_image <<: *build_job system:gcc:alpine3.14:amd64: <<: *alpine_3_14_amd64_image <<: *system_test_job needs: - job: gcc:alpine3.14:amd64 artifacts: true unit:gcc:alpine3.14:amd64: <<: *alpine_3_14_amd64_image <<: *unit_test_job needs: - job: gcc:alpine3.14:amd64 artifacts: true # Jobs for regular GCC builds on CentOS 7 (amd64) gcc:centos7:amd64: variables: CC: gcc CFLAGS: "${CFLAGS_COMMON}" EXTRA_CONFIGURE: "--with-libidn2" <<: *centos_centos7_amd64_image <<: *build_job system:gcc:centos7:amd64: <<: *centos_centos7_amd64_image <<: *system_test_job needs: - job: gcc:centos7:amd64 artifacts: true unit:gcc:centos7:amd64: <<: *centos_centos7_amd64_image <<: *unit_test_job needs: - job: gcc:centos7:amd64 artifacts: true # Jobs for regular GCC builds on CentOS 8 (amd64) gcc:centos8:amd64: variables: CC: gcc CFLAGS: "${CFLAGS_COMMON}" EXTRA_CONFIGURE: "--enable-buffer-useinline --with-libidn2" <<: *centos_centos8_amd64_image <<: *build_job system:gcc:centos8:amd64: <<: *centos_centos8_amd64_image <<: *system_test_job needs: - job: gcc:centos8:amd64 artifacts: true unit:gcc:centos8:amd64: <<: *centos_centos8_amd64_image <<: *unit_test_job needs: - job: gcc:centos8:amd64 artifacts: true # Jobs for regular GCC builds on Debian 9 "stretch" (amd64) gcc:stretch:amd64: variables: CC: gcc CFLAGS: "${CFLAGS_COMMON} -O2" EXTRA_CONFIGURE: "--without-gssapi" <<: *debian_stretch_amd64_image <<: *build_job system:gcc:stretch:amd64: <<: *debian_stretch_amd64_image <<: *system_test_job needs: - job: gcc:stretch:amd64 artifacts: true unit:gcc:stretch:amd64: <<: *debian_stretch_amd64_image <<: *unit_test_job needs: - job: gcc:stretch:amd64 artifacts: true # Jobs for regular GCC builds on Debian 10 "buster" (amd64) gcc:buster:amd64: variables: CC: gcc CFLAGS: "${CFLAGS_COMMON} --coverage -O0" LDFLAGS: "--coverage" EXTRA_CONFIGURE: "--with-libidn2" <<: *debian_buster_amd64_image <<: *build_job system:gcc:buster:amd64: <<: *debian_buster_amd64_image <<: *system_test_gcov_job needs: - job: unit:gcc:buster:amd64 artifacts: true unit:gcc:buster:amd64: <<: *debian_buster_amd64_image <<: *unit_test_gcov_job needs: - job: gcc:buster:amd64 artifacts: true # Jobs for scan-build builds on Debian 10 "buster" (amd64) .scan_build: &scan_build | ${SCAN_BUILD} --html-title="BIND 9 ($CI_COMMIT_SHORT_SHA)" \ --keep-cc \ --status-bugs \ --keep-going \ -o scan-build.reports \ make -j${BUILD_PARALLEL_JOBS:-1} all V=1 scan-build: <<: *default_triggering_rules <<: *base_image stage: postcheck variables: CC: "${CLANG}" CFLAGS: "${CFLAGS_COMMON}" CONFIGURE: "${SCAN_BUILD} ./configure" EXTRA_CONFIGURE: "--with-libidn2" script: - *configure - *scan_build needs: - job: autoreconf artifacts: true artifacts: paths: - scan-build.reports/ expire_in: "1 day" when: on_failure # Jobs for regular GCC builds on Debian "sid" (amd64) # Also tests configration option: --without-lmdb. gcc:sid:amd64: variables: CC: gcc CFLAGS: "${CFLAGS_COMMON} -O3" EXTRA_CONFIGURE: "--with-libidn2 --without-lmdb" RUN_MAKE_INSTALL: 1 <<: *debian_sid_amd64_image <<: *build_job system:gcc:sid:amd64: <<: *debian_sid_amd64_image <<: *system_test_job needs: - job: gcc:sid:amd64 artifacts: true unit:gcc:sid:amd64: <<: *debian_sid_amd64_image <<: *unit_test_job needs: - job: gcc:sid:amd64 artifacts: true cppcheck: <<: *base_image <<: *cppcheck_job # Job for out-of-tree GCC build on Debian "sid" (amd64) # Also tests configration option: --with-lmdb. gcc:out-of-tree: variables: CC: gcc CFLAGS: "${CFLAGS_COMMON} -Og" CONFIGURE: ../configure EXTRA_CONFIGURE: "--with-libidn2 --with-lmdb" SKIP_MAKE_DEPEND: 1 RUN_MAKE_INSTALL: 1 OOT_BUILD_WORKSPACE: workspace <<: *base_image <<: *build_job # Jobs for tarball GCC builds on Debian 10 "buster" (amd64) gcc:tarball: variables: CC: gcc EXTRA_CONFIGURE: "--with-libidn2" RUN_MAKE_INSTALL: 1 <<: *base_image <<: *build_job before_script: - tar --extract --file bind-*.tar.${TARBALL_EXTENSION} - rm -f bind-*.tar.${TARBALL_EXTENSION} - cd bind-* needs: - job: tarball-create artifacts: true system:gcc:tarball: <<: *base_image <<: *system_test_job <<: *schedules_tags_web_triggering_rules before_script: - cd bind-* - *setup_interfaces needs: - job: gcc:tarball artifacts: true unit:gcc:tarball: <<: *base_image <<: *unit_test_job <<: *schedules_tags_web_triggering_rules before_script: - cd bind-* needs: - job: gcc:tarball artifacts: true # Jobs for regular GCC builds on Debian "sid" (i386) gcc:sid:i386: variables: CC: gcc CFLAGS: "${CFLAGS_COMMON}" EXTRA_CONFIGURE: "--with-libidn2 --without-python" <<: *debian_sid_i386_image <<: *build_job system:gcc:sid:i386: <<: *debian_sid_i386_image <<: *system_test_job needs: - job: gcc:sid:i386 artifacts: true unit:gcc:sid:i386: <<: *debian_sid_i386_image <<: *unit_test_job needs: - job: gcc:sid:i386 artifacts: true # Jobs for debug GCC builds on openSUSE Tumbleweed (amd64) gcc:tumbleweed:amd64: variables: CC: gcc CFLAGS: "${CFLAGS_COMMON} -DDEBUG" EXTRA_CONFIGURE: "--with-libidn2" <<: *tumbleweed_latest_amd64_image <<: *build_job system:gcc:tumbleweed:amd64: <<: *tumbleweed_latest_amd64_image <<: *system_test_job needs: - job: gcc:tumbleweed:amd64 artifacts: true unit:gcc:tumbleweed:amd64: <<: *tumbleweed_latest_amd64_image <<: *unit_test_job needs: - job: gcc:tumbleweed:amd64 artifacts: true # Jobs for regular GCC builds on Ubuntu 18.04 Bionic Beaver (amd64) gcc:bionic:amd64: variables: CC: gcc CFLAGS: "${CFLAGS_COMMON} -O2" EXTRA_CONFIGURE: "--disable-dnstap --disable-geoip" <<: *ubuntu_bionic_amd64_image <<: *build_job system:gcc:bionic:amd64: <<: *ubuntu_bionic_amd64_image <<: *system_test_job needs: - job: gcc:bionic:amd64 artifacts: true unit:gcc:bionic:amd64: <<: *ubuntu_bionic_amd64_image <<: *unit_test_job needs: - job: gcc:bionic:amd64 artifacts: true # Jobs for regular GCC builds on Ubuntu 20.04 Focal Fossa (amd64) gcc:focal:amd64: variables: CC: gcc CFLAGS: "${CFLAGS_COMMON} -Og" EXTRA_CONFIGURE: "--with-libidn2" <<: *ubuntu_focal_amd64_image <<: *build_job system:gcc:focal:amd64: <<: *ubuntu_focal_amd64_image <<: *system_test_job needs: - job: gcc:focal:amd64 artifacts: true unit:gcc:focal:amd64: <<: *ubuntu_focal_amd64_image <<: *unit_test_job needs: - job: gcc:focal:amd64 artifacts: true # Jobs for ASAN builds on Debian 10 "buster" (amd64) gcc:asan: variables: CC: gcc CFLAGS: "${CFLAGS_COMMON} -fsanitize=address,undefined -DISC_MEM_USE_INTERNAL_MALLOC=0" LDFLAGS: "-fsanitize=address,undefined" EXTRA_CONFIGURE: "--with-libidn2" <<: *base_image <<: *build_job system:gcc:asan: variables: ASAN_OPTIONS: ${ASAN_OPTIONS_COMMON} <<: *base_image <<: *system_test_job needs: - job: gcc:asan artifacts: true unit:gcc:asan: variables: ASAN_OPTIONS: ${ASAN_OPTIONS_COMMON} <<: *base_image <<: *unit_test_job needs: - job: gcc:asan artifacts: true clang:asan: variables: CC: ${CLANG} CFLAGS: "${CFLAGS_COMMON} -fsanitize=address,undefined -DISC_MEM_USE_INTERNAL_MALLOC=0" LDFLAGS: "-fsanitize=address,undefined" EXTRA_CONFIGURE: "--with-libidn2" <<: *base_image <<: *build_job system:clang:asan: variables: ASAN_OPTIONS: ${ASAN_OPTIONS_COMMON} <<: *base_image <<: *system_test_job needs: - job: clang:asan artifacts: true unit:clang:asan: variables: ASAN_OPTIONS: ${ASAN_OPTIONS_COMMON} <<: *base_image <<: *unit_test_job needs: - job: clang:asan artifacts: true # Jobs for TSAN builds on Debian 10 "buster" (amd64) gcc:tsan: <<: *base_image <<: *build_job variables: CC: gcc CFLAGS: "${CFLAGS_COMMON} -fsanitize=thread -DISC_MEM_USE_INTERNAL_MALLOC=0" LDFLAGS: "-fsanitize=thread" EXTRA_CONFIGURE: "--with-libidn2 --enable-pthread-rwlock" system:gcc:tsan: variables: TSAN_OPTIONS: ${TSAN_OPTIONS_COMMON} <<: *base_image <<: *system_test_tsan_job needs: - job: gcc:tsan artifacts: true unit:gcc:tsan: variables: TSAN_OPTIONS: ${TSAN_OPTIONS_COMMON} suppressions=$CI_PROJECT_DIR/tsan-suppressions.txt <<: *base_image <<: *unit_test_tsan_job needs: - job: gcc:tsan artifacts: true clang:tsan: <<: *base_image <<: *build_job variables: CC: "${CLANG}" CFLAGS: "${CFLAGS_COMMON} -fsanitize=thread -DISC_MEM_USE_INTERNAL_MALLOC=0" LDFLAGS: "-fsanitize=thread" EXTRA_CONFIGURE: "--with-libidn2 --enable-pthread-rwlock" system:clang:tsan: variables: TSAN_OPTIONS: ${TSAN_OPTIONS_COMMON} <<: *base_image <<: *system_test_tsan_job needs: - job: clang:tsan artifacts: true unit:clang:tsan: variables: TSAN_OPTIONS: ${TSAN_OPTIONS_COMMON} suppressions=$CI_PROJECT_DIR/tsan-suppressions.txt <<: *base_image <<: *unit_test_tsan_job needs: - job: clang:tsan artifacts: true # Jobs for builds with mutex-based atomics on Debian 10 "buster" (amd64) gcc:mutexatomics: variables: CC: gcc CFLAGS: "${CFLAGS_COMMON} -DISC_MEM_USE_INTERNAL_MALLOC=0" EXTRA_CONFIGURE: "--with-libidn2 --enable-mutex-atomics" <<: *base_image <<: *build_job system:gcc:mutexatomics: <<: *base_image <<: *system_test_job needs: - job: gcc:mutexatomics artifacts: true unit:gcc:mutexatomics: <<: *base_image <<: *unit_test_job needs: - job: gcc:mutexatomics artifacts: true # Jobs for Clang builds on Debian 10 "buster" (amd64) clang:buster:amd64: variables: CC: ${CLANG} CFLAGS: "${CFLAGS_COMMON} -Wenum-conversion" EXTRA_CONFIGURE: "--with-python=python3" <<: *debian_buster_amd64_image <<: *build_job system:clang:buster:amd64: <<: *debian_buster_amd64_image <<: *system_test_job needs: - job: clang:buster:amd64 artifacts: true unit:clang:buster:amd64: <<: *debian_buster_amd64_image <<: *unit_test_job needs: - job: clang:buster:amd64 artifacts: true # Jobs for PKCS#11-enabled GCC builds on Debian "sid" (amd64) gcc:softhsm2.4: variables: CC: gcc CFLAGS: "${CFLAGS_COMMON}" EXTRA_CONFIGURE: "--enable-native-pkcs11 --with-pkcs11=/usr/lib/softhsm/libsofthsm2.so" <<: *base_image <<: *build_job system:gcc:softhsm2.4: <<: *base_image <<: *system_test_job needs: - job: gcc:softhsm2.4 artifacts: true unit:gcc:softhsm2.4: <<: *base_image <<: *unit_test_job needs: - job: gcc:softhsm2.4 artifacts: true # Jobs for PKCS#11-enabled GCC builds on Fedora 34 (amd64) gcc:softhsm2.6: variables: CC: gcc CFLAGS: "${CFLAGS_COMMON} -O1" EXTRA_CONFIGURE: "--with-libidn2 --enable-native-pkcs11 --with-pkcs11=/usr/lib64/pkcs11/libsofthsm2.so" <<: *fedora_34_amd64_image <<: *build_job system:gcc:softhsm2.6: <<: *fedora_34_amd64_image <<: *system_test_job needs: - job: gcc:softhsm2.6 artifacts: true unit:gcc:softhsm2.6: <<: *fedora_34_amd64_image <<: *unit_test_job needs: - job: gcc:softhsm2.6 artifacts: true # Jobs for Clang builds on FreeBSD 11 (amd64) clang:freebsd11:amd64: variables: CFLAGS: "${CFLAGS_COMMON}" USER: gitlab-runner <<: *freebsd_11_amd64_image <<: *build_job <<: *schedules_tags_web_triggering_rules system:clang:freebsd11:amd64: <<: *freebsd_11_amd64_image <<: *system_test_job <<: *schedules_tags_web_triggering_rules variables: USER: gitlab-runner TEST_PARALLEL_JOBS: 4 needs: - job: clang:freebsd11:amd64 artifacts: true unit:clang:freebsd11:amd64: <<: *freebsd_11_amd64_image <<: *unit_test_job <<: *schedules_tags_web_triggering_rules needs: - job: clang:freebsd11:amd64 artifacts: true # Jobs for Clang builds on FreeBSD 12 (amd64) clang:freebsd12:amd64: variables: CFLAGS: "${CFLAGS_COMMON}" USER: gitlab-runner <<: *freebsd_12_amd64_image <<: *build_job system:clang:freebsd12:amd64: <<: *freebsd_12_amd64_image <<: *system_test_job variables: USER: gitlab-runner TEST_PARALLEL_JOBS: 4 needs: - job: clang:freebsd12:amd64 artifacts: true unit:clang:freebsd12:amd64: <<: *freebsd_12_amd64_image <<: *unit_test_job needs: - job: clang:freebsd12:amd64 artifacts: true # Jobs for Clang builds on FreeBSD 13 (amd64) clang:freebsd13:amd64: variables: CFLAGS: "${CFLAGS_COMMON}" EXTRA_CONFIGURE: "${WITH_READLINE_LIBEDIT}" USER: gitlab-runner <<: *freebsd_13_amd64_image <<: *build_job system:clang:freebsd13:amd64: <<: *freebsd_13_amd64_image <<: *system_test_job variables: USER: gitlab-runner TEST_PARALLEL_JOBS: 4 needs: - job: clang:freebsd13:amd64 artifacts: true unit:clang:freebsd13:amd64: <<: *freebsd_13_amd64_image <<: *unit_test_job needs: - job: clang:freebsd13:amd64 artifacts: true # Jobs for Clang builds on OpenBSD (amd64) clang:openbsd:amd64: variables: CC: clang USER: gitlab-runner EXTRA_CONFIGURE: "--disable-dnstap" <<: *openbsd_amd64_image <<: *build_job system:clang:openbsd:amd64: <<: *openbsd_amd64_image <<: *system_test_job variables: USER: gitlab-runner needs: - job: clang:openbsd:amd64 artifacts: true only: - schedules - web # Jobs with libtool disabled nolibtool:sid:amd64: variables: CC: gcc CFLAGS: "${CFLAGS_COMMON}" EXTRA_CONFIGURE: "--with-libidn2 --without-libtool --with-dlopen" <<: *debian_sid_amd64_image <<: *build_job system:nolibtool:sid:amd64: <<: *debian_sid_amd64_image <<: *system_test_job needs: - job: nolibtool:sid:amd64 artifacts: true unit:nolibtool:sid:amd64: <<: *debian_sid_amd64_image <<: *unit_test_job needs: - job: nolibtool:sid:amd64 artifacts: true # Jobs for Visual Studio 2017 builds on Windows (amd64) msvc:windows:amd64: <<: *windows_server_2016_amd64_image <<: *windows_build_job <<: *default_triggering_rules variables: VSCONF: Release system:msvc:windows:amd64: <<: *windows_server_2016_amd64_image <<: *windows_system_test_job variables: VSCONF: Release needs: - job: msvc:windows:amd64 artifacts: true msvc-debug:windows:amd64: <<: *windows_server_2016_amd64_image <<: *windows_build_job <<: *schedules_tags_web_triggering_rules variables: VSCONF: Debug system:msvc-debug:windows:amd64: <<: *windows_server_2016_amd64_image <<: *windows_system_test_job variables: VSCONF: Debug needs: - job: msvc-debug:windows:amd64 artifacts: true # Job producing a release tarball release: <<: *base_image stage: release script: # Determine BIND version - source version - export BIND_DIRECTORY="bind-${MAJORVER}.${MINORVER}.${PATCHVER}${RELEASETYPE}${RELEASEVER}" # Remove redundant files and system test utilities from Windows build artifacts - find Build/Release/ -name "*.pdb" -print -delete - find Build/Debug/ \( -name "*.bsc" -o -name "*.idb" \) -print -delete - find Build/ -regextype posix-extended -regex "Build/.*/($(find bin/tests/ -type f | sed -nE "s|^bin/tests(/system)?/win32/(.*)\.vcxproj$|\2|p" | paste -d"|" -s))\..*" -print -delete # Create Windows zips - openssl dgst -sha256 "${BIND_DIRECTORY}.tar.${TARBALL_EXTENSION}" | tee Build/Release/SHA256 Build/Debug/SHA256 - cp "doc/arm/_build/latex/Bv9ARM.pdf" Build/Release/ - cp "doc/arm/_build/latex/Bv9ARM.pdf" Build/Debug/ - ( cd Build/Release; zip "../../BIND${BIND_DIRECTORY#bind-}.x64.zip" * ) - ( cd Build/Debug; zip "../../BIND${BIND_DIRECTORY#bind-}.debug.x64.zip" * ) # Prepare release tarball contents (tarballs + zips + documentation) - mkdir -p release/doc/arm - pushd release - mv "../${BIND_DIRECTORY}.tar.${TARBALL_EXTENSION}" ../BIND*.zip . - tar --extract --file="${BIND_DIRECTORY}.tar.${TARBALL_EXTENSION}" - mv "${BIND_DIRECTORY}"/{CHANGES*,COPYRIGHT,LICENSE,README,srcid} . - rm -rf "${BIND_DIRECTORY}" - mv "../doc/arm/_build/html" doc/arm/ - mv "../doc/arm/_build/latex/Bv9ARM.pdf" doc/arm/ - echo 'Redirect' > "RELEASE-NOTES-${BIND_DIRECTORY}.html" - popd # Create release tarball - tar --create --file="${CI_COMMIT_TAG}.tar.gz" --gzip release/ needs: - job: tarball-create artifacts: true - job: msvc:windows:amd64 artifacts: true - job: msvc-debug:windows:amd64 artifacts: true - job: docs artifacts: true only: - tags artifacts: paths: - "*.tar.gz" expire_in: "1 day" # Coverity Scan analysis upload .coverity_cache_prep: &coverity_cache_prep | test -f cov-analysis-linux64.md5 && test -f cov-analysis-linux64.tgz || ( curl --output cov-analysis-linux64.md5 https://scan.coverity.com/download/linux64 \ --form project=$COVERITY_SCAN_PROJECT_NAME \ --form token=$COVERITY_SCAN_TOKEN \ --form md5=1 curl --output cov-analysis-linux64.tgz https://scan.coverity.com/download/linux64 \ --form project=$COVERITY_SCAN_PROJECT_NAME \ --form token=$COVERITY_SCAN_TOKEN ) test "$(md5sum cov-analysis-linux64.tgz | awk '{ print $1 }')" = "$(cat cov-analysis-linux64.md5)" tar --extract --gzip --file=cov-analysis-linux64.tgz test -d cov-analysis-linux64-2020.09 .coverity_build: &coverity_build | cov-analysis-linux64-2020.09/bin/cov-build --dir cov-int sh -c 'make -j${BUILD_PARALLEL_JOBS:-1} -k all V=1' tar --create --gzip --file=cov-int.tar.gz cov-int/ curl -v https://scan.coverity.com/builds?project=$COVERITY_SCAN_PROJECT_NAME \ --form token=$COVERITY_SCAN_TOKEN \ --form email=bind-changes@isc.org \ --form file=@cov-int.tar.gz \ --form version="$(git rev-parse --short HEAD)" \ --form description="$(git rev-parse --short HEAD) / $CI_COMMIT_TITLE / $CI_COMMIT_REF_NAME:$CI_PIPELINE_ID" 2>&1 \ | tee curl-response.txt grep -q 'Build successfully submitted' curl-response.txt coverity: <<: *base_image stage: postcheck variables: CC: gcc CFLAGS: "${CFLAGS_COMMON} -Og" EXTRA_CONFIGURE: "--with-libidn2" script: - *coverity_cache_prep - *configure - *coverity_build needs: - job: autoreconf artifacts: true artifacts: paths: - curl-response.txt - cov-int.tar.gz expire_in: "1 week" when: on_failure only: variables: - $COVERITY_SCAN_PROJECT_NAME - $COVERITY_SCAN_TOKEN cache: key: cov-analysis-linux64-2020.09 paths: - cov-analysis-linux64.md5 - cov-analysis-linux64.tgz # Respdiff test respdiff: <<: *base_image stage: system variables: CC: gcc CFLAGS: "${CFLAGS_COMMON} -Og" BIND_BASELINE_VERSION: v9_11_24 script: - ./configure --without-make-clean - make -j${BUILD_PARALLEL_JOBS:-1} V=1 - *setup_interfaces - git clone --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.isc.org/isc-private/bind-qa.git - git clone --branch "${BIND_BASELINE_VERSION}" --depth 1 https://gitlab.isc.org/isc-projects/bind9.git refbind - cd refbind/ - ./configure --without-make-clean - make -j${BUILD_PARALLEL_JOBS:-1} V=1 - cd ../bind-qa/bind9/respdiff - bash respdiff.sh -q "${PWD}/100k_mixed.txt" -c 3 -w "${PWD}/rspworkdir" "${CI_PROJECT_DIR}/refbind" "${CI_PROJECT_DIR}" needs: - job: tarball-create artifacts: true only: - tags artifacts: paths: - refbind untracked: true expire_in: "1 day" when: on_failure # "Stress" tests .stress: &stress_job stage: performance script: - *configure - *setup_interfaces - *setup_softhsm - make -j${BUILD_PARALLEL_JOBS:-1} -k all V=1 - make DESTDIR="${INSTALL_PATH}" install - git clone --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.isc.org/isc-private/bind-qa.git - cd bind-qa/bind9/stress - LD_LIBRARY_PATH="${INSTALL_PATH}/usr/local/lib" BIND_INSTALL_PATH="${INSTALL_PATH}/usr/local" WORKSPACE="${CI_PROJECT_DIR}" bash stress.sh needs: - job: autoreconf artifacts: true artifacts: untracked: true expire_in: "1 day" when: always timeout: 2h stress:authoritative:fedora:34:amd64: <<: *fedora_34_amd64_image <<: *linux_stress_amd64 <<: *stress_job variables: CC: gcc FLAME: /usr/bin/flame MODE: authoritative RATE: 10000 RUN_TIME: 1 only: variables: - $CI_COMMIT_TAG || ($BIND_STRESS_TEST_OS =~ /linux/i && $BIND_STRESS_TEST_MODE =~ /authoritative/i && $BIND_STRESS_TEST_ARCH =~ /amd64/i) stress:recursive:fedora:34:amd64: <<: *fedora_34_amd64_image <<: *linux_stress_amd64 <<: *stress_job variables: CC: gcc FLAME: /usr/bin/flame MODE: recursive RATE: 10000 RUN_TIME: 1 only: variables: - $CI_COMMIT_TAG || ($BIND_STRESS_TEST_OS =~ /linux/i && $BIND_STRESS_TEST_MODE =~ /recursive/i && $BIND_STRESS_TEST_ARCH =~ /amd64/i) stress:authoritative:fedora:34:arm64: <<: *fedora_34_arm64_image <<: *linux_stress_arm64 <<: *stress_job variables: CC: gcc FLAME: /usr/bin/flame MODE: authoritative RATE: 10000 RUN_TIME: 1 only: variables: - $CI_COMMIT_TAG || ($BIND_STRESS_TEST_OS =~ /linux/i && $BIND_STRESS_TEST_MODE =~ /authoritative/i && $BIND_STRESS_TEST_ARCH =~ /arm64/i) stress:recursive:fedora:34:arm64: <<: *fedora_34_arm64_image <<: *linux_stress_arm64 <<: *stress_job variables: CC: gcc FLAME: /usr/bin/flame MODE: recursive RATE: 10000 RUN_TIME: 1 only: variables: - $CI_COMMIT_TAG || ($BIND_STRESS_TEST_OS =~ /linux/i && $BIND_STRESS_TEST_MODE =~ /recursive/i && $BIND_STRESS_TEST_ARCH =~ /arm64/i) stress:authoritative:freebsd12:amd64: <<: *freebsd_12_amd64_image <<: *freebsd_stress_amd64 <<: *stress_job variables: CC: clang FLAME: /usr/local/bin/flame MODE: authoritative RATE: 10000 RUN_TIME: 1 only: variables: - $CI_COMMIT_TAG || ($BIND_STRESS_TEST_OS =~ /freebsd/i && $BIND_STRESS_TEST_MODE =~ /authoritative/i && $BIND_STRESS_TEST_ARCH =~ /amd64/i) stress:recursive:freebsd12:amd64: <<: *freebsd_12_amd64_image <<: *freebsd_stress_amd64 <<: *stress_job variables: CC: clang FLAME: /usr/local/bin/flame MODE: recursive RATE: 10000 RUN_TIME: 1 only: variables: - $CI_COMMIT_TAG || ($BIND_STRESS_TEST_OS =~ /freebsd/i && $BIND_STRESS_TEST_MODE =~ /recursive/i && $BIND_STRESS_TEST_ARCH =~ /amd64/i) gcov: <<: *base_image <<: *default_triggering_rules stage: postcheck needs: - job: system:gcc:buster:amd64 artifacts: true script: # *.gcno and *.gcda files generated for shared library objects are created # in directories in which gcovr is unable to process them properly # (.../.libs/...). Move such *.gcno and *.gcda files one level higher. - find . -regex ".*/\.libs/.*\.\(gcda\|gcno\)" -execdir mv "{}" .. \; # Help gcovr process the nasty tricks in lib/dns/code.h, where we include C # source files from lib/dns/rdata/*/, using an even nastier trick. - find lib/dns/rdata/* -name "*.c" -execdir cp -f "{}" ../../ \; # These drivers are built into bin/named/named in a way which trips up # gcovr. Copy them to where gcovr expects them. - cp contrib/dlz/drivers/dlz_drivers.c contrib/dlz/drivers/dlz_filesystem_driver.c contrib/dlz/drivers/sdlz_helper.c bin/named/ # Generate XML file in the Cobertura XML format suitable for use by GitLab # for the purpose of displaying code coverage information in the diff view # of a given merge request. - gcovr --root . --exclude-directories bin/tests --exclude-directories doc --exclude-directories libltdl --exclude-directories lib/samples --exclude 'lib/.*/tests/.*' --xml -o coverage.xml - gcovr --root . --exclude-directories bin/tests --exclude-directories doc --exclude-directories libltdl --exclude-directories lib/samples --exclude 'lib/.*/tests/.*' --html-details -o coverage.html - gcovr --root . --exclude-directories bin/tests --exclude-directories doc --exclude-directories libltdl --exclude-directories lib/samples --exclude 'lib/.*/tests/.*' -o coverage.txt - tail -n 3 coverage.txt artifacts: paths: - coverage*.html - coverage.txt - coverage.xml reports: cobertura: coverage.xml # Pairwise testing of ./configure options pairwise: <<: *base_image stage: build needs: - job: autoreconf artifacts: true script: - util/pairwise-testing.sh artifacts: paths: - pairwise-commands.txt - pairwise-model.txt - pairwise-output.*.txt when: on_failure only: variables: - $PAIRWISE_TESTING