default: timeout: 2h stages: - build - test - analyze workflow: rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" - if: $CI_COMMIT_TAG - if: $CI_COMMIT_REF_PROTECTED == "true" test:linux: image: $image stage: test needs: [ ] tags: - saas-linux-medium-amd64 variables: CUSTOM_PATH: "/custom" TEST_OUTPUT_DIRECTORY: "/tmp/test-output" before_script: - ./ci/install-dependencies.sh script: - useradd builder --create-home - chown -R builder "${CI_PROJECT_DIR}" - sudo --preserve-env --set-home --user=builder ./ci/run-build-and-tests.sh after_script: - | if test "$CI_JOB_STATUS" != 'success' then sudo --preserve-env --set-home --user=builder ./ci/print-test-failures.sh mv "$TEST_OUTPUT_DIRECTORY"/failed-test-artifacts t/ fi parallel: matrix: - jobname: linux-sha256 image: ubuntu:rolling CC: clang - jobname: linux-reftable image: ubuntu:rolling CC: clang - jobname: linux-breaking-changes image: ubuntu:20.04 CC: gcc - jobname: linux-TEST-vars image: ubuntu:20.04 CC: gcc CC_PACKAGE: gcc-8 - jobname: linux-leaks image: ubuntu:rolling CC: gcc - jobname: linux-reftable-leaks image: ubuntu:rolling CC: gcc - jobname: linux-asan-ubsan image: ubuntu:rolling CC: clang - jobname: pedantic image: fedora:latest - jobname: linux-musl-meson image: alpine:latest - jobname: linux32 image: i386/ubuntu:20.04 - jobname: linux-meson image: ubuntu:rolling CC: gcc artifacts: paths: - t/failed-test-artifacts when: on_failure test:osx: image: $image stage: test needs: [ ] tags: - saas-macos-medium-m1 variables: TEST_OUTPUT_DIRECTORY: "/Volumes/RAMDisk" before_script: # Create a 4GB RAM disk that we use to store test output on. This small hack # significantly speeds up tests by more than a factor of 2 because the # macOS runners use network-attached storage as disks, which is _really_ # slow with the many small writes that our tests do. - sudo diskutil apfs create $(hdiutil attach -nomount ram://8192000) RAMDisk - ./ci/install-dependencies.sh script: - ./ci/run-build-and-tests.sh after_script: - | if test "$CI_JOB_STATUS" != 'success' then ./ci/print-test-failures.sh mv "$TEST_OUTPUT_DIRECTORY"/failed-test-artifacts t/ fi parallel: matrix: - jobname: osx-clang image: macos-14-xcode-15 CC: clang - jobname: osx-reftable image: macos-14-xcode-15 CC: clang - jobname: osx-meson image: macos-14-xcode-15 CC: clang artifacts: paths: - t/failed-test-artifacts when: on_failure build:mingw64: stage: build tags: - saas-windows-medium-amd64 variables: NO_PERL: 1 before_script: - ./ci/install-sdk.ps1 -directory "git-sdk" script: - git-sdk/usr/bin/bash.exe -l -c 'ci/make-test-artifacts.sh artifacts' artifacts: paths: - artifacts - git-sdk test:mingw64: stage: test tags: - saas-windows-medium-amd64 needs: - job: "build:mingw64" artifacts: true before_script: - git-sdk/usr/bin/bash.exe -l -c 'tar xf artifacts/artifacts.tar.gz' - New-Item -Path .git/info -ItemType Directory - New-Item .git/info/exclude -ItemType File -Value "/git-sdk" script: - git-sdk/usr/bin/bash.exe -l -c "ci/run-test-slice.sh $CI_NODE_INDEX $CI_NODE_TOTAL" after_script: - git-sdk/usr/bin/bash.exe -l -c 'ci/print-test-failures.sh' parallel: 10 .msvc-meson: tags: - saas-windows-medium-amd64 before_script: - choco install -y git meson ninja openssl - Import-Module $env:ChocolateyInstall\helpers\chocolateyProfile.psm1 - refreshenv # The certificate store for Python on Windows is broken and fails to fetch # certificates, see https://bugs.python.org/issue36011. This seems to # mostly be an issue with how the GitLab image is set up as it is a # non-issue on GitHub Actions. Work around the issue by importing # cetrificates manually. - Invoke-WebRequest https://curl.haxx.se/ca/cacert.pem -OutFile cacert.pem - openssl pkcs12 -export -nokeys -in cacert.pem -out certs.pfx -passout "pass:" - Import-PfxCertificate -CertStoreLocation Cert:\LocalMachine\Root -FilePath certs.pfx build:msvc-meson: extends: .msvc-meson stage: build script: - meson setup build --vsenv -Dperl=disabled -Dbackend_max_links=1 -Dcredential_helpers=wincred - meson compile -C build artifacts: paths: - build test:msvc-meson: extends: .msvc-meson stage: test timeout: 6h needs: - job: "build:msvc-meson" artifacts: true script: - meson test -C build --list | Select-Object -Skip 1 | Select-String .* | Group-Object -Property { $_.LineNumber % $Env:CI_NODE_TOTAL + 1 } | Where-Object Name -EQ $Env:CI_NODE_INDEX | ForEach-Object { meson test -C build --no-rebuild --print-errorlogs $_.Group; if (!$?) { exit $LASTEXITCODE } } parallel: 10 test:fuzz-smoke-tests: image: ubuntu:latest stage: test needs: [ ] variables: CC: clang before_script: - ./ci/install-dependencies.sh script: - ./ci/run-build-and-minimal-fuzzers.sh static-analysis: image: ubuntu:22.04 stage: analyze needs: [ ] variables: jobname: StaticAnalysis before_script: - ./ci/install-dependencies.sh script: - ./ci/run-static-analysis.sh - ./ci/check-directional-formatting.bash check-whitespace: image: ubuntu:latest stage: analyze needs: [ ] before_script: - ./ci/install-dependencies.sh # Since $CI_MERGE_REQUEST_TARGET_BRANCH_SHA is only defined for merged # pipelines, we fallback to $CI_MERGE_REQUEST_DIFF_BASE_SHA, which should # be defined in all pipelines. script: - | R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA:-${CI_MERGE_REQUEST_DIFF_BASE_SHA:?}} || exit ./ci/check-whitespace.sh "$R" rules: - if: $CI_PIPELINE_SOURCE == 'merge_request_event' check-style: image: ubuntu:latest stage: analyze needs: [ ] allow_failure: true variables: CC: clang jobname: ClangFormat before_script: - ./ci/install-dependencies.sh # Since $CI_MERGE_REQUEST_TARGET_BRANCH_SHA is only defined for merged # pipelines, we fallback to $CI_MERGE_REQUEST_DIFF_BASE_SHA, which should # be defined in all pipelines. script: - | R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA:-${CI_MERGE_REQUEST_DIFF_BASE_SHA:?}} || exit ./ci/run-style-check.sh "$R" rules: - if: $CI_PIPELINE_SOURCE == 'merge_request_event' documentation: image: ubuntu:latest stage: analyze needs: [ ] variables: jobname: Documentation before_script: - ./ci/install-dependencies.sh script: - ./ci/test-documentation.sh