Files
netbird/.github/workflows/tmp-management-timing.yml
T
Maycon SantosandClaude Fable 5.1 0b25b2722d [management] Clone test databases from a migrated template
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
2026-09-12 09:42:31 +00:00

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