src/main.go

changeset 0
75d2ad4c7dee
child 1
05a8e80e577e
equal deleted inserted replaced
-1:000000000000 0:75d2ad4c7dee
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 }

mercurial