| |
1 package main |
| |
2 |
| |
3 import ( |
| |
4 "bytes" |
| |
5 "encoding/xml" |
| |
6 "fmt" |
| |
7 "log" |
| |
8 "os" |
| |
9 "os/exec" |
| |
10 "path" |
| |
11 "text/template" |
| |
12 ) |
| |
13 |
| |
14 type Config struct { |
| |
15 XMLName xml.Name `xml:"config"` |
| |
16 BuildEnv []struct { |
| |
17 Name string `xml:"name,attr"` |
| |
18 Host string `xml:"host"` |
| |
19 User string `xml:"user"` |
| |
20 } `xml:"buildenv"` |
| |
21 |
| |
22 Repository []struct { |
| |
23 Path string `xml:"path"` |
| |
24 BuildEnvs string `xml:"buildenvs"` |
| |
25 Build []struct { |
| |
26 IsPlatform string `xml:"isplatform,attr"` |
| |
27 NotPlatform string `xml:"not,attr"` |
| |
28 Test []string `xml:"test"` |
| |
29 Var []struct { |
| |
30 Name string `xml:"name,attr"` |
| |
31 Value string `xml:",chardata"` |
| |
32 } |
| |
33 Configure string `xml:"configure"` |
| |
34 Compile string `xml:"compile"` |
| |
35 Check string `xml:"check"` |
| |
36 } `xml:"build"` |
| |
37 } `xml:"repository"` |
| |
38 } |
| |
39 |
| |
40 func main() { |
| |
41 data, err := os.ReadFile("testconfig.xml") |
| |
42 if err != nil { |
| |
43 log.Fatal(err) |
| |
44 } |
| |
45 |
| |
46 config := &Config{} |
| |
47 if err := xml.Unmarshal(data, &config); err != nil { |
| |
48 log.Fatal(err) |
| |
49 } |
| |
50 |
| |
51 templateStr, err := os.ReadFile("build.template") |
| |
52 if err != nil { |
| |
53 log.Fatal(err) |
| |
54 } |
| |
55 |
| |
56 tpl, err := template.New("").Parse(string(templateStr)) |
| |
57 if err != nil { |
| |
58 log.Fatal(err) |
| |
59 } |
| |
60 |
| |
61 err = os.Mkdir("tmp", 0755) |
| |
62 if err != nil && !os.IsExist(err) { |
| |
63 log.Fatal(err) |
| |
64 } |
| |
65 |
| |
66 tmpDir := "tmp" |
| |
67 |
| |
68 for _, repo := range config.Repository { |
| |
69 // create a build directory, that contains the repository source |
| |
70 // and build scripts |
| |
71 buildPath := path.Join(tmpDir, "build") |
| |
72 |
| |
73 if err = os.RemoveAll(buildPath); err != nil { |
| |
74 log.Fatal(err) |
| |
75 } |
| |
76 if err = os.RemoveAll(path.Join(tmpDir, "build.tar")); err != nil { |
| |
77 log.Fatal(err) |
| |
78 } |
| |
79 if err = os.RemoveAll(path.Join(tmpDir, "build.tar.gz")); err != nil { |
| |
80 log.Fatal(err) |
| |
81 } |
| |
82 |
| |
83 err = os.Mkdir(buildPath, 0755) |
| |
84 if err != nil { |
| |
85 log.Fatal(err) |
| |
86 } |
| |
87 |
| |
88 // update repository and copy it to the build directory |
| |
89 cmd := exec.Command("hg", "pull") |
| |
90 var outb, errb bytes.Buffer |
| |
91 cmd.Dir = repo.Path |
| |
92 cmd.Stdout = &outb |
| |
93 cmd.Stderr = &errb |
| |
94 err = cmd.Run() |
| |
95 if err != nil { |
| |
96 log.Print("hg: ", errb.String()) |
| |
97 log.Fatal(err) |
| |
98 } |
| |
99 |
| |
100 outb.Reset() |
| |
101 errb.Reset() |
| |
102 cmd = exec.Command("hg", "update") |
| |
103 cmd.Dir = repo.Path |
| |
104 cmd.Stdout = &outb |
| |
105 cmd.Stderr = &errb |
| |
106 err = cmd.Run() |
| |
107 if err != nil { |
| |
108 log.Print("hg: ", errb.String()) |
| |
109 log.Fatal(err) |
| |
110 } |
| |
111 |
| |
112 // copy repository to the tmp build directory |
| |
113 cmd = exec.Command("cp", "-r", repo.Path, path.Join(buildPath, "src")) |
| |
114 err = cmd.Run() |
| |
115 if err != nil { |
| |
116 log.Fatal(err) |
| |
117 } |
| |
118 |
| |
119 // create build script |
| |
120 file, err := os.Create(path.Join(buildPath, "build.sh")) |
| |
121 if err != nil { |
| |
122 log.Fatal(err) |
| |
123 } |
| |
124 |
| |
125 err = tpl.Execute(file, repo) |
| |
126 |
| |
127 if err != nil { |
| |
128 log.Fatal(err) |
| |
129 } |
| |
130 file.Close() |
| |
131 |
| |
132 // create tarball |
| |
133 cmd = exec.Command("tar", "cvf", "../build.tar", "src", "build.sh") |
| |
134 cmd.Dir = buildPath |
| |
135 if err := cmd.Run(); err != nil { |
| |
136 log.Print("tar error") |
| |
137 log.Fatal(err) |
| |
138 } |
| |
139 |
| |
140 fmt.Println(path.Join(buildPath, "build.tar")) |
| |
141 cmd = exec.Command("gzip", path.Join(tmpDir, "build.tar")) |
| |
142 if err := cmd.Run(); err != nil { |
| |
143 log.Print("gzip error") |
| |
144 log.Fatal(err) |
| |
145 } |
| |
146 |
| |
147 // TODO: upload build.tar.gz to buildenvs and execute the build.sh script remotely |
| |
148 } |
| |
149 } |