-
Notifications
You must be signed in to change notification settings - Fork 332
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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
- Loading branch information
Showing
1 changed file
with
335 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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' |