mirror of
https://github.com/coder/coder.git
synced 2025-07-09 11:45:56 +00:00
110 lines
3.6 KiB
Go
110 lines
3.6 KiB
Go
// Start an embedded postgres database on port 5432. Used in CI on macOS and Windows.
|
|
package main
|
|
|
|
import (
|
|
"database/sql"
|
|
"flag"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
"time"
|
|
|
|
embeddedpostgres "github.com/fergusstrange/embedded-postgres"
|
|
)
|
|
|
|
func main() {
|
|
var customPath string
|
|
var cachePath string
|
|
flag.StringVar(&customPath, "path", "", "Optional custom path for postgres data directory")
|
|
flag.StringVar(&cachePath, "cache", "", "Optional custom path for embedded postgres binaries")
|
|
flag.Parse()
|
|
|
|
postgresPath := filepath.Join(os.TempDir(), "coder-test-postgres")
|
|
if customPath != "" {
|
|
postgresPath = customPath
|
|
}
|
|
if err := os.MkdirAll(postgresPath, os.ModePerm); err != nil {
|
|
log.Fatalf("Failed to create directory %s: %v", postgresPath, err)
|
|
}
|
|
if cachePath == "" {
|
|
cachePath = filepath.Join(postgresPath, "cache")
|
|
}
|
|
if err := os.MkdirAll(cachePath, os.ModePerm); err != nil {
|
|
log.Fatalf("Failed to create directory %s: %v", cachePath, err)
|
|
}
|
|
|
|
ep := embeddedpostgres.NewDatabase(
|
|
embeddedpostgres.DefaultConfig().
|
|
Version(embeddedpostgres.V16).
|
|
BinariesPath(filepath.Join(postgresPath, "bin")).
|
|
BinaryRepositoryURL("https://repo.maven.apache.org/maven2").
|
|
DataPath(filepath.Join(postgresPath, "data")).
|
|
RuntimePath(filepath.Join(postgresPath, "runtime")).
|
|
CachePath(cachePath).
|
|
Username("postgres").
|
|
Password("postgres").
|
|
Database("postgres").
|
|
Encoding("UTF8").
|
|
Port(uint32(5432)).
|
|
Logger(os.Stdout),
|
|
)
|
|
err := ep.Start()
|
|
if err != nil {
|
|
log.Fatalf("Failed to start embedded postgres: %v", err)
|
|
}
|
|
|
|
// Troubleshooting: list files in cachePath
|
|
if err := filepath.Walk(cachePath, func(path string, info os.FileInfo, err error) error {
|
|
if err != nil {
|
|
return err
|
|
}
|
|
switch {
|
|
case info.IsDir():
|
|
log.Printf("D: %s", path)
|
|
case info.Mode().IsRegular():
|
|
log.Printf("F: %s [%s] (%d bytes) %s", path, info.Mode().String(), info.Size(), info.ModTime().Format(time.RFC3339))
|
|
default:
|
|
log.Printf("Other: %s [%s] %s", path, info.Mode(), info.ModTime().Format(time.RFC3339))
|
|
}
|
|
return nil
|
|
}); err != nil {
|
|
log.Printf("Failed to list files in cachePath %s: %v", cachePath, err)
|
|
}
|
|
|
|
// We execute these queries instead of using the embeddedpostgres
|
|
// StartParams because it doesn't work on Windows. The library
|
|
// seems to have a bug where it sends malformed parameters to
|
|
// pg_ctl. It encloses each parameter in single quotes, which
|
|
// Windows can't handle.
|
|
// Related issue:
|
|
// https://github.com/fergusstrange/embedded-postgres/issues/145
|
|
paramQueries := []string{
|
|
`ALTER SYSTEM SET effective_cache_size = '1GB';`,
|
|
`ALTER SYSTEM SET fsync = 'off';`,
|
|
`ALTER SYSTEM SET full_page_writes = 'off';`,
|
|
`ALTER SYSTEM SET max_connections = '1000';`,
|
|
`ALTER SYSTEM SET shared_buffers = '1GB';`,
|
|
`ALTER SYSTEM SET synchronous_commit = 'off';`,
|
|
`ALTER SYSTEM SET client_encoding = 'UTF8';`,
|
|
}
|
|
db, err := sql.Open("postgres", "postgres://postgres:postgres@127.0.0.1:5432/postgres?sslmode=disable")
|
|
if err != nil {
|
|
log.Fatalf("Failed to connect to embedded postgres: %v", err)
|
|
}
|
|
for _, query := range paramQueries {
|
|
if _, err := db.Exec(query); err != nil {
|
|
log.Fatalf("Failed to execute setup query %q: %v", query, err)
|
|
}
|
|
}
|
|
if err := db.Close(); err != nil {
|
|
log.Fatalf("Failed to close database connection: %v", err)
|
|
}
|
|
// We restart the database to apply all the parameters.
|
|
if err := ep.Stop(); err != nil {
|
|
log.Fatalf("Failed to stop embedded postgres after applying parameters: %v", err)
|
|
}
|
|
if err := ep.Start(); err != nil {
|
|
log.Fatalf("Failed to start embedded postgres after applying parameters: %v", err)
|
|
}
|
|
}
|