# HG changeset patch # User Olaf Wintermann # Date 1766180290 -3600 # Node ID 2e9b3f85c949c9c5735dd72ffdca1a2f57d2eb69 # Parent ec0d28411e6a2c50b8b1b4ce303278cf6d97501c prepare for windows build environments diff -r ec0d28411e6a -r 2e9b3f85c949 src/main.go --- 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 diff -r ec0d28411e6a -r 2e9b3f85c949 testconfig.xml --- a/testconfig.xml Thu Dec 18 19:03:53 2025 +0100 +++ b/testconfig.xml Fri Dec 19 22:38:10 2025 +0100 @@ -3,6 +3,11 @@ x1 + + + x2 + windows + testrepo