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  }