func execCmd(c *cli.Context) error { info := git.Info() cert, _ := ioutil.ReadFile(filepath.Join( c.String("docker-cert-path"), "cert.pem", )) key, _ := ioutil.ReadFile(filepath.Join( c.String("docker-cert-path"), "key.pem", )) ca, _ := ioutil.ReadFile(filepath.Join( c.String("docker-cert-path"), "ca.pem", )) if len(cert) == 0 || len(key) == 0 || len(ca) == 0 { println("") } yml, err := ioutil.ReadFile(".drone.yml") if err != nil { return err } axes, err := matrix.Parse(string(yml)) if err != nil { return err } if len(axes) == 0 { axes = append(axes, matrix.Axis{}) } cli, err := newDockerClient(c.String("docker-host"), cert, key, ca) if err != nil { return err } pwd, err := os.Getwd() if err != nil { return err } execArgs := []string{"--build", "--debug", "--mount", pwd} for _, arg := range []string{"cache", "deploy", "notify", "pull"} { if c.Bool(arg) { execArgs = append(execArgs, "--"+arg) } } if c.Bool("pull") { image := "drone/drone-exec:latest" color.Magenta("[DRONE] pulling %s", image) err := cli.PullImage(image, nil) if err != nil { color.Red("[DRONE] failed to pull %s", image) os.Exit(1) } } proj := resolvePath(pwd) var exits []int for i, axis := range axes { color.Magenta("[DRONE] starting job #%d", i+1) if len(axis) != 0 { color.Magenta("[DRONE] export %s", axis) } payload := drone.Payload{ Repo: &drone.Repo{ IsTrusted: c.Bool("trusted"), IsPrivate: true, }, Job: &drone.Job{ Status: drone.StatusRunning, Environment: axis, }, Yaml: string(yml), Build: &drone.Build{ Status: drone.StatusRunning, Branch: info.Branch, Commit: info.Head.Id, Author: info.Head.AuthorName, Email: info.Head.AuthorEmail, Message: info.Head.Message, Event: c.String("event"), }, System: &drone.System{ Link: c.GlobalString("server"), Globals: c.StringSlice("e"), Plugins: []string{"plugins/*", "*/*"}, }, } // gets the ssh key if provided if len(c.String("i")) != 0 { key, err = ioutil.ReadFile(c.String("i")) if err != nil { return err } payload.Keys = &drone.Key{ Private: string(key), } payload.Netrc = &drone.Netrc{} } if len(proj) != 0 { payload.Repo.Link = fmt.Sprintf("https://%s", proj) } out, _ := json.Marshal(payload) exit, err := run(cli, execArgs, string(out)) if err != nil { return err } exits = append(exits, exit) color.Magenta("[DRONE] finished job #%d", i+1) color.Magenta("[DRONE] exit code %d", exit) } var passed = true for i, _ := range axes { exit := exits[i] if exit == 0 { color.Green("[DRONE] job #%d passed", i+1) } else { color.Red("[DRONE] job #%d failed", i+1) passed = false } } if passed { color.Green("[DRONE] build passed") } else { color.Red("[DRONE] build failed") os.Exit(1) } return nil }
func (a *Agent) prep(w *drone.Payload) (*yaml.Config, error) { envs := toEnv(w) w.Yaml = expander.ExpandString(w.Yaml, envs) // inject the netrc file into the clone plugin if the repositroy is // private and requires authentication. var secrets []*drone.Secret if w.Build.Verified { secrets = append(secrets, w.Secrets...) } if w.Repo.IsPrivate { secrets = append(secrets, &drone.Secret{ Name: "DRONE_NETRC_USERNAME", Value: w.Netrc.Login, Images: []string{"*"}, Events: []string{"*"}, }) secrets = append(secrets, &drone.Secret{ Name: "DRONE_NETRC_PASSWORD", Value: w.Netrc.Password, Images: []string{"*"}, Events: []string{"*"}, }) secrets = append(secrets, &drone.Secret{ Name: "DRONE_NETRC_MACHINE", Value: w.Netrc.Machine, Images: []string{"*"}, Events: []string{"*"}, }) } conf, err := yaml.ParseString(w.Yaml) if err != nil { return nil, err } src := "src" if url, _ := url.Parse(w.Repo.Link); url != nil { src = filepath.Join(src, url.Host, url.Path) } transform.Clone(conf, w.Repo.Kind) transform.Environ(conf, envs) transform.DefaultFilter(conf) if w.BuildLast != nil { transform.ChangeFilter(conf, w.BuildLast.Status) } transform.ImageSecrets(conf, secrets, w.Build.Event) transform.Identifier(conf) transform.WorkspaceTransform(conf, "/drone", src) if err := transform.Check(conf, w.Repo.IsTrusted); err != nil { return nil, err } transform.CommandTransform(conf) transform.ImagePull(conf, a.Pull) transform.ImageTag(conf) transform.ImageName(conf) transform.ImageNamespace(conf, a.Namespace) transform.ImageEscalate(conf, a.Escalate) transform.PluginParams(conf) if a.Local != "" { transform.PluginDisable(conf, a.Disable) transform.ImageVolume(conf, []string{a.Local + ":" + conf.Workspace.Path}) } transform.Pod(conf) return conf, nil }