blob: 254ec826e5e2283b49c5e9c9b6c2140bc12b3ca5 [file] [log] [blame]
borenetdb182c72016-09-30 12:53:12 -07001// 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
5package main
6
7/*
8 Generate the tasks.json file.
9*/
10
11import (
borenetdb182c72016-09-30 12:53:12 -070012 "encoding/json"
13 "fmt"
borenetdb182c72016-09-30 12:53:12 -070014 "os"
15 "path"
borenetdb182c72016-09-30 12:53:12 -070016 "sort"
17 "strings"
Eric Boren4b254b92016-11-08 12:55:32 -050018 "time"
borenetdb182c72016-09-30 12:53:12 -070019
20 "github.com/skia-dev/glog"
borenetdb182c72016-09-30 12:53:12 -070021 "go.skia.org/infra/go/util"
22 "go.skia.org/infra/task_scheduler/go/specs"
23)
24
25const (
26 DEFAULT_OS = "Ubuntu"
27
28 // Pool for Skia bots.
29 POOL_SKIA = "Skia"
30
31 // Name prefix for upload jobs.
32 PREFIX_UPLOAD = "Upload"
33)
34
35var (
36 // "Constants"
37
38 // Top-level list of all jobs to run at each commit.
39 JOBS = []string{
Eric Boreneaef6152016-11-18 08:24:21 -050040 "Build-Mac-Clang-Arm7-Debug-iOS",
41 "Build-Mac-Clang-Arm7-Release-iOS",
Mike Klein2afffbd2016-12-05 10:42:36 -050042 "Build-Mac-Clang-arm64-Debug-Android",
Mike Klein6749af42016-11-07 15:38:48 -050043 "Build-Mac-Clang-arm64-Debug-GN_iOS",
Mike Klein2afffbd2016-12-05 10:42:36 -050044 "Build-Mac-Clang-x86_64-Debug",
Eric Boren8615fe52016-12-12 14:30:12 -050045 "Build-Mac-Clang-x86_64-Debug-CommandBuffer",
Mike Klein2afffbd2016-12-05 10:42:36 -050046 "Build-Mac-Clang-x86_64-Release",
Eric Boren8615fe52016-12-12 14:30:12 -050047 "Build-Mac-Clang-x86_64-Release-CommandBuffer",
Mike Klein2afffbd2016-12-05 10:42:36 -050048 "Build-Ubuntu-Clang-arm-Debug-Android",
49 "Build-Ubuntu-Clang-arm-Release-Android",
50 "Build-Ubuntu-Clang-arm64-Debug-Android",
51 "Build-Ubuntu-Clang-arm64-Debug-Android_FrameworkDefs",
52 "Build-Ubuntu-Clang-arm64-Debug-Android_Vulkan",
53 "Build-Ubuntu-Clang-arm64-Release-Android",
54 "Build-Ubuntu-Clang-arm64-Release-Android_Vulkan",
55 "Build-Ubuntu-Clang-mips64el-Debug-Android",
56 "Build-Ubuntu-Clang-mips64el-Release-Android",
57 "Build-Ubuntu-Clang-mipsel-Debug-Android",
58 "Build-Ubuntu-Clang-mipsel-Release-Android",
59 "Build-Ubuntu-Clang-x64-Debug-Android",
60 "Build-Ubuntu-Clang-x64-Release-Android",
61 "Build-Ubuntu-Clang-x86-Debug-Android",
62 "Build-Ubuntu-Clang-x86-Debug-Android_Vulkan",
63 "Build-Ubuntu-Clang-x86-Release-Android",
64 "Build-Ubuntu-Clang-x86-Release-Android_Vulkan",
65 "Build-Ubuntu-Clang-x86_64-Debug",
Eric Boren8615fe52016-12-12 14:30:12 -050066 "Build-Ubuntu-Clang-x86_64-Debug-ASAN",
67 "Build-Ubuntu-Clang-x86_64-Debug-MSAN",
Mike Klein2afffbd2016-12-05 10:42:36 -050068 "Build-Ubuntu-Clang-x86_64-Release",
Eric Boren8615fe52016-12-12 14:30:12 -050069 "Build-Ubuntu-Clang-x86_64-Release-TSAN",
Eric Boren50831302016-11-18 13:10:51 -050070 "Build-Ubuntu-GCC-x86-Debug",
71 "Build-Ubuntu-GCC-x86-Release",
Mike Klein2afffbd2016-12-05 10:42:36 -050072 "Build-Ubuntu-GCC-x86_64-Debug",
Eric Boren50831302016-11-18 13:10:51 -050073 "Build-Ubuntu-GCC-x86_64-Debug-NoGPU",
Eric Boren8615fe52016-12-12 14:30:12 -050074 "Build-Ubuntu-GCC-x86_64-Debug-SK_USE_DISCARDABLE_SCALEDIMAGECACHE",
Mike Klein2afffbd2016-12-05 10:42:36 -050075 "Build-Ubuntu-GCC-x86_64-Release",
Eric Boren50831302016-11-18 13:10:51 -050076 "Build-Ubuntu-GCC-x86_64-Release-ANGLE",
Eric Boren8615fe52016-12-12 14:30:12 -050077 "Build-Ubuntu-GCC-x86_64-Release-Fast",
Eric Boren50831302016-11-18 13:10:51 -050078 "Build-Ubuntu-GCC-x86_64-Release-Mesa",
79 "Build-Ubuntu-GCC-x86_64-Release-NoGPU",
80 "Build-Ubuntu-GCC-x86_64-Release-PDFium",
Eric Boren3dc73f32016-12-13 08:48:46 -050081 "Build-Ubuntu-GCC-x86_64-Release-PDFium_SkiaPaths",
Eric Boren8615fe52016-12-12 14:30:12 -050082 "Build-Ubuntu-GCC-x86_64-Release-SKNX_NO_SIMD",
83 "Build-Ubuntu-GCC-x86_64-Release-Shared",
Eric Borenbd488f82016-11-23 11:03:28 -050084 "Build-Ubuntu-GCC-x86_64-Release-Valgrind",
Mike Klein2afffbd2016-12-05 10:42:36 -050085 "Build-Win-Clang-arm64-Release-Android",
Eric Borencb4feeb2016-11-28 10:12:09 -050086 "Build-Win-MSVC-x86-Debug",
87 "Build-Win-MSVC-x86-Debug-ANGLE",
88 "Build-Win-MSVC-x86-Debug-Exceptions",
89 "Build-Win-MSVC-x86-Debug-GDI",
90 "Build-Win-MSVC-x86-Release",
91 "Build-Win-MSVC-x86-Release-ANGLE",
92 "Build-Win-MSVC-x86-Release-GDI",
93 "Build-Win-MSVC-x86_64-Debug",
Eric Boren8615fe52016-12-12 14:30:12 -050094 "Build-Win-MSVC-x86_64-Debug-ANGLE",
95 "Build-Win-MSVC-x86_64-Debug-GDI",
96 "Build-Win-MSVC-x86_64-Debug-Vulkan",
Eric Borencb4feeb2016-11-28 10:12:09 -050097 "Build-Win-MSVC-x86_64-Release",
Eric Boren8615fe52016-12-12 14:30:12 -050098 "Build-Win-MSVC-x86_64-Release-ANGLE",
99 "Build-Win-MSVC-x86_64-Release-GDI",
Eric Borencb4feeb2016-11-28 10:12:09 -0500100 "Build-Win-MSVC-x86_64-Release-Vulkan",
Eric Borenf5a90e82016-11-15 15:18:20 -0500101 "Housekeeper-Nightly-RecreateSKPs_Canary",
Eric Boren22f5ef72016-12-02 11:01:33 -0500102 "Housekeeper-PerCommit",
Eric Boren792079c2016-11-09 14:03:20 -0500103 "Housekeeper-PerCommit-InfraTests",
Eric Borenf5a90e82016-11-15 15:18:20 -0500104 "Housekeeper-Weekly-RecreateSKPs",
Mike Klein2afffbd2016-12-05 10:42:36 -0500105 "Perf-Android-Clang-AndroidOne-CPU-MT6582-arm-Debug-Android",
106 "Perf-Android-Clang-AndroidOne-CPU-MT6582-arm-Release-Android",
107 "Perf-Android-Clang-AndroidOne-GPU-Mali400MP2-arm-Debug-Android",
108 "Perf-Android-Clang-AndroidOne-GPU-Mali400MP2-arm-Release-Android",
109 "Perf-Android-Clang-GalaxyS7-GPU-Adreno530-arm64-Debug-Android",
110 "Perf-Android-Clang-GalaxyS7-GPU-Adreno530-arm64-Debug-Android_Vulkan",
111 "Perf-Android-Clang-GalaxyS7-GPU-Adreno530-arm64-Release-Android",
112 "Perf-Android-Clang-GalaxyS7-GPU-Adreno530-arm64-Release-Android_Vulkan",
113 "Perf-Android-Clang-NVIDIA_Shield-GPU-TegraX1-arm64-Debug-Android",
114 "Perf-Android-Clang-NVIDIA_Shield-GPU-TegraX1-arm64-Debug-Android_Vulkan",
115 "Perf-Android-Clang-NVIDIA_Shield-GPU-TegraX1-arm64-Release-Android",
116 "Perf-Android-Clang-NVIDIA_Shield-GPU-TegraX1-arm64-Release-Android_Vulkan",
117 "Perf-Android-Clang-Nexus10-GPU-MaliT604-arm-Debug-Android",
118 "Perf-Android-Clang-Nexus10-GPU-MaliT604-arm-Release-Android",
119 "Perf-Android-Clang-Nexus5-GPU-Adreno330-arm-Debug-Android",
120 "Perf-Android-Clang-Nexus5-GPU-Adreno330-arm-Release-Android",
Mike Klein2afffbd2016-12-05 10:42:36 -0500121 "Perf-Android-Clang-Nexus6p-GPU-Adreno430-arm64-Debug-Android",
122 "Perf-Android-Clang-Nexus6p-GPU-Adreno430-arm64-Debug-Android_Vulkan",
123 "Perf-Android-Clang-Nexus6p-GPU-Adreno430-arm64-Release-Android",
124 "Perf-Android-Clang-Nexus6p-GPU-Adreno430-arm64-Release-Android_Vulkan",
125 "Perf-Android-Clang-Nexus7-GPU-Tegra3-arm-Debug-Android",
126 "Perf-Android-Clang-Nexus7-GPU-Tegra3-arm-Release-Android",
127 "Perf-Android-Clang-Nexus9-GPU-TegraK1-arm64-Debug-Android",
128 "Perf-Android-Clang-Nexus9-GPU-TegraK1-arm64-Release-Android",
129 "Perf-Android-Clang-NexusPlayer-CPU-Moorefield-x86-Debug-Android",
130 "Perf-Android-Clang-NexusPlayer-CPU-Moorefield-x86-Release-Android",
131 "Perf-Android-Clang-NexusPlayer-GPU-PowerVR-x86-Debug-Android",
132 "Perf-Android-Clang-NexusPlayer-GPU-PowerVR-x86-Debug-Android_Vulkan",
133 "Perf-Android-Clang-NexusPlayer-GPU-PowerVR-x86-Release-Android",
134 "Perf-Android-Clang-NexusPlayer-GPU-PowerVR-x86-Release-Android_Vulkan",
135 "Perf-Android-Clang-Pixel-GPU-Adreno530-arm64-Debug-Android",
136 "Perf-Android-Clang-Pixel-GPU-Adreno530-arm64-Debug-Android_Vulkan",
137 "Perf-Android-Clang-Pixel-GPU-Adreno530-arm64-Release-Android",
138 "Perf-Android-Clang-Pixel-GPU-Adreno530-arm64-Release-Android_Vulkan",
Kevin Lubicke29ce642016-12-09 11:11:33 -0500139 "Perf-Android-Clang-PixelC-CPU-TegraX1-arm64-Debug-Android",
140 "Perf-Android-Clang-PixelC-CPU-TegraX1-arm64-Release-Android",
Mike Klein2afffbd2016-12-05 10:42:36 -0500141 "Perf-Android-Clang-PixelC-GPU-TegraX1-arm64-Release-Android_Skpbench",
142 "Perf-Android-Clang-PixelC-GPU-TegraX1-arm64-Release-Android_Vulkan_Skpbench",
143 "Perf-Mac-Clang-MacMini4.1-GPU-GeForce320M-x86_64-Debug",
144 "Perf-Mac-Clang-MacMini4.1-GPU-GeForce320M-x86_64-Release",
145 "Perf-Mac-Clang-MacMini6.2-CPU-AVX-x86_64-Debug",
146 "Perf-Mac-Clang-MacMini6.2-CPU-AVX-x86_64-Release",
147 "Perf-Mac-Clang-MacMini6.2-GPU-HD4000-x86_64-Debug",
148 "Perf-Mac-Clang-MacMini6.2-GPU-HD4000-x86_64-Release",
Eric Borenb409c6a2016-11-28 07:22:18 -0500149 "Perf-Mac-Clang-MacMini6.2-GPU-HD4000-x86_64-Release-CommandBuffer",
Mike Klein2afffbd2016-12-05 10:42:36 -0500150 "Perf-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Debug",
Eric Boren50831302016-11-18 13:10:51 -0500151 "Perf-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Debug-ASAN",
Eric Boren50831302016-11-18 13:10:51 -0500152 "Perf-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Debug-MSAN",
Mike Klein2afffbd2016-12-05 10:42:36 -0500153 "Perf-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Release",
Eric Borenbd488f82016-11-23 11:03:28 -0500154 "Perf-Ubuntu-Clang-Golo-GPU-GT610-x86_64-Debug-ASAN",
Eric Boren50831302016-11-18 13:10:51 -0500155 "Perf-Ubuntu-GCC-GCE-CPU-AVX2-x86-Debug",
Mike Klein2afffbd2016-12-05 10:42:36 -0500156 "Perf-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug",
Eric Boren50831302016-11-18 13:10:51 -0500157 "Perf-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-SK_USE_DISCARDABLE_SCALEDIMAGECACHE",
Mike Klein2afffbd2016-12-05 10:42:36 -0500158 "Perf-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release",
Eric Boren71b762f2016-11-30 14:05:16 -0500159 "Perf-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-CT_BENCH_1k_SKPs",
Eric Boren71b762f2016-11-30 14:05:16 -0500160 "Perf-Ubuntu-GCC-Golo-GPU-GT610-x86_64-Release-CT_BENCH_1k_SKPs",
Eric Borenbd488f82016-11-23 11:03:28 -0500161 "Perf-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-Valgrind",
Mike Klein2afffbd2016-12-05 10:42:36 -0500162 "Perf-Ubuntu-GCC-ShuttleA-GPU-GTX660-x86_64-Debug",
163 "Perf-Ubuntu-GCC-ShuttleA-GPU-GTX660-x86_64-Release",
Eric Boren54ff2fc2016-12-02 12:09:10 -0500164 "Perf-Win10-MSVC-Golo-GPU-GT610-x86_64-Release",
165 "Perf-Win10-MSVC-NUC-GPU-IntelIris6100-x86_64-Debug-ANGLE",
166 "Perf-Win10-MSVC-NUC-GPU-IntelIris6100-x86_64-Release-ANGLE",
Eric Boren78f5af72016-11-30 12:49:00 -0500167 "Perf-Win10-MSVC-ShuttleA-GPU-GTX660-x86_64-Debug",
168 "Perf-Win10-MSVC-ShuttleA-GPU-GTX660-x86_64-Debug-Vulkan",
169 "Perf-Win10-MSVC-ShuttleA-GPU-GTX660-x86_64-Release",
170 "Perf-Win10-MSVC-ShuttleA-GPU-GTX660-x86_64-Release-Vulkan",
Eric Boren54ff2fc2016-12-02 12:09:10 -0500171 "Perf-Win10-MSVC-ShuttleC-GPU-GTX960-x86_64-Debug",
172 "Perf-Win10-MSVC-ShuttleC-GPU-GTX960-x86_64-Debug-ANGLE",
173 "Perf-Win10-MSVC-ShuttleC-GPU-GTX960-x86_64-Release",
174 "Perf-Win10-MSVC-ShuttleC-GPU-GTX960-x86_64-Release-ANGLE",
175 "Perf-Win10-MSVC-ShuttleC-GPU-iHD530-x86_64-Debug",
176 "Perf-Win10-MSVC-ShuttleC-GPU-iHD530-x86_64-Release",
177 "Perf-Win2k8-MSVC-GCE-CPU-AVX2-x86-Debug",
178 "Perf-Win2k8-MSVC-GCE-CPU-AVX2-x86_64-Debug",
179 "Perf-Win2k8-MSVC-GCE-CPU-AVX2-x86_64-Debug-GDI",
180 "Perf-Win2k8-MSVC-GCE-CPU-AVX2-x86_64-Release",
Eric Boren78f5af72016-11-30 12:49:00 -0500181 "Perf-Win8-MSVC-ShuttleA-GPU-HD7770-x86_64-Debug",
182 "Perf-Win8-MSVC-ShuttleA-GPU-HD7770-x86_64-Release",
183 "Perf-Win8-MSVC-ShuttleB-GPU-HD4600-x86_64-Debug",
184 "Perf-Win8-MSVC-ShuttleB-GPU-HD4600-x86_64-Release",
Eric Boren792079c2016-11-09 14:03:20 -0500185 "Perf-iOS-Clang-iPadMini4-GPU-GX6450-Arm7-Debug",
186 "Perf-iOS-Clang-iPadMini4-GPU-GX6450-Arm7-Release",
Mike Klein2afffbd2016-12-05 10:42:36 -0500187 "Test-Android-Clang-AndroidOne-CPU-MT6582-arm-Debug-Android",
188 "Test-Android-Clang-AndroidOne-CPU-MT6582-arm-Release-Android",
189 "Test-Android-Clang-AndroidOne-GPU-Mali400MP2-arm-Debug-Android",
190 "Test-Android-Clang-AndroidOne-GPU-Mali400MP2-arm-Release-Android",
191 "Test-Android-Clang-GalaxyS7-GPU-Adreno530-arm64-Debug-Android",
192 "Test-Android-Clang-GalaxyS7-GPU-Adreno530-arm64-Debug-Android_Vulkan",
193 "Test-Android-Clang-GalaxyS7-GPU-Adreno530-arm64-Release-Android",
194 "Test-Android-Clang-GalaxyS7-GPU-Adreno530-arm64-Release-Android_Vulkan",
195 "Test-Android-Clang-NVIDIA_Shield-GPU-TegraX1-arm64-Debug-Android",
196 "Test-Android-Clang-NVIDIA_Shield-GPU-TegraX1-arm64-Debug-Android_Vulkan",
197 "Test-Android-Clang-NVIDIA_Shield-GPU-TegraX1-arm64-Release-Android",
198 "Test-Android-Clang-NVIDIA_Shield-GPU-TegraX1-arm64-Release-Android_Vulkan",
199 "Test-Android-Clang-Nexus10-GPU-MaliT604-arm-Debug-Android",
200 "Test-Android-Clang-Nexus10-GPU-MaliT604-arm-Release-Android",
201 "Test-Android-Clang-Nexus5-GPU-Adreno330-arm-Debug-Android",
202 "Test-Android-Clang-Nexus5-GPU-Adreno330-arm-Release-Android",
Mike Klein2afffbd2016-12-05 10:42:36 -0500203 "Test-Android-Clang-Nexus6p-GPU-Adreno430-arm64-Debug-Android",
204 "Test-Android-Clang-Nexus6p-GPU-Adreno430-arm64-Debug-Android_Vulkan",
205 "Test-Android-Clang-Nexus6p-GPU-Adreno430-arm64-Release-Android",
206 "Test-Android-Clang-Nexus6p-GPU-Adreno430-arm64-Release-Android_Vulkan",
207 "Test-Android-Clang-Nexus7-GPU-Tegra3-arm-Debug-Android",
208 "Test-Android-Clang-Nexus7-GPU-Tegra3-arm-Release-Android",
209 "Test-Android-Clang-Nexus9-GPU-TegraK1-arm64-Debug-Android",
210 "Test-Android-Clang-Nexus9-GPU-TegraK1-arm64-Release-Android",
211 "Test-Android-Clang-NexusPlayer-CPU-Moorefield-x86-Debug-Android",
212 "Test-Android-Clang-NexusPlayer-CPU-Moorefield-x86-Release-Android",
213 "Test-Android-Clang-NexusPlayer-GPU-PowerVR-x86-Debug-Android",
214 "Test-Android-Clang-NexusPlayer-GPU-PowerVR-x86-Debug-Android_Vulkan",
215 "Test-Android-Clang-NexusPlayer-GPU-PowerVR-x86-Release-Android",
216 "Test-Android-Clang-NexusPlayer-GPU-PowerVR-x86-Release-Android_Vulkan",
Kevin Lubicke29ce642016-12-09 11:11:33 -0500217 "Test-Android-Clang-PixelC-CPU-TegraX1-arm64-Debug-Android",
218 "Test-Android-Clang-PixelC-CPU-TegraX1-arm64-Release-Android",
Mike Klein2afffbd2016-12-05 10:42:36 -0500219 "Test-Android-Clang-PixelXL-GPU-Adreno530-arm64-Debug-Android",
220 "Test-Android-Clang-PixelXL-GPU-Adreno530-arm64-Debug-Android_Vulkan",
221 "Test-Android-Clang-PixelXL-GPU-Adreno530-arm64-Release-Android",
222 "Test-Android-Clang-PixelXL-GPU-Adreno530-arm64-Release-Android_Vulkan",
223 "Test-Mac-Clang-MacMini4.1-GPU-GeForce320M-x86_64-Debug",
224 "Test-Mac-Clang-MacMini4.1-GPU-GeForce320M-x86_64-Release",
225 "Test-Mac-Clang-MacMini6.2-CPU-AVX-x86_64-Debug",
226 "Test-Mac-Clang-MacMini6.2-CPU-AVX-x86_64-Release",
227 "Test-Mac-Clang-MacMini6.2-GPU-HD4000-x86_64-Debug",
Eric Borenb409c6a2016-11-28 07:22:18 -0500228 "Test-Mac-Clang-MacMini6.2-GPU-HD4000-x86_64-Debug-CommandBuffer",
Mike Klein2afffbd2016-12-05 10:42:36 -0500229 "Test-Mac-Clang-MacMini6.2-GPU-HD4000-x86_64-Release",
230 "Test-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Debug",
Eric Boren50831302016-11-18 13:10:51 -0500231 "Test-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Debug-ASAN",
Eric Boren50831302016-11-18 13:10:51 -0500232 "Test-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Debug-MSAN",
Mike Klein2afffbd2016-12-05 10:42:36 -0500233 "Test-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Release",
Eric Boren50831302016-11-18 13:10:51 -0500234 "Test-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Release-TSAN",
Eric Borenbd488f82016-11-23 11:03:28 -0500235 "Test-Ubuntu-Clang-Golo-GPU-GT610-x86_64-Debug-ASAN",
236 "Test-Ubuntu-Clang-Golo-GPU-GT610-x86_64-Release-TSAN",
Eric Boren50831302016-11-18 13:10:51 -0500237 "Test-Ubuntu-GCC-GCE-CPU-AVX2-x86-Debug",
Mike Klein2afffbd2016-12-05 10:42:36 -0500238 "Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug",
Eric Boren71b762f2016-11-30 14:05:16 -0500239 "Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-CT_DM_100k_SKPs",
240 "Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-CT_DM_1m_SKPs",
241 "Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-CT_IMG_DECODE_100k_SKPs",
Eric Boren50831302016-11-18 13:10:51 -0500242 "Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-SK_USE_DISCARDABLE_SCALEDIMAGECACHE",
Mike Klein2afffbd2016-12-05 10:42:36 -0500243 "Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release",
Eric Boren50831302016-11-18 13:10:51 -0500244 "Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-Fast",
Eric Boren50831302016-11-18 13:10:51 -0500245 "Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-SKNX_NO_SIMD",
Eric Borenbd488f82016-11-23 11:03:28 -0500246 "Test-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-Valgrind",
Mike Klein2afffbd2016-12-05 10:42:36 -0500247 "Test-Ubuntu-GCC-ShuttleA-GPU-GTX660-x86_64-Debug",
248 "Test-Ubuntu-GCC-ShuttleA-GPU-GTX660-x86_64-Release",
Eric Boren54ff2fc2016-12-02 12:09:10 -0500249 "Test-Win10-MSVC-Golo-GPU-GT610-x86_64-Release",
250 "Test-Win10-MSVC-NUC-GPU-IntelIris6100-x86_64-Debug-ANGLE",
251 "Test-Win10-MSVC-NUC-GPU-IntelIris6100-x86_64-Release-ANGLE",
Eric Boren78f5af72016-11-30 12:49:00 -0500252 "Test-Win10-MSVC-ShuttleA-GPU-GTX660-x86_64-Debug",
253 "Test-Win10-MSVC-ShuttleA-GPU-GTX660-x86_64-Debug-Vulkan",
254 "Test-Win10-MSVC-ShuttleA-GPU-GTX660-x86_64-Release",
Eric Boren54ff2fc2016-12-02 12:09:10 -0500255 "Test-Win10-MSVC-ShuttleC-GPU-GTX960-x86_64-Debug",
256 "Test-Win10-MSVC-ShuttleC-GPU-GTX960-x86_64-Debug-ANGLE",
257 "Test-Win10-MSVC-ShuttleC-GPU-GTX960-x86_64-Release",
258 "Test-Win10-MSVC-ShuttleC-GPU-GTX960-x86_64-Release-ANGLE",
259 "Test-Win10-MSVC-ShuttleC-GPU-iHD530-x86_64-Debug",
260 "Test-Win10-MSVC-ShuttleC-GPU-iHD530-x86_64-Release",
261 "Test-Win2k8-MSVC-GCE-CPU-AVX2-x86-Debug",
262 "Test-Win2k8-MSVC-GCE-CPU-AVX2-x86-Release",
263 "Test-Win2k8-MSVC-GCE-CPU-AVX2-x86_64-Debug",
264 "Test-Win2k8-MSVC-GCE-CPU-AVX2-x86_64-Debug-GDI",
265 "Test-Win2k8-MSVC-GCE-CPU-AVX2-x86_64-Release",
266 "Test-Win2k8-MSVC-GCE-CPU-AVX2-x86_64-Release-GDI",
Eric Boren78f5af72016-11-30 12:49:00 -0500267 "Test-Win8-MSVC-ShuttleA-GPU-HD7770-x86_64-Debug",
268 "Test-Win8-MSVC-ShuttleA-GPU-HD7770-x86_64-Release",
269 "Test-Win8-MSVC-ShuttleB-GPU-HD4600-x86_64-Debug",
270 "Test-Win8-MSVC-ShuttleB-GPU-HD4600-x86_64-Release",
Eric Boren792079c2016-11-09 14:03:20 -0500271 "Test-iOS-Clang-iPadMini4-GPU-GX6450-Arm7-Debug",
272 "Test-iOS-Clang-iPadMini4-GPU-GX6450-Arm7-Release",
borenetdb182c72016-09-30 12:53:12 -0700273 }
274
Eric Boren4b254b92016-11-08 12:55:32 -0500275 // LINUX_GCE_DIMENSIONS are the Swarming dimensions for Linux GCE
276 // instances.
277 LINUX_GCE_DIMENSIONS = []string{
borenetdb182c72016-09-30 12:53:12 -0700278 "cpu:x86-64-avx2",
279 "gpu:none",
280 "os:Ubuntu",
281 fmt.Sprintf("pool:%s", POOL_SKIA),
282 }
283
284 // Defines the structure of job names.
285 jobNameSchema *JobNameSchema
borenetdb182c72016-09-30 12:53:12 -0700286)
287
288// deriveCompileTaskName returns the name of a compile task based on the given
289// job name.
290func deriveCompileTaskName(jobName string, parts map[string]string) string {
291 if parts["role"] == "Housekeeper" {
292 return "Build-Ubuntu-GCC-x86_64-Release-Shared"
293 } else if parts["role"] == "Test" || parts["role"] == "Perf" {
294 task_os := parts["os"]
295 ec := parts["extra_config"]
Kevin Lubickb03b5ac2016-11-14 13:42:27 -0500296 ec = strings.TrimSuffix(ec, "_Skpbench")
borenetdb182c72016-09-30 12:53:12 -0700297 if task_os == "Android" {
298 if ec == "Vulkan" {
299 ec = "Android_Vulkan"
borenetdb182c72016-09-30 12:53:12 -0700300 }
borenet52383432016-10-17 10:17:53 -0700301 task_os = "Ubuntu"
borenetdb182c72016-09-30 12:53:12 -0700302 } else if task_os == "iOS" {
303 ec = task_os
304 task_os = "Mac"
305 } else if strings.Contains(task_os, "Win") {
306 task_os = "Win"
307 }
Eric Boren50831302016-11-18 13:10:51 -0500308 jobNameMap := map[string]string{
borenetdb182c72016-09-30 12:53:12 -0700309 "role": "Build",
310 "os": task_os,
311 "compiler": parts["compiler"],
312 "target_arch": parts["arch"],
313 "configuration": parts["configuration"],
Eric Boren50831302016-11-18 13:10:51 -0500314 }
315 if ec != "" {
316 jobNameMap["extra_config"] = ec
317 }
318 name, err := jobNameSchema.MakeJobName(jobNameMap)
borenetdb182c72016-09-30 12:53:12 -0700319 if err != nil {
320 glog.Fatal(err)
321 }
322 return name
323 } else {
324 return jobName
325 }
326}
327
328// swarmDimensions generates swarming bot dimensions for the given task.
329func swarmDimensions(parts map[string]string) []string {
borenetdb182c72016-09-30 12:53:12 -0700330 d := map[string]string{
331 "pool": POOL_SKIA,
332 }
333 if os, ok := parts["os"]; ok {
Eric Boren54ff2fc2016-12-02 12:09:10 -0500334 d["os"] = map[string]string{
335 "Android": "Android",
336 "Mac": "Mac-10.11",
337 "Ubuntu": "Ubuntu-14.04",
338 "Win": "Windows-2008ServerR2-SP1",
339 "Win10": "Windows-10-10586",
340 "Win2k8": "Windows-2008ServerR2-SP1",
341 "Win8": "Windows-8.1-SP0",
342 "iOS": "iOS-9.3.1",
343 }[os]
borenetdb182c72016-09-30 12:53:12 -0700344 } else {
345 d["os"] = DEFAULT_OS
346 }
borenetdb182c72016-09-30 12:53:12 -0700347 if parts["role"] == "Test" || parts["role"] == "Perf" {
348 if strings.Contains(parts["os"], "Android") {
349 // For Android, the device type is a better dimension
350 // than CPU or GPU.
Eric Boren4b254b92016-11-08 12:55:32 -0500351 deviceInfo := map[string][]string{
352 "AndroidOne": {"sprout", "MOB30Q"},
353 "GalaxyS7": {"heroqlteatt", "MMB29M"},
354 "NVIDIA_Shield": {"foster", "MRA58K"},
355 "Nexus10": {"manta", "LMY49J"},
356 "Nexus5": {"hammerhead", "MOB31E"},
357 "Nexus6": {"shamu", "M"},
358 "Nexus6p": {"angler", "NMF26C"},
359 "Nexus7": {"grouper", "LMY47V"},
360 "Nexus7v2": {"flo", "M"},
361 "Nexus9": {"flounder", "NRD91D"},
362 "NexusPlayer": {"fugu", "NRD90R"},
363 "Pixel": {"sailfish", "NMF25"},
364 "PixelC": {"dragon", "NMF26C"},
365 "PixelXL": {"marlin", "NMF25"},
borenetdb182c72016-09-30 12:53:12 -0700366 }[parts["model"]]
Eric Boren4b254b92016-11-08 12:55:32 -0500367 d["device_type"] = deviceInfo[0]
368 d["device_os"] = deviceInfo[1]
borenetdb182c72016-09-30 12:53:12 -0700369 } else if strings.Contains(parts["os"], "iOS") {
370 d["device"] = map[string]string{
Eric Boren792079c2016-11-09 14:03:20 -0500371 "iPadMini4": "iPad5,1",
borenetdb182c72016-09-30 12:53:12 -0700372 }[parts["model"]]
borenetdb182c72016-09-30 12:53:12 -0700373 } else if parts["cpu_or_gpu"] == "CPU" {
374 d["gpu"] = "none"
375 d["cpu"] = map[string]string{
376 "AVX": "x86-64",
377 "AVX2": "x86-64-avx2",
378 "SSE4": "x86-64",
379 }[parts["cpu_or_gpu_value"]]
380 if strings.Contains(parts["os"], "Win") && parts["cpu_or_gpu_value"] == "AVX2" {
381 // AVX2 is not correctly detected on Windows. Fall back on other
382 // dimensions to ensure that we correctly target machines which we know
383 // have AVX2 support.
384 d["cpu"] = "x86-64"
385 d["os"] = "Windows-2008ServerR2-SP1"
386 }
387 } else {
388 d["gpu"] = map[string]string{
Eric Boren4b254b92016-11-08 12:55:32 -0500389 "GeForce320M": "10de:08a4",
390 "GT610": "10de:104a",
391 "GTX550Ti": "10de:1244",
392 "GTX660": "10de:11c0",
393 "GTX960": "10de:1401",
394 "HD4000": "8086:0a2e",
395 "HD4600": "8086:0412",
396 "HD7770": "1002:683d",
397 "iHD530": "8086:1912",
398 "IntelIris6100": "8086:162b",
borenetdb182c72016-09-30 12:53:12 -0700399 }[parts["cpu_or_gpu_value"]]
400 }
401 } else {
402 d["gpu"] = "none"
403 }
404 rv := make([]string, 0, len(d))
405 for k, v := range d {
406 rv = append(rv, fmt.Sprintf("%s:%s", k, v))
407 }
408 sort.Strings(rv)
409 return rv
410}
411
borenetdb182c72016-09-30 12:53:12 -0700412// compile generates a compile task. Returns the name of the last task in the
413// generated chain of tasks, which the Job should add as a dependency.
boreneted20a702016-10-20 11:04:31 -0700414func compile(b *specs.TasksCfgBuilder, name string, parts map[string]string) string {
borenetdb182c72016-09-30 12:53:12 -0700415 // Collect the necessary CIPD packages.
416 pkgs := []*specs.CipdPackage{}
417
418 // Android bots require a toolchain.
419 if strings.Contains(name, "Android") {
borenetdb182c72016-09-30 12:53:12 -0700420 if strings.Contains(name, "Mac") {
boreneted20a702016-10-20 11:04:31 -0700421 pkgs = append(pkgs, b.MustGetCipdPackageFromAsset("android_ndk_darwin"))
Mike Klein86c2c0f2016-11-02 13:13:16 -0400422 } else if strings.Contains(name, "Win") {
Mike Kleine9215f02016-11-02 15:44:26 -0400423 pkg := b.MustGetCipdPackageFromAsset("android_ndk_windows")
424 pkg.Path = "n"
425 pkgs = append(pkgs, pkg)
borenetdb182c72016-09-30 12:53:12 -0700426 } else {
boreneted20a702016-10-20 11:04:31 -0700427 pkgs = append(pkgs, b.MustGetCipdPackageFromAsset("android_ndk_linux"))
borenetdb182c72016-09-30 12:53:12 -0700428 }
Mike Klein27dcee12016-11-09 16:31:42 -0500429 } else if strings.Contains(name, "Ubuntu") && strings.Contains(name, "Clang") {
boreneted20a702016-10-20 11:04:31 -0700430 pkgs = append(pkgs, b.MustGetCipdPackageFromAsset("clang_linux"))
Mike Klein27dcee12016-11-09 16:31:42 -0500431 } else if strings.Contains(name, "Win") {
boreneted20a702016-10-20 11:04:31 -0700432 pkgs = append(pkgs, b.MustGetCipdPackageFromAsset("win_toolchain"))
borenetdb182c72016-09-30 12:53:12 -0700433 if strings.Contains(name, "Vulkan") {
boreneted20a702016-10-20 11:04:31 -0700434 pkgs = append(pkgs, b.MustGetCipdPackageFromAsset("win_vulkan_sdk"))
borenetdb182c72016-09-30 12:53:12 -0700435 }
436 }
437
438 // Add the task.
boreneted20a702016-10-20 11:04:31 -0700439 b.MustAddTask(name, &specs.TaskSpec{
borenetdb182c72016-09-30 12:53:12 -0700440 CipdPackages: pkgs,
441 Dimensions: swarmDimensions(parts),
442 ExtraArgs: []string{
443 "--workdir", "../../..", "swarm_compile",
skia.buildbots2478c732016-11-04 14:37:26 -0400444 fmt.Sprintf("repository=%s", specs.PLACEHOLDER_REPO),
borenetdb182c72016-09-30 12:53:12 -0700445 fmt.Sprintf("buildername=%s", name),
446 "mastername=fake-master",
447 "buildnumber=2",
448 "slavename=fake-buildslave",
borenet98b2e7a2016-10-13 06:23:45 -0700449 "nobuildbot=True",
borenetdb182c72016-09-30 12:53:12 -0700450 fmt.Sprintf("swarm_out_dir=%s", specs.PLACEHOLDER_ISOLATED_OUTDIR),
451 fmt.Sprintf("revision=%s", specs.PLACEHOLDER_REVISION),
borenet98b2e7a2016-10-13 06:23:45 -0700452 fmt.Sprintf("patch_storage=%s", specs.PLACEHOLDER_PATCH_STORAGE),
skia.buildbots2478c732016-11-04 14:37:26 -0400453 fmt.Sprintf("patch_issue=%s", specs.PLACEHOLDER_ISSUE),
454 fmt.Sprintf("patch_set=%s", specs.PLACEHOLDER_PATCHSET),
borenetdb182c72016-09-30 12:53:12 -0700455 },
456 Isolate: "compile_skia.isolate",
457 Priority: 0.8,
boreneted20a702016-10-20 11:04:31 -0700458 })
Eric Boren8615fe52016-12-12 14:30:12 -0500459 // All compile tasks are runnable as their own Job. Assert that the Job
460 // is listed in JOBS.
461 if !util.In(name, JOBS) {
462 glog.Fatalf("Job %q is missing from the JOBS list!", name)
463 }
borenetdb182c72016-09-30 12:53:12 -0700464 return name
465}
466
467// recreateSKPs generates a RecreateSKPs task. Returns the name of the last
468// task in the generated chain of tasks, which the Job should add as a
469// dependency.
boreneted20a702016-10-20 11:04:31 -0700470func recreateSKPs(b *specs.TasksCfgBuilder, name string) string {
Eric Boren4b254b92016-11-08 12:55:32 -0500471 b.MustAddTask(name, &specs.TaskSpec{
Eric Borenf5a90e82016-11-15 15:18:20 -0500472 CipdPackages: []*specs.CipdPackage{},
473 Dimensions: LINUX_GCE_DIMENSIONS,
474 ExecutionTimeout: 4 * time.Hour,
Eric Boren4b254b92016-11-08 12:55:32 -0500475 ExtraArgs: []string{
476 "--workdir", "../../..", "swarm_RecreateSKPs",
477 fmt.Sprintf("repository=%s", specs.PLACEHOLDER_REPO),
478 fmt.Sprintf("buildername=%s", name),
479 "mastername=fake-master",
480 "buildnumber=2",
481 "slavename=fake-buildslave",
482 "nobuildbot=True",
483 fmt.Sprintf("swarm_out_dir=%s", specs.PLACEHOLDER_ISOLATED_OUTDIR),
484 fmt.Sprintf("revision=%s", specs.PLACEHOLDER_REVISION),
485 fmt.Sprintf("patch_storage=%s", specs.PLACEHOLDER_PATCH_STORAGE),
486 fmt.Sprintf("patch_issue=%s", specs.PLACEHOLDER_ISSUE),
487 fmt.Sprintf("patch_set=%s", specs.PLACEHOLDER_PATCHSET),
488 },
Eric Borenf5a90e82016-11-15 15:18:20 -0500489 IoTimeout: 40 * time.Minute,
490 Isolate: "compile_skia.isolate",
491 Priority: 0.8,
Eric Boren4b254b92016-11-08 12:55:32 -0500492 })
borenetdb182c72016-09-30 12:53:12 -0700493 return name
494}
495
496// ctSKPs generates a CT SKPs task. Returns the name of the last task in the
497// generated chain of tasks, which the Job should add as a dependency.
boreneted20a702016-10-20 11:04:31 -0700498func ctSKPs(b *specs.TasksCfgBuilder, name string) string {
Eric Boren4b254b92016-11-08 12:55:32 -0500499 b.MustAddTask(name, &specs.TaskSpec{
500 CipdPackages: []*specs.CipdPackage{},
501 Dimensions: []string{"pool:SkiaCT"},
502 ExecutionTimeout: 24 * time.Hour,
503 ExtraArgs: []string{
504 "--workdir", "../../..", "swarm_ct_skps",
505 fmt.Sprintf("repository=%s", specs.PLACEHOLDER_REPO),
506 fmt.Sprintf("buildername=%s", name),
507 "mastername=fake-master",
508 "buildnumber=2",
509 "slavename=fake-buildslave",
510 "nobuildbot=True",
511 fmt.Sprintf("swarm_out_dir=%s", specs.PLACEHOLDER_ISOLATED_OUTDIR),
512 fmt.Sprintf("revision=%s", specs.PLACEHOLDER_REVISION),
513 fmt.Sprintf("patch_storage=%s", specs.PLACEHOLDER_PATCH_STORAGE),
514 fmt.Sprintf("patch_issue=%s", specs.PLACEHOLDER_ISSUE),
515 fmt.Sprintf("patch_set=%s", specs.PLACEHOLDER_PATCHSET),
516 },
517 IoTimeout: time.Hour,
518 Isolate: "ct_skps_skia.isolate",
519 Priority: 0.8,
520 })
borenetdb182c72016-09-30 12:53:12 -0700521 return name
522}
523
524// housekeeper generates a Housekeeper task. Returns the name of the last task
525// in the generated chain of tasks, which the Job should add as a dependency.
boreneted20a702016-10-20 11:04:31 -0700526func housekeeper(b *specs.TasksCfgBuilder, name, compileTaskName string) string {
Eric Boren4b254b92016-11-08 12:55:32 -0500527 b.MustAddTask(name, &specs.TaskSpec{
Eric Boren22f5ef72016-12-02 11:01:33 -0500528 CipdPackages: []*specs.CipdPackage{b.MustGetCipdPackageFromAsset("go")},
Eric Boren4b254b92016-11-08 12:55:32 -0500529 Dependencies: []string{compileTaskName},
530 Dimensions: LINUX_GCE_DIMENSIONS,
531 ExtraArgs: []string{
532 "--workdir", "../../..", "swarm_housekeeper",
533 fmt.Sprintf("repository=%s", specs.PLACEHOLDER_REPO),
534 fmt.Sprintf("buildername=%s", name),
535 "mastername=fake-master",
536 "buildnumber=2",
537 "slavename=fake-buildslave",
538 "nobuildbot=True",
539 fmt.Sprintf("swarm_out_dir=%s", specs.PLACEHOLDER_ISOLATED_OUTDIR),
540 fmt.Sprintf("revision=%s", specs.PLACEHOLDER_REVISION),
541 fmt.Sprintf("patch_storage=%s", specs.PLACEHOLDER_PATCH_STORAGE),
542 fmt.Sprintf("patch_issue=%s", specs.PLACEHOLDER_ISSUE),
543 fmt.Sprintf("patch_set=%s", specs.PLACEHOLDER_PATCHSET),
544 },
545 Isolate: "housekeeper_skia.isolate",
546 Priority: 0.8,
547 })
borenetdb182c72016-09-30 12:53:12 -0700548 return name
549}
550
borenet2dbbfa52016-10-14 06:32:09 -0700551// infra generates an infra_tests task. Returns the name of the last task in the
552// generated chain of tasks, which the Job should add as a dependency.
boreneted20a702016-10-20 11:04:31 -0700553func infra(b *specs.TasksCfgBuilder, name string) string {
554 b.MustAddTask(name, &specs.TaskSpec{
borenet2dbbfa52016-10-14 06:32:09 -0700555 CipdPackages: []*specs.CipdPackage{},
Eric Boren4b254b92016-11-08 12:55:32 -0500556 Dimensions: LINUX_GCE_DIMENSIONS,
borenet2dbbfa52016-10-14 06:32:09 -0700557 ExtraArgs: []string{
558 "--workdir", "../../..", "swarm_infra",
skia.buildbots2478c732016-11-04 14:37:26 -0400559 fmt.Sprintf("repository=%s", specs.PLACEHOLDER_REPO),
borenet2dbbfa52016-10-14 06:32:09 -0700560 fmt.Sprintf("buildername=%s", name),
561 "mastername=fake-master",
562 "buildnumber=2",
563 "slavename=fake-buildslave",
564 "nobuildbot=True",
565 fmt.Sprintf("swarm_out_dir=%s", specs.PLACEHOLDER_ISOLATED_OUTDIR),
566 fmt.Sprintf("revision=%s", specs.PLACEHOLDER_REVISION),
567 fmt.Sprintf("patch_storage=%s", specs.PLACEHOLDER_PATCH_STORAGE),
skia.buildbots2478c732016-11-04 14:37:26 -0400568 fmt.Sprintf("patch_issue=%s", specs.PLACEHOLDER_ISSUE),
569 fmt.Sprintf("patch_set=%s", specs.PLACEHOLDER_PATCHSET),
borenet2dbbfa52016-10-14 06:32:09 -0700570 },
571 Isolate: "infra_skia.isolate",
572 Priority: 0.8,
boreneted20a702016-10-20 11:04:31 -0700573 })
borenet2dbbfa52016-10-14 06:32:09 -0700574 return name
575}
576
borenetdb182c72016-09-30 12:53:12 -0700577// doUpload indicates whether the given Job should upload its results.
578func doUpload(name string) bool {
579 skipUploadBots := []string{
580 "ASAN",
581 "Coverage",
582 "MSAN",
583 "TSAN",
584 "UBSAN",
585 "Valgrind",
586 }
587 for _, s := range skipUploadBots {
588 if strings.Contains(name, s) {
589 return false
590 }
591 }
592 return true
593}
594
595// test generates a Test task. Returns the name of the last task in the
596// generated chain of tasks, which the Job should add as a dependency.
boreneted20a702016-10-20 11:04:31 -0700597func test(b *specs.TasksCfgBuilder, name string, parts map[string]string, compileTaskName string, pkgs []*specs.CipdPackage) string {
Eric Boren4b254b92016-11-08 12:55:32 -0500598 s := &specs.TaskSpec{
Eric Boren1f2f64b2016-11-09 18:35:15 -0500599 CipdPackages: pkgs,
600 Dependencies: []string{compileTaskName},
601 Dimensions: swarmDimensions(parts),
602 ExecutionTimeout: 4 * time.Hour,
603 Expiration: 20 * time.Hour,
borenetdb182c72016-09-30 12:53:12 -0700604 ExtraArgs: []string{
605 "--workdir", "../../..", "swarm_test",
skia.buildbots2478c732016-11-04 14:37:26 -0400606 fmt.Sprintf("repository=%s", specs.PLACEHOLDER_REPO),
borenetdb182c72016-09-30 12:53:12 -0700607 fmt.Sprintf("buildername=%s", name),
608 "mastername=fake-master",
609 "buildnumber=2",
610 "slavename=fake-buildslave",
borenet98b2e7a2016-10-13 06:23:45 -0700611 "nobuildbot=True",
borenetdb182c72016-09-30 12:53:12 -0700612 fmt.Sprintf("swarm_out_dir=%s", specs.PLACEHOLDER_ISOLATED_OUTDIR),
613 fmt.Sprintf("revision=%s", specs.PLACEHOLDER_REVISION),
borenet98b2e7a2016-10-13 06:23:45 -0700614 fmt.Sprintf("patch_storage=%s", specs.PLACEHOLDER_PATCH_STORAGE),
skia.buildbots2478c732016-11-04 14:37:26 -0400615 fmt.Sprintf("patch_issue=%s", specs.PLACEHOLDER_ISSUE),
616 fmt.Sprintf("patch_set=%s", specs.PLACEHOLDER_PATCHSET),
borenetdb182c72016-09-30 12:53:12 -0700617 },
Eric Boren1f2f64b2016-11-09 18:35:15 -0500618 IoTimeout: 40 * time.Minute,
619 Isolate: "test_skia.isolate",
620 Priority: 0.8,
Eric Boren4b254b92016-11-08 12:55:32 -0500621 }
622 if strings.Contains(parts["extra_config"], "Valgrind") {
623 s.ExecutionTimeout = 9 * time.Hour
624 s.Expiration = 48 * time.Hour
625 s.IoTimeout = time.Hour
626 } else if strings.Contains(parts["extra_config"], "MSAN") {
627 s.ExecutionTimeout = 9 * time.Hour
628 }
629 b.MustAddTask(name, s)
630
borenetdb182c72016-09-30 12:53:12 -0700631 // Upload results if necessary.
632 if doUpload(name) {
633 uploadName := fmt.Sprintf("%s%s%s", PREFIX_UPLOAD, jobNameSchema.Sep, name)
boreneted20a702016-10-20 11:04:31 -0700634 b.MustAddTask(uploadName, &specs.TaskSpec{
borenetdb182c72016-09-30 12:53:12 -0700635 Dependencies: []string{name},
Eric Boren4b254b92016-11-08 12:55:32 -0500636 Dimensions: LINUX_GCE_DIMENSIONS,
borenetdb182c72016-09-30 12:53:12 -0700637 ExtraArgs: []string{
638 "--workdir", "../../..", "upload_dm_results",
skia.buildbots2478c732016-11-04 14:37:26 -0400639 fmt.Sprintf("repository=%s", specs.PLACEHOLDER_REPO),
borenetdb182c72016-09-30 12:53:12 -0700640 fmt.Sprintf("buildername=%s", name),
641 "mastername=fake-master",
642 "buildnumber=2",
643 "slavename=fake-buildslave",
borenet98b2e7a2016-10-13 06:23:45 -0700644 "nobuildbot=True",
borenetdb182c72016-09-30 12:53:12 -0700645 fmt.Sprintf("swarm_out_dir=%s", specs.PLACEHOLDER_ISOLATED_OUTDIR),
646 fmt.Sprintf("revision=%s", specs.PLACEHOLDER_REVISION),
borenet98b2e7a2016-10-13 06:23:45 -0700647 fmt.Sprintf("patch_storage=%s", specs.PLACEHOLDER_PATCH_STORAGE),
skia.buildbots2478c732016-11-04 14:37:26 -0400648 fmt.Sprintf("patch_issue=%s", specs.PLACEHOLDER_ISSUE),
649 fmt.Sprintf("patch_set=%s", specs.PLACEHOLDER_PATCHSET),
borenetdb182c72016-09-30 12:53:12 -0700650 },
651 Isolate: "upload_dm_results.isolate",
652 Priority: 0.8,
boreneted20a702016-10-20 11:04:31 -0700653 })
borenetdb182c72016-09-30 12:53:12 -0700654 return uploadName
655 }
656 return name
657}
658
659// perf generates a Perf task. Returns the name of the last task in the
660// generated chain of tasks, which the Job should add as a dependency.
boreneted20a702016-10-20 11:04:31 -0700661func perf(b *specs.TasksCfgBuilder, name string, parts map[string]string, compileTaskName string, pkgs []*specs.CipdPackage) string {
Kevin Lubickb03b5ac2016-11-14 13:42:27 -0500662 recipe := "swarm_perf"
663 isolate := "perf_skia.isolate"
664 if strings.Contains(parts["extra_config"], "Skpbench") {
665 recipe = "swarm_skpbench"
666 isolate = "skpbench_skia.isolate"
667 }
Eric Boren4b254b92016-11-08 12:55:32 -0500668 s := &specs.TaskSpec{
Eric Boren1f2f64b2016-11-09 18:35:15 -0500669 CipdPackages: pkgs,
670 Dependencies: []string{compileTaskName},
671 Dimensions: swarmDimensions(parts),
672 ExecutionTimeout: 4 * time.Hour,
673 Expiration: 20 * time.Hour,
borenetdb182c72016-09-30 12:53:12 -0700674 ExtraArgs: []string{
Kevin Lubickb03b5ac2016-11-14 13:42:27 -0500675 "--workdir", "../../..", recipe,
skia.buildbots2478c732016-11-04 14:37:26 -0400676 fmt.Sprintf("repository=%s", specs.PLACEHOLDER_REPO),
borenetdb182c72016-09-30 12:53:12 -0700677 fmt.Sprintf("buildername=%s", name),
678 "mastername=fake-master",
679 "buildnumber=2",
680 "slavename=fake-buildslave",
borenet98b2e7a2016-10-13 06:23:45 -0700681 "nobuildbot=True",
borenetdb182c72016-09-30 12:53:12 -0700682 fmt.Sprintf("swarm_out_dir=%s", specs.PLACEHOLDER_ISOLATED_OUTDIR),
683 fmt.Sprintf("revision=%s", specs.PLACEHOLDER_REVISION),
borenet98b2e7a2016-10-13 06:23:45 -0700684 fmt.Sprintf("patch_storage=%s", specs.PLACEHOLDER_PATCH_STORAGE),
skia.buildbots2478c732016-11-04 14:37:26 -0400685 fmt.Sprintf("patch_issue=%s", specs.PLACEHOLDER_ISSUE),
686 fmt.Sprintf("patch_set=%s", specs.PLACEHOLDER_PATCHSET),
borenetdb182c72016-09-30 12:53:12 -0700687 },
Eric Boren1f2f64b2016-11-09 18:35:15 -0500688 IoTimeout: 40 * time.Minute,
Kevin Lubickb03b5ac2016-11-14 13:42:27 -0500689 Isolate: isolate,
Eric Boren1f2f64b2016-11-09 18:35:15 -0500690 Priority: 0.8,
Eric Boren4b254b92016-11-08 12:55:32 -0500691 }
692 if strings.Contains(parts["extra_config"], "Valgrind") {
693 s.ExecutionTimeout = 9 * time.Hour
694 s.Expiration = 48 * time.Hour
695 s.IoTimeout = time.Hour
696 } else if strings.Contains(parts["extra_config"], "MSAN") {
697 s.ExecutionTimeout = 9 * time.Hour
698 }
699 b.MustAddTask(name, s)
700
borenetdb182c72016-09-30 12:53:12 -0700701 // Upload results if necessary.
702 if strings.Contains(name, "Release") && doUpload(name) {
703 uploadName := fmt.Sprintf("%s%s%s", PREFIX_UPLOAD, jobNameSchema.Sep, name)
boreneted20a702016-10-20 11:04:31 -0700704 b.MustAddTask(uploadName, &specs.TaskSpec{
borenetdb182c72016-09-30 12:53:12 -0700705 Dependencies: []string{name},
Eric Boren4b254b92016-11-08 12:55:32 -0500706 Dimensions: LINUX_GCE_DIMENSIONS,
borenetdb182c72016-09-30 12:53:12 -0700707 ExtraArgs: []string{
708 "--workdir", "../../..", "upload_nano_results",
skia.buildbots2478c732016-11-04 14:37:26 -0400709 fmt.Sprintf("repository=%s", specs.PLACEHOLDER_REPO),
borenetdb182c72016-09-30 12:53:12 -0700710 fmt.Sprintf("buildername=%s", name),
711 "mastername=fake-master",
712 "buildnumber=2",
713 "slavename=fake-buildslave",
borenet98b2e7a2016-10-13 06:23:45 -0700714 "nobuildbot=True",
borenetdb182c72016-09-30 12:53:12 -0700715 fmt.Sprintf("swarm_out_dir=%s", specs.PLACEHOLDER_ISOLATED_OUTDIR),
716 fmt.Sprintf("revision=%s", specs.PLACEHOLDER_REVISION),
borenet98b2e7a2016-10-13 06:23:45 -0700717 fmt.Sprintf("patch_storage=%s", specs.PLACEHOLDER_PATCH_STORAGE),
skia.buildbots2478c732016-11-04 14:37:26 -0400718 fmt.Sprintf("patch_issue=%s", specs.PLACEHOLDER_ISSUE),
719 fmt.Sprintf("patch_set=%s", specs.PLACEHOLDER_PATCHSET),
borenetdb182c72016-09-30 12:53:12 -0700720 },
721 Isolate: "upload_nano_results.isolate",
722 Priority: 0.8,
boreneted20a702016-10-20 11:04:31 -0700723 })
borenetdb182c72016-09-30 12:53:12 -0700724 return uploadName
725 }
726 return name
727}
728
729// process generates tasks and jobs for the given job name.
boreneted20a702016-10-20 11:04:31 -0700730func process(b *specs.TasksCfgBuilder, name string) {
borenetdb182c72016-09-30 12:53:12 -0700731 deps := []string{}
732
733 parts, err := jobNameSchema.ParseJobName(name)
734 if err != nil {
735 glog.Fatal(err)
736 }
737
738 // RecreateSKPs.
739 if strings.Contains(name, "RecreateSKPs") {
boreneted20a702016-10-20 11:04:31 -0700740 deps = append(deps, recreateSKPs(b, name))
borenetdb182c72016-09-30 12:53:12 -0700741 }
742
743 // CT bots.
744 if strings.Contains(name, "-CT_") {
boreneted20a702016-10-20 11:04:31 -0700745 deps = append(deps, ctSKPs(b, name))
borenetdb182c72016-09-30 12:53:12 -0700746 }
747
borenet2dbbfa52016-10-14 06:32:09 -0700748 // Infra tests.
749 if name == "Housekeeper-PerCommit-InfraTests" {
boreneted20a702016-10-20 11:04:31 -0700750 deps = append(deps, infra(b, name))
borenet2dbbfa52016-10-14 06:32:09 -0700751 }
752
borenetdb182c72016-09-30 12:53:12 -0700753 // Compile bots.
754 if parts["role"] == "Build" {
boreneted20a702016-10-20 11:04:31 -0700755 deps = append(deps, compile(b, name, parts))
borenetdb182c72016-09-30 12:53:12 -0700756 }
757
Eric Borenf5a90e82016-11-15 15:18:20 -0500758 // Most remaining bots need a compile task.
borenetdb182c72016-09-30 12:53:12 -0700759 compileTaskName := deriveCompileTaskName(name, parts)
borenet52383432016-10-17 10:17:53 -0700760 compileTaskParts, err := jobNameSchema.ParseJobName(compileTaskName)
761 if err != nil {
762 glog.Fatal(err)
763 }
Eric Boren628e78b2016-11-17 11:33:27 -0500764 // These bots do not need a compile task.
Eric Borenf5a90e82016-11-15 15:18:20 -0500765 if parts["role"] != "Build" &&
766 name != "Housekeeper-PerCommit-InfraTests" &&
Eric Boren71b762f2016-11-30 14:05:16 -0500767 !strings.Contains(name, "RecreateSKPs") &&
768 !strings.Contains(name, "-CT_") {
boreneted20a702016-10-20 11:04:31 -0700769 compile(b, compileTaskName, compileTaskParts)
borenet52383432016-10-17 10:17:53 -0700770 }
borenetdb182c72016-09-30 12:53:12 -0700771
772 // Housekeeper.
Eric Boren22f5ef72016-12-02 11:01:33 -0500773 if name == "Housekeeper-PerCommit" {
boreneted20a702016-10-20 11:04:31 -0700774 deps = append(deps, housekeeper(b, name, compileTaskName))
borenetdb182c72016-09-30 12:53:12 -0700775 }
776
777 // Common assets needed by the remaining bots.
778 pkgs := []*specs.CipdPackage{
boreneted20a702016-10-20 11:04:31 -0700779 b.MustGetCipdPackageFromAsset("skimage"),
780 b.MustGetCipdPackageFromAsset("skp"),
781 b.MustGetCipdPackageFromAsset("svg"),
borenetdb182c72016-09-30 12:53:12 -0700782 }
Eric Boren4b254b92016-11-08 12:55:32 -0500783 if strings.Contains(name, "Ubuntu") && strings.Contains(name, "SAN") {
784 pkgs = append(pkgs, b.MustGetCipdPackageFromAsset("clang_linux"))
785 }
Kevin Lubickb03b5ac2016-11-14 13:42:27 -0500786 // Skpbench only needs skps
787 if strings.Contains(name, "Skpbench") {
788 pkgs = []*specs.CipdPackage{
789 b.MustGetCipdPackageFromAsset("skp"),
790 }
791 }
borenetdb182c72016-09-30 12:53:12 -0700792
793 // Test bots.
Eric Boren71b762f2016-11-30 14:05:16 -0500794 if parts["role"] == "Test" && !strings.Contains(name, "-CT_") {
boreneted20a702016-10-20 11:04:31 -0700795 deps = append(deps, test(b, name, parts, compileTaskName, pkgs))
borenetdb182c72016-09-30 12:53:12 -0700796 }
797
798 // Perf bots.
Eric Boren71b762f2016-11-30 14:05:16 -0500799 if parts["role"] == "Perf" && !strings.Contains(name, "-CT_") {
boreneted20a702016-10-20 11:04:31 -0700800 deps = append(deps, perf(b, name, parts, compileTaskName, pkgs))
borenetdb182c72016-09-30 12:53:12 -0700801 }
802
803 // Add the Job spec.
Eric Borenf5a90e82016-11-15 15:18:20 -0500804 j := &specs.JobSpec{
borenetdb182c72016-09-30 12:53:12 -0700805 Priority: 0.8,
806 TaskSpecs: deps,
Eric Borenf5a90e82016-11-15 15:18:20 -0500807 }
808 if name == "Housekeeper-Nightly-RecreateSKPs_Canary" {
809 j.Trigger = "nightly"
810 }
811 if name == "Housekeeper-Weekly-RecreateSKPs" {
812 j.Trigger = "weekly"
813 }
Eric Boren71b762f2016-11-30 14:05:16 -0500814 if name == "Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-CT_DM_1m_SKPs" {
815 j.Trigger = "weekly"
816 }
Eric Boren8615fe52016-12-12 14:30:12 -0500817 b.MustAddJob(name, j)
borenetdb182c72016-09-30 12:53:12 -0700818}
819
borenetdb182c72016-09-30 12:53:12 -0700820// Regenerate the tasks.json file.
821func main() {
boreneted20a702016-10-20 11:04:31 -0700822 b := specs.MustNewTasksCfgBuilder()
borenetdb182c72016-09-30 12:53:12 -0700823 // Create the JobNameSchema.
boreneted20a702016-10-20 11:04:31 -0700824 schema, err := NewJobNameSchema(path.Join(b.CheckoutRoot(), "infra", "bots", "recipe_modules", "builder_name_schema", "builder_name_schema.json"))
borenetdb182c72016-09-30 12:53:12 -0700825 if err != nil {
826 glog.Fatal(err)
827 }
828 jobNameSchema = schema
829
borenetdb182c72016-09-30 12:53:12 -0700830 // Create Tasks and Jobs.
boreneted20a702016-10-20 11:04:31 -0700831 for _, name := range JOBS {
832 process(b, name)
borenetdb182c72016-09-30 12:53:12 -0700833 }
834
boreneted20a702016-10-20 11:04:31 -0700835 b.MustFinish()
borenetdb182c72016-09-30 12:53:12 -0700836}
837
838// TODO(borenet): The below really belongs in its own file, probably next to the
839// builder_name_schema.json file.
840
841// JobNameSchema is a struct used for (de)constructing Job names in a
842// predictable format.
843type JobNameSchema struct {
844 Schema map[string][]string `json:"builder_name_schema"`
845 Sep string `json:"builder_name_sep"`
846}
847
848// NewJobNameSchema returns a JobNameSchema instance based on the given JSON
849// file.
850func NewJobNameSchema(jsonFile string) (*JobNameSchema, error) {
851 var rv JobNameSchema
852 f, err := os.Open(jsonFile)
853 if err != nil {
854 return nil, err
855 }
856 defer util.Close(f)
857 if err := json.NewDecoder(f).Decode(&rv); err != nil {
858 return nil, err
859 }
860 return &rv, nil
861}
862
863// ParseJobName splits the given Job name into its component parts, according
864// to the schema.
865func (s *JobNameSchema) ParseJobName(n string) (map[string]string, error) {
866 split := strings.Split(n, s.Sep)
867 if len(split) < 2 {
868 return nil, fmt.Errorf("Invalid job name: %q", n)
869 }
870 role := split[0]
871 split = split[1:]
872 keys, ok := s.Schema[role]
873 if !ok {
874 return nil, fmt.Errorf("Invalid job name; %q is not a valid role.", role)
875 }
876 extraConfig := ""
877 if len(split) == len(keys)+1 {
878 extraConfig = split[len(split)-1]
879 split = split[:len(split)-1]
880 }
881 if len(split) != len(keys) {
882 return nil, fmt.Errorf("Invalid job name; %q has incorrect number of parts.", n)
883 }
884 rv := make(map[string]string, len(keys)+2)
885 rv["role"] = role
886 if extraConfig != "" {
887 rv["extra_config"] = extraConfig
888 }
889 for i, k := range keys {
890 rv[k] = split[i]
891 }
892 return rv, nil
893}
894
895// MakeJobName assembles the given parts of a Job name, according to the schema.
896func (s *JobNameSchema) MakeJobName(parts map[string]string) (string, error) {
897 role, ok := parts["role"]
898 if !ok {
899 return "", fmt.Errorf("Invalid job parts; jobs must have a role.")
900 }
901 keys, ok := s.Schema[role]
902 if !ok {
903 return "", fmt.Errorf("Invalid job parts; unknown role %q", role)
904 }
905 rvParts := make([]string, 0, len(parts))
906 rvParts = append(rvParts, role)
907 for _, k := range keys {
908 v, ok := parts[k]
909 if !ok {
910 return "", fmt.Errorf("Invalid job parts; missing %q", k)
911 }
912 rvParts = append(rvParts, v)
913 }
914 if _, ok := parts["extra_config"]; ok {
915 rvParts = append(rvParts, parts["extra_config"])
916 }
917 return strings.Join(rvParts, s.Sep), nil
918}