16306: Refactor docker scripts into arvados-package command.
[arvados.git] / cmd / arvados-package / cmd.go
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 package main
6
7 import (
8         "context"
9         "flag"
10         "fmt"
11         "io"
12         "os"
13         "path/filepath"
14
15         "git.arvados.org/arvados.git/lib/cmd"
16         "git.arvados.org/arvados.git/lib/install"
17         "git.arvados.org/arvados.git/sdk/go/ctxlog"
18 )
19
20 var (
21         handler = cmd.Multi(map[string]cmd.Handler{
22                 "version":   cmd.Version,
23                 "-version":  cmd.Version,
24                 "--version": cmd.Version,
25
26                 "build":       cmdFunc(build),
27                 "fpm":         cmdFunc(fpm),
28                 "testinstall": cmdFunc(testinstall),
29                 "_install":    install.Command, // internal use
30         })
31 )
32
33 func main() {
34         os.Exit(handler.RunCommand(os.Args[0], os.Args[1:], os.Stdin, os.Stdout, os.Stderr))
35 }
36
37 type cmdFunc func(ctx context.Context, opts opts, stdin io.Reader, stdout, stderr io.Writer) error
38
39 func (cf cmdFunc) RunCommand(prog string, args []string, stdin io.Reader, stdout, stderr io.Writer) int {
40         logger := ctxlog.New(stderr, "text", "info")
41         ctx := ctxlog.Context(context.Background(), logger)
42         opts, err := parseFlags(args)
43         if err != nil {
44                 logger.WithError(err).Error("error parsing command line flags")
45                 return 1
46         }
47         err = cf(ctx, opts, stdin, stdout, stderr)
48         if err != nil {
49                 logger.WithError(err).Error("failed")
50                 return 1
51         }
52         return 0
53 }
54
55 type opts struct {
56         PackageVersion string
57         PackageDir     string
58         PackageChown   string
59         RebuildImage   bool
60         SourceDir      string
61         TargetOS       string
62 }
63
64 func parseFlags(args []string) (opts, error) {
65         opts := opts{
66                 TargetOS: "debian:10",
67         }
68         flags := flag.NewFlagSet("", flag.ContinueOnError)
69         flags.StringVar(&opts.PackageVersion, "package-version", opts.PackageVersion, "package version to build/test, like \"1.2.3\"")
70         flags.StringVar(&opts.SourceDir, "source", opts.SourceDir, "arvados source tree location")
71         flags.StringVar(&opts.PackageDir, "package-dir", opts.PackageDir, "destination directory for new package (default is cwd)")
72         flags.StringVar(&opts.PackageChown, "package-chown", opts.PackageChown, "desired uid:gid for new package (default is current user:group)")
73         flags.StringVar(&opts.TargetOS, "target-os", opts.TargetOS, "target operating system vendor:version")
74         flags.BoolVar(&opts.RebuildImage, "rebuild-image", opts.RebuildImage, "rebuild docker image(s) instead of using existing")
75         err := flags.Parse(args)
76         if err != nil {
77                 return opts, err
78         }
79         if len(flags.Args()) > 0 {
80                 return opts, fmt.Errorf("unrecognized command line arguments: %v", flags.Args())
81         }
82         if opts.SourceDir == "" {
83                 d, err := os.Getwd()
84                 if err != nil {
85                         return opts, fmt.Errorf("Getwd: %w", err)
86                 }
87                 opts.SourceDir = d
88         }
89         opts.PackageDir = filepath.Clean(opts.PackageDir)
90         return opts, nil
91 }