blob: 25563afcc90d3356ecd47594902b6f797f495f06 [file]
name: Linux
on:
push:
branches: [ "*" ]
paths-ignore:
- 'docs/**'
- STATUS
- CHANGES
- README*
- '**.md'
- changes-entries/*
- .asf.yaml
tags:
- 2.*
pull_request:
branches: [ "trunk", "2.4.x" ]
paths-ignore:
- 'docs/**'
- STATUS
- CHANGES
- README*
- '**.md'
- changes-entries/*
permissions:
contents: read
env:
CFLAGS: "-g"
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
jobs:
build:
strategy:
fail-fast: false
# https://infra.apache.org/github-actions-policy.html requires a
# job concurrency level of 20 or less.
max-parallel: 20
matrix:
include:
# -------------------------------------------------------------------------
- name: Default
# -------------------------------------------------------------------------
- name: All-static modules
config: --enable-mods-static=reallyall
# -------------------------------------------------------------------------
- name: Prefork MPM, all-modules (except cgid)
config: --enable-mods-shared=reallyall --with-mpm=prefork --disable-cgid
# -------------------------------------------------------------------------
- name: Worker MPM, all-modules
config: --enable-mods-shared=reallyall --with-mpm=worker
# -------------------------------------------------------------------------
- name: Shared MPMs, all-modules
config: --enable-mods-shared=reallyall --enable-mpms-shared=all
# -------------------------------------------------------------------------
- name: Event MPM, all-modules, mod_cgid fdpassing
config: --enable-mods-shared=reallyall --with-mpm=event --disable-cgi --enable-cgid-fdpassing
# -------------------------------------------------------------------------
- name: Shared MPMs, all-modules, 64-bit ARM
config: --enable-mods-shared=reallyall --enable-mpms-shared=all
os: ubuntu-24.04-arm
# -------------------------------------------------------------------------
- name: Event MPM, all-modules, mod_cgid w/o fdpassing
config: --enable-mods-shared=reallyall --with-mpm=event --disable-cgi
# -------------------------------------------------------------------------
- name: Default, all-modules + install
config: --enable-mods-shared=reallyall
env: |
TEST_INSTALL=1
APACHE_TEST_EXTRA_ARGS=-v
# -------------------------------------------------------------------------
- name: Default, all-modules, random test order
config: --enable-mods-shared=reallyall
env: |
TEST_ARGS=-order=random
# -------------------------------------------------------------------------
- name: GCC 14 maintainer-mode w/-Werror, install + VPATH
os: ubuntu-24.04
config: --enable-mods-shared=reallyall --enable-maintainer-mode
notest-cflags: -Werror -O2
pkgs: gcc-14
env: |
CC=gcc-14
TEST_VPATH=1
TEST_INSTALL=1
SKIP_TESTING=1
# -------------------------------------------------------------------------
- name: All-modules, APR 1.7.6, APR-util 1.6.5
config: --enable-mods-shared=reallyall
env: |
APR_VERSION=1.7.6
APU_VERSION=1.6.5
APU_CONFIG="--with-crypto --with-ldap"
# -------------------------------------------------------------------------
- name: APR 1.7.6, APR-util 1.6.5 (no APU crypto/LDAP)
config: --enable-mods-shared=reallyall
env: |
APR_VERSION=1.7.6
APU_VERSION=1.6.5
APU_CONFIG="--without-crypto --without-ldap"
# -------------------------------------------------------------------------
- name: APR 1.7.x, APR-util 1.6.x
config: --enable-mods-shared=reallyall
env: |
APR_VERSION=1.7.x
APU_VERSION=1.6.x
APU_CONFIG="--with-crypto --with-ldap"
# -------------------------------------------------------------------------
- name: APR 1.8.x, APR-util 1.7.x
config: --enable-mods-shared=reallyall
env: |
APR_VERSION=1.8.x
APU_VERSION=1.7.x
APU_CONFIG="--with-crypto --with-ldap"
# -------------------------------------------------------------------------
# Oldest supported APR/APR-util branches. Their configure
# tests fail to compile with GCC 14 or later.
- name: APR 1.4.8, APR-util 1.3.12
os: ubuntu-24.04
config: --enable-mods-shared=reallyall
env: |
TEST_APR_TARBALL=yes
APR_VERSION=1.4.8
APU_VERSION=1.3.12
APU_CONFIG="--with-crypto --with-ldap"
# -------------------------------------------------------------------------
- name: Pool-debug
config: --enable-mods-shared=reallyall
env: |
APR_VERSION=1.7.x
APR_CONFIG="--enable-pool-debug"
APU_VERSION=1.7.x
APU_CONFIG="--with-crypto --with-ldap"
TEST_MALLOC=1
# -------------------------------------------------------------------------
- name: Shared MPMs (event), pool-debug, SSL/TLS variants
config: --enable-mods-shared=reallyall --enable-mpms-shared=all --with-mpm=event
env: |
APR_VERSION=1.7.x
APR_CONFIG="--enable-pool-debug"
APU_VERSION=1.7.x
APU_CONFIG="--with-crypto --with-ldap"
TEST_MALLOC=1
TEST_SSL=1
# -------------------------------------------------------------------------
- name: Shared MPMs (worker), pool-debug, SSL/TLS variants
config: --enable-mods-shared=reallyall --enable-mpms-shared=all --with-mpm=worker
env: |
APR_VERSION=1.7.x
APR_CONFIG="--enable-pool-debug"
APU_VERSION=1.7.x
APU_CONFIG="--with-crypto --with-ldap"
TEST_MALLOC=1
TEST_SSL=1
# -------------------------------------------------------------------------
- name: Shared MPMs (prefork), pool-debug, SSL/TLS variants
config: --enable-mods-shared=reallyall --enable-mpms-shared=all --with-mpm=prefork
env: |
APR_VERSION=1.7.x
APR_CONFIG="--enable-pool-debug"
APU_VERSION=1.7.x
APU_CONFIG="--with-crypto --with-ldap"
TEST_MALLOC=1
TEST_SSL=1
# -------------------------------------------------------------------------
- name: litmus WebDAV tests
config: --enable-dav --enable-dav-fs
env: |
LITMUS=1
TESTS="t/modules/dav.t"
pkgs: litmus
# -------------------------------------------------------------------------
- name: APR 1.7.6, APR-util 1.6.3, LDAP
config: --enable-mods-shared=reallyall
pkgs: ldap-utils
env: |
APR_VERSION=1.7.6
APU_VERSION=1.6.3
APU_CONFIG="--with-crypto --with-ldap"
TEST_MALLOC=1
TEST_LDAP=1
TEST_ARGS="-defines LDAP"
TESTS="t/modules/"
# -------------------------------------------------------------------------
- name: APR 1.7.x, APR-util 1.7.x, LDAP
config: --enable-mods-shared=reallyall
pkgs: ldap-utils
env: |
APR_VERSION=1.7.x
APU_VERSION=1.7.x
APU_CONFIG="--with-crypto --with-ldap"
TEST_MALLOC=1
TEST_LDAP=1
TEST_ARGS="-defines LDAP"
TESTS="t/modules/"
# -------------------------------------------------------------------------
### TODO: if: *condition_not_24x
- name: APR trunk thread debugging
config: --enable-mods-shared=reallyall --with-mpm=event
env: |
APR_VERSION=trunk
APR_CONFIG="--with-crypto --enable-thread-debug"
# -------------------------------------------------------------------------
- name: ASan
notest-cflags: -ggdb -fsanitize=address -fno-sanitize-recover=address -fno-omit-frame-pointer
config: --enable-mods-shared=reallyall
env: |
APR_VERSION=1.7.x
APU_VERSION=1.7.x
APU_CONFIG="--with-crypto --with-ldap"
TEST_ASAN=1
# -------------------------------------------------------------------------
- name: ASan, pool-debug
notest-cflags: -ggdb -fsanitize=address -fno-sanitize-recover=address -fno-omit-frame-pointer
config: --enable-mods-shared=reallyall
env: |
APR_VERSION=1.7.x
APR_CONFIG="--enable-pool-debug"
APU_VERSION=1.7.x
APU_CONFIG="--with-crypto --with-ldap"
TEST_ASAN=1
# -------------------------------------------------------------------------
# Runs every pytest-based test suite via `make check-all-pytest`.
# See TEST_PYTEST in test/travis_run_linux.sh.
- name: Python pytest test suites
config: --enable-mods-shared=reallyall --with-mpm=event --enable-mpms-shared=all
pkgs: nghttp2-client
env: |
APR_VERSION=1.7.6
APU_VERSION=1.6.5
APU_CONFIG="--with-crypto"
NO_TEST_FRAMEWORK=1
TEST_PYTEST=1
# -------------------------------------------------------------------------
### TODO: if: *condition_not_24x
### TODO: pebble install is broken.
# - name: ACME test suite
# config: --enable-mods-shared=reallyall --with-mpm=event --enable-mpms-shared=event
# pkgs: >-
# python3-pytest nghttp2-client python3-cryptography python3-requests python3-filelock
# golang-1.17 curl
# env: |
# APR_VERSION=1.7.6
# APU_VERSION=1.6.3
# APU_CONFIG="--with-crypto"
# GOROOT=/usr/lib/go-1.17
# NO_TEST_FRAMEWORK=1
# TEST_INSTALL=1
# TEST_MD=1
# -------------------------------------------------------------------------
### TODO: if: *condition_not_24x
# -------------------------------------------------------------------------
### TODO if: *condition_not_24x
### TODO: Fails because :i386 packages are not being found.
# - name: i386 Shared MPMs, most modules, maintainer-mode w/-Werror
# config: --enable-mods-shared=reallyall --disable-xml2enc --disable-proxy-html --enable-mpms-shared=all --enable-maintainer-mode
# pkgs: >-
# cpanminus libc6-dev-i386 gcc-multilib libexpat1-dev:i386 libssl-dev:i386
# lib32z1-dev libbrotli-dev:i386 libpcre2-dev:i386 libldap2-dev:i386 libtool-bin
# perl-doc libapr1-dev libbrotli-dev:i386
# env: |
# PKG_CONFIG_PATH="/usr/lib/i386-linux-gnu/pkgconfig"
# NOTEST_CFLAGS="-Werror"
# CC="gcc -m32"
# APR_VERSION=1.7.3
# APU_VERSION=1.6.5
# APU_CONFIG="--with-crypto --with-ldap"
# -------------------------------------------------------------------------
- name: OpenSSL 3.0 LTS
config: --enable-mods-shared=most --enable-maintainer-mode --disable-md --disable-http2 --disable-ldap --disable-crypto
env: |
TEST_OPENSSL3=3.0.22
APR_VERSION=1.7.6
APU_VERSION=1.6.5
APU_CONFIG="--without-crypto"
# -------------------------------------------------------------------------
- name: OpenSSL 3.4 -Werror
config: --enable-mods-shared=most --enable-maintainer-mode --disable-md --disable-http2 --disable-ldap --disable-crypto
notest-cflags: -Werror -O2
env: |
TEST_OPENSSL3=3.4.8
APR_VERSION=1.7.6
APU_VERSION=1.6.5
APU_CONFIG="--without-crypto"
# -------------------------------------------------------------------------
- name: OpenSSL 3.4 no-engine
config: --enable-mods-shared=most --enable-maintainer-mode --disable-md --disable-http2 --disable-ldap --disable-crypto
env: |
TEST_OPENSSL3=3.4.8
OPENSSL_CONFIG=no-engine
APR_VERSION=1.7.6
APU_VERSION=1.6.5
APU_CONFIG="--without-crypto"
# -------------------------------------------------------------------------
- name: OpenSSL 3.5 no-engine -Werror
config: --enable-mods-shared=most --enable-maintainer-mode --disable-md --disable-http2 --disable-ldap --disable-crypto
notest-cflags: -Werror -O2
env: |
TEST_OPENSSL3=3.5.9
OPENSSL_CONFIG=no-engine
APR_VERSION=1.7.6
APU_VERSION=1.6.5
APU_CONFIG="--without-crypto"
# -------------------------------------------------------------------------
- name: OpenSSL 4.0
config: --enable-mods-shared=most --enable-maintainer-mode --disable-md --disable-http2 --disable-ldap --disable-crypto
notest-cflags: -Werror -O2
env: |
TEST_OPENSSL3=4.0.3
OPENSSL_CONFIG=
APR_VERSION=1.7.6
APU_VERSION=1.6.5
APU_CONFIG="--without-crypto"
# -------------------------------------------------------------------------
runs-on: ${{ matrix.os == '' && 'ubuntu-latest' || matrix.os }}
timeout-minutes: 30
env:
NOTEST_CFLAGS: ${{ matrix.notest-cflags }}
CONFIG: ${{ matrix.config }}
name: ${{ matrix.name }}
steps:
# JOBID names the artifacts uploaded on failure; see "Artifacts" in
# README.ci. IMAGEOS is exported so that it is visible to the env
# context, which does not see the runner's own $ImageOS.
- name: Set environment variables
env:
MATRIX_NAME: ${{ matrix.name }}
run: |
echo "${{ matrix.env }}" >> $GITHUB_ENV
echo "IMAGEOS=$ImageOS" >> $GITHUB_ENV
# The scripts run "make $MFLAGS"; default it to the number of
# CPUs the runner has, unless the matrix entry set it already.
grep -q '^MFLAGS=' $GITHUB_ENV || echo "MFLAGS=-j`nproc`" >> $GITHUB_ENV
# Use whichever php-fpm the runner image ships, so this doesn't
# break when the image moves to a new PHP version, unless the
# matrix entry set PHP_FPM already.
if ! grep -q '^PHP_FPM=' $GITHUB_ENV; then
PHP_FPM=`ls -1 /usr/sbin/php-fpm* 2>/dev/null | sort -V | tail -n1`
if test -z "$PHP_FPM"; then
echo "::error::No php-fpm found in /usr/sbin"
exit 1
fi
echo "PHP_FPM=$PHP_FPM" >> $GITHUB_ENV
fi
echo JOBID=`printf '%s-%s' "${{ strategy.job-index }}" "$MATRIX_NAME" \
| tr -cs '[:alnum:]._-' '-'` >> $GITHUB_ENV
- name: apt refresh
run: sudo apt-get -o Acquire::Retries=5 update
# cpanminus and perl-doc are only used to build the CPAN modules for
# the Perl test framework, and perl-doc drags in around a hundred
# packages. gdb is only used to extract a backtrace from any core
# dumped during testing, which includes the pytest suites.
- name: Install prerequisites
run: sudo apt-get install -o Acquire::Retries=5
libtool-bin libapr1-dev libaprutil1-dev
liblua5.3-dev libbrotli-dev libcurl4-openssl-dev
libnghttp2-dev libjansson-dev libpcre2-dev
${{ ! ( env.SKIP_TESTING || env.NO_TEST_FRAMEWORK ) && 'cpanminus perl-doc' || '' }}
${{ ! env.SKIP_TESTING && 'gdb' || '' }}
libsasl2-dev ${{ matrix.pkgs }}
- uses: actions/checkout@v6
- uses: actions/checkout@v6
with:
repository: apache/httpd-tests
path: test/perl-framework
submodules: true
if: ${{ ! ( env.SKIP_TESTING || env.NO_TEST_FRAMEWORK ) }}
# Sets $ROOTID, identifying the contents of ~/root - left unset for
# a job which builds no dependencies from source - and $PERLID,
# identifying the perl which the ~/perl5 modules are built against.
- name: Resolve dependency versions
run: ./test/gha-resolve-deps.sh
# Restored here but saved only once the dependencies have been built
# successfully, below: a job which fails part-way through building
# them would otherwise save a half-built tree under a key which can
# never be updated. Bump the serial in the key to discard the cached
# builds and start afresh.
- name: Restore installed libraries
uses: actions/cache/restore@v5
id: cache-libs
if: env.ROOTID != ''
with:
path: ~/root
key: cache-libs-1-${{ env.IMAGEOS }}-${{ runner.arch }}-${{ env.ROOTID }}
# ~/perl5 does not vary by job: the module list is fixed and the
# modules are always built with CC=gcc. It varies only by the perl
# ABI, which $PERLID identifies, and by the module list itself, so
# one cache is shared by every job. Bump the serial in the key to
# force a rebuild against current CPAN.
- name: Cache CPAN modules
uses: actions/cache@v5
if: ${{ ! ( env.SKIP_TESTING || env.NO_TEST_FRAMEWORK ) }}
with:
path: ~/perl5
key: cache-cpan-1-${{ env.PERLID }}-${{ runner.arch }}-${{ hashFiles('test/travis_before_linux.sh') }}
- name: Configure environment
run: ./test/travis_before_linux.sh
timeout-minutes: 15
- name: Save installed libraries
uses: actions/cache/save@v5
if: success() && env.ROOTID != '' && steps.cache-libs.outputs.cache-hit != 'true'
with:
path: ~/root
key: ${{ steps.cache-libs.outputs.cache-primary-key }}
- uses: actions/upload-artifact@v7
if: failure()
with:
name: config.log-${{ env.JOBID }}
path: |
/home/runner/build/**/config.log
- name: Install uv
if: env.TEST_PYTEST == '1'
run: |
pipx install uv
echo "$HOME/.local/bin" >> $GITHUB_PATH
- name: Build and test
run: ./test/travis_run_linux.sh
- uses: actions/upload-artifact@v7
if: failure()
with:
name: error_log-${{ env.JOBID }}
path: |
**/config.log
test/perl-framework/t/logs/error_log