diff options
Diffstat (limited to '.github/workflows/main.yml')
-rw-r--r-- | .github/workflows/main.yml | 104 |
1 files changed, 72 insertions, 32 deletions
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 572f02544..bcad84b8b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -10,7 +10,7 @@ on: workflow_dispatch: env: - docker-registry: docker.pkg.github.com + docker-registry: ghcr.io docker-config-path: source/ci/docker jobs: @@ -22,8 +22,7 @@ jobs: # with both the sha and "latest" so that the subsequent runs need not # know the sha. Only do this on CI builds (when the event is a "push") # because PR builds from forks lack permission to write packages. - build_containers: - name: Create docker image + containers: strategy: matrix: container: @@ -46,6 +45,7 @@ jobs: - name: centos7 - name: centos8 runs-on: ubuntu-latest + name: "Create container: ${{ matrix.container.name }}" steps: - name: Check out repository uses: actions/checkout@v2 @@ -69,7 +69,7 @@ jobs: if [ "${{ matrix.container.base }}" != "" ]; then BASE_ARG="--build-arg BASE=${{ matrix.container.base }}" fi - docker build -t ${{ env.docker-registry-container-sha }} ${BASE_ARG} -f ${{ env.dockerfile }} . + docker build -t ${{ env.docker-registry-container-sha }} --build-arg UID=$(id -u) --build-arg GID=$(id -g) ${BASE_ARG} -f ${{ env.dockerfile }} . docker tag ${{ env.docker-registry-container-sha }} ${{ env.docker-registry-container-latest }} docker push ${{ env.docker-registry-container-sha }} docker push ${{ env.docker-registry-container-latest }} @@ -80,76 +80,82 @@ jobs: # and their details. Then we build either in a docker container (Linux) # or on the actual hosts (macOS, Windows). build: - name: Build - needs: [ build_containers ] + needs: [ containers ] strategy: matrix: platform: - - # Xenial, GCC, OpenSSL + - name: "Linux (Xenial, GCC, OpenSSL)" + id: xenial-gcc-openssl container: name: xenial env: CC: gcc CMAKE_GENERATOR: Ninja - CMAKE_OPTIONS: -DUSE_HTTPS=OpenSSL -DREGEX_BACKEND=builtin -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind -DUSE_GSSAPI=ON -DDEBUG_STRICT_ALLOC=ON -DDEBUG_STRICT_OPEN=ON + CMAKE_OPTIONS: -DUSE_HTTPS=OpenSSL -DREGEX_BACKEND=builtin -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind -DUSE_GSSAPI=ON -DUSE_SSH=ON -DDEBUG_STRICT_ALLOC=ON -DDEBUG_STRICT_OPEN=ON os: ubuntu-latest - - # Xenial, GCC, mbedTLS + - name: Linux (Xenial, GCC, mbedTLS) + id: xenial-gcc-mbedtls container: name: xenial env: CC: gcc CMAKE_GENERATOR: Ninja - CMAKE_OPTIONS: -DUSE_HTTPS=mbedTLS -DUSE_SHA1=HTTPS -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind -DUSE_GSSAPI=ON + CMAKE_OPTIONS: -DUSE_HTTPS=mbedTLS -DUSE_SHA1=HTTPS -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind -DUSE_GSSAPI=ON -DUSE_SSH=ON os: ubuntu-latest - - # Xenial, Clang, OpenSSL + - name: "Linux (Xenial, Clang, OpenSSL)" + id: xenial-clang-openssl container: name: xenial env: CC: clang CMAKE_GENERATOR: Ninja - CMAKE_OPTIONS: -DUSE_HTTPS=OpenSSL -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind -DUSE_GSSAPI=ON + CMAKE_OPTIONS: -DUSE_HTTPS=OpenSSL -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind -DUSE_GSSAPI=ON -DUSE_SSH=ON os: ubuntu-latest - - # Xenial, Clang, mbedTLS + - name: "Linux (Xenial, Clang, mbedTLS)" + id: xenial-clang-mbedtls container: name: xenial env: CC: clang - CMAKE_OPTIONS: -DUSE_HTTPS=mbedTLS -DUSE_SHA1=HTTPS -DREGEX_BACKEND=pcre -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind -DUSE_GSSAPI=ON + CMAKE_OPTIONS: -DUSE_HTTPS=mbedTLS -DUSE_SHA1=HTTPS -DREGEX_BACKEND=pcre -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind -DUSE_GSSAPI=ON -DUSE_SSH=ON CMAKE_GENERATOR: Ninja os: ubuntu-latest - - # Focal, Clang 10, mbedTLS, MemorySanitizer + - name: "Linux (MemorySanitizer)" + id: memorysanitizer container: name: focal env: CC: clang-10 CFLAGS: -fsanitize=memory -fsanitize-memory-track-origins=2 -fsanitize-blacklist=/home/libgit2/source/script/sanitizers.supp -fno-optimize-sibling-calls -fno-omit-frame-pointer - CMAKE_OPTIONS: -DCMAKE_PREFIX_PATH=/usr/local/msan -DUSE_HTTPS=mbedTLS -DUSE_SHA1=HTTPS -DREGEX_BACKEND=pcre -DDEPRECATE_HARD=ON -DUSE_BUNDLED_ZLIB=ON + CMAKE_OPTIONS: -DCMAKE_PREFIX_PATH=/usr/local/msan -DUSE_HTTPS=mbedTLS -DUSE_SHA1=HTTPS -DREGEX_BACKEND=pcre -DDEPRECATE_HARD=ON -DUSE_BUNDLED_ZLIB=ON -DUSE_SSH=ON CMAKE_GENERATOR: Ninja SKIP_SSH_TESTS: true SKIP_NEGOTIATE_TESTS: true ASAN_SYMBOLIZER_PATH: /usr/bin/llvm-symbolizer-10 UBSAN_OPTIONS: print_stacktrace=1 os: ubuntu-latest - - # Focal, Clang 10, OpenSSL, UndefinedBehaviorSanitizer + - name: "Linux (UndefinedBehaviorSanitizer)" + id: ubsanitizer container: name: focal env: CC: clang-10 CFLAGS: -fsanitize=undefined,nullability -fno-sanitize-recover=undefined,nullability -fsanitize-blacklist=/home/libgit2/source/script/sanitizers.supp -fno-optimize-sibling-calls -fno-omit-frame-pointer - CMAKE_OPTIONS: -DCMAKE_PREFIX_PATH=/usr/local -DUSE_HTTPS=OpenSSL -DUSE_SHA1=HTTPS -DREGEX_BACKEND=pcre -DDEPRECATE_HARD=ON -DUSE_BUNDLED_ZLIB=ON + CMAKE_OPTIONS: -DCMAKE_PREFIX_PATH=/usr/local -DUSE_HTTPS=OpenSSL -DUSE_SHA1=HTTPS -DREGEX_BACKEND=pcre -DDEPRECATE_HARD=ON -DUSE_BUNDLED_ZLIB=ON -DUSE_SSH=ON CMAKE_GENERATOR: Ninja SKIP_SSH_TESTS: true SKIP_NEGOTIATE_TESTS: true ASAN_SYMBOLIZER_PATH: /usr/bin/llvm-symbolizer-10 UBSAN_OPTIONS: print_stacktrace=1 os: ubuntu-latest - - # Focal, Clang 10, OpenSSL, ThreadSanitizer + - name: "Linux (ThreadSanitizer)" + id: threadsanitizer container: name: focal env: CC: clang-10 CFLAGS: -fsanitize=thread -fno-optimize-sibling-calls -fno-omit-frame-pointer - CMAKE_OPTIONS: -DCMAKE_PREFIX_PATH=/usr/local -DUSE_HTTPS=OpenSSL -DUSE_SHA1=HTTPS -DREGEX_BACKEND=pcre -DDEPRECATE_HARD=ON -DUSE_BUNDLED_ZLIB=ON + CMAKE_OPTIONS: -DCMAKE_PREFIX_PATH=/usr/local -DUSE_HTTPS=OpenSSL -DUSE_SHA1=HTTPS -DREGEX_BACKEND=pcre -DDEPRECATE_HARD=ON -DUSE_BUNDLED_ZLIB=ON -DUSE_SSH=ON CMAKE_GENERATOR: Ninja SKIP_SSH_TESTS: true SKIP_NEGOTIATE_TESTS: true @@ -157,7 +163,8 @@ jobs: UBSAN_OPTIONS: print_stacktrace=1 TSAN_OPTIONS: suppressions=/home/libgit2/source/script/thread-sanitizer.supp second_deadlock_stack=1 os: ubuntu-latest - - # macOS + - name: "macOS" + id: macos os: macos-10.15 env: CC: clang @@ -166,7 +173,8 @@ jobs: SKIP_SSH_TESTS: true SKIP_NEGOTIATE_TESTS: true setup-script: osx - - # Windows amd64 Visual Studio + - name: "Windows (amd64, Visual Studio)" + id: windows-amd64-vs os: windows-2019 env: ARCH: amd64 @@ -174,7 +182,8 @@ jobs: CMAKE_OPTIONS: -A x64 -DWIN32_LEAKCHECK=ON -DDEPRECATE_HARD=ON SKIP_SSH_TESTS: true SKIP_NEGOTIATE_TESTS: true - - # Windows x86 Visual Studio + - name: "Windows (x86, Visual Studio)" + id: windows-x86-vs os: windows-2019 env: ARCH: x86 @@ -182,7 +191,8 @@ jobs: CMAKE_OPTIONS: -A Win32 -DWIN32_LEAKCHECK=ON -DDEPRECATE_HARD=ON -DUSE_SHA1=HTTPS -DUSE_BUNDLED_ZLIB=ON SKIP_SSH_TESTS: true SKIP_NEGOTIATE_TESTS: true - - # Windows amd64 mingw + - name: "Windows (amd64, mingw)" + id: windows-amd64-mingw os: windows-2019 setup-script: mingw env: @@ -193,7 +203,8 @@ jobs: BUILD_PATH: D:\Temp\mingw64\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Program Files (x86)\CMake\bin SKIP_SSH_TESTS: true SKIP_NEGOTIATE_TESTS: true - - # Windows x86 mingw + - name: "Windows (x86, mingw)" + id: windows-x86-mingw os: windows-2019 setup-script: mingw env: @@ -207,6 +218,7 @@ jobs: fail-fast: false env: ${{ matrix.platform.env }} runs-on: ${{ matrix.platform.os }} + name: "Build: ${{ matrix.platform.name }}" steps: - name: Check out repository uses: actions/checkout@v2 @@ -214,7 +226,7 @@ jobs: path: source fetch-depth: 0 - name: Set up build environment - run: source/ci/setup-${{ matrix.platform.setup-script }}.sh + run: source/ci/setup-${{ matrix.platform.setup-script }}-build.sh shell: bash if: matrix.platform.setup-script != '' - name: Setup QEMU @@ -229,7 +241,11 @@ jobs: working-directory: ${{ env.docker-config-path }} if: matrix.platform.container.name != '' - name: Create container - run: docker build -t ${{ env.docker-registry-container-sha }} -f ${{ env.dockerfile }} . + run: | + if [ "${{ matrix.container.base }}" != "" ]; then + BASE_ARG="--build-arg BASE=${{ matrix.container.base }}" + fi + docker build -t ${{ env.docker-registry-container-sha }} --build-arg UID=$(id -u) --build-arg GID=$(id -g) ${BASE_ARG} -f ${{ env.dockerfile }} . working-directory: ${{ env.docker-config-path }} if: matrix.platform.container.name != '' && env.docker-container-exists != 'true' - name: Build and test @@ -237,10 +253,12 @@ jobs: export GITTEST_NEGOTIATE_PASSWORD="${{ secrets.GITTEST_NEGOTIATE_PASSWORD }}" if [ -n "${{ matrix.platform.container.name }}" ]; then + mkdir build docker run \ --rm \ - --user libgit2:libgit2 \ + --user "$(id -u):$(id -g)" \ -v "$(pwd)/source:/home/libgit2/source" \ + -v "$(pwd)/build:/home/libgit2/build" \ -w /home/libgit2 \ -e ASAN_SYMBOLIZER_PATH \ -e CC \ @@ -248,19 +266,40 @@ jobs: -e CMAKE_GENERATOR \ -e CMAKE_OPTIONS \ -e GITTEST_NEGOTIATE_PASSWORD \ + -e GITTEST_FLAKY_STAT \ -e PKG_CONFIG_PATH \ -e SKIP_NEGOTIATE_TESTS \ -e SKIP_SSH_TESTS \ -e TSAN_OPTIONS \ -e UBSAN_OPTIONS \ ${{ env.docker-registry-container-sha }} \ - /bin/bash -c "mkdir build && cd build && ../source/ci/build.sh && ../source/ci/test.sh" + /bin/bash -c "cd build && ../source/ci/build.sh && ../source/ci/test.sh" else - mkdir build && cd build + mkdir build + cd build ../source/ci/build.sh ../source/ci/test.sh fi shell: bash + - name: Upload test results + uses: actions/upload-artifact@v3 + if: success() || failure() + with: + name: test-results-${{ matrix.platform.id }} + path: build/results_*.xml + + test_results: + name: Test results + needs: [ build ] + runs-on: ubuntu-latest + steps: + - name: Download test results + uses: actions/download-artifact@v3 + - name: Generate test summary + uses: test-summary/action@v1 + with: + paths: 'test-results-*/*.xml' + # Generate documentation using docurium. We'll upload the documentation # as a build artifact so that it can be reviewed as part of a pull @@ -269,7 +308,8 @@ jobs: # published to our documentation site. documentation: name: Generate documentation - needs: [build_containers] + needs: [ containers ] + if: success() || failure() runs-on: ubuntu-latest steps: - name: Check out repository @@ -300,4 +340,4 @@ jobs: - name: Push documentation branch working-directory: source run: git push origin gh-pages - if: github.event_name != 'pull_request' && github.repository == 'libgit2/libgit2' + if: github.event_name == 'push' && github.repository == 'libgit2/libgit2' |