X-Git-Url: http://tinc-vpn.org/git/browse?a=blobdiff_plain;f=.github%2Fworkflows%2Ftest.yml;h=1757c8efb24cc39451d9dcc649e9ae9a21fc67ab;hb=d9e42faa6a7f4da98502be44566605a01a16a637;hp=b5392ff2643dfe1681e74b555021c68ecb8e3c50;hpb=e1d5459339d7417cda45a7fa0d3c47db555ae6a9;p=tinc diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b5392ff2..1757c8ef 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,5 +1,9 @@ name: Test +concurrency: + group: test-${{ github.head_ref }} + cancel-in-progress: true + on: push: pull_request: @@ -9,7 +13,7 @@ on: jobs: cross: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 timeout-minutes: 30 strategy: fail-fast: false @@ -17,9 +21,10 @@ jobs: arch: - armhf - mipsel + - mingw container: - image: debian:bullseye + image: debian:stable options: --privileged steps: @@ -30,10 +35,7 @@ jobs: run: HOST=${{ matrix.arch }} sh .ci/deps.sh - name: Prepare the system - run: | - sh .ci/test/prepare.sh - update-binfmts --enable - rm -f /dev/net/tun + run: HOST=${{ matrix.arch }} sh .ci/test/prepare.sh - name: Run tests with default settings run: sudo -u build CI=1 HOST=${{ matrix.arch }} sh .ci/test/run.sh default @@ -44,6 +46,7 @@ jobs: - name: Run tests with libgcrypt run: sudo -u build CI=1 HOST=${{ matrix.arch }} sh .ci/test/run.sh gcrypt + if: always() - name: Upload test results uses: actions/upload-artifact@v2 @@ -52,69 +55,98 @@ jobs: path: /tmp/logs/tests.*.tar.gz if: always() - static-analysis: - runs-on: ubuntu-latest - timeout-minutes: 30 + muon: + runs-on: ubuntu-22.04 + timeout-minutes: 20 + container: + image: debian:stable-slim + env: + CI: 1 + steps: - name: Checkout code uses: actions/checkout@v1 + - name: Install dependencies + run: SKIP_OPENSSL3=1 SKIP_MESON=1 .ci/deps.sh libpkgconf-dev + + - name: Compatibility with muon + run: ./.ci/muon/run.sh + + analysis: + runs-on: ubuntu-22.04 + timeout-minutes: 30 + steps: + - name: Checkout tinc + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Install dependencies + run: sudo SKIP_OPENSSL3=1 .ci/deps.sh autoconf automake iperf3 + + - name: Compatibility with older versions of tinc + run: sudo ./.ci/compat/run.sh + if: always() + - name: Install tools run: | sudo apt-get install -y astyle clang-tidy-$CLANG - sudo update-alternatives --install /usr/bin/clang-tidy clang-tidy /usr/bin/clang-tidy-$CLANG 100 + sudo update-alternatives --install /usr/bin/clang-tidy clang-tidy /usr/bin/clang-tidy-$CLANG 100 + sudo update-alternatives --install /usr/bin/run-clang-tidy run-clang-tidy /usr/bin/run-clang-tidy-$CLANG 100 curl -OL "https://github.com/koalaman/shellcheck/releases/download/v$SHELLCHECK/shellcheck-v${SHELLCHECK}.linux.x86_64.tar.xz" tar -C ~ --strip-components=1 --wildcards -xf ./shellcheck-*.tar.xz 'shellcheck-*/shellcheck' curl -o ~/shfmt -L "https://github.com/mvdan/sh/releases/download/v$SHFMT/shfmt_v${SHFMT}_linux_amd64" chmod 755 ~/shfmt ~/shellcheck - pip3 install --user compiledb + python3 -m venv /tmp/venv + . /tmp/venv/bin/activate + pip3 install black pylint mypy markflow env: CLANG: 11 - SHELLCHECK: 0.7.2 - SHFMT: 3.3.0 - - - name: Install deps - run: sudo sh .ci/deps.sh - - - name: Configure and compile - run: | - autoreconf -fsi - ./configure $(sh .ci/conf.sh) - - - name: Run clang-tidy - run: sh .ci/tidy/run.sh - if: always() - - - name: Check code formatting - run: "! astyle -r --options=.astylerc --dry-run --formatted '*.c' '*.h' | grep '^Formatted'" - if: always() - - - name: Check scripts formatting - run: find -type f -regextype egrep -regex '.+\.(sh|sh\.in|test)$' -exec ~/shfmt -d -i 2 -s '{}' + + SHELLCHECK: 0.8.0 + SHFMT: 3.5.0 if: always() - - name: Run static analysis on scripts - run: find -type f -regextype egrep -regex '.+\.sh(\.in)?$' -exec shellcheck -x '{}' + + - name: Lint/typecheck/check formatting on C/shell/Python code + run: | + . /tmp/venv/bin/activate + PATH=$PATH:$HOME ./lint.py if: always() - - name: Run static analysis on tests - run: find -type f -name '*.test' -execdir shellcheck -x '{}' + + - name: Check warnings (clang) + run: bash .ci/warn/run.sh + env: + CC: clang-12 if: always() - name: Check warnings (gcc) run: bash .ci/warn/run.sh env: - CC: gcc + CC: gcc-11 if: always() - - name: Check warnings (clang) - run: bash .ci/warn/run.sh + - name: Check that very long paths work + run: | + meson setup "$WD" + meson test -C "$WD" --verbose env: - CC: clang + WD: /tmp/tinc_testing_directory_with_a_very_long_path_which_goes_over_the_108_char_limit_on_unix_socket_file_paths + if: always() + + - name: Archive test results + run: sudo tar -caf tests.tar.gz /usr/local/etc + continue-on-error: true + if: always() + + - name: Upload test results + uses: actions/upload-artifact@v2 + with: + name: tests_compat + path: tests.tar.gz if: always() sanitizer: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 timeout-minutes: 30 strategy: fail-fast: false @@ -131,18 +163,26 @@ jobs: uses: actions/checkout@v1 - name: Install deps - run: sudo sh .ci/deps.sh + run: | + sudo sh .ci/deps.sh iputils-arping + sudo pip3 install --upgrade cryptography - name: Run tests with OpenSSL 3 run: bash .ci/sanitizers/run.sh openssl3 + if: always() - name: Sanitize tests with default settings run: bash .ci/sanitizers/run.sh default + if: always() - name: Sanitize tests without legacy protocol run: bash .ci/sanitizers/run.sh nolegacy if: always() + - name: Run tests with libgcrypt + run: bash .ci/sanitizers/run.sh gcrypt + if: always() + - name: Upload test results uses: actions/upload-artifact@v2 with: @@ -151,21 +191,22 @@ jobs: if: always() linux: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 timeout-minutes: 30 strategy: fail-fast: false matrix: os: - - alpine - - centos:7 # aka RHEL 7 - - almalinux:8 # aka RHEL 8 - - fedora - - debian:buster - - debian:bullseye + - alpine:latest + - alpine:edge + - almalinux:latest + - fedora:latest + - fedora:rawhide + - debian:oldstable + - debian:stable - debian:testing - - ubuntu # current LTS - - ubuntu:rolling # latest + - ubuntu:latest + - ubuntu:rolling container: image: ${{ matrix.os }} options: --privileged @@ -189,6 +230,7 @@ jobs: - name: Run tests with default settings run: sudo -u build CI=1 sh .ci/test/run.sh default + if: always() - name: Run tests without legacy protocol run: sudo -u build CI=1 sh .ci/test/run.sh nolegacy @@ -196,6 +238,7 @@ jobs: - name: Run tests with libgcrypt run: sudo -u build CI=1 sh .ci/test/run.sh gcrypt + if: always() - name: Upload test results uses: actions/upload-artifact@v2 @@ -207,6 +250,7 @@ jobs: - name: Build package run: sh .ci/package/build.sh if: github.ref == 'refs/heads/1.1' || startsWith(github.ref, 'refs/tags/release-') + continue-on-error: true - name: Upload package uses: actions/upload-artifact@v2 @@ -215,13 +259,15 @@ jobs: path: | *.deb ~/rpmbuild/RPMS/*/*.rpm + continue-on-error: true pkg-publish: if: always() && (github.ref == 'refs/heads/1.1' || startsWith(github.ref, 'refs/tags/release-')) - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 + continue-on-error: true needs: - linux - - windows + - mingw steps: - name: Create artifact directory @@ -252,7 +298,7 @@ jobs: if: startsWith(github.ref, 'refs/tags/') macos: - runs-on: macos-latest + runs-on: macos-12 timeout-minutes: 20 steps: @@ -271,6 +317,7 @@ jobs: - name: Run tests with libgcrypt run: sh .ci/test/run.sh gcrypt + if: always() - name: Upload test results uses: actions/upload-artifact@v2 @@ -279,7 +326,7 @@ jobs: path: /tmp/logs/tests.*.tar.gz if: always() - windows: + mingw: runs-on: windows-latest timeout-minutes: 30 @@ -291,8 +338,8 @@ jobs: # https://packages.msys2.org/package/ install: >- base-devel - autoconf-wrapper - automake-wrapper + mingw-w64-x86_64-meson + mingw-w64-x86_64-pkgconf mingw-w64-x86_64-gcc mingw-w64-x86_64-openssl mingw-w64-x86_64-libgcrypt @@ -317,12 +364,14 @@ jobs: shell: msys2 {0} run: sh .ci/package/build.sh if: github.ref == 'refs/heads/1.1' || startsWith(github.ref, 'refs/tags/release-') + continue-on-error: true - name: Upload package uses: actions/upload-artifact@v2 with: name: pkg-windows path: .ci/package/win/tinc-*.exe + continue-on-error: true - name: Run tests without legacy protocol shell: msys2 {0} @@ -332,6 +381,7 @@ jobs: - name: Run tests with libgcrypt shell: msys2 {0} run: sh .ci/test/run.sh gcrypt + if: always() - name: Upload test results uses: actions/upload-artifact@v2 @@ -339,3 +389,46 @@ jobs: name: tests_windows path: /tmp/logs/tests.*.tar.gz if: always() + + msvc: + runs-on: windows-latest + timeout-minutes: 30 + + strategy: + fail-fast: false + matrix: + target: + - { build: amd64, host: amd64, test: test } + - { build: amd64, host: x86, test: test } + - { build: amd64, host: arm64, test: notest } + + env: + HOST_ARCH: ${{ matrix.target.host }} + BUILD_ARCH: ${{ matrix.target.build }} + + steps: + - name: Install meson + run: pip3 install meson + + - name: Checkout code + uses: actions/checkout@v1 + + - name: Activate dev environment + uses: ilammy/msvc-dev-cmd@v1 + with: + arch: ${{ matrix.target.build == matrix.target.host && matrix.target.host || format('{0}_{1}', matrix.target.build, matrix.target.host) }} + + - name: Build (nolegacy) + run: .ci\windows\build.cmd nolegacy + + - name: Test (nolegacy) + run: .ci\windows\test.cmd nolegacy + if: always() && matrix.target.test == 'test' + + - name: Build (OpenSSL) + run: .ci\windows\build.cmd openssl + if: always() + + - name: Test (OpenSSL) + run: .ci\windows\test.cmd openssl + if: always() && matrix.target.test == 'test'