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  }