82 lines
1.7 KiB
Go
82 lines
1.7 KiB
Go
|
package builder
|
||
|
|
||
|
import "github.com/drone/drone/common"
|
||
|
|
||
|
// Builder represents a build execution tree.
|
||
|
type Builder struct {
|
||
|
builds Node
|
||
|
deploy Node
|
||
|
notify Node
|
||
|
}
|
||
|
|
||
|
// Run runs the build, deploy and notify nodes
|
||
|
// in the build tree.
|
||
|
func (b *Builder) Run(build *B) error {
|
||
|
var err error
|
||
|
err = b.RunBuild(build)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
err = b.RunDeploy(build)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
return b.RunNotify(build)
|
||
|
}
|
||
|
|
||
|
// RunBuild runs only the build node.
|
||
|
func (b *Builder) RunBuild(build *B) error {
|
||
|
return b.builds.Run(build)
|
||
|
}
|
||
|
|
||
|
// RunDeploy runs only the deploy node.
|
||
|
func (b *Builder) RunDeploy(build *B) error {
|
||
|
return b.notify.Run(build)
|
||
|
}
|
||
|
|
||
|
// RunNotify runs on the notify node.
|
||
|
func (b *Builder) RunNotify(build *B) error {
|
||
|
return b.notify.Run(build)
|
||
|
}
|
||
|
|
||
|
func (b *Builder) HasDeploy() bool {
|
||
|
return len(b.deploy.(serialNode)) != 0
|
||
|
}
|
||
|
|
||
|
func (b *Builder) HasNotify() bool {
|
||
|
return len(b.notify.(serialNode)) != 0
|
||
|
}
|
||
|
|
||
|
// Load loads a build configuration file.
|
||
|
func Load(conf *common.Config) *Builder {
|
||
|
var (
|
||
|
builds []Node
|
||
|
deploys []Node
|
||
|
notifys []Node
|
||
|
)
|
||
|
|
||
|
for _, step := range conf.Compose {
|
||
|
builds = append(builds, &serviceNode{step}) // compose
|
||
|
}
|
||
|
builds = append(builds, &batchNode{conf.Setup}) // setup
|
||
|
if conf.Clone != nil {
|
||
|
builds = append(builds, &batchNode{conf.Clone}) // clone
|
||
|
}
|
||
|
builds = append(builds, &batchNode{conf.Build}) // build
|
||
|
|
||
|
for _, step := range conf.Publish {
|
||
|
deploys = append(deploys, &batchNode{step}) // publish
|
||
|
}
|
||
|
for _, step := range conf.Deploy {
|
||
|
deploys = append(deploys, &batchNode{step}) // deploy
|
||
|
}
|
||
|
for _, step := range conf.Notify {
|
||
|
notifys = append(notifys, &batchNode{step}) // notify
|
||
|
}
|
||
|
return &Builder{
|
||
|
serialNode(builds),
|
||
|
serialNode(deploys),
|
||
|
serialNode(notifys),
|
||
|
}
|
||
|
}
|