1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
15 "git.arvados.org/arvados.git/lib/install"
18 func fpm(ctx context.Context, opts opts, stdin io.Reader, stdout, stderr io.Writer) error {
19 var chownUid, chownGid int
20 if opts.PackageChown != "" {
21 _, err := fmt.Sscanf(opts.PackageChown, "%d:%d", &chownUid, &chownGid)
23 return fmt.Errorf("invalid value %q for PackageChown: %w", opts.PackageChown, err)
27 exitcode := install.Command.RunCommand("arvados-server install", []string{
29 "-package-version", opts.PackageVersion,
30 "-source", opts.SourceDir,
31 }, stdin, stdout, stderr)
33 return fmt.Errorf("arvados-server install failed: exit code %d", exitcode)
36 cmd := exec.Command("/var/lib/arvados/bin/gem", "install", "--user", "--no-document", "fpm")
41 return fmt.Errorf("gem install fpm: %w", err)
44 if _, err := os.Stat("/root/.gem/ruby/2.5.0/gems/fpm-1.11.0/lib/fpm/package/deb.rb"); err == nil {
45 // Workaround for fpm bug https://github.com/jordansissel/fpm/issues/1739
46 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")
51 return fmt.Errorf("monkeypatch fpm: %w", err)
55 // Remove unneeded files. This is much faster than "fpm
56 // --exclude X" because fpm copies everything into a staging
57 // area before looking at the --exclude args.
58 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")
63 return fmt.Errorf("rm -rf [...]: %w", err)
66 format := "deb" // TODO: rpm
67 pkgfile := filepath.Join(opts.PackageDir, "arvados-server-easy_"+opts.PackageVersion+"_amd64."+format)
69 cmd = exec.Command("/root/.gem/ruby/2.5.0/bin/fpm",
71 "--name", "arvados-server-easy",
72 "--version", opts.PackageVersion,
73 "--input-type", "dir",
74 "--output-type", format)
75 deps, err := install.ProductionDependencies()
79 for _, pkg := range deps {
80 cmd.Args = append(cmd.Args, "--depends", pkg)
82 cmd.Args = append(cmd.Args,
84 "--deb-use-file-permissions",
85 "--rpm-use-file-permissions",
88 "/var/www/.passenger",
91 fmt.Fprintf(stderr, "... %s\n", cmd.Args)
92 cmd.Dir = opts.PackageDir
97 return fmt.Errorf("fpm: %w", err)
100 if opts.PackageChown != "" {
101 err = os.Chown(pkgfile, chownUid, chownGid)
103 return fmt.Errorf("chown %s: %w", pkgfile, err)
107 cmd = exec.Command("ls", "-l", pkgfile)