fix: use preview:dev for correct dist dir and kill process groups in test:e2e
- build:dev outputs to dist-dev/ but preview serves from dist/, so use preview:dev which serves from dist-dev/ - pnpm spawns child processes, so SIGINT only hits the wrapper; use setpgid + kill(-pgid) to terminate the entire process group
This commit is contained in:
parent
51a9f9c9f8
commit
d00851292d
53
magefile.go
53
magefile.go
|
|
@ -37,6 +37,7 @@ import (
|
||||||
"runtime"
|
"runtime"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/iancoleman/strcase"
|
"github.com/iancoleman/strcase"
|
||||||
|
|
@ -337,6 +338,23 @@ func getRandomPort() (int, error) {
|
||||||
return l.Addr().(*net.TCPAddr).Port, nil
|
return l.Addr().(*net.TCPAddr).Port, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// setProcessGroup configures a command to run in its own process group,
|
||||||
|
// so that all child processes can be killed together.
|
||||||
|
func setProcessGroup(cmd *exec.Cmd) {
|
||||||
|
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
|
||||||
|
}
|
||||||
|
|
||||||
|
// killProcessGroup sends a signal to the entire process group of the given command.
|
||||||
|
func killProcessGroup(cmd *exec.Cmd) {
|
||||||
|
if cmd.Process != nil {
|
||||||
|
pgid, err := syscall.Getpgid(cmd.Process.Pid)
|
||||||
|
if err == nil {
|
||||||
|
syscall.Kill(-pgid, syscall.SIGTERM)
|
||||||
|
}
|
||||||
|
cmd.Wait()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// waitForHTTP polls a URL until it returns a 200 status or the timeout expires.
|
// waitForHTTP polls a URL until it returns a 200 status or the timeout expires.
|
||||||
func waitForHTTP(url string, timeout time.Duration) error {
|
func waitForHTTP(url string, timeout time.Duration) error {
|
||||||
deadline := time.Now().Add(timeout)
|
deadline := time.Now().Add(timeout)
|
||||||
|
|
@ -487,15 +505,13 @@ func (Test) E2E(args string) error {
|
||||||
)
|
)
|
||||||
apiCmd.Stdout = os.Stdout
|
apiCmd.Stdout = os.Stdout
|
||||||
apiCmd.Stderr = os.Stderr
|
apiCmd.Stderr = os.Stderr
|
||||||
|
setProcessGroup(apiCmd)
|
||||||
if err := apiCmd.Start(); err != nil {
|
if err := apiCmd.Start(); err != nil {
|
||||||
return fmt.Errorf("failed to start API: %w", err)
|
return fmt.Errorf("failed to start API: %w", err)
|
||||||
}
|
}
|
||||||
defer func() {
|
defer func() {
|
||||||
fmt.Println("\n--- Stopping API server ---")
|
fmt.Println("\n--- Stopping API server ---")
|
||||||
if apiCmd.Process != nil {
|
killProcessGroup(apiCmd)
|
||||||
apiCmd.Process.Signal(os.Interrupt)
|
|
||||||
apiCmd.Wait()
|
|
||||||
}
|
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// Wait for API to be ready
|
// Wait for API to be ready
|
||||||
|
|
@ -506,25 +522,30 @@ func (Test) E2E(args string) error {
|
||||||
}
|
}
|
||||||
printSuccess("API is ready!")
|
printSuccess("API is ready!")
|
||||||
|
|
||||||
// Start the frontend dev server
|
// Build the frontend
|
||||||
fmt.Println("\n--- Starting frontend dev server ---")
|
fmt.Println("\n--- Building frontend ---")
|
||||||
frontendCmd := exec.Command("pnpm", "dev", "--port", strconv.Itoa(frontendPort))
|
buildFrontendCmd := exec.Command("pnpm", "build:dev")
|
||||||
|
buildFrontendCmd.Dir = "frontend"
|
||||||
|
buildFrontendCmd.Stdout = os.Stdout
|
||||||
|
buildFrontendCmd.Stderr = os.Stderr
|
||||||
|
if err := buildFrontendCmd.Run(); err != nil {
|
||||||
|
return fmt.Errorf("failed to build frontend: %w", err)
|
||||||
|
}
|
||||||
|
printSuccess("Frontend built!")
|
||||||
|
|
||||||
|
// Serve the built frontend with vite preview (static, no file watchers)
|
||||||
|
fmt.Println("\n--- Starting frontend preview server ---")
|
||||||
|
frontendCmd := exec.Command("pnpm", "preview:dev", "--port", strconv.Itoa(frontendPort))
|
||||||
frontendCmd.Dir = "frontend"
|
frontendCmd.Dir = "frontend"
|
||||||
frontendCmd.Env = append(os.Environ(),
|
|
||||||
fmt.Sprintf("VIKUNJA_FRONTEND_PORT=%d", frontendPort),
|
|
||||||
fmt.Sprintf("DEV_PROXY=http://127.0.0.1:%d", apiPort),
|
|
||||||
)
|
|
||||||
frontendCmd.Stdout = os.Stdout
|
frontendCmd.Stdout = os.Stdout
|
||||||
frontendCmd.Stderr = os.Stderr
|
frontendCmd.Stderr = os.Stderr
|
||||||
|
setProcessGroup(frontendCmd)
|
||||||
if err := frontendCmd.Start(); err != nil {
|
if err := frontendCmd.Start(); err != nil {
|
||||||
return fmt.Errorf("failed to start frontend: %w", err)
|
return fmt.Errorf("failed to start frontend: %w", err)
|
||||||
}
|
}
|
||||||
defer func() {
|
defer func() {
|
||||||
fmt.Println("\n--- Stopping frontend dev server ---")
|
fmt.Println("\n--- Stopping frontend preview server ---")
|
||||||
if frontendCmd.Process != nil {
|
killProcessGroup(frontendCmd)
|
||||||
frontendCmd.Process.Signal(os.Interrupt)
|
|
||||||
frontendCmd.Wait()
|
|
||||||
}
|
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// Wait for frontend to be ready
|
// Wait for frontend to be ready
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue