src/main.go

Mon, 15 Dec 2025 19:18:04 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Mon, 15 Dec 2025 19:18:04 +0100
changeset 2
edeb8e8e02b6
parent 1
05a8e80e577e
child 3
9273d04a4d89
permissions
-rw-r--r--

implement build script

0
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 package main
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 import (
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 "bytes"
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 "encoding/xml"
1
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
6 "errors"
0
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 "fmt"
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 "log"
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 "os"
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 "os/exec"
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 "path"
1
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
12 "strings"
0
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 "text/template"
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 )
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
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
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
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
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46 }
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48 func main() {
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49 data, err := os.ReadFile("testconfig.xml")
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
50 if err != nil {
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
51 log.Fatal(err)
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
52 }
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
53
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
54 config := &Config{}
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
55 if err := xml.Unmarshal(data, &config); err != nil {
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
56 log.Fatal(err)
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
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
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
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
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
70 templateStr, err := os.ReadFile("build.template")
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
71 if err != nil {
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
72 log.Fatal(err)
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
73 }
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
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
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
85 if err != nil {
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
86 log.Fatal(err)
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
87 }
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
88
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
89 err = os.Mkdir("tmp", 0755)
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
90 if err != nil && !os.IsExist(err) {
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
91 log.Fatal(err)
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
92 }
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
93
1
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
94 tmp := "tmp"
0
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
95
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
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
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
98 log.Fatal(err)
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
99 }
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
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
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
102 log.Fatal(err)
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
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
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
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
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
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
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
217 }
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
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
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
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
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
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
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
229 }
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
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
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
245 }
1
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
246 }
0
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
247
1
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
248 return nil
0
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
249 }

mercurial