blob: abbb5fa905a26bb46f65f3f39f2ce488c788f2b0 [file] [log] [blame]
Nathaniel Manistacbf21da2016-02-02 22:17:44 +00001#!/usr/bin/env python2.7
Jan Tattermuschbe538a12016-01-28 14:58:15 -08002# Copyright 2016, Google Inc.
3# All rights reserved.
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions are
7# met:
8#
9# * Redistributions of source code must retain the above copyright
10# notice, this list of conditions and the following disclaimer.
11# * Redistributions in binary form must reproduce the above
12# copyright notice, this list of conditions and the following disclaimer
13# in the documentation and/or other materials provided with the
14# distribution.
15# * Neither the name of Google Inc. nor the names of its
16# contributors may be used to endorse or promote products derived from
17# this software without specific prior written permission.
18#
19# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31"""Definition of targets to build distribution packages."""
32
33import jobset
34
murgatroid99dc3b4a42016-02-03 12:57:49 -080035def create_docker_jobspec(name, dockerfile_dir, shell_command, environ={},
36 flake_retries=0, timeout_retries=0):
37 """Creates jobspec for a task running under docker."""
38 environ = environ.copy()
39 environ['RUN_COMMAND'] = shell_command
40
41 docker_args=[]
siddharthshukla0589e532016-07-07 16:08:01 +020042 for k,v in environ.items():
murgatroid99dc3b4a42016-02-03 12:57:49 -080043 docker_args += ['-e', '%s=%s' % (k, v)]
44 docker_env = {'DOCKERFILE_DIR': dockerfile_dir,
Jan Tattermusch9835d4b2016-04-29 15:05:05 -070045 'DOCKER_RUN_SCRIPT': 'tools/run_tests/dockerize/docker_run.sh',
murgatroid99dc3b4a42016-02-03 12:57:49 -080046 'OUTPUT_DIR': 'artifacts'}
47 jobspec = jobset.JobSpec(
Jan Tattermusch9835d4b2016-04-29 15:05:05 -070048 cmdline=['tools/run_tests/dockerize/build_and_run_docker.sh'] + docker_args,
murgatroid99dc3b4a42016-02-03 12:57:49 -080049 environ=docker_env,
murgatroid993c3e58e2016-02-03 13:43:29 -080050 shortname='build_package.%s' % (name),
murgatroid99dc3b4a42016-02-03 12:57:49 -080051 timeout_seconds=30*60,
52 flake_retries=flake_retries,
53 timeout_retries=timeout_retries)
54 return jobspec
Jan Tattermuschbe538a12016-01-28 14:58:15 -080055
56def create_jobspec(name, cmdline, environ=None, cwd=None, shell=False,
57 flake_retries=0, timeout_retries=0):
58 """Creates jobspec."""
59 jobspec = jobset.JobSpec(
60 cmdline=cmdline,
61 environ=environ,
62 cwd=cwd,
63 shortname='build_package.%s' % (name),
64 timeout_seconds=10*60,
65 flake_retries=flake_retries,
66 timeout_retries=timeout_retries,
67 shell=shell)
68 return jobspec
69
70
Jan Tattermusch3c603922016-02-05 18:17:55 -080071class CSharpPackage:
Jan Tattermuschbe538a12016-01-28 14:58:15 -080072 """Builds C# nuget packages."""
73
Jan Tattermusch8a84c8c2016-09-08 21:06:10 +020074 def __init__(self, use_dotnet_cli=False):
75 self.use_dotnet_cli = use_dotnet_cli
76 self.name = 'csharp_package_dotnetcli' if use_dotnet_cli else 'csharp_package'
Jan Tattermusch2c084ee2016-06-28 16:54:17 -070077 self.labels = ['package', 'csharp']
Jan Tattermusch8a84c8c2016-09-08 21:06:10 +020078 if use_dotnet_cli:
Jan Tattermusch2c084ee2016-06-28 16:54:17 -070079 self.labels += ['linux']
80 else:
81 self.labels += ['windows']
Jan Tattermuschbe538a12016-01-28 14:58:15 -080082
83 def pre_build_jobspecs(self):
Nicolas "Pixel" Noble6ee23ee2016-08-12 09:46:07 +020084 if 'windows' in self.labels:
Nicolas "Pixel" Noblef2c074a2016-08-12 03:23:10 +020085 return [create_jobspec('prebuild_%s' % self.name,
86 ['tools\\run_tests\\pre_build_csharp.bat'],
87 shell=True,
88 flake_retries=5,
89 timeout_retries=2)]
90 else:
91 return []
Jan Tattermuschbe538a12016-01-28 14:58:15 -080092
93 def build_jobspec(self):
Jan Tattermusch8a84c8c2016-09-08 21:06:10 +020094 if self.use_dotnet_cli:
Jan Tattermusch2c084ee2016-06-28 16:54:17 -070095 return create_docker_jobspec(
96 self.name,
97 'tools/dockerfile/test/csharp_coreclr_x64',
Jan Tattermusch8a84c8c2016-09-08 21:06:10 +020098 'src/csharp/build_packages_dotnetcli.sh')
Jan Tattermusch2c084ee2016-06-28 16:54:17 -070099 else:
100 return create_jobspec(self.name,
101 ['build_packages.bat'],
102 cwd='src\\csharp',
103 shell=True)
Jan Tattermuschbe538a12016-01-28 14:58:15 -0800104
105 def __str__(self):
106 return self.name
107
Jan Tattermusch3c603922016-02-05 18:17:55 -0800108
109class NodePackage:
110 """Builds Node NPM package and collects precompiled binaries"""
murgatroid99dc3b4a42016-02-03 12:57:49 -0800111
112 def __init__(self):
Jan Tattermusch3c603922016-02-05 18:17:55 -0800113 self.name = 'node_package'
murgatroid993c3e58e2016-02-03 13:43:29 -0800114 self.labels = ['package', 'node', 'linux']
murgatroid99dc3b4a42016-02-03 12:57:49 -0800115
116 def pre_build_jobspecs(self):
117 return []
118
119 def build_jobspec(self):
120 return create_docker_jobspec(
121 self.name,
122 'tools/dockerfile/grpc_artifact_linux_x64',
123 'tools/run_tests/build_package_node.sh')
Jan Tattermuschbe538a12016-01-28 14:58:15 -0800124
Jan Tattermusch3c603922016-02-05 18:17:55 -0800125
126class RubyPackage:
127 """Collects ruby gems created in the artifact phase"""
128
129 def __init__(self):
130 self.name = 'ruby_package'
131 self.labels = ['package', 'ruby', 'linux']
132
133 def pre_build_jobspecs(self):
134 return []
135
136 def build_jobspec(self):
137 return create_docker_jobspec(
138 self.name,
139 'tools/dockerfile/grpc_artifact_linux_x64',
140 'tools/run_tests/build_package_ruby.sh')
141
142
143class PythonPackage:
144 """Collects python eggs and wheels created in the artifact phase"""
145
146 def __init__(self):
147 self.name = 'python_package'
148 self.labels = ['package', 'python', 'linux']
149
150 def pre_build_jobspecs(self):
151 return []
152
153 def build_jobspec(self):
154 return create_docker_jobspec(
155 self.name,
156 'tools/dockerfile/grpc_artifact_linux_x64',
157 'tools/run_tests/build_package_python.sh')
158
159
Stanley Cheung5adb71f2016-02-13 00:03:02 -0800160class PHPPackage:
Stanley Cheungbf74d692016-02-23 22:39:25 -0800161 """Copy PHP PECL package artifact"""
Stanley Cheung5adb71f2016-02-13 00:03:02 -0800162
163 def __init__(self):
164 self.name = 'php_package'
165 self.labels = ['package', 'php', 'linux']
166
167 def pre_build_jobspecs(self):
168 return []
169
170 def build_jobspec(self):
171 return create_docker_jobspec(
172 self.name,
173 'tools/dockerfile/grpc_artifact_linux_x64',
174 'tools/run_tests/build_package_php.sh')
175
176
Jan Tattermuschbe538a12016-01-28 14:58:15 -0800177def targets():
178 """Gets list of supported targets"""
Jan Tattermusch3c603922016-02-05 18:17:55 -0800179 return [CSharpPackage(),
Jan Tattermusch8a84c8c2016-09-08 21:06:10 +0200180 CSharpPackage(use_dotnet_cli=True),
Jan Tattermusch3c603922016-02-05 18:17:55 -0800181 NodePackage(),
182 RubyPackage(),
Stanley Cheung5adb71f2016-02-13 00:03:02 -0800183 PythonPackage(),
184 PHPPackage()]