15 """Definition of targets to build artifacts."""
22 sys.path.insert(0, os.path.abspath(
'..'))
25 _LATEST_MANYLINUX =
"manylinux2014"
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
42 for k, v
in list(environ.items()):
43 docker_args += [
'-e',
'%s=%s' % (k, v)]
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'
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'] +
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)
70 timeout_seconds=30 * 60,
73 verbose_success=False):
74 """Creates jobspec."""
75 environ = environ.copy()
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'
82 environ[
'ARTIFACTS_OUT'] = os.path.join(
'artifacts', name)
84 jobspec = jobset.JobSpec(cmdline=cmdline,
86 shortname=
'build_artifact.%s' % (name),
87 timeout_seconds=timeout_seconds,
88 flake_retries=flake_retries,
89 timeout_retries=timeout_retries,
92 verbose_success=verbose_success)
96 _MACOS_COMPAT_FLAG =
'-mmacosx-version-min=10.10'
98 _ARCH_FLAG_MAP = {
'x86':
'-m32',
'x64':
'-m64'}
102 """Builds Python artifacts."""
104 def __init__(self, platform, arch, py_version, presubmit=False):
105 self.
name =
'python_%s_%s_%s' % (platform, arch, py_version)
108 self.
labels = [
'artifact',
'python', platform, arch, py_version]
110 self.
labels.append(
'presubmit')
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:
120 self.
labels.append(
'linux')
121 if 'musllinux' in platform:
122 self.
labels.append(
'linux')
129 if inner_jobs
is not None:
132 environ[
'GRPC_PYTHON_BUILD_EXT_COMPILER_JOBS'] =
str(inner_jobs)
138 environ[
"GRPC_UNIVERSAL2_REPAIR"] =
"true"
142 environ[
'PYTHON'] =
'/opt/python/{}/bin/python3'.
format(
145 environ[
'GRPC_SKIP_PIP_CYTHON_UPGRADE'] =
'TRUE'
146 environ[
'GRPC_SKIP_TWINE_CHECK'] =
'TRUE'
149 'tools/dockerfile/grpc_artifact_python_linux_{}'.
format(
151 'tools/run_tests/artifacts/build_artifact_python.sh',
153 timeout_seconds=60 * 60)
155 if self.
arch ==
'x86':
156 environ[
'SETARCH_CMD'] =
'linux32'
159 environ[
'PYTHON'] =
'/opt/python/{}/bin/python'.
format(
162 environ[
'GRPC_SKIP_PIP_CYTHON_UPGRADE'] =
'TRUE'
163 if self.
arch ==
'aarch64':
164 environ[
'GRPC_SKIP_TWINE_CHECK'] =
'TRUE'
167 environ[
'GRPC_RUN_AUDITWHEEL_REPAIR'] =
'TRUE'
172 environ[
'GRPC_BUILD_GRPCIO_TOOLS_DEPENDENTS'] =
'TRUE'
175 'tools/dockerfile/grpc_artifact_python_%s_%s' %
177 'tools/run_tests/artifacts/build_artifact_python.sh',
179 timeout_seconds=60 * 60 * 2)
181 environ[
'PYTHON'] =
'/opt/python/{}/bin/python'.
format(
184 environ[
'GRPC_SKIP_PIP_CYTHON_UPGRADE'] =
'TRUE'
185 environ[
'GRPC_RUN_AUDITWHEEL_REPAIR'] =
'TRUE'
186 environ[
'GRPC_PYTHON_BUILD_WITH_STATIC_LIBSTDCXX'] =
'TRUE'
189 'tools/dockerfile/grpc_artifact_python_%s_%s' %
191 'tools/run_tests/artifacts/build_artifact_python.sh',
193 timeout_seconds=60 * 60 * 2)
195 environ[
'EXT_COMPILER'] =
'msvc'
199 random.choice(string.ascii_uppercase)
for _
in range(10))
201 'tools\\run_tests\\artifacts\\build_artifact_python.bat',
205 timeout_seconds=45 * 60,
209 environ[
'SKIP_PIP_INSTALL'] =
'TRUE'
212 [
'tools/run_tests/artifacts/build_artifact_python.sh'],
214 timeout_seconds=60 * 60 * 2,
222 """Builds ruby native gem."""
224 def __init__(self, platform, gem_platform, presubmit=False):
225 self.
name =
'ruby_native_gem_%s_%s' % (platform, gem_platform)
228 self.
labels = [
'artifact',
'ruby', platform, gem_platform]
230 self.
labels.append(
'presubmit')
237 if inner_jobs
is not None:
239 environ[
'GRPC_RUBY_BUILD_PROCS'] =
str(inner_jobs)
243 'tools/run_tests/artifacts/build_artifact_ruby.sh',
247 timeout_seconds=90 * 60,
252 """Builds C# native extension library"""
254 def __init__(self, platform, arch, arch_abi=None, presubmit=False):
255 self.
name =
'csharp_ext_%s_%s' % (platform, arch)
259 self.
labels = [
'artifact',
'csharp', platform, arch]
261 self.
name +=
'_%s' % arch_abi
262 self.
labels.append(arch_abi)
264 self.
labels.append(
'presubmit')
271 if inner_jobs
is not None:
273 environ[
'GRPC_CSHARP_BUILD_EXT_COMPILER_JOBS'] =
str(inner_jobs)
275 if self.
arch ==
'android':
276 environ[
'ANDROID_ABI'] = self.
arch_abi
279 'tools/dockerfile/grpc_artifact_android_ndk',
280 'tools/run_tests/artifacts/build_artifact_csharp_android.sh',
282 elif self.
arch ==
'ios':
285 [
'tools/run_tests/artifacts/build_artifact_csharp_ios.sh'],
286 timeout_seconds=60 * 60,
291 'tools\\run_tests\\artifacts\\build_artifact_csharp.bat',
294 timeout_seconds=45 * 60,
299 dockerfile_dir =
'tools/dockerfile/grpc_artifact_centos6_{}'.
format(
301 if self.
arch ==
'aarch64':
304 dockerfile_dir =
'tools/dockerfile/grpc_artifact_python_manylinux2014_aarch64'
308 'tools/run_tests/artifacts/build_artifact_csharp.sh',
313 [
'tools/run_tests/artifacts/build_artifact_csharp.sh'],
314 timeout_seconds=45 * 60,
323 """Builds PHP PECL package"""
325 def __init__(self, platform, arch, presubmit=False):
326 self.
name =
'php_pecl_package_{0}_{1}'.
format(platform, arch)
329 self.
labels = [
'artifact',
'php', platform, arch]
331 self.
labels.append(
'presubmit')
341 'tools/dockerfile/test/php73_zts_debian11_{}'.
format(self.
arch),
342 'tools/run_tests/artifacts/build_artifact_php.sh')
345 self.
name, [
'tools/run_tests/artifacts/build_artifact_php.sh'],
350 """Builds protoc and protoc-plugin artifacts"""
352 def __init__(self, platform, arch, presubmit=False):
353 self.
name =
'protoc_%s_%s' % (platform, arch)
356 self.
labels = [
'artifact',
'protoc', platform, arch]
358 self.
labels.append(
'presubmit')
365 if inner_jobs
is not None:
367 environ[
'GRPC_PROTOC_BUILD_COMPILER_JOBS'] =
str(inner_jobs)
370 environ[
'CXXFLAGS'] =
''
371 environ[
'LDFLAGS'] =
''
373 dockerfile_dir =
'tools/dockerfile/grpc_artifact_centos6_{}'.
format(
375 if self.
arch ==
'aarch64':
378 dockerfile_dir =
'tools/dockerfile/grpc_artifact_protoc_aarch64'
379 environ[
'LDFLAGS'] +=
' -static-libgcc -static-libstdc++ -s'
383 'tools/run_tests/artifacts/build_artifact_protoc.sh',
387 'CXXFLAGS'] +=
' -std=c++14 -stdlib=libc++ %s' % _MACOS_COMPAT_FLAG
390 [
'tools/run_tests/artifacts/build_artifact_protoc.sh'],
392 timeout_seconds=60 * 60,
395 vs_tools_architecture = self.
arch
396 environ[
'ARCHITECTURE'] = vs_tools_architecture
399 [
'tools\\run_tests\\artifacts\\build_artifact_protoc.bat'],
408 """Reorder targets to achieve optimal build speed"""
414 key=
lambda target: 0
if target.name.startswith(
'ruby_')
else 1))
418 """Gets list of supported targets"""
433 arch_abi=
'arm64-v8a',
437 arch_abi=
'armeabi-v7a',
441 PythonArtifact(
'manylinux2014',
'x64',
'cp36-cp36m', presubmit=
True),
442 PythonArtifact(
'manylinux2014',
'x64',
'cp37-cp37m', presubmit=
True),
445 PythonArtifact(
'manylinux2014',
'x64',
'cp310-cp310', presubmit=
True),
446 PythonArtifact(
'manylinux2014',
'x86',
'cp36-cp36m', presubmit=
True),
447 PythonArtifact(
'manylinux2014',
'x86',
'cp37-cp37m', presubmit=
True),
450 PythonArtifact(
'manylinux2014',
'x86',
'cp310-cp310', presubmit=
True),
454 PythonArtifact(
'manylinux2014',
'aarch64',
'cp38-cp38', presubmit=
True),
457 PythonArtifact(
'linux_extra',
'armv7',
'cp36-cp36m', presubmit=
True),
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),
467 PythonArtifact(
'musllinux_1_1',
'x86',
'cp310-cp310', presubmit=
True),
468 PythonArtifact(
'musllinux_1_1',
'x86',
'cp36-cp36m', presubmit=
True),
476 PythonArtifact(
'windows',
'x86',
'Python36_32bit', presubmit=
True),
480 PythonArtifact(
'windows',
'x86',
'Python310_32bit', presubmit=
True),