src/main.go

Mon, 15 Dec 2025 10:59:58 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Mon, 15 Dec 2025 10:59:58 +0100
changeset 1
05a8e80e577e
parent 0
75d2ad4c7dee
child 2
edeb8e8e02b6
permissions
-rw-r--r--

add buildenv remote build.sh execution

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 {
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
34 IsPlatform string `xml:"isplatform,attr"`
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
35 NotPlatform string `xml:"not,attr"`
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
36 Test []string `xml:"test"`
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
37 Var []struct {
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
38 Name string `xml:"name,attr"`
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
39 Value string `xml:",chardata"`
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
40 }
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
41 Configure string `xml:"configure"`
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
42 Compile string `xml:"compile"`
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
43 Check string `xml:"check"`
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
44 } `xml:"build"`
0
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
45 }
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 func main() {
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48 data, err := os.ReadFile("testconfig.xml")
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49 if err != nil {
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
50 log.Fatal(err)
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
51 }
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 config := &Config{}
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
54 if err := xml.Unmarshal(data, &config); err != nil {
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
55 log.Fatal(err)
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
56 }
1
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
57 config.BuildEnvMap = make(map[string]BuildEnv)
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
58 for _, env := range config.BuildEnv {
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
59 config.BuildEnvMap[env.Name] = env
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
60 }
0
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
61
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
62 templateStr, err := os.ReadFile("build.template")
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
63 if err != nil {
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
64 log.Fatal(err)
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
65 }
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
66
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
67 tpl, err := template.New("").Parse(string(templateStr))
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
68 if err != nil {
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
69 log.Fatal(err)
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
70 }
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
71
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
72 err = os.Mkdir("tmp", 0755)
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
73 if err != nil && !os.IsExist(err) {
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
74 log.Fatal(err)
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
75 }
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
76
1
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
77 tmp := "tmp"
0
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
78
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
79 for _, repo := range config.Repository {
1
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
80 if err = create_repo_archive(&repo, tpl, tmp); err != nil {
0
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
81 log.Fatal(err)
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
82 }
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
83
1
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
84 if err = exec_buildenvs(config, &repo, tmp); err != nil {
0
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
85 log.Fatal(err)
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
86 }
1
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
87 }
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
88 }
0
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
89
1
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
90 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
91 // 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
92 // and build scripts
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
93 buildPath := path.Join(tmp_dir, "build")
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
94
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
95 if err := os.RemoveAll(buildPath); err != nil {
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
96 log.Print("remove build dir failed: ", err)
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
97 return err
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
98 }
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
99 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
100 log.Print("remove build.tar failed")
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
101 return err
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
102 }
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
103 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
104 log.Print("remove build.tar.gz failed")
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
105 return err
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
106 }
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
107
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
108 err := os.Mkdir(buildPath, 0755)
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
109 if err != nil {
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
110 log.Print("mkdir build dir failed: ", err)
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
111 return err
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
112 }
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
113
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
114 // 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
115 cmd := exec.Command("hg", "pull")
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
116 var outb, errb bytes.Buffer
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
117 cmd.Dir = repo.Path
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
118 cmd.Stdout = &outb
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
119 cmd.Stderr = &errb
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
120 err = cmd.Run()
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
121 if err != nil {
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
122 log.Print("hg: ", errb.String())
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
123 return err
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
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
126 outb.Reset()
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
127 errb.Reset()
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
128 cmd = exec.Command("hg", "update")
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
129 cmd.Dir = repo.Path
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
130 cmd.Stdout = &outb
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
131 cmd.Stderr = &errb
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
132 err = cmd.Run()
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
133 if err != nil {
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
134 log.Print("hg: ", errb.String())
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
135 return err
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
136 }
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
137
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
138 // 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
139 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
140 err = cmd.Run()
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
141 if err != nil {
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
142 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
143 return err
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
144 }
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
145
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
146 // create build script
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
147 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
148 if err != nil {
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
149 log.Print("cannot create build.sh")
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
150 return err
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
151 }
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
152 defer file.Close()
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 err = tpl.Execute(file, repo)
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
155 if err != nil {
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
156 log.Print("cannot execute build.sh template")
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
157 return err
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
158 }
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
159 file.Chmod(0755)
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
160
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
161 // create tarball
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
162 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
163 cmd.Dir = buildPath
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
164 if err := cmd.Run(); err != nil {
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
165 log.Print("tar error")
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
166 return err
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
167 }
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 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
170 if err := cmd.Run(); err != nil {
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
171 log.Print("gzip error")
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
172 return err
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
173 }
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
174
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
175 return nil
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
176 }
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 func host_is_available(host string) bool {
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
179 cmd := exec.Command("ping", "-c", "1", host)
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
180 if err := cmd.Run(); err != nil {
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
181 return false
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
182 }
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
183 return true
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 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
187 if len(repo.BuildEnvs) == 0 {
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
188 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
189 return nil
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 buildenvs := strings.Split(repo.BuildEnvs, ",")
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
192 for _, buildenv := range buildenvs {
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
193 env, ok := config.BuildEnvMap[buildenv]
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
194 if !ok {
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
195 return errors.New("unknown build env: " + buildenv)
0
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
196 }
1
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
197 if !host_is_available(env.Host) {
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
198 log.Print("skip unavailable host ", env.Host)
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
199 return nil
0
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
200 }
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
201
1
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
202 // steps:
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
203 // upload build.tar.gz
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
204 // 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
205
1
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
206 // upload using scp
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
207 cmd := exec.Command("scp", path.Join(tmp_dir, "build.tar.gz"), env.Host+":")
0
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
208 if err := cmd.Run(); err != nil {
1
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
209 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
210 continue
0
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
211 }
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
212
1
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
213 // run build.sh
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
214 build_dir := "build"
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
215 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
216 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
217
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
218 var outb, errb bytes.Buffer
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
219 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
220 cmd.Stdout = &outb
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
221 cmd.Stderr = &errb
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
222 err := cmd.Run()
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
223 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
224 if err != nil {
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
225 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
226 log.Print("stderr: ", errb.String())
0
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
227 }
1
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
228 }
0
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
229
1
05a8e80e577e add buildenv remote build.sh execution
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 0
diff changeset
230 return nil
0
75d2ad4c7dee init repo
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
231 }

mercurial