src/main.go

changeset 8
2e9b3f85c949
parent 6
66cb1937078f
child 9
eef1439666f7
--- a/src/main.go	Thu Dec 18 19:03:53 2025 +0100
+++ b/src/main.go	Fri Dec 19 22:38:10 2025 +0100
@@ -4,6 +4,7 @@
 	"bytes"
 	"encoding/json"
 	"encoding/xml"
+	"errors"
 	"fmt"
 	"log"
 	"os"
@@ -26,6 +27,7 @@
 	Name string `xml:"name,attr"`
 	Host string `xml:"host"`
 	User string `xml:"user"`
+	OS   string `xml:"os"`
 }
 
 type Build struct {
@@ -283,71 +285,89 @@
 			continue
 		}
 
-		// steps:
-		// upload build.tar.gz
-		// extract build.tar.gz on the buildenv host and run build.sh
-
-		// upload using scp
-		cmd := exec.Command("scp", path.Join(tmp_dir, "build.tar.gz"), env.Host+":")
-		log.Print("scp: ", cmd.Args)
-		if err := cmd.Run(); err != nil {
-			log.Print("cannot copy build env to ", env.Host)
-			continue
+		// exec posix or windows build script
+		var result BuildEnvResult
+		var err error
+		if env.OS == "windows" {
+			result, err = exec_win_buildenv(config, repo, &env, tmp_dir)
+		} else {
+			result, err = exec_posix_buildenv(config, repo, &env, tmp_dir)
 		}
-
-		// run build.sh
-		build_dir := "build"
-		remote_command := fmt.Sprintf("sh -c 'rm -Rf %[1]s; mkdir -p %[1]s; gzip -dc build.tar.gz | tar xf - -C %[1]s ; (cd %[1]s; ./build.sh)'", build_dir)
-		log.Printf("host: %s: command: %s", env.Host, remote_command)
-
-		var outb, errb bytes.Buffer
-		cmd = exec.Command("ssh", "-t", env.Host, remote_command)
-		cmd.Stdout = &outb
-		cmd.Stderr = &errb
-		err := cmd.Run()
-		log.Printf("host: %s: stdout: %s", env.Host, outb.String())
 		if err != nil {
-			log.Print("cannot execute build.sh on buildenv host ", env.Host)
-			log.Print("stderr: ", errb.String())
+			log.Print("buildenv exec error: ", err)
 			continue
 		}
 
-		// download result
-		cmd.Stdout = nil
-		cmd.Stderr = nil
-		cmd = exec.Command("scp", "-r", env.Host+":"+build_dir+"/result", tmp_dir)
-		log.Print("scp: ", cmd.Args)
-		if err := cmd.Run(); err != nil {
-			log.Print("cannot get result from buildenv")
-			continue
-		}
-
-		// parse result
-		resultData, err := os.ReadFile(path.Join(tmp_dir, "result/result.json"))
-		if err != nil {
-			log.Print("cannot read result from buildenv")
-			continue
-		}
-
-		var results []Result
-		if err := json.Unmarshal(resultData, &results); err != nil {
-			log.Print("cannot parse result.json")
-			continue
-		}
-
-		// store the actual Build pointer in the result
-		for i := range results {
-			results[i].Build = get_build(repo.Build, results[i].Id)
-		}
-		log.Print("buildenv finished ", env.Name)
-
-		envResult := BuildEnvResult{Env: &env, Results: results}
-		buildResults = append(buildResults, envResult)
+		buildResults = append(buildResults, result)
 	}
 
 	return buildResults
 }
 
+func exec_posix_buildenv(config *Config, repo *Repository, env *BuildEnv, tmp_dir string) (BuildEnvResult, error) {
+	result := BuildEnvResult{}
+
+	// steps:
+	// upload build.tar.gz
+	// extract build.tar.gz on the buildenv host and run build.sh
+
+	// upload using scp
+	cmd := exec.Command("scp", path.Join(tmp_dir, "build.tar.gz"), env.Host+":")
+	log.Print("scp: ", cmd.Args)
+	if err := cmd.Run(); err != nil {
+		return result, errors.New("cannot copy build env to " + env.Host)
+	}
+
+	// run build.sh
+	build_dir := "build"
+	remote_command := fmt.Sprintf("sh -c 'rm -Rf %[1]s; mkdir -p %[1]s; gzip -dc build.tar.gz | tar xf - -C %[1]s ; (cd %[1]s; ./build.sh)'", build_dir)
+	log.Printf("host: %s: command: %s", env.Host, remote_command)
+
+	var outb, errb bytes.Buffer
+	cmd = exec.Command("ssh", "-t", env.Host, remote_command)
+	cmd.Stdout = &outb
+	cmd.Stderr = &errb
+	err := cmd.Run()
+	log.Printf("host: %s: stdout: %s", env.Host, outb.String())
+	if err != nil {
+		log.Print("stderr: ", errb.String())
+		return result, errors.New("cannot execute build.sh on buildenv host " + env.Host)
+	}
+
+	// download result
+	cmd.Stdout = nil
+	cmd.Stderr = nil
+	cmd = exec.Command("scp", "-r", env.Host+":"+build_dir+"/result", tmp_dir)
+	log.Print("scp: ", cmd.Args)
+	if err := cmd.Run(); err != nil {
+		return result, errors.New("cannot get result from buildenv")
+	}
+
+	// parse result
+	resultData, err := os.ReadFile(path.Join(tmp_dir, "result/result.json"))
+	if err != nil {
+		return result, errors.New("cannot read result from buildenv")
+	}
+
+	var results []Result
+	if err := json.Unmarshal(resultData, &results); err != nil {
+		return result, errors.New("cannot parse result.json")
+	}
+
+	// store the actual Build pointer in the result
+	for i := range results {
+		results[i].Build = get_build(repo.Build, results[i].Id)
+	}
+	log.Print("buildenv finished ", env.Name)
+
+	return BuildEnvResult{Env: env, Results: results}, nil
+}
+
+func exec_win_buildenv(config *Config, repo *Repository, env *BuildEnv, tmp_dir string) (BuildEnvResult, error) {
+	result := BuildEnvResult{}
+	return result, nil
+}
+
 func get_commit_info(repo_dir string) *Commit {
 	var outb, errb bytes.Buffer
 

mercurial