| 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 } |