commands/ci/run_trig/run_trig.go (94 lines of code) (raw):

package run_trig import ( "errors" "fmt" "os" "strings" "gitlab.com/gitlab-org/cli/api" "gitlab.com/gitlab-org/cli/commands/ci/ciutils" "gitlab.com/gitlab-org/cli/commands/cmdutils" "github.com/MakeNowJust/heredoc/v2" "github.com/spf13/cobra" gitlab "gitlab.com/gitlab-org/api/client-go" ) var envVariables = []string{} func parseVarArg(s string) (key string, val string, err error) { // From https://pkg.go.dev/strings#Split: // // > If s does not contain sep and sep is not empty, // > Split returns a slice of length 1 whose only element is s. // // Therefore, the function will always return a slice of min length 1. v := strings.SplitN(s, ":", 2) if len(v) == 1 { return "", "", fmt.Errorf("invalid argument structure") } return v[0], v[1], nil } func NewCmdRunTrig(f *cmdutils.Factory) *cobra.Command { pipelineRunCmd := &cobra.Command{ Use: "run-trig [flags]", Short: `Run a CI/CD pipeline trigger.`, Aliases: []string{"run-trig"}, Example: heredoc.Doc(` $ glab ci run-trig -t xxxx $ glab ci run-trig -t xxxx -b main $ glab ci run-trig -t xxxx -b main --variables key1:val1 $ glab ci run-trig -t xxxx -b main --variables key1:val1,key2:val2 $ glab ci run-trig -t xxxx -b main --variables key1:val1 --variables key2:val2 `), Long: ``, Args: cobra.ExactArgs(0), RunE: func(cmd *cobra.Command, args []string) error { var err error apiClient, err := f.HttpClient() if err != nil { return err } repo, err := f.BaseRepo() if err != nil { return err } c := &gitlab.RunPipelineTriggerOptions{ Variables: make(map[string]string), } if customPipelineVars, _ := cmd.Flags().GetStringSlice("variables"); len(customPipelineVars) > 0 { for _, v := range customPipelineVars { key, val, err := parseVarArg(v) if err != nil { return fmt.Errorf("parsing pipeline variable. Expected format KEY:VALUE: %w", err) } c.Variables[key] = val } } branch, err := cmd.Flags().GetString("branch") if err != nil { return err } if branch != "" { c.Ref = gitlab.Ptr(branch) } else if currentBranch, err := f.Branch(); err == nil { c.Ref = gitlab.Ptr(currentBranch) } else { // `ci run-trig` is running out of a git repo fmt.Fprintln(f.IO.StdOut, "not in a Git repository. Using repository argument.") c.Ref = gitlab.Ptr(ciutils.GetDefaultBranch(f)) } token, err := cmd.Flags().GetString("token") if err != nil { return err } if token == "" { token = os.Getenv("CI_JOB_TOKEN") } if token == "" { return errors.New("`--token` parameter can be omitted only if `CI_JOB_TOKEN` environment variable is set.") } c.Token = &token pipe, err := api.RunPipelineTrigger(apiClient, repo.FullName(), c) if err != nil { return err } output := fmt.Sprintf("Created pipeline (ID: %d), status: %s, ref: %s, weburl: %s", pipe.ID, pipe.Status, pipe.Ref, pipe.WebURL) fmt.Fprintln(f.IO.StdOut, output) return nil }, } pipelineRunCmd.Flags().StringP("token", "t", "", "Pipeline trigger token. Can be omitted only if the `CI_JOB_TOKEN` environment variable is set.") pipelineRunCmd.Flags().StringP("branch", "b", "", "Create pipeline on branch or reference <string>.") pipelineRunCmd.Flags().StringSliceVarP(&envVariables, "variables", "", []string{}, "Pass variables to pipeline in the format <key>:<value>.") return pipelineRunCmd }