summaryrefslogtreecommitdiffhomepage
path: root/.github
diff options
context:
space:
mode:
authorDylan Arbour <arbourd@users.noreply.github.com>2023-12-18 18:09:32 -0500
committerDylan Arbour <arbourd@users.noreply.github.com>2024-02-21 09:54:05 -0500
commit56d3a1a72b3db74ac3bf8b7665428a3cd15056bd (patch)
tree7bd98cf95755a993db93dc7e0ab069f4b9c35d13 /.github
parent697a58506235e89af1c8cc3cafc92b3d85a3467d (diff)
downloadunit-56d3a1a72b3db74ac3bf8b7665428a3cd15056bd.tar.gz
unit-56d3a1a72b3db74ac3bf8b7665428a3cd15056bd.tar.bz2
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
Diffstat (limited to '.github')
-rw-r--r--.github/workflows/ci.yml335
1 files changed, 335 insertions, 0 deletions
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 00000000..42ca7896
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -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'