API and Database Deployment Update
This commit is contained in:
@@ -1,5 +1,4 @@
|
||||
package builder
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
@@ -9,14 +8,11 @@ import (
|
||||
"path/filepath"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Builder struct{}
|
||||
|
||||
func NewBuilder() *Builder {
|
||||
return &Builder{}
|
||||
}
|
||||
|
||||
func (b *Builder) Build(repoURL, appName, gitToken, buildCmd, startCmd, installCmd, runtime string, envVars map[string]string, logWriter io.Writer) (string, string, error) {
|
||||
func (b *Builder) Build(repoURL, targetCommit, appName, gitToken, buildCmd, startCmd, installCmd, runtime string, envVars map[string]string, logWriter io.Writer) (string, string, error) {
|
||||
workDir := filepath.Join("/tmp", "paas-builds", appName)
|
||||
if err := os.RemoveAll(workDir); err != nil {
|
||||
return "", "", fmt.Errorf("failed to clean work dir: %w", err)
|
||||
@@ -24,7 +20,6 @@ func (b *Builder) Build(repoURL, appName, gitToken, buildCmd, startCmd, installC
|
||||
if err := os.MkdirAll(workDir, 0755); err != nil {
|
||||
return "", "", fmt.Errorf("failed to create work dir: %w", err)
|
||||
}
|
||||
|
||||
cloneURL := repoURL
|
||||
if gitToken != "" {
|
||||
u, err := url.Parse(repoURL)
|
||||
@@ -34,17 +29,29 @@ func (b *Builder) Build(repoURL, appName, gitToken, buildCmd, startCmd, installC
|
||||
u.User = url.UserPassword("oauth2", gitToken)
|
||||
cloneURL = u.String()
|
||||
}
|
||||
|
||||
fmt.Fprintf(logWriter, ">>> Cloning repository %s...\n", repoURL)
|
||||
cloneCmd := exec.Command("git", "clone", "--depth", "1", cloneURL, ".")
|
||||
var cloneCmd *exec.Cmd
|
||||
if targetCommit != "" && targetCommit != "HEAD" && targetCommit != "MANUAL" && targetCommit != "WEBHOOK" {
|
||||
cloneCmd = exec.Command("git", "clone", "--filter=blob:none", cloneURL, ".")
|
||||
} else {
|
||||
cloneCmd = exec.Command("git", "clone", "--depth", "1", cloneURL, ".")
|
||||
}
|
||||
cloneCmd.Dir = workDir
|
||||
cloneCmd.Stdout = logWriter
|
||||
cloneCmd.Stderr = logWriter
|
||||
if err := cloneCmd.Run(); err != nil {
|
||||
return "", "", fmt.Errorf("git clone failed: %w", err)
|
||||
}
|
||||
|
||||
// Get commit hash
|
||||
if targetCommit != "" && targetCommit != "HEAD" && targetCommit != "MANUAL" && targetCommit != "WEBHOOK" {
|
||||
fmt.Fprintf(logWriter, ">>> Checking out commit %s...\n", targetCommit)
|
||||
checkoutCmd := exec.Command("git", "checkout", targetCommit)
|
||||
checkoutCmd.Dir = workDir
|
||||
checkoutCmd.Stdout = logWriter
|
||||
checkoutCmd.Stderr = logWriter
|
||||
if err := checkoutCmd.Run(); err != nil {
|
||||
return "", "", fmt.Errorf("git checkout failed: %w", err)
|
||||
}
|
||||
}
|
||||
commitCmd := exec.Command("git", "rev-parse", "HEAD")
|
||||
commitCmd.Dir = workDir
|
||||
commitHashBytes, err := commitCmd.Output()
|
||||
@@ -55,14 +62,11 @@ func (b *Builder) Build(repoURL, appName, gitToken, buildCmd, startCmd, installC
|
||||
} else {
|
||||
fmt.Fprintf(logWriter, ">>> Failed to get commit hash: %v\n", err)
|
||||
}
|
||||
|
||||
if runtime == "" {
|
||||
runtime = "nodejs"
|
||||
}
|
||||
|
||||
var nixPkgs string
|
||||
var defaultInstall, defaultBuild, defaultStart string
|
||||
|
||||
switch runtime {
|
||||
case "bun":
|
||||
nixPkgs = `["bun"]`
|
||||
@@ -85,66 +89,50 @@ func (b *Builder) Build(repoURL, appName, gitToken, buildCmd, startCmd, installC
|
||||
defaultBuild = "npm run build"
|
||||
defaultStart = "npm run start"
|
||||
}
|
||||
|
||||
installStr := defaultInstall
|
||||
if installCmd != "" {
|
||||
installStr = installCmd
|
||||
}
|
||||
|
||||
buildStr := defaultBuild
|
||||
if buildCmd != "" {
|
||||
buildStr = buildCmd
|
||||
}
|
||||
|
||||
startStr := defaultStart
|
||||
if startCmd != "" {
|
||||
startStr = startCmd
|
||||
}
|
||||
|
||||
nixpacksConfig := fmt.Sprintf(`
|
||||
[phases.setup]
|
||||
nixPkgs = %s
|
||||
|
||||
[phases.install]
|
||||
cmds = ["%s"]
|
||||
|
||||
[phases.build]
|
||||
cmds = ["%s"]
|
||||
|
||||
[start]
|
||||
cmd = "%s"
|
||||
`, nixPkgs, installStr, buildStr, startStr)
|
||||
|
||||
if _, err := os.Stat(filepath.Join(workDir, "package.json")); err == nil {
|
||||
configPath := filepath.Join(workDir, "nixpacks.toml")
|
||||
if err := os.WriteFile(configPath, []byte(nixpacksConfig), 0644); err != nil {
|
||||
return "", "", fmt.Errorf("failed to write nixpacks.toml: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
imageName := strings.ToLower(appName)
|
||||
|
||||
fmt.Fprintf(logWriter, "\n>>> Starting Nixpacks build for %s...\n", imageName)
|
||||
|
||||
args := []string{"build", ".", "--name", imageName, "--no-cache"}
|
||||
for k, v := range envVars {
|
||||
args = append(args, "--env", fmt.Sprintf("%s=%s", k, v))
|
||||
}
|
||||
|
||||
nixCmd := exec.Command("nixpacks", args...)
|
||||
nixCmd.Dir = workDir
|
||||
nixCmd.Stdout = logWriter
|
||||
nixCmd.Stderr = logWriter
|
||||
|
||||
nixCmd.Env = append(os.Environ(),
|
||||
"NIXPACKS_NO_CACHE=1",
|
||||
)
|
||||
|
||||
if err := nixCmd.Run(); err != nil {
|
||||
return "", "", fmt.Errorf("nixpacks build failed: %w", err)
|
||||
}
|
||||
|
||||
fmt.Fprintf(logWriter, "\n>>> Build successful!\n")
|
||||
|
||||
return imageName, commitHash, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user