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) } } 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 := struct { System drone.System `json:"system"` Workspace drone.Workspace `json:"workspace"` Repo drone.Repo `json:"repo"` Build drone.Build `json:"build"` Job drone.Job `json:"job"` Netrc drone.Netrc `json:"netrc"` Keys drone.Key `json:"keys"` Config string `json:"config"` }{ Repo: drone.Repo{ IsTrusted: c.Bool("trusted"), IsPrivate: true, }, Job: drone.Job{ Status: drone.StatusRunning, Environment: axis, }, Config: 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 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 } // initially populate globals from the '-e' slice globals := c.StringSlice("e") if c.IsSet("E") { // read the .drone.sec.yml file (plain text) plaintext, err := readInput(c.String("E")) if err != nil { return err } // parse the plaintext secrets file sec := new(secure.Secure) err = yaml.Unmarshal(plaintext, sec) if err != nil { return err } // prepend values into globals (allow '-e' to override the secrets file) for k, v := range sec.Environment.Map() { tmp := strings.Join([]string{k, v}, "=") globals = append([]string{tmp}, globals...) } } 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: globals, 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 }