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