build.gradle.kts 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. import com.bmuschko.gradle.docker.tasks.image.DockerBuildImage
  2. import com.bmuschko.gradle.docker.tasks.image.DockerPushImage
  3. import org.gradle.configurationcache.extensions.capitalized
  4. plugins {
  5. id("otel.spotless-conventions")
  6. id("com.bmuschko.docker-remote-api")
  7. }
  8. data class ImageTarget(val version: List<String>, val vm: List<String>, val jdk: List<String>, val args: Map<String, String> = emptyMap(), val war: String = "servlet-3.0", val windows: Boolean = true)
  9. val extraTag = findProperty("extraTag")
  10. ?: java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd.HHmmSS").format(java.time.LocalDateTime.now())
  11. // Each line under appserver describes one matrix of (version x vm x jdk), dockerfile key overrides
  12. // Dockerfile name, args key passes raw arguments to docker build
  13. val targets = mapOf(
  14. "jetty" to listOf(
  15. ImageTarget(listOf("9.4.39"), listOf("hotspot"), listOf("8", "11", "17", "19", "20"), mapOf("sourceVersion" to "9.4.39.v20210325")),
  16. ImageTarget(listOf("9.4.39"), listOf("openj9"), listOf("8", "11", "17", "18"), mapOf("sourceVersion" to "9.4.39.v20210325")),
  17. ImageTarget(listOf("10.0.7"), listOf("hotspot"), listOf("11", "17", "19", "20"), mapOf("sourceVersion" to "10.0.7")),
  18. ImageTarget(listOf("10.0.7"), listOf("openj9"), listOf("11", "17", "18"), mapOf("sourceVersion" to "10.0.7")),
  19. ImageTarget(listOf("11.0.7"), listOf("hotspot"), listOf("11", "17", "19", "20"), mapOf("sourceVersion" to "11.0.7"), "servlet-5.0"),
  20. ImageTarget(listOf("11.0.7"), listOf("openj9"), listOf("11", "17", "18"), mapOf("sourceVersion" to "11.0.7"), "servlet-5.0"),
  21. ),
  22. "liberty" to listOf(
  23. ImageTarget(listOf("20.0.0.12"), listOf("hotspot", "openj9"), listOf("8", "11"), mapOf("release" to "2020-11-11_0736")),
  24. // running configure.sh is failing while building the image with Java 19
  25. ImageTarget(listOf("21.0.0.10"), listOf("hotspot"), listOf("8", "11", "17"), mapOf("release" to "2021-09-20_1900")),
  26. ImageTarget(listOf("21.0.0.10"), listOf("openj9"), listOf("8", "11", "17"), mapOf("release" to "2021-09-20_1900")),
  27. ),
  28. "payara" to listOf(
  29. ImageTarget(listOf("5.2020.6"), listOf("hotspot", "openj9"), listOf("8", "11")),
  30. ImageTarget(listOf("5.2021.8"), listOf("hotspot", "openj9"), listOf("8", "11")),
  31. ),
  32. "tomcat" to listOf(
  33. ImageTarget(listOf("7.0.109"), listOf("hotspot", "openj9"), listOf("8"), mapOf("majorVersion" to "7")),
  34. ImageTarget(listOf("8.5.72"), listOf("hotspot"), listOf("8", "11", "17", "19", "20"), mapOf("majorVersion" to "8")),
  35. ImageTarget(listOf("8.5.72"), listOf("openj9"), listOf("8", "11", "17", "18"), mapOf("majorVersion" to "8")),
  36. ImageTarget(listOf("9.0.54"), listOf("hotspot"), listOf("8", "11", "17", "19", "20"), mapOf("majorVersion" to "9")),
  37. ImageTarget(listOf("9.0.54"), listOf("openj9"), listOf("8", "11", "17", "18"), mapOf("majorVersion" to "9")),
  38. ImageTarget(listOf("10.0.12"), listOf("hotspot"), listOf("8", "11", "17", "19", "20"), mapOf("majorVersion" to "10"), "servlet-5.0"),
  39. ImageTarget(listOf("10.0.12"), listOf("openj9"), listOf("8", "11", "17", "18"), mapOf("majorVersion" to "10"), "servlet-5.0"),
  40. ),
  41. "tomee" to listOf(
  42. ImageTarget(listOf("7.0.9"), listOf("hotspot", "openj9"), listOf("8")),
  43. ImageTarget(listOf("7.1.4"), listOf("hotspot", "openj9"), listOf("8")),
  44. ImageTarget(listOf("8.0.8"), listOf("hotspot"), listOf("8", "11", "17", "19", "20")),
  45. ImageTarget(listOf("8.0.8"), listOf("openj9"), listOf("8", "11", "17", "18")),
  46. ImageTarget(listOf("9.0.0-M7"), listOf("hotspot"), listOf("8", "11", "17", "19", "20"), war = "servlet-5.0"),
  47. ImageTarget(listOf("9.0.0-M7"), listOf("openj9"), listOf("8", "11", "17", "18"), war = "servlet-5.0"),
  48. ),
  49. "websphere" to listOf(
  50. // TODO (trask) this is a recent change, check back in a while and see if it's been fixed
  51. // 8.5.5.20 only has linux/ppc64le image
  52. ImageTarget(listOf("8.5.5.19", "9.0.5.9"), listOf("openj9"), listOf("8"), windows = false),
  53. ),
  54. "wildfly" to listOf(
  55. ImageTarget(listOf("13.0.0.Final"), listOf("hotspot", "openj9"), listOf("8")),
  56. ImageTarget(listOf("17.0.1.Final", "21.0.0.Final", "25.0.1.Final"), listOf("hotspot"), listOf("8", "11", "17", "19", "20")),
  57. ImageTarget(listOf("17.0.1.Final", "21.0.0.Final", "25.0.1.Final"), listOf("openj9"), listOf("8", "11", "17", "18")),
  58. ),
  59. )
  60. val matrix = mutableListOf<String>()
  61. tasks {
  62. val buildLinuxTestImages by registering {
  63. group = "build"
  64. description = "Builds all Linux Docker images for the test matrix"
  65. }
  66. val buildWindowsTestImages by registering {
  67. group = "build"
  68. description = "Builds all Windows Docker images for the test matrix"
  69. }
  70. val pushMatrix by registering(DockerPushImage::class) {
  71. mustRunAfter(buildLinuxTestImages)
  72. mustRunAfter(buildWindowsTestImages)
  73. group = "publishing"
  74. description = "Push all Docker images for the test matrix"
  75. images.set(matrix)
  76. }
  77. createDockerTasks(buildLinuxTestImages, false)
  78. createDockerTasks(buildWindowsTestImages, true)
  79. val printSmokeTestsConfigurations by registering {
  80. for ((server, matrices) in targets) {
  81. val smokeTestServer = findProperty("smokeTestServer")
  82. if (smokeTestServer != null && server != smokeTestServer) {
  83. continue
  84. }
  85. println(server)
  86. val serverName = server.capitalized()
  87. for (entry in matrices) {
  88. for (version in entry.version) {
  89. val dotIndex = version.indexOf('.')
  90. val majorVersion = if (dotIndex != -1) version.substring(0, dotIndex) else version
  91. for (jdk in entry.jdk) {
  92. for (vm in entry.vm) {
  93. println("@AppServer(version = \"$version\", jdk = \"$jdk${if (vm == "hotspot") "" else "-openj9"}\")")
  94. println("class ${serverName}${majorVersion}Jdk${jdk}${if (vm == "hotspot") "" else "Openj9"} extends ${serverName}SmokeTest {")
  95. println("}")
  96. }
  97. }
  98. }
  99. }
  100. }
  101. }
  102. }
  103. fun configureImage(parentTask: TaskProvider<out Task>, server: String, dockerfile: String, version: String, vm: String, jdk: String, warProject: String, args: Map<String, String>, isWindows: Boolean): String {
  104. // Using separate build directory for different image
  105. val dockerWorkingDir = file("$buildDir/docker-$server-$version-jdk$jdk-$vm-$warProject")
  106. val dockerFileName = "$dockerfile.${if (isWindows) "windows." else ""}dockerfile"
  107. val platformSuffix = if (isWindows) "-windows" else ""
  108. val prepareTask = tasks.register<Copy>("${server}ImagePrepare-$version-jdk$jdk-$vm$platformSuffix") {
  109. val warTask = project(":smoke-tests:images:servlet:$warProject").tasks.named<War>("war")
  110. dependsOn(warTask)
  111. into(dockerWorkingDir)
  112. from("src/$dockerFileName")
  113. from("src/main/docker/$server")
  114. from(warTask.get().archiveFile) {
  115. rename { "app.war" }
  116. }
  117. }
  118. val vmSuffix = if (vm == "hotspot") "" else "-$vm"
  119. val image = "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-servlet-$server:$version-jdk$jdk$vmSuffix$platformSuffix-$extraTag"
  120. val jdkImage = if (vm == "hotspot") {
  121. if (jdk == "20") {
  122. // "The only tags which will continue to receive updates beyond July 2022 will be Early Access
  123. // builds (which are sourced from jdk.java.net), as those are not published/supported by any
  124. // of the above projects."
  125. // (see https://hub.docker.com/_/openjdk)
  126. "openjdk:$jdk"
  127. } else {
  128. "eclipse-temurin:$jdk"
  129. }
  130. } else if (vm == "openj9") {
  131. if (isWindows) {
  132. // ibm-semeru-runtimes doesn't publish windows images
  133. // adoptopenjdk doesn't publish Windows 2022 images (and is deprecated)
  134. throw GradleException("Unexpected vm: $vm")
  135. } else {
  136. "ibm-semeru-runtimes:open-$jdk-jdk"
  137. }
  138. } else {
  139. throw GradleException("Unexpected vm: $vm")
  140. }
  141. val extraArgs = args.toMutableMap()
  142. if (server == "wildfly") {
  143. // wildfly url without .zip or .tar.gz suffix
  144. val majorVersion = version.substring(0, version.indexOf(".")).toInt()
  145. val serverBaseUrl = if (majorVersion >= 25) {
  146. "https://github.com/wildfly/wildfly/releases/download/$version/wildfly-$version"
  147. } else {
  148. "https://download.jboss.org/wildfly/$version/wildfly-$version"
  149. }
  150. extraArgs["baseDownloadUrl"] = serverBaseUrl
  151. } else if (server == "payara") {
  152. if (version == "5.2020.6") {
  153. extraArgs["domainName"] = "production"
  154. } else {
  155. extraArgs["domainName"] = "domain1"
  156. }
  157. }
  158. val buildTask = tasks.register<DockerBuildImage>("${server}Image-$version-jdk$jdk$vmSuffix$platformSuffix") {
  159. dependsOn(prepareTask)
  160. group = "build"
  161. description = "Builds Docker image with $server $version on JDK $jdk-$vm${if (isWindows) " on Windows" else ""}"
  162. inputDir.set(dockerWorkingDir)
  163. images.add(image)
  164. dockerFile.set(File(dockerWorkingDir, dockerFileName))
  165. buildArgs.set(extraArgs + mapOf("jdk" to jdk, "vm" to vm, "version" to version, "jdkImage" to jdkImage))
  166. doLast {
  167. matrix.add(image)
  168. }
  169. }
  170. parentTask.configure {
  171. dependsOn(buildTask)
  172. }
  173. return image
  174. }
  175. fun createDockerTasks(parentTask: TaskProvider<out Task>, isWindows: Boolean) {
  176. val resultImages = mutableSetOf<String>()
  177. for ((server, matrices) in targets) {
  178. val smokeTestServer = findProperty("smokeTestServer")
  179. if (smokeTestServer != null && server != smokeTestServer) {
  180. continue
  181. }
  182. for (entry in matrices) {
  183. val dockerfile = server
  184. val extraArgs = entry.args
  185. val warProject = entry.war
  186. val supportsWindows = entry.windows
  187. for (version in entry.version) {
  188. for (vm in entry.vm) {
  189. if (vm == "openj9" && isWindows) {
  190. // ibm-semeru-runtimes doesn't publish windows images
  191. // adoptopenjdk is deprecated and doesn't publish Windows 2022 images
  192. continue
  193. }
  194. for (jdk in entry.jdk) {
  195. if (supportsWindows || !isWindows) {
  196. resultImages.add(configureImage(parentTask, server, dockerfile, version, vm, jdk, warProject, extraArgs, isWindows))
  197. }
  198. }
  199. }
  200. }
  201. }
  202. }
  203. }