src/main.go

changeset 3
9273d04a4d89
parent 2
edeb8e8e02b6
child 4
e24fc79b7980
equal deleted inserted replaced
2:edeb8e8e02b6 3:9273d04a4d89
1 package main 1 package main
2 2
3 import ( 3 import (
4 "bytes" 4 "bytes"
5 "encoding/json"
5 "encoding/xml" 6 "encoding/xml"
6 "errors"
7 "fmt" 7 "fmt"
8 "log" 8 "log"
9 "os" 9 "os"
10 "os/exec" 10 "os/exec"
11 "path" 11 "path"
29 29
30 type Repository struct { 30 type Repository struct {
31 Path string `xml:"path"` 31 Path string `xml:"path"`
32 BuildEnvs string `xml:"buildenvs"` 32 BuildEnvs string `xml:"buildenvs"`
33 Build []struct { 33 Build []struct {
34 Name string `xml:"name,attr"`
34 IsPlatform string `xml:"isplatform,attr"` 35 IsPlatform string `xml:"isplatform,attr"`
35 NotPlatform string `xml:"not,attr"` 36 NotPlatform string `xml:"not,attr"`
36 NotList []string 37 NotList []string
37 Test []string `xml:"test"` 38 Test []string `xml:"test"`
38 Var []struct { 39 Var []struct {
43 Compile string `xml:"compile"` 44 Compile string `xml:"compile"`
44 Check string `xml:"check"` 45 Check string `xml:"check"`
45 } `xml:"build"` 46 } `xml:"build"`
46 } 47 }
47 48
49 type Result struct {
50 Build string `json:"build"`
51 Name string `json:"name"`
52 Configure string `json:"configure"`
53 Compile string `json:"compile"`
54 Check string `json:"check"`
55 }
56
57 type Results struct {
58 Results []Result
59 }
60
48 func main() { 61 func main() {
49 data, err := os.ReadFile("testconfig.xml") 62 data, err := os.ReadFile("testconfig.xml")
50 if err != nil { 63 if err != nil {
51 log.Fatal(err) 64 log.Fatal(err)
52 } 65 }
96 for _, repo := range config.Repository { 109 for _, repo := range config.Repository {
97 if err = create_repo_archive(&repo, tpl, tmp); err != nil { 110 if err = create_repo_archive(&repo, tpl, tmp); err != nil {
98 log.Fatal(err) 111 log.Fatal(err)
99 } 112 }
100 113
101 if err = exec_buildenvs(config, &repo, tmp); err != nil { 114 exec_buildenvs(config, &repo, tmp)
102 log.Fatal(err)
103 }
104 } 115 }
105 } 116 }
106 117
107 func create_repo_archive(repo *Repository, tpl *template.Template, tmp_dir string) error { 118 func create_repo_archive(repo *Repository, tpl *template.Template, tmp_dir string) error {
108 // create a build directory, that contains the repository source 119 // create a build directory, that contains the repository source
117 log.Print("remove build.tar failed") 128 log.Print("remove build.tar failed")
118 return err 129 return err
119 } 130 }
120 if err := os.RemoveAll(path.Join(tmp_dir, "build.tar.gz")); err != nil { 131 if err := os.RemoveAll(path.Join(tmp_dir, "build.tar.gz")); err != nil {
121 log.Print("remove build.tar.gz failed") 132 log.Print("remove build.tar.gz failed")
133 return err
134 }
135 if err := os.RemoveAll(path.Join(tmp_dir, "result")); err != nil {
136 log.Print("remove result failed")
122 return err 137 return err
123 } 138 }
124 139
125 err := os.Mkdir(buildPath, 0755) 140 err := os.Mkdir(buildPath, 0755)
126 if err != nil { 141 if err != nil {
198 return false 213 return false
199 } 214 }
200 return true 215 return true
201 } 216 }
202 217
203 func exec_buildenvs(config *Config, repo *Repository, tmp_dir string) error { 218 func exec_buildenvs(config *Config, repo *Repository, tmp_dir string) int {
204 if len(repo.BuildEnvs) == 0 { 219 if len(repo.BuildEnvs) == 0 {
205 log.Print("repo %s has no buildenvs", repo.Path) 220 log.Print("repo %s has no buildenvs", repo.Path)
206 return nil 221 return 0
207 } 222 }
223 success := 0
208 buildenvs := strings.Split(repo.BuildEnvs, ",") 224 buildenvs := strings.Split(repo.BuildEnvs, ",")
209 for _, buildenv := range buildenvs { 225 for _, buildenv := range buildenvs {
210 env, ok := config.BuildEnvMap[buildenv] 226 env, ok := config.BuildEnvMap[buildenv]
211 if !ok { 227 if !ok {
212 return errors.New("unknown build env: " + buildenv) 228 log.Print("unknown build env ", buildenv)
229 continue
213 } 230 }
214 if !host_is_available(env.Host) { 231 if !host_is_available(env.Host) {
215 log.Print("skip unavailable host ", env.Host) 232 log.Print("skip unavailable host ", env.Host)
216 return nil 233 continue
217 } 234 }
218 235
219 // steps: 236 // steps:
220 // upload build.tar.gz 237 // upload build.tar.gz
221 // extract build.tar.gz on the buildenv host and run build.sh 238 // extract build.tar.gz on the buildenv host and run build.sh
240 err := cmd.Run() 257 err := cmd.Run()
241 log.Printf("host: %s: stdout: %s", env.Host, outb.String()) 258 log.Printf("host: %s: stdout: %s", env.Host, outb.String())
242 if err != nil { 259 if err != nil {
243 log.Print("cannot execute build.sh on buildenv host ", env.Host) 260 log.Print("cannot execute build.sh on buildenv host ", env.Host)
244 log.Print("stderr: ", errb.String()) 261 log.Print("stderr: ", errb.String())
245 } 262 continue
246 } 263 }
247 264
248 return nil 265 // download result
249 } 266 cmd.Stdout = nil
267 cmd.Stderr = nil
268 cmd = exec.Command("scp", "-r", env.Host+":"+build_dir+"/result", tmp_dir)
269 log.Print("scp: ", cmd.Args)
270 if err := cmd.Run(); err != nil {
271 log.Print("cannot get result from buildenv")
272 continue
273 }
274
275 // parse result
276 resultData, err := os.ReadFile(path.Join(tmp_dir, "result/result.json"))
277 if err != nil {
278 log.Print("cannot read result from buildenv")
279 continue
280 }
281
282 var results []Result
283 if err := json.Unmarshal(resultData, &results); err != nil {
284 log.Print("cannot parse result.json")
285 continue
286 }
287
288 log.Print(results)
289
290 success++
291 }
292
293 return success
294 }

mercurial