go.fuchsia.dev/infra@v0.0.0-20240507153436-9b593402251b/cmd/recipe_wrapper/cipd/cipd.go (about) 1 // Copyright 2023 The Fuchsia Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package cipd 6 7 import ( 8 "context" 9 "fmt" 10 "os" 11 "os/exec" 12 "path/filepath" 13 14 "go.chromium.org/luci/cipd/common" 15 "go.chromium.org/luci/common/logging" 16 ) 17 18 type Package struct { 19 name string 20 version string 21 binDir string 22 } 23 24 func (p *Package) AsPin() *common.Pin { 25 return &common.Pin{ 26 PackageName: p.name, 27 InstanceID: p.version, 28 } 29 } 30 31 var ( 32 VPythonPkg = Package{ 33 name: "infra/tools/luci/vpython/${platform}", 34 version: "git_revision:3d6ee7542a04be92a48ff1c5dc28cb3c5c15dd00", 35 } 36 CPythonPkg = Package{ 37 name: "infra/3pp/tools/cpython/${platform}", 38 version: "version:2@2.7.18.chromium.44", 39 binDir: "bin", 40 } 41 ) 42 43 func Install(ctx context.Context, dir string, packages ...Package) ([]string, error) { 44 cmd := exec.CommandContext(ctx, "cipd", "init", dir, "-force") 45 cmd.Stdout = os.Stdout 46 cmd.Stderr = os.Stderr 47 if err := cmd.Run(); err != nil { 48 return nil, fmt.Errorf("cipd init failed: %w", err) 49 } 50 51 var binDirs []string 52 for _, pkg := range packages { 53 logging.Infof(ctx, "Installing %v / %v to %v", pkg.name, pkg.version, dir) 54 cmd := exec.CommandContext(ctx, "cipd", "install", pkg.name, pkg.version, "-root", dir) 55 cmd.Stdout = os.Stdout 56 cmd.Stderr = os.Stderr 57 if err := cmd.Run(); err != nil { 58 return nil, fmt.Errorf("failed to install %s: %w", pkg.name, err) 59 } 60 logging.Infof(ctx, "%v successfully installed to %v", pkg.name, pkg.binDir) 61 binDirs = append(binDirs, filepath.Join(dir, pkg.binDir)) 62 } 63 64 return binDirs, nil 65 }