Add GitHub Actions
This commit adds GitHub Actions configuration, running tests on
pull-requests and master push changes.
This change is meant to be a first-pass at our evolving CI processes.
- Tests run in parallel per language for speed and isolation
- Test matrix is composed by a string list of languages and versions
- `setup-${language}` actions are preferred over base (and changing)
versions from `ubuntu-latest` operating system
A few caveats with the current setup:
- Only tests on Ubuntu (no FreeBSD or Alpine)
- Unpriviledged tests only
- No core dumps available on failure
This commit is contained in:
335
.github/workflows/ci.yml
vendored
Normal file
335
.github/workflows/ci.yml
vendored
Normal file
@@ -0,0 +1,335 @@
|
||||
name: ci
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
# Core
|
||||
- build: unit
|
||||
os: ubuntu-latest
|
||||
# Modules
|
||||
- build: go-1.21
|
||||
os: ubuntu-latest
|
||||
- build: go-1.22
|
||||
os: ubuntu-latest
|
||||
- build: java-17
|
||||
os: ubuntu-latest
|
||||
- build: java-18
|
||||
os: ubuntu-latest
|
||||
- build: java-21
|
||||
os: ubuntu-latest
|
||||
- build: node-20
|
||||
os: ubuntu-latest
|
||||
- build: node-21
|
||||
os: ubuntu-latest
|
||||
- build: perl
|
||||
os: ubuntu-latest
|
||||
- build: php-8.3
|
||||
os: ubuntu-latest
|
||||
- build: python-3.11
|
||||
os: ubuntu-latest
|
||||
- build: python-3.12
|
||||
os: ubuntu-latest
|
||||
- build: ruby-3.2
|
||||
os: ubuntu-latest
|
||||
- build: ruby-3.3
|
||||
os: ubuntu-latest
|
||||
- build: wasm
|
||||
os: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
# Creates and outputs directories used by tests (/usr/local is unfriendly)
|
||||
- name: Configure directories
|
||||
id: dir
|
||||
run: |
|
||||
PREFIX=${HOME}/.unit
|
||||
BIN=${PREFIX}/bin
|
||||
VAR=${PREFIX}/var
|
||||
mkdir -p $BIN
|
||||
mkdir -p $VAR
|
||||
|
||||
echo "prefix=${PREFIX}" >> "$GITHUB_OUTPUT"
|
||||
echo "bin=${BIN}" >> "$GITHUB_OUTPUT"
|
||||
echo "bin=${BIN}" >> "$GITHUB_PATH"
|
||||
echo "var=${VAR}" >> "$GITHUB_OUTPUT"
|
||||
cat "$GITHUB_OUTPUT"
|
||||
|
||||
# Provides module, language version and testpath from build name
|
||||
- name: Output build metadata
|
||||
id: metadata
|
||||
run: |
|
||||
# Split the build name by '-' into module and version
|
||||
IFS='-' read -r module version <<< "${{ matrix.build }}"
|
||||
|
||||
testpath="test/test_${module}*"
|
||||
|
||||
# Run all tests for "unit" and "python"
|
||||
# Python is the default module for tests
|
||||
if [ "$module" = "unit" ] || [ "$module" = "python" ]; then
|
||||
testpath="test"
|
||||
fi
|
||||
|
||||
echo "module=${module}" >> "$GITHUB_OUTPUT"
|
||||
echo "version=${version}" >> "$GITHUB_OUTPUT"
|
||||
echo "testpath=${testpath}" >> "$GITHUB_OUTPUT"
|
||||
|
||||
NJS_VERSION=$(sed -n "s/NJS_VERSION := \(.*\)/\1/p" pkg/contrib/src/njs/version)
|
||||
echo "njs_version=${NJS_VERSION}" >> "$GITHUB_OUTPUT"
|
||||
|
||||
cat "$GITHUB_OUTPUT"
|
||||
|
||||
# https://github.com/actions/runner-images/issues/2821
|
||||
- name: Kill mono process
|
||||
run: |
|
||||
sudo systemctl stop mono-xsp4.service
|
||||
sudo systemctl mask mono-xsp4.service
|
||||
sudo systemctl status mono-xsp4.service || true
|
||||
PID=$(sudo lsof -t -i :8084)
|
||||
echo "Killing PID $PID"
|
||||
sudo kill -9 $PID
|
||||
|
||||
##
|
||||
## njs
|
||||
##
|
||||
|
||||
- name: Clone njs repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: nginx/njs
|
||||
ref: '${{ steps.metadata.outputs.njs_version }}'
|
||||
path: njs
|
||||
|
||||
- name: Make njs
|
||||
run: |
|
||||
./configure --no-libxml2 --no-zlib
|
||||
make -j4 -k
|
||||
working-directory: njs
|
||||
|
||||
##
|
||||
## Unit
|
||||
##
|
||||
|
||||
- name: Configure unit
|
||||
run: |
|
||||
./configure \
|
||||
--prefix=${{ steps.dir.outputs.prefix }} \
|
||||
--sbindir=${{ steps.dir.outputs.bin }} \
|
||||
--logdir=${{ steps.dir.outputs.var }}/log \
|
||||
--log=${{ steps.dir.outputs.var }}/log/unit/unit.log \
|
||||
--runstatedir=${{ steps.dir.outputs.var }}/run \
|
||||
--pid=${{ steps.dir.outputs.var }}/run/unit/unit.pid \
|
||||
--control=unix:${{ steps.dir.outputs.var }}/run/unit/control.sock \
|
||||
--modules=${{ steps.dir.outputs.prefix }}/lib/unit/modules \
|
||||
--statedir=${{ steps.dir.outputs.var }}/state/unit \
|
||||
--tests \
|
||||
--openssl \
|
||||
--njs \
|
||||
--cc-opt="-I njs/src/ -I njs/build" \
|
||||
--ld-opt="-L njs/build" \
|
||||
--debug
|
||||
|
||||
- name: Make unit
|
||||
run: |
|
||||
make -j4 -k || make
|
||||
|
||||
##
|
||||
## Go
|
||||
##
|
||||
|
||||
- uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: '${{ steps.metadata.outputs.version }}'
|
||||
if: steps.metadata.outputs.module == 'go'
|
||||
|
||||
- name: Configure go
|
||||
run: |
|
||||
./configure go --go-path=
|
||||
if: steps.metadata.outputs.module == 'go'
|
||||
|
||||
- name: Make go
|
||||
run: |
|
||||
make go
|
||||
make go-install
|
||||
if: steps.metadata.outputs.module == 'go'
|
||||
|
||||
##
|
||||
## Java
|
||||
##
|
||||
|
||||
- uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: temurin
|
||||
java-version: '${{ steps.metadata.outputs.version }}'
|
||||
if: steps.metadata.outputs.module == 'java'
|
||||
|
||||
- name: Configure java
|
||||
run: |
|
||||
./configure java
|
||||
if: steps.metadata.outputs.module == 'java'
|
||||
|
||||
- name: Make java
|
||||
run: |
|
||||
make java
|
||||
if: steps.metadata.outputs.module == 'java'
|
||||
|
||||
##
|
||||
## Node
|
||||
##
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '${{ steps.metadata.outputs.version }}'
|
||||
if: steps.metadata.outputs.module == 'node'
|
||||
|
||||
- name: Install node-gyp
|
||||
run: |
|
||||
npm install -g node-gyp
|
||||
if: steps.metadata.outputs.module == 'node'
|
||||
|
||||
- name: Configure node
|
||||
run: |
|
||||
./configure nodejs
|
||||
if: steps.metadata.outputs.module == 'node'
|
||||
|
||||
- name: Make node
|
||||
run: |
|
||||
make node-local-install DESTDIR=node
|
||||
if: steps.metadata.outputs.module == 'node'
|
||||
|
||||
##
|
||||
## Perl
|
||||
##
|
||||
|
||||
# Uses default Actions VM Perl
|
||||
# https://github.com/actions/runner-images#available-images
|
||||
|
||||
- name: Install libperl-dev
|
||||
run: |
|
||||
sudo apt-get install libperl-dev
|
||||
if: steps.metadata.outputs.module == 'perl'
|
||||
|
||||
- name: Configure perl
|
||||
run: |
|
||||
./configure perl
|
||||
if: steps.metadata.outputs.module == 'perl'
|
||||
|
||||
- name: Make perl
|
||||
run: |
|
||||
make perl
|
||||
if: steps.metadata.outputs.module == 'perl'
|
||||
|
||||
##
|
||||
## PHP
|
||||
##
|
||||
|
||||
- uses: shivammathur/setup-php@v2
|
||||
with:
|
||||
php-version: '${{ steps.metadata.outputs.version }}'
|
||||
extensions: none
|
||||
env:
|
||||
update: true
|
||||
if: steps.metadata.outputs.module == 'php'
|
||||
|
||||
- name: Configure php
|
||||
run: |
|
||||
./configure php
|
||||
if: steps.metadata.outputs.module == 'php'
|
||||
|
||||
- name: Make php
|
||||
run: |
|
||||
make php
|
||||
if: steps.metadata.outputs.module == 'php'
|
||||
|
||||
##
|
||||
## Python 3
|
||||
##
|
||||
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '${{ steps.metadata.outputs.version }}'
|
||||
if: steps.metadata.outputs.module == 'python'
|
||||
|
||||
- name: Configure python3
|
||||
run: |
|
||||
./configure python --config=python3-config
|
||||
if: steps.metadata.outputs.module == 'python'
|
||||
|
||||
- name: Make python3
|
||||
run: |
|
||||
make python3
|
||||
if: steps.metadata.outputs.module == 'python'
|
||||
|
||||
##
|
||||
## Ruby
|
||||
##
|
||||
|
||||
- uses: ruby/setup-ruby@v1
|
||||
with:
|
||||
ruby-version: '${{ steps.metadata.outputs.version }}'
|
||||
if: steps.metadata.outputs.module == 'ruby'
|
||||
|
||||
- name: Install rack
|
||||
run: |
|
||||
gem install rack
|
||||
if: steps.metadata.outputs.module == 'ruby'
|
||||
|
||||
- name: Configure ruby
|
||||
run: |
|
||||
./configure ruby
|
||||
if: steps.metadata.outputs.module == 'ruby'
|
||||
|
||||
- name: Make ruby
|
||||
run: |
|
||||
make ruby
|
||||
if: steps.metadata.outputs.module == 'ruby'
|
||||
|
||||
##
|
||||
## Wasm
|
||||
##
|
||||
|
||||
- name: Make wasmtime
|
||||
run: |
|
||||
make -C pkg/contrib .wasmtime
|
||||
if: steps.metadata.outputs.module == 'wasm'
|
||||
|
||||
- name: Configure wasm
|
||||
run: |
|
||||
./configure wasm --include-path=pkg/contrib/wasmtime/crates/c-api/include --lib-path=pkg/contrib/wasmtime/target/release
|
||||
if: steps.metadata.outputs.module == 'wasm'
|
||||
|
||||
- name: Make wasm
|
||||
run: |
|
||||
make wasm
|
||||
if: steps.metadata.outputs.module == 'wasm'
|
||||
|
||||
##
|
||||
## Tests
|
||||
##
|
||||
|
||||
# Install python3 if not present
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3'
|
||||
if: steps.metadata.outputs.module != 'wasm'
|
||||
|
||||
- name: Install pytest
|
||||
run: |
|
||||
pip install pytest
|
||||
if: steps.metadata.outputs.module != 'wasm'
|
||||
|
||||
- name: Run ${{ steps.metadata.outputs.module }} tests
|
||||
run: |
|
||||
pytest --print-log ${{ steps.metadata.outputs.testpath }}
|
||||
# Skip pytest if wasm build, as there are no tests yet
|
||||
if: steps.metadata.outputs.module != 'wasm'
|
||||
Reference in New Issue
Block a user