1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
15 "git.arvados.org/arvados.git/lib/install"
16 "git.arvados.org/arvados.git/sdk/go/ctxlog"
17 "github.com/sirupsen/logrus"
22 func (bld build) RunCommand(prog string, args []string, stdin io.Reader, stdout, stderr io.Writer) int {
23 logger := ctxlog.New(stderr, "text", "info")
25 PackageVersion: "0.0.0",
27 }).run(context.Background(), prog, args, stdin, stdout, stderr)
29 logger.WithError(err).Error("failed")
40 logger logrus.FieldLogger
43 func (bldr *builder) run(ctx context.Context, prog string, args []string, stdin io.Reader, stdout, stderr io.Writer) error {
44 flags := flag.NewFlagSet("", flag.ContinueOnError)
45 flags.StringVar(&bldr.PackageVersion, "package-version", bldr.PackageVersion, "package version")
46 flags.StringVar(&bldr.SourcePath, "source", bldr.SourcePath, "source tree location")
47 flags.StringVar(&bldr.OutputDir, "output-directory", bldr.OutputDir, "destination directory for new package (default is cwd)")
48 flags.BoolVar(&bldr.SkipInstall, "skip-install", bldr.SkipInstall, "skip install step, assume you have already run 'arvados-server install -type package'")
49 err := flags.Parse(args)
53 if len(flags.Args()) > 0 {
54 return fmt.Errorf("unrecognized command line arguments: %v", flags.Args())
56 if !bldr.SkipInstall {
57 exitcode := install.Command.RunCommand("arvados-server install", []string{
59 "-package-version", bldr.PackageVersion,
60 "-source", bldr.SourcePath,
61 }, stdin, stdout, stderr)
63 return fmt.Errorf("arvados-server install failed: exit code %d", exitcode)
66 cmd := exec.Command("/var/lib/arvados/bin/gem", "install", "--user", "--no-document", "fpm")
71 return fmt.Errorf("gem install fpm: %w", err)
74 if _, err := os.Stat("/root/.gem/ruby/2.5.0/gems/fpm-1.11.0/lib/fpm/package/deb.rb"); err == nil {
75 // Workaround for fpm bug https://github.com/jordansissel/fpm/issues/1739
76 cmd = exec.Command("sed", "-i", `/require "digest"/a require "zlib"`, "/root/.gem/ruby/2.5.0/gems/fpm-1.11.0/lib/fpm/package/deb.rb")
81 return fmt.Errorf("monkeypatch fpm: %w", err)
85 // Remove unneeded files. This is much faster than "fpm
86 // --exclude X" because fpm copies everything into a staging
87 // area before looking at the --exclude args.
88 cmd = exec.Command("bash", "-c", "cd /var/www/.gem/ruby && rm -rf */cache */bundler/gems/*/.git */bundler/gems/arvados-*/[^s]* */bundler/gems/arvados-*/s[^d]* */bundler/gems/arvados-*/sdk/[^cr]* */gems/passenger-*/src/cxx* ruby/*/gems/*/ext /var/lib/arvados/go")
93 return fmt.Errorf("rm -rf [...]: %w", err)
96 format := "deb" // TODO: rpm
98 cmd = exec.Command("/root/.gem/ruby/2.5.0/bin/fpm",
99 "--name", "arvados-server-easy",
100 "--version", bldr.PackageVersion,
101 "--input-type", "dir",
102 "--output-type", format)
103 deps, err := install.ProductionDependencies()
107 for _, pkg := range deps {
108 cmd.Args = append(cmd.Args, "--depends", pkg)
110 cmd.Args = append(cmd.Args,
112 "--deb-use-file-permissions",
113 "--rpm-use-file-permissions",
116 "/var/www/.passenger",
119 fmt.Fprintf(stderr, "... %s\n", cmd.Args)
120 cmd.Dir = bldr.OutputDir