harness-drone/shared/build/script/script.go

166 lines
3.5 KiB
Go
Raw Normal View History

2014-02-07 10:10:01 +00:00
package script
import (
2014-02-13 15:03:40 +00:00
"bytes"
"fmt"
2014-02-07 10:10:01 +00:00
"io/ioutil"
"strings"
2014-06-12 00:42:49 +00:00
"gopkg.in/yaml.v1"
2014-02-07 10:10:01 +00:00
2014-06-12 21:46:55 +00:00
"github.com/drone/drone/plugin/deploy"
"github.com/drone/drone/plugin/notify"
"github.com/drone/drone/plugin/publish"
2014-06-04 21:25:38 +00:00
"github.com/drone/drone/shared/build/buildfile"
"github.com/drone/drone/shared/build/git"
"github.com/drone/drone/shared/build/repo"
2014-02-07 10:10:01 +00:00
)
2014-06-12 00:42:49 +00:00
func ParseBuild(data string, params map[string]string) (*Build, error) {
2014-02-07 10:10:01 +00:00
build := Build{}
// parse the build configuration file
2014-06-12 00:42:49 +00:00
err := yaml.Unmarshal(injectParams([]byte(data), params), &build)
2014-02-07 10:10:01 +00:00
return &build, err
}
func ParseBuildFile(filename string) (*Build, error) {
data, err := ioutil.ReadFile(filename)
if err != nil {
return nil, err
}
2014-06-12 00:42:49 +00:00
return ParseBuild(string(data), nil)
2014-02-13 15:03:40 +00:00
}
// injectParams injects params into data.
func injectParams(data []byte, params map[string]string) []byte {
for k, v := range params {
data = bytes.Replace(data, []byte(fmt.Sprintf("{{%s}}", k)), []byte(v), -1)
}
return data
2014-02-07 10:10:01 +00:00
}
// Build stores the configuration details for
// building, testing and deploying code.
type Build struct {
// Image specifies the Docker Image that will be
// used to virtualize the Build process.
Image string
// Name specifies a user-defined label used
// to identify the build.
Name string
// Script specifies the build and test commands.
Script []string
// Env specifies the environment of the build.
Env []string
// Hosts specifies the custom IP address and
// hostname mappings.
Hosts []string
2014-03-03 06:35:01 +00:00
// Cache lists a set of directories that should
// persisted between builds.
Cache []string
2014-02-07 10:10:01 +00:00
// Services specifies external services, such as
// database or messaging queues, that should be
// linked to the build environment.
Services []string
// White-list of Branches that are built.
Branches []string
Deploy *deploy.Deploy `yaml:"deploy,omitempty"`
Publish *publish.Publish `yaml:"publish,omitempty"`
Notifications *notify.Notification `yaml:"notify,omitempty"`
// Git specified git-specific parameters, such as
// the clone depth and path
Git *git.Git `yaml:"git,omitempty"`
2014-02-07 10:10:01 +00:00
}
// Write adds all the steps to the build script, including
// build commands, deploy and publish commands.
func (b *Build) Write(f *buildfile.Buildfile, r *repo.Repo) {
2014-02-07 10:10:01 +00:00
// append build commands
b.WriteBuild(f)
// write publish commands
if b.Publish != nil {
b.Publish.Write(f, r)
2014-02-07 10:10:01 +00:00
}
// write deployment commands
if b.Deploy != nil {
b.Deploy.Write(f)
}
2014-02-26 21:24:48 +00:00
// write exit value
f.WriteCmd("exit 0")
2014-02-07 10:10:01 +00:00
}
// WriteBuild adds only the build steps to the build script,
// omitting publish and deploy steps. This is important for
// pull requests, where deployment would be undesirable.
func (b *Build) WriteBuild(f *buildfile.Buildfile) {
// append environment variables
for _, env := range b.Env {
parts := strings.Split(env, "=")
if len(parts) != 2 {
continue
}
f.WriteEnv(parts[0], parts[1])
}
// append build commands
for _, cmd := range b.Script {
f.WriteCmd(cmd)
}
}
func (b *Build) MatchBranch(branch string) bool {
if len(b.Branches) == 0 {
return true
}
for _, item := range b.Branches {
if item == branch {
return true
}
}
return false
}
2014-02-07 10:10:01 +00:00
type Publish interface {
Write(f *buildfile.Buildfile)
}
type Deployment interface {
Write(f *buildfile.Buildfile)
}
type Notification interface {
Set(c Context)
}
type Context interface {
Host() string
Owner() string
Name() string
Branch() string
Hash() string
Status() string
Message() string
Author() string
Gravatar() string
Duration() int64
HumanDuration() string
//Settings
}