X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=.github%2Fworkflows%2Ftest.yml;h=a9253ab626a440367a6fd088d74633c6db7879ee;hb=ee2d78fa6fbef174ebe91c14de857e2ed46e8127;hp=21b3aba5b4e4e28d4f9b6b6c4cddf924473e8c1a;hpb=14de587f4f56827193291d5b5eed11ffa2190cc6;p=tinc diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 21b3aba5..a9253ab6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,132 +1,188 @@ -name: Build and test +name: Test on: push: - branches: - - master - - "1.1" - tags: - - "release-*" - pull_request: types: - opened - synchronize jobs: - test-linux: + code-style: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Install code formatting tools + run: | + sudo apt-get install -y astyle + curl -OL 'https://github.com/koalaman/shellcheck/releases/download/v0.7.2/shellcheck-v0.7.2.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/v3.3.0/shfmt_v3.3.0_linux_amd64' + chmod 755 ~/shfmt ~/shellcheck + + - name: Check code formatting + run: "! astyle -r --options=.astylerc --dry-run --formatted '*.c' '*.h' | grep '^Formatted'" + + - name: Check scripts formatting + run: find -type f -regextype egrep -regex '.+\.(sh|sh\.in|test)$' -exec ~/shfmt -d -i 2 -s '{}' + + if: always() + + - name: Run static analysis on scripts + run: find -type f -regextype egrep -regex '.+\.sh(\.in)?$' -exec shellcheck -x '{}' + + if: always() + + - name: Prepare test library and run static analysis on tests + run: | + autoreconf -fsi + ./configure --disable-{lzo,readline,zlib,curses} + find -type f -name '*.test' -execdir shellcheck -x '{}' + + if: always() + + sanitizer: + runs-on: ubuntu-latest strategy: - matrix: - os: [ubuntu-18.04, ubuntu-20.04] - compiler: [clang, gcc] - legacy_protocol: ["", --disable-legacy-protocol] fail-fast: false - - runs-on: ${{ matrix.os }} + matrix: + sanitizer: + - thread + - undefined env: - CC: ${{ matrix.compiler }} + SANITIZER: "${{ matrix.sanitizer }}" steps: - name: Checkout code uses: actions/checkout@v2 + with: + fetch-depth: 0 - - name: Install Artistic Style and build deps - run: > - sudo apt-get install -y --no-install-{recommends,suggests} - zlib1g-dev - liblzo2-dev - libncurses-dev - libreadline-dev - libminiupnpc-dev - libvdeplug-dev - astyle - socket - - - name: Install OpenSSL - run: sudo apt-get install -y libssl-dev - if: ${{ matrix.legacy_protocol == '' }} - - - name: Run autoreconf - run: autoreconf -fsi - - - name: Run ./configure + - name: Install deps + shell: bash run: > - ./configure - --enable-{miniupnpc,uml,vde} - ${{ matrix.legacy_protocol }} + sudo apt-get install -y + git binutils make autoconf automake diffutils texinfo netcat + zlib1g-dev lib{ssl,lzo2,ncurses,readline,vdeplug,miniupnpc}-dev - - name: Check code formatting - run: make check-style - - - name: Compile project - run: make -j$(nproc) + - name: Configure and compile + shell: bash + run: bash .github/workflows/sanitizers/build.sh + env: + CC: clang-12 - name: Run tests - # root is required for some tests - run: sudo make check-recursive - timeout-minutes: 20 + run: bash .github/workflows/sanitizers/run.sh + + - name: Archive test results + run: sudo tar -c -z -f test-results.tar.gz test/ sanitizer/ + if: always() - name: Upload test results uses: actions/upload-artifact@v2 with: - name: tests_${{ matrix.os }}_${{ matrix.compiler }} - path: test/test-suite.log - if: failure() + name: tests_sanitizer_${{ matrix.sanitizer }} + path: test-results.tar.gz + if: always() - build-windows: - runs-on: windows-latest + linux: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + os: + - alpine:3.13 + - centos:7 # aka RHEL 7 + - almalinux:8 # aka RHEL 8 + - debian:oldstable + - debian:stable + - debian:testing + - debian:unstable + - ubuntu:18.04 # previous LTS + - ubuntu:20.04 # current LTS + - opensuse/leap # aka SLES + container: + image: ${{ matrix.os }} + options: --privileged steps: + - name: Install deps (Alpine) + run: > + apk add git binutils make autoconf automake gcc linux-headers libtool + diffutils texinfo procps openssl-dev zlib-dev lzo-dev ncurses-dev + readline-dev musl-dev lz4-dev socat + if: startsWith(matrix.os, 'alpine') + + - name: Install deps (Debian and Ubuntu) + shell: bash + run: | + apt-get update + apt-get install -y git binutils make autoconf automake gcc diffutils \ + texinfo netcat procps socat zlib1g-dev lib{ssl,lzo2,lz4,ncurses,readline}-dev + env: + DEBIAN_FRONTEND: noninteractive + if: startsWith(matrix.os, 'debian') || startsWith(matrix.os, 'ubuntu') + + - name: Install deps (RHEL) + shell: bash + run: | + if type dnf 2>/dev/null; then + dnf install -y 'dnf-command(config-manager)' + dnf config-manager --enable powertools + fi + yum install -y epel-release + yum install -y git binutils make autoconf automake gcc diffutils \ + texinfo netcat procps socat {lzo,zlib,lz4,openssl11,ncurses,readline}-devel + if: startsWith(matrix.os, 'centos') || startsWith(matrix.os, 'alma') + + - name: Install deps (SUSE) + shell: bash + run: > + zypper install -y tar git binutils make autoconf automake gcc procps + makeinfo diffutils gzip socat {openssl,zlib,lzo,liblz4,ncurses,readline}-devel + if: startsWith(matrix.os, 'opensuse') + - name: Checkout code uses: actions/checkout@v2 - - - name: Install msys2 - uses: msys2/setup-msys2@v2 with: - update: true - # https://packages.msys2.org/package/ - install: >- - base-devel - mingw-w64-x86_64-gcc - mingw-w64-x86_64-openssl - mingw-w64-x86_64-zlib - mingw-w64-x86_64-lzo2 - mingw-w64-x86_64-ncurses - mingw-w64-x86_64-miniupnpc - git + fetch-depth: 0 - - name: Build the project - shell: msys2 {0} - run: | - autoreconf -fsi - ./configure --with-curses-include=/mingw64/include/ncurses --disable-readline - make -j$(nproc) + - name: Assign name for test results artifact + run: echo TEST_ARTIFACT="$(echo '${{ matrix.os }}' | sed 's|[:/]|_|g')" >>"$GITHUB_ENV" - - name: Check that tinc can be started - shell: msys2 {0} - run: ./src/tinc --version + - name: Run tests with default settings + run: sh .github/workflows/test/run.sh default - - name: Check that tincd can be started - shell: msys2 {0} - run: ./src/tincd --version + - name: Run tests without legacy protocol + run: sh .github/workflows/test/run.sh nolegacy - release-deb: + - name: Upload test results + uses: actions/upload-artifact@v2 + with: + name: tests_${{ env.TEST_ARTIFACT }} + path: /tmp/tests.*.tar.gz + if: always() + + deb-build: if: startsWith(github.ref, 'refs/tags/release-') - needs: test-linux + needs: linux strategy: matrix: - os: ["ubuntu-18.04", ubuntu-20.04] + os: [ubuntu-18.04, ubuntu-20.04] runs-on: ${{ matrix.os }} steps: - name: Checkout code uses: actions/checkout@v2 + with: + fetch-depth: 0 - name: Install build deps run: > sudo apt-get install -y --no-install-{recommends,suggests} + devscripts + git-buildpackage dh-make texinfo libssl-dev @@ -134,70 +190,157 @@ jobs: liblzo2-dev libncurses-dev libreadline-dev + libminiupnpc-dev - - name: Run autoreconf + - name: Configure project run: autoreconf -fsi - - name: Run ./configure - run: > - ./configure - --prefix=/usr - --sbindir=/usr/sbin - --sysconfdir=/etc - --localstatedir=/var - --with-systemd=/usr/lib/systemd/system - - name: Prepare debian directory - run: > - dh_make - --yes - --single - --createorig - --copyright gpl2 - --packagename "tinc_$(git describe --tags --always | sed 's/release-//')-${{ matrix.os }}" + run: bash .github/workflows/deb/prepare.sh env: - DEBFULLNAME: Automated Builds + JOB_DISTRIBUTION: ${{ matrix.os }} - name: Build deb package - run: dpkg-buildpackage -d -us -uc + run: | + dpkg-buildpackage -d -us -uc + mv ../*.deb . + + - name: Upload packages + uses: actions/upload-artifact@v2 + with: + name: deb-${{ matrix.os }} + path: "*.deb" + + deb-publish: + needs: deb-build + + strategy: + matrix: + os: [ubuntu-18.04, ubuntu-20.04] + + runs-on: ${{ matrix.os }} + + steps: + - name: Download built packages + uses: actions/download-artifact@v2 + with: + name: deb-${{ matrix.os }} + + - name: Install package + run: sudo apt-get install -y ./*.deb + + - name: Prepare tinc configs + run: | + set -eu + sudo mkdir -p /etc/tinc/test/hosts + sudo tinc -b -n test generate-ed25519-keys + echo "Name test" | sudo tee /etc/tinc/test/tinc.conf + + - name: Enable and start tincd + run: | + sudo systemctl start tinc@test + sudo tinc -n test dump reachable nodes - name: Publish deb package uses: softprops/action-gh-release@v1 with: - files: | - ../*.deb + files: "*.deb" env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - test-macos: - runs-on: macos-10.15 + macos: + runs-on: macos-latest + + strategy: + fail-fast: false + matrix: + legacy_protocol: ["", --disable-legacy-protocol] steps: - name: Checkout code uses: actions/checkout@v2 + with: + fetch-depth: 0 - - name: Install dependencies - run: brew install coreutils netcat automake lzo miniupnpc - - - name: Run autoreconf - run: autoreconf -fsi + - name: Install build deps + run: brew install coreutils netcat automake lzo lz4 miniupnpc - - name: Run ./configure - run: > - ./configure - --with-openssl=/usr/local/opt/openssl@1.1 - --enable-{tunemu,miniupnpc} + - name: Configure project + run: | + autoreconf -fsi + ./configure --with-openssl=/usr/local/opt/openssl@1.1 --enable-{tunemu,miniupnpc} ${{ matrix.legacy_protocol }} - - name: Compile application + - name: Compile project run: make -j$(sysctl -n hw.ncpu) - name: Run tests - run: make check-recursive - timeout-minutes: 20 + run: make check-recursive VERBOSE=1 + + - name: Archive test results + run: sudo tar -c -z -f test-results.tar.gz test/ + if: always() + + - name: Upload test results + uses: actions/upload-artifact@v2 + with: + name: tests_${{ runner.os }}_${{ matrix.legacy_protocol }} + path: test-results.tar.gz + if: always() + + windows: + runs-on: windows-latest + + strategy: + fail-fast: false + matrix: + legacy_protocol: ["", --disable-legacy-protocol] + + steps: + - name: Checkout code + uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Install msys2 + uses: msys2/setup-msys2@v2 + with: + update: true + # https://packages.msys2.org/package/ + install: >- + base-devel + mingw-w64-x86_64-gcc + mingw-w64-x86_64-openssl + mingw-w64-x86_64-zlib + mingw-w64-x86_64-lzo2 + mingw-w64-x86_64-lz4 + mingw-w64-x86_64-ncurses + mingw-w64-x86_64-miniupnpc + git + netcat + procps + + - name: Configure project + shell: msys2 {0} + run: | + autoreconf -fsi + ./configure --enable-miniupnpc --disable-readline --with-curses-include=/mingw64/include/ncurses ${{ matrix.legacy_protocol }} + + - name: Compile project + shell: msys2 {0} + run: make -j$(nproc) + + - name: Run tests + shell: msys2 {0} + run: make check-recursive VERBOSE=1 + + - name: Archive test results + shell: msys2 {0} + run: tar -c -z -f test-results.tar.gz test/ + if: always() - name: Upload test results uses: actions/upload-artifact@v2 with: - name: tests_${{ runner.os }} - path: test/test-suite.log - if: failure() + name: tests_${{ runner.os }}_${{ matrix.legacy_protocol }} + path: test-results.tar.gz + if: always()