1
0
mirror of https://github.com/wolfSSL/wolfssl.git synced 2026-10-24 04:09:07 +03:00
Files
wolfssl/.github/workflows/libssh2.yml
Tobias Frauenschläger b10744a04e Fix the libssh2 test retry, which never actually ran
The retry added for the flaky Docker OpenSSH-server tests was a no-op.
automake generates the recheck target only in the directory that defines
TESTS, so libssh2 has it in tests/Makefile but not at the top level. Every
flaky run ended with "No rule to make target 'recheck'" twice and failed
the job on the first transient error. Run recheck in tests/ instead.

Also correct the description of the race. The handshake fails with -43,
which is LIBSSH2_ERROR_SOCKET_RECV rather than a banner timeout:
docker-proxy binds the published port as soon as the container starts, so
connect() succeeds and sshd resets the connection because it is not
listening inside the container yet. That is why the fixture cannot recover
on its own, as its retry loop only covers connect(), which never fails
here.

Cap the test parallelism at the runner's CPU count. "make -j" is
unbounded, and the failing runs started around 20 containers at once on a
four-CPU runner, which is what starves sshd of the time it needs to come
up. Every observed failure was a single random test out of 46 inside that
burst.

A genuine failure is still retried twice and still fails the job.
2026-08-31 12:01:29 +02:00

114 lines
3.7 KiB
YAML

name: libssh2 Tests
# START OF COMMON SECTION
on:
push:
branches: [ 'release/**' ]
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
branches: [ '*' ]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
# END OF COMMON SECTION
jobs:
build_wolfssl:
name: Build wolfSSL
# Just to keep it the same as the testing target
if: ${{ (github.repository_owner == 'wolfssl') && (github.event_name != 'pull_request' || github.event.pull_request.draft == false) }}
runs-on: ubuntu-24.04
# This should be a safe limit for the tests to run.
timeout-minutes: 4
steps:
- name: Build wolfSSL
uses: wolfSSL/actions-build-autotools-project@v1
with:
path: wolfssl
configure: --enable-all
check: false # config is already tested in many other PRB's
install: true
- name: tar build-dir
run: tar -zcf build-dir.tgz build-dir
- name: Upload built lib
uses: actions/upload-artifact@v6
with:
name: wolf-install-libssh2
path: build-dir.tgz
retention-days: 5
libssh2_check:
strategy:
fail-fast: false
matrix:
# List of releases to test
ref: [ 1.11.1 ]
name: ${{ matrix.ref }}
if: ${{ (github.repository_owner == 'wolfssl') && (github.event_name != 'pull_request' || github.event.pull_request.draft == false) }}
runs-on: ubuntu-24.04
# This should be a safe limit for the tests to run.
timeout-minutes: 8
needs: build_wolfssl
steps:
- name: Download lib
uses: actions/download-artifact@v7
with:
name: wolf-install-libssh2
- name: untar build-dir
run: tar -xf build-dir.tgz
- name: Clone libssh2
uses: actions/checkout@v5
with:
repository: libssh2/libssh2
ref: libssh2-${{ matrix.ref }}
path: libssh2
fetch-depth: 1
- name: Update libssh2 test to use a stable version of debian
working-directory: libssh2
run: |
sed -i 's/testing-slim/oldstable-slim/' tests/openssh_server/Dockerfile
- name: Build libssh2
working-directory: libssh2
run: |
autoreconf -fi
./configure --with-crypto=wolfssl --with-libwolfssl-prefix=$GITHUB_WORKSPACE/build-dir
make -j
- name: Pre-build Docker image to avoid concurrent docker build race
working-directory: libssh2
run: docker build -t libssh2/openssh_server tests/openssh_server
- name: Run libssh2 tests
working-directory: libssh2
# The Docker OpenSSH-server tests hit a container-readiness race:
# docker-proxy binds the published port as soon as the container
# starts, so connect() succeeds and the handshake then fails with
# ECONNRESET (-43) because sshd inside the container is not listening
# yet. The libssh2 fixture only retries connect(), which never fails
# here, so it cannot recover on its own. Cap the parallelism to the
# runner's CPU count to shrink the burst of simultaneous containers,
# then re-run only the tests that did not pass. Note that recheck is
# generated by automake only in the directory holding TESTS, so it has
# to run in tests/. A genuine failure still fails the job.
run: |
make -j"$(nproc)" check \
|| make -C tests recheck \
|| make -C tests recheck
- name: Confirm libssh2 built with wolfSSL
run: ldd libssh2/src/.libs/libssh2.so | grep wolfssl
- name: print test logs
if: ${{ failure() }}
run: tail -n +1 libssh2/tests/*.log