name: Test on: push: pull_request: types: - opened - synchronize jobs: static-analysis: runs-on: ubuntu-latest timeout-minutes: 10 steps: - name: Checkout code uses: actions/checkout@v2 - 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 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 env: CLANG: 11 SHELLCHECK: 0.7.2 SHFMT: 3.3.0 - name: Install deps run: > sudo apt-get install -y git binutils make autoconf automake diffutils texinfo netcat zlib1g-dev lib{ssl,lzo2,ncurses,readline,vdeplug,miniupnpc,gcrypt}-dev - name: Configure and compile run: | autoreconf -fsi ./configure --enable-{uml,vde,miniupnpc} make -j$(nproc) compiledb -n make check - 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 '{}' + if: always() - name: Run static analysis on scripts run: find -type f -regextype egrep -regex '.+\.sh(\.in)?$' -exec shellcheck -x '{}' + if: always() - name: Run static analysis on tests run: find -type f -name '*.test' -execdir shellcheck -x '{}' + if: always() - name: Run clang-tidy run: | find src \ ! '(' -path src/solaris -prune ')' \ ! '(' -path src/mingw -prune ')' \ ! '(' -path src/bsd -prune ')' \ -name '*.c' \ -exec clang-tidy --header-filter='.*' '{}' + if: always() - name: Check warnings (gcc) run: bash .github/workflows/warn/run.sh env: CC: gcc if: always() - name: Check warnings (clang) run: bash .github/workflows/warn/run.sh env: CC: clang if: always() sanitizer: runs-on: ubuntu-latest timeout-minutes: 10 strategy: fail-fast: false matrix: sanitizer: - address - thread - undefined env: SANITIZER: "${{ matrix.sanitizer }}" steps: - name: Checkout code uses: actions/checkout@v2 with: fetch-depth: 0 - name: Install deps shell: bash run: > sudo apt-get install -y git binutils make autoconf automake diffutils texinfo netcat zlib1g-dev lib{ssl,lzo2,ncurses,readline,vdeplug,miniupnpc}-dev - name: Configure and compile shell: bash run: bash .github/workflows/sanitizers/build.sh env: CC: clang-12 - name: Run tests 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_sanitizer_${{ matrix.sanitizer }} path: test-results.tar.gz if: always() linux: runs-on: ubuntu-latest timeout-minutes: 10 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 env: CI: 1 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 shadow sudo 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 sudo \ 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 sudo \ texinfo netcat procps socat {lzo,zlib,lz4,ncurses,readline}-devel yum install -y openssl11-devel || yum install -y openssl-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 sudo makeinfo diffutils gzip socat {openssl,zlib,lzo,liblz4,ncurses,readline}-devel if: startsWith(matrix.os, 'opensuse') - name: Checkout code uses: actions/checkout@v2 with: fetch-depth: 0 - name: Assign name for test results artifact run: echo TEST_ARTIFACT="$(echo '${{ matrix.os }}' | sed 's|[:/]|_|g')" >>"$GITHUB_ENV" - name: Create a non-privileged user run: | useradd --user-group build chown -R build:build . echo 'build ALL=(ALL) NOPASSWD: ALL' >/etc/sudoers.d/build - name: Run tests with default settings run: sudo -u build CI=1 sh .github/workflows/test/run.sh default - name: Run tests without legacy protocol run: sudo -u build CI=1 sh .github/workflows/test/run.sh nolegacy - 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: linux strategy: matrix: os: [ubuntu-18.04, ubuntu-20.04] runs-on: ${{ matrix.os }} timeout-minutes: 5 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 zlib1g-dev liblzo2-dev libncurses-dev libreadline-dev libminiupnpc-dev - name: Configure project run: autoreconf -fsi - name: Prepare debian directory run: bash .github/workflows/deb/prepare.sh env: JOB_DISTRIBUTION: ${{ matrix.os }} - name: Build deb package 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 }} timeout-minutes: 5 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" env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} macos: runs-on: macos-latest timeout-minutes: 10 strategy: fail-fast: false matrix: legacy_protocol: ["", --disable-legacy-protocol] steps: - name: Checkout code uses: actions/checkout@v2 with: fetch-depth: 0 - name: Install build deps run: | brew install coreutils netcat automake lzo lz4 miniupnpc pip3 install --user compiledb - name: Configure and compile run: | export CPPFLAGS="-I/usr/local/include" export CPPFLAGS="$CPPFLAGS -I$(brew --prefix libgcrypt)/include" export CPPFLAGS="$CPPFLAGS -I$(brew --prefix openssl)/include" export CPPFLAGS="$CPPFLAGS -I$(brew --prefix libgcrypt)/include" autoreconf -fsi ./configure \ --with-openssl="$(brew --prefix openssl)" \ --with-miniupnpc="$(brew --prefix miniupnpc)" \ --enable-{tunemu,miniupnpc} \ ${{ matrix.legacy_protocol }} make -j$(sysctl -n hw.ncpu) - name: Run tests run: | export PATH="$PATH:$HOME/Library/Python/3.9/bin" compiledb make -j$(sysctl -n hw.ncpu) check VERBOSE=1 - name: Run clang-tidy run: | export PATH="$PATH:$(brew --prefix llvm)/bin/" find src \ ! '(' -path src/solaris -prune ')' \ ! '(' -path src/mingw -prune ')' \ ! '(' -path src/linux -prune ')' \ ! -name vde_device.c \ -name '*.c' \ -exec clang-tidy --header-filter='.*' '{}' + if: ${{ matrix.legacy_protocol == '' }} - 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 timeout-minutes: 20 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 }}_${{ matrix.legacy_protocol }} path: test-results.tar.gz if: always()