ср, 29 июл. 2020 г. в 21:49, Tim Duesterhus <t...@bastelstu.be>:

> Travis is becoming overall increasingly unreliable lately. We've already
> seen that the timing sensitive tests regularly fail and thus they were
> disabled.
>
> GitHub Actions VMs are working well, possibly allowing to use custom
> runners
> for special tasks in the future.
>
> In addition to this better performance its workflow configuration language
> is more expressive compared to the Travis CI one. Specifically the build
> matrix does not need to be specified in YAML. Instead it can be generated
> ad-hoc using a script. This allows us to cleanly define the various build
> configurations without having an unreadable 80 line mess where the flags
> are inconsistently activated. As an example in the current Travis CI
> configuration the prometheus exporter is tested together with LibreSSL
> 2.9.2
> for whatever reason.
>
> In addition to all the previous points the UI of Travis is not that nice.
> On GitHub you are just seeing that "Travis failed" without any details
> which
> exact job failed. This requires you to visit the slow Travis page and look
> up the details there. GitHub Actions creates a single entry for each
> configuration that is tested, allowing you to see the details without
> needing
> to leave GitHub.
>
> This new GitHub Actions workflow aims to reproduce the configurations
> tested
> in Travis. It comes close, but is not completely there, yet. Consider this
> patch a proof of concept that will evolve in the future, ideally with
> Ilya's
> expertise.
>
> The current configurations are as follows. Each one is tested with both gcc
> and clang.
> - All features disabled (no USE flags)
> - All features enabled (all USE flags)
> - Standalone test of each of the supported compression libraries:
>   - USE_ZLIB=1
>   - USE_SLZ=1
> - Standalone test of various SSL libraries:
>   - stock (the SSL on the VM)
>   - OpenSSL 1.0.2u, 1.1.0l, 1.1.1f
>   - LibreSSL 2.9.2, 3.0.2, 3.1.1
>
> Future additions of new tests should take care to not test unrelated stuff.
> Instead a distinct configuration should be added.
>
> Additionally there is a Mac OS test with clang and all features disabled.
>
> Known issues:
> - Apparently the git commit is not properly detected during build. The HEAD
>   currently shows as 2.3-dev1.
> - Mac OS currently fails.
> - The detailed logs are not printed for failing tests.
> ---
>  .github/workflows/vtest.yml | 175 ++++++++++++++++++++++++++++++++++++
>  1 file changed, 175 insertions(+)
>  create mode 100644 .github/workflows/vtest.yml
>
> diff --git a/.github/workflows/vtest.yml b/.github/workflows/vtest.yml
> new file mode 100644
> index 000000000..d94322474
> --- /dev/null
> +++ b/.github/workflows/vtest.yml
> @@ -0,0 +1,175 @@
> +# Copyright 2019 Ilya Shipitsin <chipits...@gmail.com>
> +# Copyright 2020 Tim Duesterhus <t...@bastelstu.be>
> +#
> +# This program is free software; you can redistribute it and/or
> +# modify it under the terms of the GNU General Public License
> +# as published by the Free Software Foundation; either version
> +# 2 of the License, or (at your option) any later version.
> +
> +name: VTest
> +
> +on:
> +  push:
> +
> +jobs:
> +  generate-matrix:
> +    name: Generate Build Matrix
> +    runs-on: ubuntu-latest
> +    outputs:
> +      matrix: ${{ steps.set-matrix.outputs.matrix }}
> +    steps:
> +      - name: Generate Build Matrix
> +        id: set-matrix
> +        shell: python
> +        run: |
> +          import json
> +
> +          matrix = []
> +          os = "ubuntu-latest"
> +          TARGET = "linux-glibc"
> +          for CC in [ "gcc", "clang" ]:
> +            matrix.append({
> +              "name": "{} with no features enabled on {}".format(CC, os),
> +              "os": os,
> +              "TARGET": TARGET,
> +              "CC": CC,
> +              "FLAGS": ""
> +            })
> +
> +            matrix.append({
> +              "name": "{} with all features enabled on {}".format(CC, os),
> +              "os": os,
> +              "TARGET": TARGET,
> +              "CC": CC,
> +              "FLAGS": " ".join([
> +                "USE_ZLIB=1",
> +                "USE_PCRE=1",
> +                "USE_PCRE_JIT=1",
> +                "USE_LUA=1",
> +                "USE_OPENSSL=1",
> +                "USE_SYSTEMD=1",
> +              #  "USE_WURFL=1",
> +              #  "WURFL_INC=contrib/wurfl",
> +              #  "WURFL_LIB=contrib/wurfl",
> +              #  "USE_DEVICEATLAS=1",
> +              #  "DEVICEATLAS_SRC=contrib/deviceatlas",
> +              #  "USE_51DEGREES=1",
> +              #  "FIFTYONEDEGREES_SRC=contrib/51d/src/pattern",
> +              ])
> +            })
> +
> +            for compression in [
> +              "USE_SLZ=1",
> +              "USE_ZLIB=1"
> +            ]:
> +              matrix.append({
> +                "name": "{} with {} on {}".format(CC, compression, os),
> +                "os": os,
> +                "TARGET": TARGET,
> +                "CC": CC,
> +                "compression": compression,
> +                "FLAGS": compression
> +              })
> +
> +            for ssl in [
> +              "stock",
> +              "OPENSSL_VERSION=1.0.2u",
> +              "OPENSSL_VERSION=1.1.0l",
> +              "OPENSSL_VERSION=1.1.1f",
> +              "LIBRESSL_VERSION=2.9.2",
> +              "LIBRESSL_VERSION=3.0.2",
> +              "LIBRESSL_VERSION=3.1.1",
> +            ]:
> +              flags = ["USE_OPENSSL=1"]
> +              if ssl != "stock":
> +                flags.append("SSL_LIB=${HOME}/opt/lib")
> +                flags.append("SSL_INC=${HOME}/opt/include")
>

I do not like that polluting assignment. I know where it came from, it was
me :)
I'm going to get rid of it, hope in 1-2 weeks.



> +              matrix.append({
> +                "name": "{} with {} SSL on {}".format(CC, ssl, os),
> +                "os": os,
> +                "TARGET": TARGET,
> +                "CC": CC,
> +                "ssl": ssl,
> +                "FLAGS": " ".join(flags)
> +              })
> +
> +          os = "macos-latest"
> +          TARGET = "osx"
> +          for CC in [ "clang" ]:
> +            matrix.append({
> +              "name": "{} with no features enabled on {}".format(CC, os),
> +              "os": os,
> +              "TARGET": TARGET,
> +              "CC": CC,
> +              "FLAGS": ""
> +            })
> +
> +          print("::set-output name=matrix::{}".format(json.dumps({
> +            "include": matrix
> +          })))
> +  Test:
> +    name: ${{ matrix.name }}
> +    needs: generate-matrix
> +    runs-on: ${{ matrix.os }}
> +    strategy:
> +      matrix: ${{ fromJson(needs.generate-matrix.outputs.matrix) }}
> +      fail-fast: false
> +    steps:
> +    - uses: actions/checkout@v2
> +      with:
> +        fetch-depth: 100
> +    - name: Install apt dependencies.
> +      if: ${{ startsWith(matrix.os, 'ubuntu-') }}
> +      run: |
> +        sudo apt-get install -y \
> +          liblua5.3-dev \
> +          libpcre2-dev \
> +          libsystemd-dev \
> +          ninja-build \
> +          socat
> +    - name: Install brew dependencies.
> +      if: ${{ startsWith(matrix.os, 'macos-') }}
> +      run: |
> +        brew install socat
> +        brew install lua
> +    - name: Install VTest.
> +      run: |
> +        curl -fsSL https://github.com/vtest/VTest/archive/master.tar.gz
> -o VTest.tar.gz
> +        mkdir VTest
> +        tar xvf VTest.tar.gz -C VTest --strip-components=1
> +        make -C VTest -j$(nproc) FLAGS="-O2 -s -Wall"
> +        sudo install -m755 VTest/vtest /usr/local/bin/vtest
> +    - name: Install SLZ
> +      if: ${{ matrix.compression == 'USE_SLZ=1' }}
> +      run: |
> +        curl -fsSL
> https://github.com/wtarreau/libslz/archive/master.tar.gz -o libslz.tar.gz
> +        mkdir libslz
> +        tar xvf libslz.tar.gz -C libslz --strip-components=1
> +        make -C libslz
> +        sudo make -C libslz install
> +    - name: Install SSL ${{ matrix.ssl }}
> +      if: ${{ matrix.ssl && matrix.ssl != 'stock' }}
> +      run: env ${{ matrix.ssl }} scripts/build-ssl.sh
> +    - name: Compile HAProxy with ${{ matrix.CC }}.
> +      run: |
> +        make -j$(nproc) all \
> +          ERR=1 \
> +          TARGET=${{ matrix.TARGET }} \
> +          CC=${{ matrix.CC }} \
> +          ${{ matrix.FLAGS }} \
> +          ADDLIB="-Wl,-rpath,/usr/local/lib/ -Wl,-rpath,$HOME/opt/lib/"
> +        sudo make install
> +    - name: Show HAProxy version.
> +      id: show-version
> +      run: |
> +        echo "::group::Show dynamic libraries."
> +        if command -v ldd > /dev/null; then
> +          ldd $(which haproxy)
> +        else
> +          otool -L $(which haproxy)
> +        fi
> +        echo "::endgroup::"
> +        haproxy -vv
> +        echo "::set-output name=version::$(haproxy -v |awk 'NR==1{print
> $3}')"
> +    - name: Run VTest for HAProxy ${{ steps.show-version.outputs.version
> }}
> +      run: make reg-tests
> --
> 2.28.0
>
>

Reply via email to