Skip to content

chore: adopt testcontainers-go for Postgres, MySQL and MongoDB #1353

chore: adopt testcontainers-go for Postgres, MySQL and MongoDB

chore: adopt testcontainers-go for Postgres, MySQL and MongoDB #1353

Workflow file for this run

on:
push:
branches:
- master
- main
paths:
- "**"
- "!**.md"
pull_request:
paths:
- "**"
- "!**.md"
permissions:
deployments: write
contents: write
name: Benchmark
jobs:
changes:
runs-on: ubuntu-latest
permissions:
pull-requests: read
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Generate filters
id: filter-setup
run: |
filters=$(find . -maxdepth 1 -type d ! -path ./.git ! -path . -exec basename {} \; | grep -v '^\.' | awk '{printf "%s: \"%s/**\"\n", $1, $1}')
echo "filters<<EOF" >> $GITHUB_OUTPUT
echo "$filters" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
shell: bash
- name: Filter changes
id: filter
uses: dorny/paths-filter@v3
with:
filters: ${{ steps.filter-setup.outputs.filters }}
outputs:
packages: ${{ steps.filter.outputs.changes || '[]' }}
compare:
needs: changes
runs-on: ubuntu-latest
timeout-minutes: 30
if: needs.changes.outputs.packages != '[]' # Ensure job runs only if there are changes
strategy:
matrix:
package: ${{ fromJSON(needs.changes.outputs.packages || '[]') }}
fail-fast: false
steps:
- name: Fetch Repository
uses: actions/checkout@v4
- name: Install Go
uses: actions/setup-go@v5
with:
# NOTE: Keep this in sync with the version from go.mod
go-version: "1.21.x"
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
- name: Install ArangoDB
if: ${{ matrix.package == 'arangodb' }}
run: |
docker run -d -p 8529:8529 -e "ARANGO_NO_AUTH=1" arangodb:latest
- name: Install DynamoDB
if: ${{ matrix.package == 'dynamodb' }}
run: |
docker run -d -p 8000:8000 amazon/dynamodb-local:latest
- name: Install Memcached
if: ${{ matrix.package == 'memcache' }}
run: |
docker run -d -p 11211:11211 memcached:latest
- name: Install Azurite
if: ${{ matrix.package == 'azureblob' }}
run: |
docker run -d -p 10000:10000 mcr.microsoft.com/azure-storage/azurite azurite-blob --blobHost 0.0.0.0 --blobPort 10000
- name: Install Cloudflare Worker
if: ${{ matrix.package == 'cloudflarekv' }}
run : |
.github/scripts/initialize-wrangler.sh
cd cloudflarekv && npx wrangler dev &
npx wait-on tcp:8787
- name: Install Coherence
if: ${{ matrix.package == 'coherence' }}
run: |
docker run -d -p 1408:1408 -p 30000:30000 ghcr.io/oracle/coherence-ce:22.06.5
sleep 30
- name: Install etcd
if: ${{ matrix.package == 'etcd' }}
run: |
docker run -d --name Etcd-server \
--publish 2379:2379 \
--publish 2380:2380 \
--env ALLOW_NONE_AUTHENTICATION=yes \
--env ETCD_ADVERTISE_CLIENT_URLS=http://etcd-server:2379 \
bitnami/etcd:latest
- name: Install ScyllaDb
if: ${{ matrix.package == 'scylladb' }}
run: |
docker run --name scylladb -p 9042:9042 -p 19042:19042 -p 9160:9160 -p 7000:7000 -p 7001:7001 -p 7199:7199 -p 9180:9180 -d scylladb/scylla:latest --broadcast-address 127.0.0.1 --listen-address 0.0.0.0 --broadcast-rpc-address 127.0.0.1
sleep 15 # Wait for ScyllaDb to initialize
- name: Setup Redis
if: ${{ matrix.package == 'redis' || matrix.package == 'rueidis' }}
uses: shogo82148/actions-setup-redis@v1
with:
redis-version: '7.x'
auto-start: 'false'
- name: Run Redis
if: ${{ matrix.package == 'redis' || matrix.package == 'rueidis' }}
run: |
redis-server --port 6379 &
- name: Run NATS
if: ${{ matrix.package == 'nats' }}
run: |
./.github/scripts/gen-test-certs.sh
docker run -d --name nats-jetstream -p 4443:4443 -v ./nats/testdata:/testdata -v ./tls:/tls nats:latest --jetstream -c /testdata/nats-tls.conf
sleep 2
- name: Run Benchmarks
working-directory: ${{ matrix.package }}
run: |
set -o pipefail
echo "Bench dir: ${{ matrix.package }}"
go test ./... -timeout 120s -benchmem -run=^$ -bench . | tee -a output.txt
shell: bash
env:
MSSQL_DATABASE: master
MSSQL_USERNAME: sa
MSSQL_PASSWORD: MsSql!1234
TEST_CLICKHOUSE_IMAGE: "clickhouse/clickhouse-server:23-alpine"
TEST_COUCHBASE_IMAGE: "couchbase:enterprise-7.6.3"
TEST_MINIO_IMAGE: "docker.io/minio/minio:RELEASE.2024-08-17T01-24-54Z"
TEST_MONGODB_IMAGE: "docker.io/mongo:7"
TEST_MYSQL_IMAGE: "docker.io/mysql:9"
TEST_POSTGRES_IMAGE: "docker.io/postgres:16-alpine"
- name: Get Previous Benchmark Results
uses: actions/cache@v4
with:
path: ./cache
key: ${{ runner.os }}-benchmark-${{ matrix.package }}
- name: Save Benchmark Results
uses: benchmark-action/[email protected]
with:
tool: "go"
output-file-path: ${{ matrix.package }}/output.txt
github-token: ${{ secrets.BENCHMARK_TOKEN }}
benchmark-data-dir-path: "benchmarks/${{ matrix.package }}"
alert-threshold: "300%"
fail-on-alert: true
comment-on-alert: ${{ github.event_name == 'push' || github.event_name == 'workflow_dispatch' }}
#summary-always: ${{ github.event_name != 'push' && github.event_name != 'workflow_dispatch' }}
auto-push: ${{ github.event_name == 'push' || github.event_name == 'workflow_dispatch' }}
save-data-file: ${{ github.event_name == 'push' || github.event_name == 'workflow_dispatch' }}