xref: /aosp_15_r20/external/skia/infra/bots/recipe_modules/infra/api.py (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1# Copyright 2016 The Chromium 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
6from recipe_engine import recipe_api
7
8
9INFRA_GO_PKG = 'go.skia.org/infra'
10UPDATE_GO_ATTEMPTS = 5
11UPLOAD_ATTEMPTS = 5
12
13
14class InfraApi(recipe_api.RecipeApi):
15  @property
16  def goroot(self):
17    go_root = self.m.vars.workdir.joinpath('go', 'go')
18    # Starting with Go 1.18, the standard library includes "//go:embed"
19    # directives that point to other files in the standard library. For
20    # security reasons, the "embed" package does not support symbolic links
21    # (discussion at
22    # https://github.com/golang/go/issues/35950#issuecomment-561725322), and it
23    # produces "cannot embed irregular file" errors when it encounters one.
24    #
25    # To prevent the above error, we ensure our GOROOT environment variable
26    # points to a path without symbolic links.
27    #
28    # For some reason step.m.path.realpath returns the path unchanged, so we
29    # invoke realpath instead.
30    symlink_version_file = go_root.joinpath('VERSION') # Arbitrary symlink.
31    step_result = self.m.step('realpath go/go/VERSION',
32                          cmd=['realpath', str(symlink_version_file)],
33                          stdout=self.m.raw_io.output_text())
34    step_result = self.m.step('dirname',
35                          cmd=['dirname', step_result.stdout],
36                          stdout=self.m.raw_io.output_text())
37    go_root_nosymlinks = step_result.stdout.strip()
38    if go_root_nosymlinks != "":
39      return go_root_nosymlinks # pragma: nocover
40    else:
41      # This branch exists solely to appease recipe tests, under which the
42      # workdir variable is unset. Returning an empty string causes tests to
43      # fail, so we return the original GOROOT instead.
44      return go_root
45
46  @property
47  def go_bin(self):
48    return self.m.path.join(self.goroot, 'bin')
49
50  @property
51  def go_env(self):
52    return {
53        'GOCACHE': self.m.vars.cache_dir.joinpath('go_cache'),
54        'GOPATH': self.gopath,
55        'GOROOT': self.goroot,
56        'PATH': self.m.path.pathsep.join([
57            str(self.go_bin), str(self.gopath.joinpath('bin')), '%(PATH)s']),
58    }
59
60  @property
61  def gopath(self):
62    return self.m.vars.cache_dir.joinpath('gopath')
63