build.gradle 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. import com.bmuschko.gradle.docker.tasks.image.DockerBuildImage
  2. import com.bmuschko.gradle.docker.tasks.image.DockerPushImage
  3. plugins {
  4. id "com.bmuschko.docker-remote-api" version "6.7.0"
  5. }
  6. def buildLinuxTestImagesTask = tasks.create("buildLinuxTestImages") {
  7. group = "build"
  8. description = "Builds all Linux Docker images for the test matrix"
  9. }
  10. def buildWindowsTestImagesTask = tasks.create("buildWindowsTestImages") {
  11. group = "build"
  12. description = "Builds all Windows Docker images for the test matrix"
  13. }
  14. ext {
  15. matrix = []
  16. }
  17. tasks.create("pushMatrix", DockerPushImage) {
  18. group = "publishing"
  19. description = "Push all Docker images for the test matrix"
  20. images.set(project.ext.matrix)
  21. }
  22. // Each line under appserver describes one matrix of (version x vm x jdk), dockerfile key overrides
  23. // Dockerfile name, args key passes raw arguments to docker build
  24. def targets = [
  25. "jetty" : [
  26. [version: ["9.4.39"], vm: ["hotspot"], jdk: ["8", "11", "17"], args: [sourceVersion: "9.4.39.v20210325"]],
  27. [version: ["9.4.39"], vm: ["openj9"], jdk: ["8", "11", "16"], args: [sourceVersion: "9.4.39.v20210325"]],
  28. [version: ["10.0.7"], vm: ["hotspot"], jdk: ["11", "17"], args: [sourceVersion: "10.0.7"]],
  29. [version: ["10.0.7"], vm: ["openj9"], jdk: ["11", "16"], args: [sourceVersion: "10.0.7"]],
  30. [version: ["11.0.7"], vm: ["hotspot"], jdk: ["11", "17"], args: [sourceVersion: "11.0.7"], war: "servlet-5.0"],
  31. [version: ["11.0.7"], vm: ["openj9"], jdk: ["11", "16"], args: [sourceVersion: "11.0.7"], war: "servlet-5.0"]
  32. ],
  33. "tomcat" : [
  34. [version: ["7.0.109"], vm: ["hotspot", "openj9"], jdk: ["8"], args: [majorVersion: "7"]],
  35. [version: ["8.5.71"], vm: ["hotspot"], jdk: ["8", "11", "17"], args: [majorVersion: "8"]],
  36. [version: ["8.5.71"], vm: ["openj9"], jdk: ["8", "11"], args: [majorVersion: "8"]],
  37. [version: ["9.0.53"], vm: ["hotspot"], jdk: ["8", "11", "17"], args: [majorVersion: "9"]],
  38. [version: ["9.0.53"], vm: ["openj9"], jdk: ["8", "11"], args: [majorVersion: "9"]],
  39. [version: ["10.0.11"], vm: ["hotspot"], jdk: ["8", "11", "17"], args: [majorVersion: "10"], war: "servlet-5.0"],
  40. [version: ["10.0.11"], vm: ["openj9"], jdk: ["8", "11"], args: [majorVersion: "10"], war: "servlet-5.0"]
  41. ],
  42. "tomee" : [
  43. [version: ["7.0.9"], vm: ["hotspot", "openj9"], jdk: ["8"]],
  44. [version: ["7.1.4"], vm: ["hotspot", "openj9"], jdk: ["8"]],
  45. [version: ["8.0.8"], vm: ["hotspot"], jdk: ["8", "11", "17"]],
  46. [version: ["8.0.8"], vm: ["openj9"], jdk: ["8", "11", "16"]],
  47. [version: ["9.0.0-M7"], vm: ["hotspot"], jdk: ["8", "11", "17"], war: "servlet-5.0"],
  48. [version: ["9.0.0-M7"], vm: ["openj9"], jdk: ["8", "11", "16"], war: "servlet-5.0"]
  49. ],
  50. "payara" : [
  51. [version: ["5.2020.6"], vm: ["hotspot", "openj9"], jdk: ["8", "11"]]
  52. ],
  53. "wildfly": [
  54. [version: ["13.0.0.Final"], vm: ["hotspot", "openj9"], jdk: ["8"]],
  55. [version: ["17.0.1.Final", "21.0.0.Final"], vm: ["hotspot"], jdk: ["8", "11", "17"]],
  56. [version: ["17.0.1.Final", "21.0.0.Final"], vm: ["openj9"], jdk: ["8", "11", "16"]]
  57. ],
  58. "liberty": [
  59. // running configure.sh is failing while building the image with Java 17
  60. [version: ["20.0.0.12"], vm: ["hotspot", "openj9"], jdk: ["8", "11", "16"], args: [release: "2020-11-11_0736"]]
  61. ]
  62. ]
  63. tasks.register("printSmokeTestsConfigurations") {
  64. targets.each { server, matrices ->
  65. def smokeTestServer = findProperty('smokeTestServer')
  66. if (smokeTestServer != null && server != smokeTestServer) {
  67. return
  68. }
  69. println server
  70. def serverName = String.valueOf(Character.toUpperCase(server.charAt(0))) + server.substring(1)
  71. matrices.forEach { entry ->
  72. entry.version.forEach { version ->
  73. def dotIndex = version.indexOf('.')
  74. def majorVersion = dotIndex != -1 ? version.substring(0, dotIndex) : version
  75. entry.jdk.forEach { jdk ->
  76. entry.vm.forEach { vm ->
  77. println "@AppServer(version = \"$version\", jdk = \"$jdk${vm == 'hotspot' ? '' : '-openj9'}\")"
  78. println "class ${serverName}${majorVersion}Jdk${jdk}${vm == 'hotspot' ? '' : 'Openj9'} extends ${serverName}SmokeTest {"
  79. println "}"
  80. }
  81. }
  82. }
  83. }
  84. }
  85. }
  86. createDockerTasks(buildLinuxTestImagesTask, targets, false)
  87. createDockerTasks(buildWindowsTestImagesTask, targets, true)
  88. def configureImage(Task parentTask, server, dockerfile, version, vm, jdk, warProject, Map<String, String> extraArgs, boolean isWindows, String extraTag) {
  89. // Using separate build directory for different war files allows using the same app.war filename
  90. def dockerWorkingDir = new File(project.buildDir, "docker-$warProject")
  91. def dockerFileName = isWindows ? "${dockerfile}.windows.dockerfile" : "${dockerfile}.dockerfile"
  92. def platformSuffix = isWindows ? "-windows" : ""
  93. def prepareTask = tasks.register("${server}ImagePrepare-$version-jdk$jdk-$vm$platformSuffix", Copy) {
  94. def warTask = warProject != null ? project(":$warProject").tasks["war"] : project.tasks.war
  95. it.dependsOn(warTask)
  96. it.into(dockerWorkingDir)
  97. it.from("src/$dockerFileName")
  98. it.from("src/main/docker/$server")
  99. it.from(warTask.archiveFile) {
  100. rename { _ -> "app.war" }
  101. }
  102. }
  103. def vmSuffix = vm == "hotspot" ? "" : "-$vm"
  104. def image = "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-servlet-$server:$version-jdk$jdk$vmSuffix$platformSuffix-$extraTag"
  105. def jdkImage
  106. if (vm == "hotspot") {
  107. jdkImage = "eclipse-temurin:${jdk}"
  108. } else if (vm == "openj9") {
  109. jdkImage = "adoptopenjdk:${jdk}-openj9"
  110. } else {
  111. throw new GradleException("Unexpected vm: $vm")
  112. }
  113. def buildTask = tasks.register("${server}Image-$version-jdk$jdk$vmSuffix$platformSuffix", DockerBuildImage) {
  114. it.dependsOn(prepareTask)
  115. group = "build"
  116. description = "Builds Docker image with $server $version on JDK $jdk-$vm${isWindows ? ' on Windows' : ''}"
  117. it.inputDir.set(dockerWorkingDir)
  118. it.images.add(image)
  119. it.dockerFile.set(new File(dockerWorkingDir, dockerFileName))
  120. it.buildArgs.set(extraArgs + [jdk: jdk, vm: vm, version: version, jdkImage: jdkImage])
  121. it.doLast {
  122. project.ext.matrix.add(image)
  123. }
  124. }
  125. parentTask.dependsOn(buildTask)
  126. return image
  127. }
  128. def createDockerTasks(Task parentTask, targets, isWindows) {
  129. String extraTag = findProperty("extraTag") ?: new Date().format("yyyyMMdd.HHmmSS")
  130. Set<String> resultImages = []
  131. targets.each { server, matrices ->
  132. def smokeTestServer = findProperty('smokeTestServer')
  133. if (smokeTestServer != null && server != smokeTestServer) {
  134. return
  135. }
  136. matrices.forEach { entry ->
  137. def dockerfile = entry["dockerfile"]?.toString() ?: server
  138. def extraArgs = (entry["args"] ?: [:]) as Map<String, String>
  139. def warProject = entry["war"] ?: "servlet-3.0"
  140. entry.version.forEach { version ->
  141. entry.vm.forEach { vm ->
  142. entry.jdk.forEach { jdk ->
  143. resultImages.add(configureImage(parentTask, server, dockerfile, version, vm, jdk, warProject, extraArgs, isWindows, extraTag))
  144. }
  145. }
  146. }
  147. }
  148. }
  149. return resultImages
  150. }