16306: Packaging dev cycle, type=production support in lib/boot.
[arvados.git] / cmd / arvados-dev / buildpackage.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/exec"
13
14         "git.arvados.org/arvados.git/lib/install"
15         "git.arvados.org/arvados.git/sdk/go/ctxlog"
16         "github.com/sirupsen/logrus"
17 )
18
19 type buildPackage struct{}
20
21 func (bld buildPackage) RunCommand(prog string, args []string, stdin io.Reader, stdout, stderr io.Writer) int {
22         logger := ctxlog.New(stderr, "text", "info")
23         err := (&builder{
24                 PackageVersion: "0.0.0",
25                 logger:         logger,
26         }).run(context.Background(), prog, args, stdin, stdout, stderr)
27         if err != nil {
28                 logger.WithError(err).Error("failed")
29                 return 1
30         }
31         return 0
32 }
33
34 type builder struct {
35         PackageVersion string
36         SourcePath     string
37         OutputDir      string
38         SkipInstall    bool
39         logger         logrus.FieldLogger
40 }
41
42 func (bldr *builder) run(ctx context.Context, prog string, args []string, stdin io.Reader, stdout, stderr io.Writer) error {
43         flags := flag.NewFlagSet("", flag.ContinueOnError)
44         flags.StringVar(&bldr.PackageVersion, "package-version", bldr.PackageVersion, "package version")
45         flags.StringVar(&bldr.SourcePath, "source", bldr.SourcePath, "source tree location")
46         flags.StringVar(&bldr.OutputDir, "output-directory", bldr.OutputDir, "destination directory for new package (default is cwd)")
47         flags.BoolVar(&bldr.SkipInstall, "skip-install", bldr.SkipInstall, "skip install step, assume you have already run 'arvados-server install -type package'")
48         err := flags.Parse(args)
49         if err != nil {
50                 return err
51         }
52         if len(flags.Args()) > 0 {
53                 return fmt.Errorf("unrecognized command line arguments: %v", flags.Args())
54         }
55         if !bldr.SkipInstall {
56                 exitcode := install.Command.RunCommand("arvados-server install", []string{
57                         "-type", "package",
58                         "-package-version", bldr.PackageVersion,
59                         "-source", bldr.SourcePath,
60                 }, stdin, stdout, stderr)
61                 if exitcode != 0 {
62                         return fmt.Errorf("arvados-server install failed: exit code %d", exitcode)
63                 }
64         }
65         cmd := exec.Command("/var/lib/arvados/bin/gem", "install", "--user", "--no-rdoc", "--no-ri", "fpm")
66         cmd.Stdout = stdout
67         cmd.Stderr = stderr
68         err = cmd.Run()
69         if err != nil {
70                 return fmt.Errorf("gem install fpm: %w", err)
71         }
72
73         format := "deb" // TODO: rpm
74
75         cmd = exec.Command("/root/.gem/ruby/2.5.0/bin/fpm",
76                 "--name", "arvados-server-easy",
77                 "--version", bldr.PackageVersion,
78                 "--input-type", "dir",
79                 "--output-type", format)
80         deps, err := install.ProductionDependencies()
81         if err != nil {
82                 return err
83         }
84         for _, pkg := range deps {
85                 cmd.Args = append(cmd.Args, "--depends", pkg)
86         }
87         cmd.Args = append(cmd.Args,
88                 "--deb-use-file-permissions",
89                 "--rpm-use-file-permissions",
90                 "--exclude", "/var/lib/arvados/go",
91                 "/var/lib/arvados",
92                 "/var/www/.gem",
93                 "/var/www/.passenger",
94         )
95         fmt.Fprintf(stderr, "... %s\n", cmd.Args)
96         cmd.Dir = bldr.OutputDir
97         cmd.Stdout = stdout
98         cmd.Stderr = stderr
99         return cmd.Run()
100 }