Merge branch '19454-cwl-output-json' refs #19454
[arvados.git] / lib / install / deps.go
index ff00ee1e350159ea82e2bc5a54293853708a8eef..b4f110e3cd1115ac82730cf76351ca2abd9b14a8 100644 (file)
@@ -28,7 +28,19 @@ import (
 
 var Command cmd.Handler = &installCommand{}
 
-const devtestDatabasePassword = "insecure_arvados_test"
+const goversion = "1.17.7"
+
+const (
+       rubyversion             = "2.7.5"
+       bundlerversion          = "2.2.19"
+       singularityversion      = "3.9.9"
+       pjsversion              = "1.9.8"
+       geckoversion            = "0.24.0"
+       gradleversion           = "5.3.1"
+       nodejsversion           = "v12.22.11"
+       devtestDatabasePassword = "insecure_arvados_test"
+       workbench2version       = "5e020488f67b5bc919796e0dc8b0b9f3b3ff23b0"
+)
 
 type installCommand struct {
        ClusterType    string
@@ -57,17 +69,11 @@ func (inst *installCommand) RunCommand(prog string, args []string, stdin io.Read
        flags.StringVar(&inst.SourcePath, "source", "/arvados", "source tree location (required for -type=package)")
        flags.StringVar(&inst.PackageVersion, "package-version", "0.0.0", "version string to embed in executable files")
        flags.BoolVar(&inst.EatMyData, "eatmydata", false, "use eatmydata to speed up install")
-       err = flags.Parse(args)
-       if err == flag.ErrHelp {
-               err = nil
-               return 0
-       } else if err != nil {
-               return 2
+
+       if ok, code := cmd.ParseFlags(flags, prog, args, "", stderr); !ok {
+               return code
        } else if *versionFlag {
                return cmd.Version.RunCommand(prog, args, stdin, stdout, stderr)
-       } else if len(flags.Args()) > 0 {
-               err = fmt.Errorf("unrecognized command line arguments: %v", flags.Args())
-               return 2
        }
 
        var dev, test, prod, pkg bool
@@ -128,7 +134,6 @@ func (inst *installCommand) RunCommand(prog string, args []string, stdin io.Read
                pkgs = append(pkgs,
                        "dpkg-dev",
                        "eatmydata", // install it for later steps, even if we're not using it now
-                       "rsync",
                )
        }
 
@@ -177,15 +182,15 @@ func (inst *installCommand) RunCommand(prog string, args []string, stdin io.Read
                        "r-cran-markdown",
                        "r-cran-roxygen2",
                        "r-cran-xml",
+                       "rsync",
                        "sudo",
                        "uuid-dev",
                        "wget",
                        "xvfb",
                )
                if dev || test {
-                       pkgs = append(pkgs,
-                               "squashfs-tools", // for singularity
-                       )
+                       pkgs = append(pkgs, "squashfs-tools") // for singularity
+                       pkgs = append(pkgs, "gnupg")          // for docker install recipe
                }
                switch {
                case osv.Debian && osv.Major >= 10:
@@ -208,6 +213,37 @@ func (inst *installCommand) RunCommand(prog string, args []string, stdin io.Read
                }
        }
 
+       if dev || test {
+               if havedockerversion, err := exec.Command("docker", "--version").CombinedOutput(); err == nil {
+                       logger.Printf("%s installed, assuming that version is ok", bytes.TrimSuffix(havedockerversion, []byte("\n")))
+               } else if osv.Debian {
+                       var codename string
+                       switch osv.Major {
+                       case 10:
+                               codename = "buster"
+                       case 11:
+                               codename = "bullseye"
+                       default:
+                               err = fmt.Errorf("don't know how to install docker-ce for debian %d", osv.Major)
+                               return 1
+                       }
+                       err = inst.runBash(`
+rm -f /usr/share/keyrings/docker-archive-keyring.gpg
+curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
+echo 'deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian/ `+codename+` stable' | \
+    tee /etc/apt/sources.list.d/docker.list
+apt-get update
+DEBIAN_FRONTEND=noninteractive apt-get --yes --no-install-recommends install docker-ce
+`, stdout, stderr)
+                       if err != nil {
+                               return 1
+                       }
+               } else {
+                       err = fmt.Errorf("don't know how to install docker for osversion %v", osv)
+                       return 1
+               }
+       }
+
        os.Mkdir("/var/lib/arvados", 0755)
        os.Mkdir("/var/lib/arvados/tmp", 0700)
        if prod || pkg {
@@ -245,7 +281,6 @@ make install
        }
 
        if !prod {
-               goversion := "1.17.1"
                if havegoversion, err := exec.Command("/usr/local/bin/go", "version").CombinedOutput(); err == nil && bytes.HasPrefix(havegoversion, []byte("go version go"+goversion+" ")) {
                        logger.Print("go " + goversion + " already installed")
                } else {
@@ -268,7 +303,7 @@ ln -sf /var/lib/arvados/go/bin/* /usr/local/bin/
                } else {
                        err = inst.runBash(`
 PJS=phantomjs-`+pjsversion+`-linux-x86_64
-wget --progress=dot:giga -O- https://bitbucket.org/ariya/phantomjs/downloads/$PJS.tar.bz2 | tar -C /var/lib/arvados -xjf -
+wget --progress=dot:giga -O- https://cache.arvados.org/$PJS.tar.bz2 | tar -C /var/lib/arvados -xjf -
 ln -sf /var/lib/arvados/$PJS/bin/phantomjs /usr/local/bin/
 `, stdout, stderr)
                        if err != nil {
@@ -343,6 +378,14 @@ make -C ./builddir install
                        }
                }
 
+               err = inst.runBash(`
+install /usr/bin/nsenter /var/lib/arvados/bin/nsenter
+setcap "cap_sys_admin+pei cap_sys_chroot+pei" /var/lib/arvados/bin/nsenter
+`, stdout, stderr)
+               if err != nil {
+                       return 1
+               }
+
                // The entry in /etc/locale.gen is "en_US.UTF-8"; once
                // it's installed, locale -a reports it as
                // "en_US.utf8".