name: alpine/musl

on:
  push:

permissions:
  contents: read

jobs:
  musl:
      name: gcc
      runs-on: ubuntu-latest
      container:
        image: alpine:latest
        options: --privileged --ulimit core=-1 --security-opt seccomp=unconfined
        volumes:
          - /tmp/core:/tmp/core
      steps:
      - name: Setup coredumps
        run: |
          ulimit -c unlimited
          echo '/tmp/core/core.%h.%e.%t' > /proc/sys/kernel/core_pattern
      - uses: actions/checkout@v4
      - name: Install dependencies
        run: apk add gcc gdb make tar git python3 libc-dev linux-headers pcre-dev pcre2-dev openssl-dev lua5.3-dev grep socat curl musl-dbg lua5.3-dbg
      - name: Install VTest
        run: scripts/build-vtest.sh
      - name: Build
        run: make -j$(nproc) TARGET=linux-musl ARCH_FLAGS='-ggdb3' CC=cc V=1 USE_LUA=1 LUA_INC=/usr/include/lua5.3 LUA_LIB=/usr/lib/lua5.3 USE_OPENSSL=1 USE_PCRE2=1 USE_PCRE2_JIT=1 USE_PROMEX=1
      - name: Show version
        run: ./haproxy -vv
      - name: Show linked libraries
        run: ldd haproxy
      - name: Install problem matcher for VTest
        # This allows one to more easily see which tests fail.
        run: echo "::add-matcher::.github/vtest.json"
      - name: Run VTest
        id: vtest
        run: make reg-tests VTEST_PROGRAM=../vtest/vtest REGTESTS_TYPES=default,bug,devel
      - name: Show coredumps
        if: ${{ failure() && steps.vtest.outcome == 'failure' }}
        run: |
          failed=false
          ls /tmp/core/
          for file in /tmp/core/core.*; do
            failed=true
            printf "::group::"
            gdb -ex 'thread apply all bt full' ./haproxy $file
            echo "::endgroup::"
          done
          if [ "$failed" = true ]; then
            exit 1;
          fi
      - name: Show results
        if: ${{ failure() }}
        run: |
          for folder in /tmp/haregtests-*/vtc.*; do
            printf "::group::"
            cat $folder/INFO
            cat $folder/LOG
            echo "::endgroup::"
          done
