forked from checkr/codeflow
-
Notifications
You must be signed in to change notification settings - Fork 0
/
docker_build.go
134 lines (112 loc) · 3.18 KB
/
docker_build.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package docker_build
import (
"bytes"
"fmt"
"log"
"github.com/checkr/codeflow/server/agent"
"github.com/checkr/codeflow/server/plugins"
docker "github.com/fsouza/go-dockerclient"
"github.com/spf13/viper"
)
type DockerBuild struct {
events chan agent.Event
}
func init() {
agent.RegisterPlugin("docker_build", func() agent.Plugin {
return &DockerBuild{}
})
}
func (b *DockerBuild) Description() string {
return "Clone git repository and build a docker image"
}
func (b *DockerBuild) SampleConfig() string {
return ` `
}
func (b *DockerBuild) Start(events chan agent.Event) error {
b.events = events
log.Println("Started Git Docker Build")
return nil
}
func (b *DockerBuild) Stop() {
log.Println("Stopping Git Docker Build")
}
func (b *DockerBuild) Subscribe() []string {
return []string{
"plugins.DockerBuild:create",
}
}
func (b *DockerBuild) Process(e agent.Event) error {
log.Printf("Process DockerBuild event: %s", e.Name)
var err error
var event agent.Event
build := e.Payload.(plugins.DockerBuild)
build.Action = plugins.Status
build.State = plugins.Running
build.BuildLog = ""
build.BuildError = ""
dockerHost := viper.GetString("plugins.docker_build.docker_host")
rsaPrivateKey := build.Git.RsaPrivateKey
rsaPublicKey := build.Git.RsaPublicKey
outputBuffer := bytes.NewBuffer(nil)
dockerClient, err := docker.NewClient(dockerHost)
if err != nil {
build.BuildError = fmt.Sprintf("%v (Action: %v)", err.Error(), build.State)
build.State = plugins.Failed
event := e.NewEvent(build, err)
b.events <- event
log.Println(err)
return err
}
build.State = plugins.Fetching
event = e.NewEvent(build, nil)
b.events <- event
dockerBuilder := NewDockerBuilder(dockerClient, rsaPrivateKey, rsaPublicKey, outputBuffer)
err = dockerBuilder.fetchCode(&build)
if err != nil {
build.BuildLog = outputBuffer.String()
build.BuildError = fmt.Sprintf("%v (Action: %v)", err.Error(), build.State)
build.State = plugins.Failed
event := e.NewEvent(build, err)
b.events <- event
log.Println(err)
return err
}
build.State = plugins.Building
event = e.NewEvent(build, nil)
b.events <- event
if err = dockerBuilder.build(&build); err != nil {
build.BuildLog = outputBuffer.String()
build.BuildError = fmt.Sprintf("%v (Action: %v)", err.Error(), build.State)
build.State = plugins.Failed
event := e.NewEvent(build, err)
b.events <- event
log.Println(err)
return err
}
build.State = plugins.Pushing
event = e.NewEvent(build, nil)
b.events <- event
if err = dockerBuilder.push(&build); err != nil {
build.BuildLog = outputBuffer.String()
build.BuildError = fmt.Sprintf("%v (Action: %v)", err.Error(), build.State)
build.State = plugins.Failed
event := e.NewEvent(build, err)
b.events <- event
log.Println(err)
return err
}
build.State = plugins.Complete
build.BuildLog = outputBuffer.String()
event = e.NewEvent(build, nil)
b.events <- event
if err = dockerBuilder.cleanup(&build); err != nil {
build.BuildLog = outputBuffer.String()
build.BuildError = fmt.Sprintf("%v (Action: %v)", err.Error(), build.State)
build.State = plugins.Failed
event := e.NewEvent(build, err)
b.events <- event
log.Println(err)
return err
}
return nil
}