99 lines
2.1 KiB
Go
99 lines
2.1 KiB
Go
package parser
|
|
|
|
import (
|
|
"github.com/drone/drone/common"
|
|
"github.com/drone/drone/parser/inject"
|
|
"github.com/drone/drone/parser/matrix"
|
|
|
|
"gopkg.in/yaml.v2"
|
|
)
|
|
|
|
// Opts specifies parser options that will permit
|
|
// or deny certain Yaml settings.
|
|
type Opts struct {
|
|
Volumes bool
|
|
Network bool
|
|
Privileged bool
|
|
}
|
|
|
|
var defaultOpts = &Opts{
|
|
Volumes: false,
|
|
Network: false,
|
|
Privileged: false,
|
|
}
|
|
|
|
// Parse parses a build matrix and returns
|
|
// a list of build configurations for each axis
|
|
// using the default parsing options.
|
|
func Parse(raw string) ([]*common.Config, error) {
|
|
return ParseOpts(raw, defaultOpts)
|
|
}
|
|
|
|
// ParseOpts parses a build matrix and returns
|
|
// a list of build configurations for each axis
|
|
// using the provided parsing options.
|
|
func ParseOpts(raw string, opts *Opts) ([]*common.Config, error) {
|
|
confs, err := parse(raw)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
for _, conf := range confs {
|
|
err := Lint(conf)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
transformSetup(conf)
|
|
transformClone(conf)
|
|
transformBuild(conf)
|
|
transformImages(conf)
|
|
transformDockerPlugin(conf)
|
|
if !opts.Network {
|
|
rmNetwork(conf)
|
|
}
|
|
if !opts.Volumes {
|
|
rmVolumes(conf)
|
|
}
|
|
if !opts.Privileged {
|
|
rmPrivileged(conf)
|
|
}
|
|
}
|
|
return confs, nil
|
|
}
|
|
|
|
// helper function to parse a matrix configuraiton file.
|
|
func parse(raw string) ([]*common.Config, error) {
|
|
axis, err := matrix.Parse(raw)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
confs := []*common.Config{}
|
|
|
|
// when no matrix values exist we should return
|
|
// a single config value with an empty label.
|
|
if len(axis) == 0 {
|
|
conf, err := parseYaml(raw)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
confs = append(confs, conf)
|
|
}
|
|
|
|
for _, ax := range axis {
|
|
// inject the matrix values into the raw script
|
|
injected := inject.Inject(raw, ax)
|
|
conf, err := parseYaml(injected)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
conf.Axis = common.Axis(ax)
|
|
confs = append(confs, conf)
|
|
}
|
|
return confs, nil
|
|
}
|
|
|
|
// helper funtion to parse a yaml configuration file.
|
|
func parseYaml(raw string) (*common.Config, error) {
|
|
conf := &common.Config{}
|
|
err := yaml.Unmarshal([]byte(raw), conf)
|
|
return conf, err
|
|
}
|