build.gradle.kts 10 KB

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