Skip to content

fix(postgres): guard pg push against same-id cross-machine row collision #2195

fix(postgres): guard pg push against same-id cross-machine row collision

fix(postgres): guard pg push against same-id cross-machine row collision #2195

Workflow file for this run

name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
cancel-in-progress: true
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
- uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
with:
go-version-file: go.mod
- name: Install lint tools
run: |
make lint-tools
echo "$(go env GOPATH)/bin" >> "$GITHUB_PATH"
- name: Run Go linters
run: make lint-ci
frontend:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: "24"
- name: Install frontend dependencies
run: npm ci
working-directory: frontend
- name: Type-check (svelte-check)
run: npm run check
working-directory: frontend
- name: Run frontend tests
run: npm test
working-directory: frontend
frontend-node-25:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: "25"
- name: Install frontend dependencies
run: npm ci
working-directory: frontend
- name: Run frontend tests
run: npm test
working-directory: frontend
test:
name: Go Test (${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
- uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
with:
go-version-file: go.mod
- name: Setup MinGW (Windows)
if: runner.os == 'Windows'
id: setup_mingw
continue-on-error: true
uses: msys2/setup-msys2@e9898307ac31d1a803454791be09ab9973336e1c # v2
with:
msystem: MINGW64
update: false
install: mingw-w64-x86_64-gcc
path-type: inherit
- name: Setup MinGW (Windows, retry on transient failure)
if: runner.os == 'Windows' && steps.setup_mingw.outcome == 'failure'
uses: msys2/setup-msys2@e9898307ac31d1a803454791be09ab9973336e1c # v2
with:
msystem: MINGW64
update: false
install: mingw-w64-x86_64-gcc
path-type: inherit
- name: Run Go tests
run: go test -tags "fts5" ./... -v -count=1
env:
CGO_ENABLED: "1"
- name: Run Go tests (race detector)
if: runner.os == 'Linux'
run: |
go test -tags "fts5" ./internal/duckdb -count=1
go test -tags "fts5" -race $(go list ./... | grep -v '/internal/duckdb$') -count=1
env:
CGO_ENABLED: "1"
desktop-windows-unit:
name: Desktop Unit Tests (Windows)
runs-on: windows-latest
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
- name: Prepare placeholder sidecar resource
shell: pwsh
run: |
$hostTriple = (rustc -vV | Select-String '^host: ').ToString() -replace '^host:\s+', ''
if (-not $hostTriple) {
throw "could not determine Rust host triple"
}
New-Item -ItemType Directory -Force desktop/src-tauri/binaries | Out-Null
New-Item -ItemType File -Force "desktop/src-tauri/binaries/agentsview-$hostTriple.exe" | Out-Null
- name: Run Windows desktop update tests
run: cargo test --manifest-path desktop/src-tauri/Cargo.toml --lib install_downloaded_update
coverage:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
- uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
with:
go-version-file: go.mod
- name: Test with coverage
run: go test -tags "fts5" -coverprofile=coverage.out ./...
env:
CGO_ENABLED: "1"
- name: Upload coverage
id: codecov
uses: codecov/codecov-action@e79a6962e0d4c0c17b229090214935d2e33f8354 # v6.0.1
with:
files: coverage.out
continue-on-error: true
- name: Warn on coverage upload failure
if: steps.codecov.outcome == 'failure'
run: echo "::warning::Codecov upload failed"
integration:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:18-alpine
env:
POSTGRES_USER: agentsview_test
POSTGRES_PASSWORD: agentsview_test_password
POSTGRES_DB: agentsview_test
ports:
- 5433:5432
options: >-
--health-cmd "pg_isready -U agentsview_test -d agentsview_test"
--health-interval 2s
--health-timeout 5s
--health-retries 10
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
- uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
with:
go-version-file: go.mod
- name: Run PostgreSQL integration tests
run: make test-postgres-ci
env:
CGO_ENABLED: "1"
TEST_PG_URL: postgres://agentsview_test:agentsview_test_password@localhost:5433/agentsview_test?sslmode=disable
- name: Build SSH test container
run: docker build -t agentsview-sshd -f testdata/ssh/Dockerfile .
- name: Start SSH test container
run: |
docker run -d --name sshd-test -p 2222:22 agentsview-sshd
for i in $(seq 1 10); do nc -z localhost 2222 && break || sleep 1; done
docker cp sshd-test:/tmp/test_ssh_key testdata/ssh/test_key
chmod 600 testdata/ssh/test_key
- name: Verify SSH connectivity
run: |
echo "=== Key file ==="
ls -la testdata/ssh/test_key
head -1 testdata/ssh/test_key
echo "=== Container sshd_config ==="
docker exec sshd-test cat /etc/ssh/sshd_config
echo "=== Container authorized_keys ==="
docker exec sshd-test cat /home/testuser/.ssh/authorized_keys
echo "=== Test SSH connection ==="
ssh -v -i testdata/ssh/test_key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 2222 testuser@localhost echo "SSH works" 2>&1 || true
- name: Run SSH integration tests
run: make test-ssh-ci
env:
CGO_ENABLED: "1"
TEST_SSH_HOST: localhost
TEST_SSH_PORT: "2222"
TEST_SSH_USER: testuser
TEST_SSH_KEY: ${{ github.workspace }}/testdata/ssh/test_key
e2e:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
- uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
with:
go-version-file: go.mod
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: "24"
- name: Install frontend dependencies
run: npm ci
working-directory: frontend
- name: Build frontend
run: npm run build
working-directory: frontend
- name: Embed frontend in Go source tree
run: |
rm -rf internal/web/dist
cp -r frontend/dist internal/web/dist
- name: Pre-build Go binaries
run: |
CGO_ENABLED=1 go build -tags "fts5,kit_posthog_disabled" \
-o /tmp/testfixture ./cmd/testfixture
CGO_ENABLED=1 go build -tags "fts5,kit_posthog_disabled" \
-o /tmp/agentsview ./cmd/agentsview
env:
CGO_ENABLED: "1"
- name: Install Playwright browsers
run: npx playwright install --with-deps chromium webkit
working-directory: frontend
- name: Run E2E tests
run: npx playwright test --reporter=list
working-directory: frontend
env:
E2E_PREBUILT_FIXTURE: /tmp/testfixture
E2E_PREBUILT_SERVER: /tmp/agentsview