artifact_targets.py
Go to the documentation of this file.
1 #!/usr/bin/env python3
2 # Copyright 2016 gRPC authors.
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
7 #
8 # http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15 """Definition of targets to build artifacts."""
16 
17 import os.path
18 import random
19 import string
20 import sys
21 
22 sys.path.insert(0, os.path.abspath('..'))
23 import python_utils.jobset as jobset
24 
25 _LATEST_MANYLINUX = "manylinux2014"
26 
27 
29  dockerfile_dir,
30  shell_command,
31  environ={},
32  flake_retries=0,
33  timeout_retries=0,
34  timeout_seconds=30 * 60,
35  extra_docker_args=None,
36  verbose_success=False):
37  """Creates jobspec for a task running under docker."""
38  environ = environ.copy()
39  environ['ARTIFACTS_OUT'] = 'artifacts/%s' % name
40 
41  docker_args = []
42  for k, v in list(environ.items()):
43  docker_args += ['-e', '%s=%s' % (k, v)]
44  docker_env = {
45  'DOCKERFILE_DIR': dockerfile_dir,
46  'DOCKER_RUN_SCRIPT': 'tools/run_tests/dockerize/docker_run.sh',
47  'DOCKER_RUN_SCRIPT_COMMAND': shell_command,
48  'OUTPUT_DIR': 'artifacts'
49  }
50  if extra_docker_args is not None:
51  docker_env['EXTRA_DOCKER_ARGS'] = extra_docker_args
52  jobspec = jobset.JobSpec(
53  cmdline=['tools/run_tests/dockerize/build_and_run_docker.sh'] +
54  docker_args,
55  environ=docker_env,
56  shortname='build_artifact.%s' % (name),
57  timeout_seconds=timeout_seconds,
58  flake_retries=flake_retries,
59  timeout_retries=timeout_retries,
60  verbose_success=verbose_success)
61  return jobspec
62 
63 
64 def create_jobspec(name,
65  cmdline,
66  environ={},
67  shell=False,
68  flake_retries=0,
69  timeout_retries=0,
70  timeout_seconds=30 * 60,
71  use_workspace=False,
72  cpu_cost=1.0,
73  verbose_success=False):
74  """Creates jobspec."""
75  environ = environ.copy()
76  if use_workspace:
77  environ['WORKSPACE_NAME'] = 'workspace_%s' % name
78  environ['ARTIFACTS_OUT'] = os.path.join('..', 'artifacts', name)
79  cmdline = ['bash', 'tools/run_tests/artifacts/run_in_workspace.sh'
80  ] + cmdline
81  else:
82  environ['ARTIFACTS_OUT'] = os.path.join('artifacts', name)
83 
84  jobspec = jobset.JobSpec(cmdline=cmdline,
85  environ=environ,
86  shortname='build_artifact.%s' % (name),
87  timeout_seconds=timeout_seconds,
88  flake_retries=flake_retries,
89  timeout_retries=timeout_retries,
90  shell=shell,
91  cpu_cost=cpu_cost,
92  verbose_success=verbose_success)
93  return jobspec
94 
95 
96 _MACOS_COMPAT_FLAG = '-mmacosx-version-min=10.10'
97 
98 _ARCH_FLAG_MAP = {'x86': '-m32', 'x64': '-m64'}
99 
100 
102  """Builds Python artifacts."""
103 
104  def __init__(self, platform, arch, py_version, presubmit=False):
105  self.name = 'python_%s_%s_%s' % (platform, arch, py_version)
106  self.platform = platform
107  self.arch = arch
108  self.labels = ['artifact', 'python', platform, arch, py_version]
109  if presubmit:
110  self.labels.append('presubmit')
111  self.py_version = py_version
112  if platform == _LATEST_MANYLINUX:
113  self.labels.append('latest-manylinux')
114  if 'manylinux' in platform:
115  self.labels.append('linux')
116  if 'linux_extra' in platform:
117  # linux_extra wheels used to be built by a separate kokoro job.
118  # Their build is now much faster, so they can be included
119  # in the regular artifact build.
120  self.labels.append('linux')
121  if 'musllinux' in platform:
122  self.labels.append('linux')
123 
125  return []
126 
127  def build_jobspec(self, inner_jobs=None):
128  environ = {}
129  if inner_jobs is not None:
130  # set number of parallel jobs when building native extension
131  # building the native extension is the most time-consuming part of the build
132  environ['GRPC_PYTHON_BUILD_EXT_COMPILER_JOBS'] = str(inner_jobs)
133 
134  # This is necessary due to https://github.com/pypa/wheel/issues/406.
135  # distutils incorrectly generates a universal2 artifact that only contains
136  # x86_64 libraries.
137  if self.platform == "macos" and self.arch == "x64":
138  environ["GRPC_UNIVERSAL2_REPAIR"] = "true"
139 
140  if self.platform == 'linux_extra':
141  # Crosscompilation build for armv7 (e.g. Raspberry Pi)
142  environ['PYTHON'] = '/opt/python/{}/bin/python3'.format(
143  self.py_version)
144  environ['PIP'] = '/opt/python/{}/bin/pip3'.format(self.py_version)
145  environ['GRPC_SKIP_PIP_CYTHON_UPGRADE'] = 'TRUE'
146  environ['GRPC_SKIP_TWINE_CHECK'] = 'TRUE'
147  return create_docker_jobspec(
148  self.name,
149  'tools/dockerfile/grpc_artifact_python_linux_{}'.format(
150  self.arch),
151  'tools/run_tests/artifacts/build_artifact_python.sh',
152  environ=environ,
153  timeout_seconds=60 * 60)
154  elif 'manylinux' in self.platform:
155  if self.arch == 'x86':
156  environ['SETARCH_CMD'] = 'linux32'
157  # Inside the manylinux container, the python installations are located in
158  # special places...
159  environ['PYTHON'] = '/opt/python/{}/bin/python'.format(
160  self.py_version)
161  environ['PIP'] = '/opt/python/{}/bin/pip'.format(self.py_version)
162  environ['GRPC_SKIP_PIP_CYTHON_UPGRADE'] = 'TRUE'
163  if self.arch == 'aarch64':
164  environ['GRPC_SKIP_TWINE_CHECK'] = 'TRUE'
165  else:
166  # only run auditwheel if we're not crosscompiling
167  environ['GRPC_RUN_AUDITWHEEL_REPAIR'] = 'TRUE'
168  # only build the packages that depend on grpcio-tools
169  # if we're not crosscompiling.
170  # - they require protoc to run on current architecture
171  # - they only have sdist packages anyway, so it's useless to build them again
172  environ['GRPC_BUILD_GRPCIO_TOOLS_DEPENDENTS'] = 'TRUE'
173  return create_docker_jobspec(
174  self.name,
175  'tools/dockerfile/grpc_artifact_python_%s_%s' %
176  (self.platform, self.arch),
177  'tools/run_tests/artifacts/build_artifact_python.sh',
178  environ=environ,
179  timeout_seconds=60 * 60 * 2)
180  elif 'musllinux' in self.platform:
181  environ['PYTHON'] = '/opt/python/{}/bin/python'.format(
182  self.py_version)
183  environ['PIP'] = '/opt/python/{}/bin/pip'.format(self.py_version)
184  environ['GRPC_SKIP_PIP_CYTHON_UPGRADE'] = 'TRUE'
185  environ['GRPC_RUN_AUDITWHEEL_REPAIR'] = 'TRUE'
186  environ['GRPC_PYTHON_BUILD_WITH_STATIC_LIBSTDCXX'] = 'TRUE'
187  return create_docker_jobspec(
188  self.name,
189  'tools/dockerfile/grpc_artifact_python_%s_%s' %
190  (self.platform, self.arch),
191  'tools/run_tests/artifacts/build_artifact_python.sh',
192  environ=environ,
193  timeout_seconds=60 * 60 * 2)
194  elif self.platform == 'windows':
195  environ['EXT_COMPILER'] = 'msvc'
196  # For some reason, the batch script %random% always runs with the same
197  # seed. We create a random temp-dir here
198  dir = ''.join(
199  random.choice(string.ascii_uppercase) for _ in range(10))
200  return create_jobspec(self.name, [
201  'tools\\run_tests\\artifacts\\build_artifact_python.bat',
202  self.py_version, '32' if self.arch == 'x86' else '64'
203  ],
204  environ=environ,
205  timeout_seconds=45 * 60,
206  use_workspace=True)
207  else:
208  environ['PYTHON'] = self.py_version
209  environ['SKIP_PIP_INSTALL'] = 'TRUE'
210  return create_jobspec(
211  self.name,
212  ['tools/run_tests/artifacts/build_artifact_python.sh'],
213  environ=environ,
214  timeout_seconds=60 * 60 * 2,
215  use_workspace=True)
216 
217  def __str__(self):
218  return self.name
219 
220 
222  """Builds ruby native gem."""
223 
224  def __init__(self, platform, gem_platform, presubmit=False):
225  self.name = 'ruby_native_gem_%s_%s' % (platform, gem_platform)
226  self.platform = platform
227  self.gem_platform = gem_platform
228  self.labels = ['artifact', 'ruby', platform, gem_platform]
229  if presubmit:
230  self.labels.append('presubmit')
231 
233  return []
234 
235  def build_jobspec(self, inner_jobs=None):
236  environ = {}
237  if inner_jobs is not None:
238  # set number of parallel jobs when building native extension
239  environ['GRPC_RUBY_BUILD_PROCS'] = str(inner_jobs)
240  # Ruby build uses docker internally and docker cannot be nested.
241  # We are using a custom workspace instead.
242  return create_jobspec(self.name, [
243  'tools/run_tests/artifacts/build_artifact_ruby.sh',
244  self.gem_platform
245  ],
246  use_workspace=True,
247  timeout_seconds=90 * 60,
248  environ=environ)
249 
250 
252  """Builds C# native extension library"""
253 
254  def __init__(self, platform, arch, arch_abi=None, presubmit=False):
255  self.name = 'csharp_ext_%s_%s' % (platform, arch)
256  self.platform = platform
257  self.arch = arch
258  self.arch_abi = arch_abi
259  self.labels = ['artifact', 'csharp', platform, arch]
260  if arch_abi:
261  self.name += '_%s' % arch_abi
262  self.labels.append(arch_abi)
263  if presubmit:
264  self.labels.append('presubmit')
265 
267  return []
268 
269  def build_jobspec(self, inner_jobs=None):
270  environ = {}
271  if inner_jobs is not None:
272  # set number of parallel jobs when building native extension
273  environ['GRPC_CSHARP_BUILD_EXT_COMPILER_JOBS'] = str(inner_jobs)
274 
275  if self.arch == 'android':
276  environ['ANDROID_ABI'] = self.arch_abi
277  return create_docker_jobspec(
278  self.name,
279  'tools/dockerfile/grpc_artifact_android_ndk',
280  'tools/run_tests/artifacts/build_artifact_csharp_android.sh',
281  environ=environ)
282  elif self.arch == 'ios':
283  return create_jobspec(
284  self.name,
285  ['tools/run_tests/artifacts/build_artifact_csharp_ios.sh'],
286  timeout_seconds=60 * 60,
287  use_workspace=True,
288  environ=environ)
289  elif self.platform == 'windows':
290  return create_jobspec(self.name, [
291  'tools\\run_tests\\artifacts\\build_artifact_csharp.bat',
292  self.arch
293  ],
294  timeout_seconds=45 * 60,
295  use_workspace=True,
296  environ=environ)
297  else:
298  if self.platform == 'linux':
299  dockerfile_dir = 'tools/dockerfile/grpc_artifact_centos6_{}'.format(
300  self.arch)
301  if self.arch == 'aarch64':
302  # for aarch64, use a dockcross manylinux image that will
303  # give us both ready to use crosscompiler and sufficient backward compatibility
304  dockerfile_dir = 'tools/dockerfile/grpc_artifact_python_manylinux2014_aarch64'
305  return create_docker_jobspec(
306  self.name,
307  dockerfile_dir,
308  'tools/run_tests/artifacts/build_artifact_csharp.sh',
309  environ=environ)
310  else:
311  return create_jobspec(
312  self.name,
313  ['tools/run_tests/artifacts/build_artifact_csharp.sh'],
314  timeout_seconds=45 * 60,
315  use_workspace=True,
316  environ=environ)
317 
318  def __str__(self):
319  return self.name
320 
321 
323  """Builds PHP PECL package"""
324 
325  def __init__(self, platform, arch, presubmit=False):
326  self.name = 'php_pecl_package_{0}_{1}'.format(platform, arch)
327  self.platform = platform
328  self.arch = arch
329  self.labels = ['artifact', 'php', platform, arch]
330  if presubmit:
331  self.labels.append('presubmit')
332 
334  return []
335 
336  def build_jobspec(self, inner_jobs=None):
337  del inner_jobs # arg unused as PHP artifact build is basically just packing an archive
338  if self.platform == 'linux':
339  return create_docker_jobspec(
340  self.name,
341  'tools/dockerfile/test/php73_zts_debian11_{}'.format(self.arch),
342  'tools/run_tests/artifacts/build_artifact_php.sh')
343  else:
344  return create_jobspec(
345  self.name, ['tools/run_tests/artifacts/build_artifact_php.sh'],
346  use_workspace=True)
347 
348 
350  """Builds protoc and protoc-plugin artifacts"""
351 
352  def __init__(self, platform, arch, presubmit=False):
353  self.name = 'protoc_%s_%s' % (platform, arch)
354  self.platform = platform
355  self.arch = arch
356  self.labels = ['artifact', 'protoc', platform, arch]
357  if presubmit:
358  self.labels.append('presubmit')
359 
361  return []
362 
363  def build_jobspec(self, inner_jobs=None):
364  environ = {}
365  if inner_jobs is not None:
366  # set number of parallel jobs when building protoc
367  environ['GRPC_PROTOC_BUILD_COMPILER_JOBS'] = str(inner_jobs)
368 
369  if self.platform != 'windows':
370  environ['CXXFLAGS'] = ''
371  environ['LDFLAGS'] = ''
372  if self.platform == 'linux':
373  dockerfile_dir = 'tools/dockerfile/grpc_artifact_centos6_{}'.format(
374  self.arch)
375  if self.arch == 'aarch64':
376  # for aarch64, use a dockcross manylinux image that will
377  # give us both ready to use crosscompiler and sufficient backward compatibility
378  dockerfile_dir = 'tools/dockerfile/grpc_artifact_protoc_aarch64'
379  environ['LDFLAGS'] += ' -static-libgcc -static-libstdc++ -s'
380  return create_docker_jobspec(
381  self.name,
382  dockerfile_dir,
383  'tools/run_tests/artifacts/build_artifact_protoc.sh',
384  environ=environ)
385  else:
386  environ[
387  'CXXFLAGS'] += ' -std=c++14 -stdlib=libc++ %s' % _MACOS_COMPAT_FLAG
388  return create_jobspec(
389  self.name,
390  ['tools/run_tests/artifacts/build_artifact_protoc.sh'],
391  environ=environ,
392  timeout_seconds=60 * 60,
393  use_workspace=True)
394  else:
395  vs_tools_architecture = self.arch # architecture selector passed to vcvarsall.bat
396  environ['ARCHITECTURE'] = vs_tools_architecture
397  return create_jobspec(
398  self.name,
399  ['tools\\run_tests\\artifacts\\build_artifact_protoc.bat'],
400  environ=environ,
401  use_workspace=True)
402 
403  def __str__(self):
404  return self.name
405 
406 
408  """Reorder targets to achieve optimal build speed"""
409  # ruby artifact build builds multiple artifacts at once, so make sure
410  # we start building ruby artifacts first, so that they don't end up
411  # being a long tail once everything else finishes.
412  return list(
413  sorted(targets,
414  key=lambda target: 0 if target.name.startswith('ruby_') else 1))
415 
416 
417 def targets():
418  """Gets list of supported targets"""
420  ProtocArtifact('linux', 'x64', presubmit=True),
421  ProtocArtifact('linux', 'x86', presubmit=True),
422  ProtocArtifact('linux', 'aarch64', presubmit=True),
423  ProtocArtifact('macos', 'x64', presubmit=True),
424  ProtocArtifact('windows', 'x64', presubmit=True),
425  ProtocArtifact('windows', 'x86', presubmit=True),
426  CSharpExtArtifact('linux', 'x64', presubmit=True),
427  CSharpExtArtifact('linux', 'aarch64', presubmit=True),
428  CSharpExtArtifact('macos', 'x64', presubmit=True),
429  CSharpExtArtifact('windows', 'x64', presubmit=True),
430  CSharpExtArtifact('windows', 'x86', presubmit=True),
431  CSharpExtArtifact('linux',
432  'android',
433  arch_abi='arm64-v8a',
434  presubmit=True),
435  CSharpExtArtifact('linux',
436  'android',
437  arch_abi='armeabi-v7a',
438  presubmit=True),
439  CSharpExtArtifact('linux', 'android', arch_abi='x86', presubmit=True),
440  CSharpExtArtifact('macos', 'ios', presubmit=True),
441  PythonArtifact('manylinux2014', 'x64', 'cp36-cp36m', presubmit=True),
442  PythonArtifact('manylinux2014', 'x64', 'cp37-cp37m', presubmit=True),
443  PythonArtifact('manylinux2014', 'x64', 'cp38-cp38'),
444  PythonArtifact('manylinux2014', 'x64', 'cp39-cp39'),
445  PythonArtifact('manylinux2014', 'x64', 'cp310-cp310', presubmit=True),
446  PythonArtifact('manylinux2014', 'x86', 'cp36-cp36m', presubmit=True),
447  PythonArtifact('manylinux2014', 'x86', 'cp37-cp37m', presubmit=True),
448  PythonArtifact('manylinux2014', 'x86', 'cp38-cp38'),
449  PythonArtifact('manylinux2014', 'x86', 'cp39-cp39'),
450  PythonArtifact('manylinux2014', 'x86', 'cp310-cp310', presubmit=True),
451  PythonArtifact('manylinux2014', 'aarch64', 'cp36-cp36m',
452  presubmit=True),
453  PythonArtifact('manylinux2014', 'aarch64', 'cp37-cp37m'),
454  PythonArtifact('manylinux2014', 'aarch64', 'cp38-cp38', presubmit=True),
455  PythonArtifact('manylinux2014', 'aarch64', 'cp39-cp39'),
456  PythonArtifact('manylinux2014', 'aarch64', 'cp310-cp310'),
457  PythonArtifact('linux_extra', 'armv7', 'cp36-cp36m', presubmit=True),
458  PythonArtifact('linux_extra', 'armv7', 'cp37-cp37m'),
459  PythonArtifact('linux_extra', 'armv7', 'cp38-cp38'),
460  PythonArtifact('linux_extra', 'armv7', 'cp39-cp39'),
461  PythonArtifact('linux_extra', 'armv7', 'cp310-cp310', presubmit=True),
462  PythonArtifact('musllinux_1_1', 'x64', 'cp310-cp310', presubmit=True),
463  PythonArtifact('musllinux_1_1', 'x64', 'cp36-cp36m', presubmit=True),
464  PythonArtifact('musllinux_1_1', 'x64', 'cp37-cp37m'),
465  PythonArtifact('musllinux_1_1', 'x64', 'cp38-cp38'),
466  PythonArtifact('musllinux_1_1', 'x64', 'cp39-cp39'),
467  PythonArtifact('musllinux_1_1', 'x86', 'cp310-cp310', presubmit=True),
468  PythonArtifact('musllinux_1_1', 'x86', 'cp36-cp36m', presubmit=True),
469  PythonArtifact('musllinux_1_1', 'x86', 'cp37-cp37m'),
470  PythonArtifact('musllinux_1_1', 'x86', 'cp38-cp38'),
471  PythonArtifact('musllinux_1_1', 'x86', 'cp39-cp39'),
472  PythonArtifact('macos', 'x64', 'python3.7', presubmit=True),
473  PythonArtifact('macos', 'x64', 'python3.8'),
474  PythonArtifact('macos', 'x64', 'python3.9'),
475  PythonArtifact('macos', 'x64', 'python3.10', presubmit=True),
476  PythonArtifact('windows', 'x86', 'Python36_32bit', presubmit=True),
477  PythonArtifact('windows', 'x86', 'Python37_32bit'),
478  PythonArtifact('windows', 'x86', 'Python38_32bit'),
479  PythonArtifact('windows', 'x86', 'Python39_32bit'),
480  PythonArtifact('windows', 'x86', 'Python310_32bit', presubmit=True),
481  PythonArtifact('windows', 'x64', 'Python36', presubmit=True),
482  PythonArtifact('windows', 'x64', 'Python37'),
483  PythonArtifact('windows', 'x64', 'Python38'),
484  PythonArtifact('windows', 'x64', 'Python39'),
485  PythonArtifact('windows', 'x64', 'Python310', presubmit=True),
486  RubyArtifact('linux', 'x86-mingw32', presubmit=True),
487  RubyArtifact('linux', 'x64-mingw32', presubmit=True),
488  RubyArtifact('linux', 'x86_64-linux', presubmit=True),
489  RubyArtifact('linux', 'x86-linux', presubmit=True),
490  RubyArtifact('linux', 'x86_64-darwin', presubmit=True),
491  RubyArtifact('linux', 'arm64-darwin', presubmit=True),
492  PHPArtifact('linux', 'x64', presubmit=True),
493  PHPArtifact('macos', 'x64', presubmit=True),
494  ])
artifacts.artifact_targets.RubyArtifact.gem_platform
gem_platform
Definition: artifact_targets.py:227
xds_interop_client.str
str
Definition: xds_interop_client.py:487
artifacts.artifact_targets.PHPArtifact
Definition: artifact_targets.py:322
http2_test_server.format
format
Definition: http2_test_server.py:118
artifacts.artifact_targets._reorder_targets_for_build_speed
def _reorder_targets_for_build_speed(targets)
Definition: artifact_targets.py:407
artifacts.artifact_targets.CSharpExtArtifact.platform
platform
Definition: artifact_targets.py:256
capstone.range
range
Definition: third_party/bloaty/third_party/capstone/bindings/python/capstone/__init__.py:6
artifacts.artifact_targets.CSharpExtArtifact.pre_build_jobspecs
def pre_build_jobspecs(self)
Definition: artifact_targets.py:266
artifacts.artifact_targets.ProtocArtifact.__init__
def __init__(self, platform, arch, presubmit=False)
Definition: artifact_targets.py:352
artifacts.artifact_targets.ProtocArtifact
Definition: artifact_targets.py:349
artifacts.artifact_targets.CSharpExtArtifact.__init__
def __init__(self, platform, arch, arch_abi=None, presubmit=False)
Definition: artifact_targets.py:254
artifacts.artifact_targets.RubyArtifact
Definition: artifact_targets.py:221
artifacts.artifact_targets.CSharpExtArtifact.__str__
def __str__(self)
Definition: artifact_targets.py:318
artifacts.artifact_targets.PythonArtifact.platform
platform
Definition: artifact_targets.py:106
artifacts.artifact_targets.RubyArtifact.pre_build_jobspecs
def pre_build_jobspecs(self)
Definition: artifact_targets.py:232
artifacts.artifact_targets.CSharpExtArtifact.build_jobspec
def build_jobspec(self, inner_jobs=None)
Definition: artifact_targets.py:269
artifacts.artifact_targets.RubyArtifact.build_jobspec
def build_jobspec(self, inner_jobs=None)
Definition: artifact_targets.py:235
artifacts.artifact_targets.ProtocArtifact.labels
labels
Definition: artifact_targets.py:356
artifacts.artifact_targets.PythonArtifact
Definition: artifact_targets.py:101
artifacts.artifact_targets.CSharpExtArtifact.arch
arch
Definition: artifact_targets.py:257
artifacts.artifact_targets.ProtocArtifact.name
name
Definition: artifact_targets.py:353
artifacts.artifact_targets.RubyArtifact.name
name
Definition: artifact_targets.py:225
artifacts.artifact_targets.PHPArtifact.build_jobspec
def build_jobspec(self, inner_jobs=None)
Definition: artifact_targets.py:336
python_utils.jobset
Definition: jobset.py:1
artifacts.artifact_targets.PHPArtifact.labels
labels
Definition: artifact_targets.py:329
artifacts.artifact_targets.PythonArtifact.arch
arch
Definition: artifact_targets.py:107
artifacts.artifact_targets.PHPArtifact.__init__
def __init__(self, platform, arch, presubmit=False)
Definition: artifact_targets.py:325
artifacts.artifact_targets.ProtocArtifact.__str__
def __str__(self)
Definition: artifact_targets.py:403
artifacts.artifact_targets.RubyArtifact.platform
platform
Definition: artifact_targets.py:226
artifacts.artifact_targets.ProtocArtifact.pre_build_jobspecs
def pre_build_jobspecs(self)
Definition: artifact_targets.py:360
artifacts.artifact_targets.targets
def targets()
Definition: artifact_targets.py:417
artifacts.artifact_targets.ProtocArtifact.build_jobspec
def build_jobspec(self, inner_jobs=None)
Definition: artifact_targets.py:363
artifacts.artifact_targets.RubyArtifact.labels
labels
Definition: artifact_targets.py:228
artifacts.artifact_targets.PythonArtifact.__init__
def __init__(self, platform, arch, py_version, presubmit=False)
Definition: artifact_targets.py:104
artifacts.artifact_targets.PHPArtifact.platform
platform
Definition: artifact_targets.py:327
artifacts.artifact_targets.PythonArtifact.pre_build_jobspecs
def pre_build_jobspecs(self)
Definition: artifact_targets.py:124
artifacts.artifact_targets.ProtocArtifact.arch
arch
Definition: artifact_targets.py:355
artifacts.artifact_targets.PHPArtifact.pre_build_jobspecs
def pre_build_jobspecs(self)
Definition: artifact_targets.py:333
artifacts.artifact_targets.PythonArtifact.build_jobspec
def build_jobspec(self, inner_jobs=None)
Definition: artifact_targets.py:127
artifacts.artifact_targets.ProtocArtifact.platform
platform
Definition: artifact_targets.py:354
artifacts.artifact_targets.PythonArtifact.__str__
def __str__(self)
Definition: artifact_targets.py:217
artifacts.artifact_targets.create_jobspec
def create_jobspec(name, cmdline, environ={}, shell=False, flake_retries=0, timeout_retries=0, timeout_seconds=30 *60, use_workspace=False, cpu_cost=1.0, verbose_success=False)
Definition: artifact_targets.py:64
artifacts.artifact_targets.create_docker_jobspec
def create_docker_jobspec(name, dockerfile_dir, shell_command, environ={}, flake_retries=0, timeout_retries=0, timeout_seconds=30 *60, extra_docker_args=None, verbose_success=False)
Definition: artifact_targets.py:28
artifacts.artifact_targets.PythonArtifact.labels
labels
Definition: artifact_targets.py:108
artifacts.artifact_targets.CSharpExtArtifact.labels
labels
Definition: artifact_targets.py:259
artifacts.artifact_targets.CSharpExtArtifact
Definition: artifact_targets.py:251
artifacts.artifact_targets.RubyArtifact.__init__
def __init__(self, platform, gem_platform, presubmit=False)
Definition: artifact_targets.py:224
artifacts.artifact_targets.PHPArtifact.arch
arch
Definition: artifact_targets.py:328
artifacts.artifact_targets.PythonArtifact.name
name
Definition: artifact_targets.py:105
artifacts.artifact_targets.PHPArtifact.name
name
Definition: artifact_targets.py:326
artifacts.artifact_targets.CSharpExtArtifact.name
name
Definition: artifact_targets.py:255
artifacts.artifact_targets.PythonArtifact.py_version
py_version
Definition: artifact_targets.py:111
artifacts.artifact_targets.CSharpExtArtifact.arch_abi
arch_abi
Definition: artifact_targets.py:258


grpc
Author(s):
autogenerated on Fri May 16 2025 02:57:44