github.com/dnephin/dobi@v0.15.0/cmd/dobi.go (about) 1 package cmd 2 3 import ( 4 "fmt" 5 "os" 6 7 "github.com/dnephin/dobi/config" 8 "github.com/dnephin/dobi/logging" 9 "github.com/dnephin/dobi/tasks" 10 "github.com/dnephin/dobi/tasks/client" 11 docker "github.com/fsouza/go-dockerclient" 12 log "github.com/sirupsen/logrus" 13 "github.com/spf13/cobra" 14 ) 15 16 const ( 17 // DefaultDockerAPIVersion is the default version of the docker API to use 18 DefaultDockerAPIVersion = "1.25" 19 ) 20 21 var ( 22 version = "0.15.0" 23 gitsha = "unknown" 24 buildDate = "" 25 ) 26 27 type dobiOptions struct { 28 filename string 29 verbose bool 30 quiet bool 31 noBindMount bool 32 tasks []string 33 version bool 34 } 35 36 // NewRootCommand returns a new root command 37 func NewRootCommand() *cobra.Command { 38 var opts dobiOptions 39 40 cmd := &cobra.Command{ 41 Use: "dobi [flags] RESOURCE[:ACTION] [RESOURCE[:ACTION]...]", 42 Short: "A build automation tool for Docker applications", 43 SilenceUsage: true, 44 SilenceErrors: true, 45 TraverseChildren: true, 46 Args: cobra.ArbitraryArgs, 47 RunE: func(cmd *cobra.Command, args []string) error { 48 opts.tasks = args 49 return runDobi(opts) 50 }, 51 PersistentPreRunE: func(cmd *cobra.Command, args []string) error { 52 initLogging(opts.verbose, opts.quiet) 53 return nil 54 }, 55 } 56 57 flags := cmd.Flags() 58 flags.StringVarP(&opts.filename, "filename", "f", "dobi.yaml", "Path to config file") 59 flags.BoolVarP(&opts.verbose, "verbose", "v", false, "Verbose") 60 flags.BoolVarP(&opts.quiet, "quiet", "q", false, "Quiet") 61 flags.BoolVar( 62 &opts.noBindMount, 63 "no-bind-mount", 64 defaultBoolValue("DOBI_NO_BIND_MOUNT"), 65 "Provide mounts as a layer in an image instead of a bind mount") 66 flags.BoolVar(&opts.version, "version", false, "Print version and exit") 67 68 flags.SetInterspersed(false) 69 cmd.AddCommand( 70 newListCommand(&opts), 71 newCleanCommand(&opts), 72 ) 73 return cmd 74 } 75 76 func runDobi(opts dobiOptions) error { 77 if opts.version { 78 printVersion() 79 return nil 80 } 81 82 conf, err := config.Load(opts.filename) 83 if err != nil { 84 return err 85 } 86 87 client, err := buildClient() 88 if err != nil { 89 return fmt.Errorf("failed to create client: %s", err) 90 } 91 92 return tasks.Run(tasks.RunOptions{ 93 Client: client, 94 Config: conf, 95 Tasks: opts.tasks, 96 Quiet: opts.quiet, 97 BindMount: !opts.noBindMount, 98 }) 99 } 100 101 func initLogging(verbose, quiet bool) { 102 logger := logging.Log 103 if verbose { 104 logger.Level = log.DebugLevel 105 } 106 if quiet { 107 logger.Level = log.WarnLevel 108 } 109 logger.Out = os.Stderr 110 111 formatter := &logging.Formatter{} 112 log.SetFormatter(formatter) 113 logger.Formatter = formatter 114 } 115 116 func buildClient() (client.DockerClient, error) { 117 apiVersion := os.Getenv("DOCKER_API_VERSION") 118 if apiVersion == "" { 119 apiVersion = DefaultDockerAPIVersion 120 } 121 // TODO: args for client 122 client, err := docker.NewVersionedClientFromEnv(apiVersion) 123 if err != nil { 124 return nil, err 125 } 126 log.Debug("Docker client created") 127 return client, nil 128 } 129 130 func printVersion() { 131 fmt.Printf("dobi version %v (build: %v, date: %s)\n", version, gitsha, buildDate) 132 } 133 134 func defaultBoolValue(key string) bool { 135 return os.Getenv(key) != "" 136 }