Callable Dqlite Jepsen tests #19
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
name: Callable Dqlite Jepsen tests | |
on: | |
workflow_dispatch: | |
inputs: | |
raft-repo: | |
description: 'raft repo' | |
default: 'canonical/raft' | |
raft-ref: | |
description: 'raft branch or ref' | |
default: 'master' | |
dqlite-repo: | |
description: 'dqlite repo' | |
default: 'canonical/dqlite' | |
dqlite-ref: | |
description: 'dqlite branch or ref' | |
default: 'master' | |
go-dqlite-repo: | |
description: 'go-dqlite repo' | |
default: 'canonical/go-dqlite' | |
go-dqlite-ref: | |
description: 'go-dqlite branch or ref' | |
default: 'master' | |
workloads: | |
description: 'Jepsen workloads as JSON, e.g. [ append, bank ]' | |
required: true | |
nemeses: | |
description: "Jepsen nemesis as JSON, e.g. [ 'pause,disk' ]" | |
required: true | |
disk: | |
description: "Enable or disable dqlite's disk-mode e.g. [ '0', '1' ]" | |
required: true | |
cli-opts: | |
description: 'Jepsen cli opts, e.g. --node-targets primaries' | |
required: false | |
workflow_call: | |
inputs: | |
jepsen-dqlite-repo: | |
type: string | |
required: false | |
default: 'canonical/jepsen.dqlite' | |
jepsen-dqlite-ref: | |
type: string | |
required: false | |
default: 'master' | |
jepsen-repo: | |
type: string | |
required: false | |
jepsen-branch: | |
type: string | |
required: false | |
raft-repo: | |
type: string | |
required: false | |
raft-ref: | |
type: string | |
required: false | |
dqlite-repo: | |
type: string | |
required: false | |
dqlite-ref: | |
type: string | |
required: false | |
go-dqlite-repo: | |
type: string | |
required: false | |
go-dqlite-ref: | |
type: string | |
required: false | |
workloads: | |
type: string | |
required: true | |
nemeses: | |
type: string | |
required: true | |
disk: | |
type: string | |
required: true | |
cli-opts: | |
type: string | |
required: false | |
env: | |
RAFT_REPO: 'canonical/raft' | |
RAFT_BRANCH: 'master' | |
DQLITE_REPO: 'canonical/dqlite' | |
DQLITE_BRANCH: 'master' | |
GO_DQLITE_REPO: 'canonical/go-dqlite' | |
GO_DQLITE_BRANCH: 'master' | |
jobs: | |
test: | |
strategy: | |
fail-fast: false | |
matrix: | |
workload: ${{ fromJSON(inputs.workloads) }} | |
nemesis: ${{ fromJSON(inputs.nemeses) }} | |
disk: ${{ fromJSON(inputs.disk) }} | |
runs-on: ubuntu-20.04 | |
timeout-minutes: 25 | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v3 | |
with: | |
repository: ${{ inputs.jepsen-dqlite-repo || github.repository }} | |
ref: ${{ inputs.jepsen-dqlite-ref || github.ref }} | |
- name: Cache Go modules | |
uses: actions/cache@v3 | |
with: | |
path: | | |
~/.cache/go-build | |
~/go/pkg/mod | |
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} | |
restore-keys: | | |
${{ runner.os }}-go- | |
- name: Cache Jepsen (lein project) dependencies | |
uses: actions/cache@v3 | |
with: | |
path: ~/.m2/repository | |
key: ${{ runner.os }}-clojure-${{ hashFiles('**/project.clj') }} | |
restore-keys: | | |
${{ runner.os }}-clojure | |
- name: Install Go | |
uses: actions/setup-go@v3 | |
- name: Setup environment | |
timeout-minutes: 15 | |
run: | | |
sudo apt update | |
sudo apt install -y gnuplot libsqlite3-dev libuv1-dev liblz4-dev libjna-java graphviz leiningen build-essential | |
printf core | sudo tee /proc/sys/kernel/core_pattern | |
- name: Install local Jepsen | |
if: ${{ inputs.jepsen-repo && inputs.jepsen-branch }} | |
run: | | |
git clone --branch ${{ inputs.jepsen-branch }} --depth 1 ${{ inputs.jepsen-repo }} | |
cd jepsen/jepsen | |
git log -n 1 | |
lein install | |
cd ../.. | |
- name: Install libbacktrace | |
run: | | |
git clone https://github.com/ianlancetaylor/libbacktrace --depth 1 | |
cd libbacktrace | |
autoreconf -i | |
./configure | |
make -j4 | |
sudo make install | |
sudo ldconfig | |
cd .. | |
- name: Check out raft | |
uses: actions/checkout@v3 | |
with: | |
repository: ${{ inputs.raft-repo || env.RAFT_REPO }} | |
ref: ${{ inputs.raft-ref || env.RAFT_REF }} | |
path: raft | |
- name: Build raft | |
run: | | |
cd raft | |
git log -n 1 | |
autoreconf -i | |
./configure --enable-debug --enable-backtrace | |
make -j4 | |
sudo make install | |
sudo ldconfig | |
- name: Check out dqlite | |
uses: actions/checkout@v3 | |
with: | |
repository: ${{ inputs.dqlite-repo || env.DQLITE_REPO }} | |
ref: ${{ inputs.dqlite-ref || env.DQLITE_REF }} | |
path: dqlite | |
- name: Build dqlite | |
run: | | |
cd dqlite | |
git log -n 1 | |
autoreconf -i | |
./configure --enable-debug --enable-backtrace | |
make -j4 | |
sudo make install | |
sudo ldconfig | |
- name: Test | |
env: | |
LD_LIBRARY_PATH: "/usr/local/lib" | |
timeout-minutes: 8 | |
run: | | |
go get golang.org/x/sync/semaphore | |
go get -tags libsqlite3 github.com/canonical/go-dqlite/app | |
go build -tags libsqlite3 -o resources/app resources/app.go | |
sudo ufw disable | |
sleep 0.200 | |
sudo systemctl stop ufw.service | |
sudo ./resources/network.sh setup 5 | |
if test ${{ matrix.workload }} = set; then echo 180 >time-limit; else echo 240 >time-limit; fi | |
lein run test --no-ssh --binary $(pwd)/resources/app \ | |
--workload ${{ matrix.workload }} \ | |
--nemesis ${{ matrix.nemesis }} \ | |
--rate 100 \ | |
--time-limit $(cat time-limit) \ | |
--disk ${{ matrix.disk }} \ | |
${{ inputs.cli-opts }} | |
sudo ./resources/network.sh teardown 5 | |
- name: Jepsen log Summary | |
if: ${{ always() }} | |
run: tail -n 100 store/current/jepsen.log > store/current/tail-jepsen.log | |
- name: Summary Artifact | |
if: ${{ always() }} | |
uses: actions/upload-artifact@v3 | |
with: | |
name: jepsen-data-${{ matrix.workload }}-${{ matrix.nemesis }}-summary | |
path: | | |
store/dqlite*/**/results.edn | |
store/dqlite*/**/latency-raw.png | |
store/dqlite*/**/tail-jepsen.log | |
!**/current/ | |
!**/latest/ | |
- name: Failure Artifact | |
uses: actions/upload-artifact@v3 | |
with: | |
name: jepsen-data-${{ matrix.workload }}-${{ matrix.nemesis }}-failure | |
path: | | |
store/dqlite* | |
!**/current/ | |
!**/latest/ |