Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 1 | import org.apache.tools.ant.filters.ReplaceTokens |
| 2 | import com.google.cloud.tools.gradle.appengine.core.DeployTask |
| 3 | |
| 4 | buildscript { |
| 5 | ext { |
| 6 | springBootVersion = '1.5.13.RELEASE' |
| 7 | objectifyVersion = '6.0' |
Young Gyu Park | ef1bbb9 | 2018-10-16 17:46:08 +0900 | [diff] [blame] | 8 | jacksonVersion = '2.9.7' |
Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 9 | googleCloudVersion = '0.47.0-alpha' |
Young Gyu Park | cfe2ba5 | 2018-09-27 18:16:19 +0900 | [diff] [blame] | 10 | googleJavaFormatVersion = '0.7.1' |
Young Gyu Park | ef1bbb9 | 2018-10-16 17:46:08 +0900 | [diff] [blame] | 11 | googleHttpClientVersion = '1.25.0' |
Young Gyu Park | e965ffb | 2018-12-04 15:55:04 +0900 | [diff] [blame] | 12 | lombokVersion = '1.18.4' |
Young Gyu Park | cfe2ba5 | 2018-09-27 18:16:19 +0900 | [diff] [blame] | 13 | appGradlePluginVersion = '2.0.0-rc3' |
Young Gyu Park | eaab6af | 2018-12-06 17:14:07 +0900 | [diff] [blame] | 14 | protobufGradlePlugin = '0.8.7' |
Young Gyu Park | ef1bbb9 | 2018-10-16 17:46:08 +0900 | [diff] [blame] | 15 | googleSheetsAPI = 'v4-rev548-1.25.0' |
Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 16 | } |
| 17 | repositories { |
| 18 | jcenter() |
| 19 | mavenCentral() |
| 20 | maven { |
Young Gyu Park | cfe2ba5 | 2018-09-27 18:16:19 +0900 | [diff] [blame] | 21 | url "https://plugins.gradle.org/m2/" |
| 22 | } |
| 23 | maven { |
Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 24 | url 'https://oss.sonatype.org/content/repositories/snapshots/' |
| 25 | } |
| 26 | } |
| 27 | dependencies { |
Young Gyu Park | 021de0e | 2018-07-23 11:12:04 +0900 | [diff] [blame] | 28 | classpath "com.google.cloud.tools:appengine-gradle-plugin:${appGradlePluginVersion}" // latest App Engine Gradle tasks |
Young Gyu Park | eaab6af | 2018-12-06 17:14:07 +0900 | [diff] [blame] | 29 | classpath "com.google.protobuf:protobuf-gradle-plugin:${protobufGradlePlugin}" |
Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 30 | classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}" |
Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 31 | } |
| 32 | } |
| 33 | |
Young Gyu Park | cfe2ba5 | 2018-09-27 18:16:19 +0900 | [diff] [blame] | 34 | plugins { |
| 35 | id 'war' // standard Web Archive plugin |
| 36 | id "com.github.sherter.google-java-format" version "0.7.1" |
| 37 | } |
| 38 | |
Young Gyu Park | eaab6af | 2018-12-06 17:14:07 +0900 | [diff] [blame] | 39 | apply plugin: 'com.google.protobuf' |
Young Gyu Park | cfe2ba5 | 2018-09-27 18:16:19 +0900 | [diff] [blame] | 40 | apply plugin: 'com.google.cloud.tools.appengine-standard' // App Engine tasks |
| 41 | |
Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 42 | apply from: rootProject.file('gradle/profiles.gradle') |
| 43 | |
| 44 | group = 'com.android.vts' |
| 45 | version = '4' |
Young Gyu Park | cfe2ba5 | 2018-09-27 18:16:19 +0900 | [diff] [blame] | 46 | description = "Google Android VTS dashboard" |
Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 47 | |
| 48 | sourceCompatibility = 1.8 |
| 49 | targetCompatibility = 1.8 |
| 50 | |
| 51 | |
| 52 | repositories { |
| 53 | maven { |
| 54 | url 'https://oss.sonatype.org/content/repositories/snapshots' // SNAPSHOT repository (if needed) |
| 55 | } |
| 56 | mavenCentral() |
| 57 | jcenter() |
| 58 | } |
| 59 | |
| 60 | dependencies { |
| 61 | compile 'com.google.appengine:appengine-api-1.0-sdk:+' // Latest App Engine Api's |
| 62 | providedCompile 'javax.servlet:javax.servlet-api:3.1.0' |
| 63 | |
| 64 | compile 'jstl:jstl:1.2' |
| 65 | |
Young Gyu Park | 8558606 | 2018-08-21 16:25:41 +0900 | [diff] [blame] | 66 | compile group: 'org.apache.commons', name: 'commons-lang3', version:'3.7' |
Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 67 | compile group: 'org.apache.commons', name: 'commons-math3', version:'3.6.1' |
| 68 | compile group: 'commons-codec', name: 'commons-codec', version:'1.9' |
| 69 | compile group: 'com.google.cloud', name: 'google-cloud', version: "${googleCloudVersion}" |
| 70 | compile group: 'com.google.code.gson', name: 'gson', version:'2.7' |
| 71 | compile group: 'com.googlecode.objectify', name: 'objectify', version: "${objectifyVersion}" |
| 72 | compile group: 'org.json', name: 'json', version:'20180130' |
Young Gyu Park | ef1bbb9 | 2018-10-16 17:46:08 +0900 | [diff] [blame] | 73 | compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: "${jacksonVersion}" |
| 74 | compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: "${jacksonVersion}" |
| 75 | compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: "${jacksonVersion}" |
| 76 | |
Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 77 | compile group: 'com.google.apis', name: 'google-api-services-oauth2', version:'v1-rev136-1.23.0' |
Young Gyu Park | c0204c1 | 2018-06-26 11:36:17 +0900 | [diff] [blame] | 78 | compile group: 'com.google.http-client', name: 'google-http-client', version: "${googleHttpClientVersion}" |
| 79 | compile group: 'com.google.http-client', name: 'google-http-client-protobuf', version: "${googleHttpClientVersion}" |
| 80 | compile group: 'com.google.visualization', name: 'visualization-datasource', version:'1.1.1' |
Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 81 | |
Young Gyu Park | 82a17c3 | 2018-10-22 10:55:32 +0900 | [diff] [blame] | 82 | compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.11.1' |
| 83 | |
Young Gyu Park | ef1bbb9 | 2018-10-16 17:46:08 +0900 | [diff] [blame] | 84 | compile(group: 'com.google.api-client', name: 'google-api-client', version: "${googleHttpClientVersion}") { |
| 85 | exclude(module: 'guava-jdk5') |
| 86 | } |
| 87 | compile group: 'com.google.oauth-client', name: 'google-oauth-client-jetty', version: "${googleHttpClientVersion}" |
| 88 | compile group: 'com.google.apis', name: 'google-api-services-sheets', version: "${googleSheetsAPI}" |
| 89 | |
Young Gyu Park | 8558606 | 2018-08-21 16:25:41 +0900 | [diff] [blame] | 90 | testCompile group: 'junit', name: 'junit', version: '4.12' |
| 91 | testCompile group: 'org.mockito', name: 'mockito-core', version: '2.21.0' |
Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 92 | testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version:'5.0.3' |
| 93 | |
| 94 | testCompile 'com.google.appengine:appengine-testing:+' |
| 95 | testCompile 'com.google.appengine:appengine-api-stubs:+' |
| 96 | testCompile 'com.google.appengine:appengine-tools-sdk:+' |
| 97 | |
Young Gyu Park | eaab6af | 2018-12-06 17:14:07 +0900 | [diff] [blame] | 98 | compile group: 'org.projectlombok', name: 'lombok', version: "${lombokVersion}" |
Young Gyu Park | e965ffb | 2018-12-04 15:55:04 +0900 | [diff] [blame] | 99 | annotationProcessor group: 'org.projectlombok', name: 'lombok', version: "${lombokVersion}" |
Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 100 | } |
| 101 | |
| 102 | // Always run unit tests |
| 103 | appengineDeploy.dependsOn test |
| 104 | appengineStage.dependsOn test |
| 105 | |
| 106 | googleJavaFormat { |
| 107 | toolVersion = '1.6' |
| 108 | options style: 'AOSP' |
| 109 | source = sourceSets*.allJava |
| 110 | include '**/*.java' |
| 111 | exclude '**/*Template.java' |
| 112 | exclude 'src/test/template_*' |
| 113 | } |
| 114 | |
Young Gyu Park | eaab6af | 2018-12-06 17:14:07 +0900 | [diff] [blame] | 115 | sourceSets { |
| 116 | main { |
| 117 | proto { |
| 118 | srcDir '../test_serving/proto' |
| 119 | include 'TestScheduleConfigMessage.proto' |
| 120 | } |
| 121 | java { |
| 122 | srcDir 'src/main/java' |
| 123 | } |
| 124 | } |
| 125 | } |
| 126 | |
| 127 | protobuf { |
| 128 | generateProtoTasks { |
| 129 | ofSourceSet('main').each { task -> |
| 130 | task.builtins { |
| 131 | python { |
| 132 | outputSubDir = 'python' |
| 133 | } |
| 134 | java { |
| 135 | outputSubDir = 'java' |
| 136 | } |
| 137 | } |
| 138 | } |
| 139 | } |
| 140 | } |
| 141 | |
Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 142 | appengine { // App Engine tasks configuration |
Young Gyu Park | cfe2ba5 | 2018-09-27 18:16:19 +0900 | [diff] [blame] | 143 | tools { |
| 144 | // configure the Cloud Sdk tooling |
| 145 | } |
| 146 | |
Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 147 | run { |
| 148 | environment = [ |
| 149 | GOOGLE_CLOUD_PROJECT: "android-vts-staging", |
| 150 | // DATASTORE_USE_PROJECT_ID_AS_APP_ID: "true", |
| 151 | ] |
| 152 | port = 8080 |
| 153 | jvmFlags = [ |
| 154 | "-Xdebug", |
Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 155 | "-Dappengine.fullscan.seconds=5" |
| 156 | ] |
| 157 | } |
Young Gyu Park | cfe2ba5 | 2018-09-27 18:16:19 +0900 | [diff] [blame] | 158 | stage { |
| 159 | // configure staging for deployment |
| 160 | } |
Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 161 | deploy { // deploy configuration |
Young Gyu Park | cfe2ba5 | 2018-09-27 18:16:19 +0900 | [diff] [blame] | 162 | version = project.property("appEngineVersion") |
| 163 | projectId = project.property("projectIdList") |
Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 164 | |
| 165 | } |
| 166 | } |
| 167 | |
| 168 | test { |
| 169 | useJUnit() |
| 170 | testLogging.showStandardStreams = true |
| 171 | beforeTest { descriptor -> |
| 172 | logger.lifecycle("test: " + descriptor + " Running") |
| 173 | } |
| 174 | |
| 175 | onOutput { descriptor, event -> |
| 176 | logger.lifecycle("test: " + descriptor + ": " + event.message ) |
| 177 | } |
| 178 | afterTest { descriptor, result -> |
| 179 | logger.lifecycle("test: " + descriptor + ": " + result ) |
| 180 | } |
| 181 | } |
| 182 | |
Young Gyu Park | eaab6af | 2018-12-06 17:14:07 +0900 | [diff] [blame] | 183 | tasks.whenTaskAdded { task -> |
| 184 | if (task.name =~ /generate.*Proto/) { |
| 185 | task.finalizedBy(copyGeneratedProtoFiles) |
| 186 | } |
| 187 | } |
| 188 | |
| 189 | task copyGeneratedProtoFiles(type: Copy) { |
| 190 | into(projectDir) |
| 191 | |
| 192 | from("build/generated/source/proto/main/java") { |
| 193 | into "src/main/java" |
| 194 | } |
| 195 | from("build/generated/source/proto/main/python") { |
| 196 | into "python" |
| 197 | } |
| 198 | } |
| 199 | |
Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 200 | |
| 201 | tasks.addRule("Pattern: vtsGaeDeploy<ID>") { String taskName -> |
| 202 | if (taskName.startsWith("vtsGaeDeploy-")) { |
| 203 | |
| 204 | def projectId = taskName.replace("vtsGaeDeploy-", "") |
Young Gyu Park | 021de0e | 2018-07-23 11:12:04 +0900 | [diff] [blame] | 205 | def version = project.property("appEngineVersion") |
| 206 | |
Young Gyu Park | cfe2ba5 | 2018-09-27 18:16:19 +0900 | [diff] [blame] | 207 | def appengineWebCopy = tasks.create(name: "appengineWebCopy-${projectId}", type: Copy) { |
| 208 | from "${webAppDirName}/WEB-INF/appengine-web.xml" |
| 209 | into "${appengine.stage.sourceDirectory}/WEB-INF" |
| 210 | filter(ReplaceTokens, tokens: [PROJECT_ID: projectId]) |
| 211 | } |
| 212 | appengineWebCopy.dependsOn appengineStage |
| 213 | appengineWebCopy.mustRunAfter appengineStage |
Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 214 | |
Young Gyu Park | cfe2ba5 | 2018-09-27 18:16:19 +0900 | [diff] [blame] | 215 | def gcsConfigCopy = task("gcsConfigCopy-${projectId}") { |
Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 216 | doFirst { |
| 217 | println "============ resource folder processing ============" |
| 218 | |
| 219 | if (project.loadConfigFromGcs.toBoolean()) { |
| 220 | exec { |
| 221 | println "The resources folder will be copied from GCS!" |
| 222 | commandLine "gsutil", |
| 223 | "cp", |
| 224 | "-R", |
| 225 | "${project.gcsConfigPath}${project.mode}/dashboard/${projectId}/resources/*", |
| 226 | "$appengine.stage.stagingDirectory/WEB-INF/classes" |
| 227 | } |
| 228 | } else { |
| 229 | println "The local resource folder will be used!" |
| 230 | } |
| 231 | } |
| 232 | |
| 233 | doLast { |
Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 234 | |
Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 235 | } |
| 236 | } |
Young Gyu Park | cfe2ba5 | 2018-09-27 18:16:19 +0900 | [diff] [blame] | 237 | gcsConfigCopy.dependsOn appengineWebCopy |
| 238 | gcsConfigCopy.mustRunAfter appengineWebCopy |
Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 239 | |
Young Gyu Park | cfe2ba5 | 2018-09-27 18:16:19 +0900 | [diff] [blame] | 240 | def deployTaskList = [appengineDeploy] |
Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 241 | |
| 242 | def vtsGaeDeployTask = task(taskName) { |
| 243 | |
| 244 | doFirst { |
Young Gyu Park | cfe2ba5 | 2018-09-27 18:16:19 +0900 | [diff] [blame] | 245 | println "--------------> setup deploying tasks <-------------" |
Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 246 | } |
| 247 | |
| 248 | doLast { |
Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 249 | def commandKeyList = [ |
| 250 | 'enableAppengineDeployCron': appengineDeployCron, |
| 251 | 'enableAppengineDeployDispatch': appengineDeployDispatch, |
| 252 | 'enableAppengineDeployDos': appengineDeployDos, |
| 253 | 'enableAppengineDeployIndex': appengineDeployIndex, |
| 254 | 'enableAppengineDeployQueue': appengineDeployQueue |
| 255 | ] |
| 256 | |
| 257 | commandKeyList.each { key, value -> |
| 258 | if (project.hasProperty(key) && project.getProperty(key).toBoolean()) { |
Young Gyu Park | cfe2ba5 | 2018-09-27 18:16:19 +0900 | [diff] [blame] | 259 | deployTaskList.push(value) |
Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 260 | } |
| 261 | } |
| 262 | } |
| 263 | } |
| 264 | |
Young Gyu Park | cfe2ba5 | 2018-09-27 18:16:19 +0900 | [diff] [blame] | 265 | vtsGaeDeployTask.dependsOn gcsConfigCopy |
| 266 | vtsGaeDeployTask.mustRunAfter gcsConfigCopy |
| 267 | vtsGaeDeployTask.finalizedBy deployTaskList |
Young Gyu Park | 3ff7fcf | 2018-05-29 19:07:27 +0900 | [diff] [blame] | 268 | } |
| 269 | } |
| 270 | |
| 271 | task vtsGaeMultiDeploy { |
| 272 | dependsOn { |
| 273 | def taskList = [] |
| 274 | def projectIdList = project.property("projectIdList") |
| 275 | projectIdList.split(",").each { projectId -> |
| 276 | taskList.push(tasks.findByName("vtsGaeDeploy-${projectId.trim()}".toString())) |
| 277 | } |
| 278 | return taskList |
| 279 | } |
| 280 | } |