mirror of
https://github.com/netbirdio/netbird.git
synced 2026-09-14 02:39:06 +02:00
Profiling the management unit suite per engine showed that nearly every test in management/server spends 1.0 to 1.7 seconds creating its store on MySQL and about 0.9 seconds on Postgres, against 0.3 seconds on sqlite. The work is CREATE DATABASE followed by 26 pre-migrations, a 40-table AutoMigrate and 9 post-migrations, repeated for each of the package's 133 store creation sites. That put the package at 10 minutes of its 20 minute go test budget on a healthy runner, and over it on a slow one. Run the full migration once per process into a template database and clone it for every test database. Postgres copies it server-side with CREATE DATABASE ... TEMPLATE. MySQL has no equivalent, so the template's SHOW CREATE TABLE statements are replayed into the new database with foreign key checks off, which keeps the ON DELETE CASCADE constraints that CREATE TABLE ... LIKE would drop. The per-test store then opens with migrations skipped. Every test still gets its own database, so isolation is unchanged. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EsVtbd7MxMVsS9vP1H6KPS
93 lines
3.0 KiB
YAML
93 lines
3.0 KiB
YAML
# Temporary: profiles the management unit suite per store engine from a working
|
|
# branch. Delete before merging.
|
|
name: Management timing (temporary)
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- "work/amazing-wright-6xehqh"
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
test_management:
|
|
name: "Management / Unit timing"
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
arch: ["amd64"]
|
|
store: ["sqlite", "postgres", "mysql"]
|
|
runs-on: ubuntu-22.04
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- name: Install Go
|
|
uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6.5.0
|
|
with:
|
|
go-version-file: "go.mod"
|
|
cache: false
|
|
|
|
- name: Get Go environment
|
|
run: |
|
|
echo "cache=$(go env GOCACHE)" >> $GITHUB_ENV
|
|
echo "modcache=$(go env GOMODCACHE)" >> $GITHUB_ENV
|
|
|
|
- name: Cache Go modules
|
|
uses: actions/cache/restore@2c8a9bd7457de244a408f35966fab2fb45fda9c8 # v6.0.0
|
|
with:
|
|
path: |
|
|
${{ env.cache }}
|
|
${{ env.modcache }}
|
|
key: ${{ runner.os }}-gotest-cache-${{ hashFiles('**/go.sum') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-gotest-cache-
|
|
|
|
- name: Install modules
|
|
run: go mod tidy
|
|
|
|
- name: Login to Docker hub
|
|
uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0
|
|
with:
|
|
username: ${{ secrets.DOCKER_USER }}
|
|
password: ${{ secrets.DOCKER_TOKEN }}
|
|
|
|
- name: docker login for root user
|
|
env:
|
|
DOCKER_USER: ${{ secrets.DOCKER_USER }}
|
|
DOCKER_TOKEN: ${{ secrets.DOCKER_TOKEN }}
|
|
run: echo "$DOCKER_TOKEN" | sudo docker login --username "$DOCKER_USER" --password-stdin
|
|
|
|
- name: download mysql image
|
|
if: matrix.store == 'mysql'
|
|
run: |
|
|
docker pull mlsmaycon/warmed-mysql:8
|
|
docker image inspect mlsmaycon/warmed-mysql:8 --format 'entrypoint={{json .Config.Entrypoint}} cmd={{json .Config.Cmd}} env={{json .Config.Env}}'
|
|
|
|
- name: Build test summarizer
|
|
run: go build -o /tmp/gotestsummary ./tools/gotestsummary
|
|
|
|
- name: Test
|
|
shell: bash
|
|
run: |
|
|
set -o pipefail
|
|
CGO_ENABLED=1 GOARCH=${{ matrix.arch }} \
|
|
NETBIRD_STORE_ENGINE=${{ matrix.store }} \
|
|
CI=true \
|
|
go test -json -tags=devcert -coverprofile=coverage.txt \
|
|
-exec "sudo --preserve-env=CI,NETBIRD_STORE_ENGINE" \
|
|
-timeout 45m ./management/... ./shared/management/... \
|
|
| tee test-output.jsonl | /tmp/gotestsummary -slowest 80
|
|
|
|
- name: Upload raw test events
|
|
if: always()
|
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a #v7.0.1
|
|
with:
|
|
name: test-output-${{ matrix.store }}
|
|
path: test-output.jsonl
|
|
if-no-files-found: ignore
|