Mon, 15 Dec 2025 19:18:04 +0100
implement build script
| 0 | 1 | package main |
| 2 | ||
| 3 | import ( | |
| 4 | "bytes" | |
| 5 | "encoding/xml" | |
|
1
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
6 | "errors" |
| 0 | 7 | "fmt" |
| 8 | "log" | |
| 9 | "os" | |
| 10 | "os/exec" | |
| 11 | "path" | |
|
1
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
12 | "strings" |
| 0 | 13 | "text/template" |
| 14 | ) | |
| 15 | ||
| 16 | type Config struct { | |
|
1
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
17 | XMLName xml.Name `xml:"config"` |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
18 | BuildEnv []BuildEnv `xml:"buildenv"` |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
19 | BuildEnvMap map[string]BuildEnv |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
20 | |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
21 | Repository []Repository `xml:"repository"` |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
22 | } |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
23 | |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
24 | type BuildEnv struct { |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
25 | Name string `xml:"name,attr"` |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
26 | Host string `xml:"host"` |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
27 | User string `xml:"user"` |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
28 | } |
| 0 | 29 | |
|
1
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
30 | type Repository struct { |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
31 | Path string `xml:"path"` |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
32 | BuildEnvs string `xml:"buildenvs"` |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
33 | Build []struct { |
|
2
edeb8e8e02b6
implement build script
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
1
diff
changeset
|
34 | IsPlatform string `xml:"isplatform,attr"` |
|
edeb8e8e02b6
implement build script
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
1
diff
changeset
|
35 | NotPlatform string `xml:"not,attr"` |
|
edeb8e8e02b6
implement build script
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
1
diff
changeset
|
36 | NotList []string |
|
1
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
37 | Test []string `xml:"test"` |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
38 | Var []struct { |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
39 | Name string `xml:"name,attr"` |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
40 | Value string `xml:",chardata"` |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
41 | } |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
42 | Configure string `xml:"configure"` |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
43 | Compile string `xml:"compile"` |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
44 | Check string `xml:"check"` |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
45 | } `xml:"build"` |
| 0 | 46 | } |
| 47 | ||
| 48 | func main() { | |
| 49 | data, err := os.ReadFile("testconfig.xml") | |
| 50 | if err != nil { | |
| 51 | log.Fatal(err) | |
| 52 | } | |
| 53 | ||
| 54 | config := &Config{} | |
| 55 | if err := xml.Unmarshal(data, &config); err != nil { | |
| 56 | log.Fatal(err) | |
| 57 | } | |
|
1
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
58 | config.BuildEnvMap = make(map[string]BuildEnv) |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
59 | for _, env := range config.BuildEnv { |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
60 | config.BuildEnvMap[env.Name] = env |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
61 | } |
| 0 | 62 | |
|
2
edeb8e8e02b6
implement build script
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
1
diff
changeset
|
63 | for ri := range config.Repository { |
|
edeb8e8e02b6
implement build script
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
1
diff
changeset
|
64 | for bi := range config.Repository[ri].Build { |
|
edeb8e8e02b6
implement build script
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
1
diff
changeset
|
65 | build := &config.Repository[ri].Build[bi] |
|
edeb8e8e02b6
implement build script
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
1
diff
changeset
|
66 | build.NotList = strings.Split(build.NotPlatform, ",") |
|
edeb8e8e02b6
implement build script
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
1
diff
changeset
|
67 | } |
|
edeb8e8e02b6
implement build script
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
1
diff
changeset
|
68 | } |
|
edeb8e8e02b6
implement build script
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
1
diff
changeset
|
69 | |
| 0 | 70 | templateStr, err := os.ReadFile("build.template") |
| 71 | if err != nil { | |
| 72 | log.Fatal(err) | |
| 73 | } | |
| 74 | ||
|
2
edeb8e8e02b6
implement build script
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
1
diff
changeset
|
75 | funcs := template.FuncMap{ |
|
edeb8e8e02b6
implement build script
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
1
diff
changeset
|
76 | "add": func(i int, n int) int { |
|
edeb8e8e02b6
implement build script
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
1
diff
changeset
|
77 | return i + n |
|
edeb8e8e02b6
implement build script
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
1
diff
changeset
|
78 | }, |
|
edeb8e8e02b6
implement build script
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
1
diff
changeset
|
79 | "sub": func(i int, n int) int { |
|
edeb8e8e02b6
implement build script
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
1
diff
changeset
|
80 | return i - n |
|
edeb8e8e02b6
implement build script
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
1
diff
changeset
|
81 | }, |
|
edeb8e8e02b6
implement build script
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
1
diff
changeset
|
82 | } |
|
edeb8e8e02b6
implement build script
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
1
diff
changeset
|
83 | |
|
edeb8e8e02b6
implement build script
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
1
diff
changeset
|
84 | tpl, err := template.New("").Funcs(funcs).Parse(string(templateStr)) |
| 0 | 85 | if err != nil { |
| 86 | log.Fatal(err) | |
| 87 | } | |
| 88 | ||
| 89 | err = os.Mkdir("tmp", 0755) | |
| 90 | if err != nil && !os.IsExist(err) { | |
| 91 | log.Fatal(err) | |
| 92 | } | |
| 93 | ||
|
1
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
94 | tmp := "tmp" |
| 0 | 95 | |
| 96 | for _, repo := range config.Repository { | |
|
1
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
97 | if err = create_repo_archive(&repo, tpl, tmp); err != nil { |
| 0 | 98 | log.Fatal(err) |
| 99 | } | |
| 100 | ||
|
1
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
101 | if err = exec_buildenvs(config, &repo, tmp); err != nil { |
| 0 | 102 | log.Fatal(err) |
| 103 | } | |
|
1
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
104 | } |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
105 | } |
| 0 | 106 | |
|
1
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
107 | func create_repo_archive(repo *Repository, tpl *template.Template, tmp_dir string) error { |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
108 | // create a build directory, that contains the repository source |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
109 | // and build scripts |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
110 | buildPath := path.Join(tmp_dir, "build") |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
111 | |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
112 | if err := os.RemoveAll(buildPath); err != nil { |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
113 | log.Print("remove build dir failed: ", err) |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
114 | return err |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
115 | } |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
116 | if err := os.RemoveAll(path.Join(tmp_dir, "build.tar")); err != nil { |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
117 | log.Print("remove build.tar failed") |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
118 | return err |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
119 | } |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
120 | if err := os.RemoveAll(path.Join(tmp_dir, "build.tar.gz")); err != nil { |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
121 | log.Print("remove build.tar.gz failed") |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
122 | return err |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
123 | } |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
124 | |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
125 | err := os.Mkdir(buildPath, 0755) |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
126 | if err != nil { |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
127 | log.Print("mkdir build dir failed: ", err) |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
128 | return err |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
129 | } |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
130 | |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
131 | // update repository and copy it to the build directory |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
132 | cmd := exec.Command("hg", "pull") |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
133 | var outb, errb bytes.Buffer |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
134 | cmd.Dir = repo.Path |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
135 | cmd.Stdout = &outb |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
136 | cmd.Stderr = &errb |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
137 | err = cmd.Run() |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
138 | if err != nil { |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
139 | log.Print("hg: ", errb.String()) |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
140 | return err |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
141 | } |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
142 | |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
143 | outb.Reset() |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
144 | errb.Reset() |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
145 | cmd = exec.Command("hg", "update") |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
146 | cmd.Dir = repo.Path |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
147 | cmd.Stdout = &outb |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
148 | cmd.Stderr = &errb |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
149 | err = cmd.Run() |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
150 | if err != nil { |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
151 | log.Print("hg: ", errb.String()) |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
152 | return err |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
153 | } |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
154 | |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
155 | // copy repository to the tmp_dir build directory |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
156 | cmd = exec.Command("cp", "-r", repo.Path, path.Join(buildPath, "src")) |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
157 | err = cmd.Run() |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
158 | if err != nil { |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
159 | log.Print("cannot copy the repository to the build dir") |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
160 | return err |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
161 | } |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
162 | |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
163 | // create build script |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
164 | file, err := os.Create(path.Join(buildPath, "build.sh")) |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
165 | if err != nil { |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
166 | log.Print("cannot create build.sh") |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
167 | return err |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
168 | } |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
169 | defer file.Close() |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
170 | |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
171 | err = tpl.Execute(file, repo) |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
172 | if err != nil { |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
173 | log.Print("cannot execute build.sh template") |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
174 | return err |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
175 | } |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
176 | file.Chmod(0755) |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
177 | |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
178 | // create tarball |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
179 | cmd = exec.Command("tar", "cvf", "../build.tar", "src", "build.sh") |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
180 | cmd.Dir = buildPath |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
181 | if err := cmd.Run(); err != nil { |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
182 | log.Print("tar error") |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
183 | return err |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
184 | } |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
185 | |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
186 | cmd = exec.Command("gzip", path.Join(tmp_dir, "build.tar")) |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
187 | if err := cmd.Run(); err != nil { |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
188 | log.Print("gzip error") |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
189 | return err |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
190 | } |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
191 | |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
192 | return nil |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
193 | } |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
194 | |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
195 | func host_is_available(host string) bool { |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
196 | cmd := exec.Command("ping", "-c", "1", host) |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
197 | if err := cmd.Run(); err != nil { |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
198 | return false |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
199 | } |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
200 | return true |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
201 | } |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
202 | |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
203 | func exec_buildenvs(config *Config, repo *Repository, tmp_dir string) error { |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
204 | if len(repo.BuildEnvs) == 0 { |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
205 | log.Print("repo %s has no buildenvs", repo.Path) |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
206 | return nil |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
207 | } |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
208 | buildenvs := strings.Split(repo.BuildEnvs, ",") |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
209 | for _, buildenv := range buildenvs { |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
210 | env, ok := config.BuildEnvMap[buildenv] |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
211 | if !ok { |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
212 | return errors.New("unknown build env: " + buildenv) |
| 0 | 213 | } |
|
1
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
214 | if !host_is_available(env.Host) { |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
215 | log.Print("skip unavailable host ", env.Host) |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
216 | return nil |
| 0 | 217 | } |
| 218 | ||
|
1
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
219 | // steps: |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
220 | // upload build.tar.gz |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
221 | // extract build.tar.gz on the buildenv host and run build.sh |
| 0 | 222 | |
|
1
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
223 | // upload using scp |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
224 | cmd := exec.Command("scp", path.Join(tmp_dir, "build.tar.gz"), env.Host+":") |
|
2
edeb8e8e02b6
implement build script
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
1
diff
changeset
|
225 | log.Print("scp: ", cmd.Args) |
| 0 | 226 | if err := cmd.Run(); err != nil { |
|
1
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
227 | log.Print("cannot copy build env to ", env.Host) |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
228 | continue |
| 0 | 229 | } |
| 230 | ||
|
1
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
231 | // run build.sh |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
232 | build_dir := "build" |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
233 | remote_command := fmt.Sprintf("sh -c 'rm -Rf %s; mkdir -p %s; gzip -dc build.tar.gz | tar xf - -C %s ; (cd %s; ./build.sh)'", build_dir, build_dir, build_dir, build_dir) |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
234 | log.Printf("host: %s: command: %s", env.Host, remote_command) |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
235 | |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
236 | var outb, errb bytes.Buffer |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
237 | cmd = exec.Command("ssh", "-t", env.Host, remote_command) |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
238 | cmd.Stdout = &outb |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
239 | cmd.Stderr = &errb |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
240 | err := cmd.Run() |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
241 | log.Printf("host: %s: stdout: %s", env.Host, outb.String()) |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
242 | if err != nil { |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
243 | log.Print("cannot execute build.sh on buildenv host ", env.Host) |
|
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
244 | log.Print("stderr: ", errb.String()) |
| 0 | 245 | } |
|
1
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
246 | } |
| 0 | 247 | |
|
1
05a8e80e577e
add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
248 | return nil |
| 0 | 249 | } |