build.gradle 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. /*
  2. * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
  3. * or more contributor license agreements. Licensed under the Elastic License
  4. * 2.0 and the Server Side Public License, v 1; you may not use this file except
  5. * in compliance with, at your election, the Elastic License 2.0 or the Server
  6. * Side Public License, v 1.
  7. */
  8. import org.apache.tools.ant.filters.ReplaceTokens
  9. import org.elasticsearch.gradle.internal.conventions.info.GitInfo
  10. plugins {
  11. id 'java-gradle-plugin'
  12. id 'groovy-gradle-plugin'
  13. id 'groovy'
  14. id 'elasticsearch.build-tools'
  15. id 'elasticsearch.eclipse'
  16. id 'elasticsearch.versions'
  17. id 'elasticsearch.formatting'
  18. }
  19. group = 'org.elasticsearch.gradle'
  20. // we update the version property to reflect if we are building a snapshot or a release build
  21. // we write this back out below to load it in the Build.java which will be shown in rest main action
  22. // to indicate this being a snapshot build or a release build.
  23. version = versions.getProperty("elasticsearch")
  24. gradlePlugin {
  25. // We already configure publication and we don't need or want the one that comes
  26. // with the java-gradle-plugin
  27. automatedPublishing = false
  28. plugins {
  29. build {
  30. id = 'elasticsearch.build'
  31. implementationClass = 'org.elasticsearch.gradle.internal.BuildPlugin'
  32. }
  33. buildComplete {
  34. id = 'elasticsearch.build-complete'
  35. implementationClass = 'org.elasticsearch.gradle.internal.ElasticsearchBuildCompletePlugin'
  36. }
  37. distro {
  38. id = 'elasticsearch.distro'
  39. implementationClass = 'org.elasticsearch.gradle.internal.distribution.ElasticsearchDistributionPlugin'
  40. }
  41. distroTest {
  42. id = 'elasticsearch.distro-test'
  43. implementationClass = 'org.elasticsearch.gradle.internal.test.DistroTestPlugin'
  44. }
  45. dockerSupport {
  46. id = 'elasticsearch.docker-support'
  47. implementationClass = 'org.elasticsearch.gradle.internal.docker.DockerSupportPlugin'
  48. }
  49. docsTest {
  50. id = 'elasticsearch.docs-test'
  51. implementationClass = 'org.elasticsearch.gradle.internal.doc.DocsTestPlugin'
  52. }
  53. draArtifacts {
  54. id = 'elasticsearch.dra-artifacts'
  55. implementationClass = 'org.elasticsearch.gradle.internal.dra.DraResolvePlugin'
  56. }
  57. globalBuildInfo {
  58. id = 'elasticsearch.global-build-info'
  59. implementationClass = 'org.elasticsearch.gradle.internal.info.GlobalBuildInfoPlugin'
  60. }
  61. internalAvailablePorts {
  62. id = 'elasticsearch.internal-available-ports'
  63. implementationClass = 'org.elasticsearch.gradle.internal.InternalAvailableTcpPortProviderPlugin'
  64. }
  65. internalClusterTest {
  66. id = 'elasticsearch.internal-cluster-test'
  67. implementationClass = 'org.elasticsearch.gradle.internal.test.InternalClusterTestPlugin'
  68. }
  69. internalDistributionArchiveCheck {
  70. id = 'elasticsearch.internal-distribution-archive-check'
  71. implementationClass = 'org.elasticsearch.gradle.internal.InternalDistributionArchiveCheckPlugin'
  72. }
  73. internalDistributionArchiveSetup {
  74. id = 'elasticsearch.internal-distribution-archive-setup'
  75. implementationClass = 'org.elasticsearch.gradle.internal.InternalDistributionArchiveSetupPlugin'
  76. }
  77. internalDistributionBwcSetup {
  78. id = 'elasticsearch.internal-distribution-bwc-setup'
  79. implementationClass = 'org.elasticsearch.gradle.internal.InternalDistributionBwcSetupPlugin'
  80. }
  81. internalDistributionDownload {
  82. id = 'elasticsearch.internal-distribution-download'
  83. implementationClass = 'org.elasticsearch.gradle.internal.InternalDistributionDownloadPlugin'
  84. }
  85. internalPlugin {
  86. id = 'elasticsearch.internal-es-plugin'
  87. implementationClass = 'org.elasticsearch.gradle.internal.InternalPluginBuildPlugin'
  88. }
  89. internalBasePlugin {
  90. id = 'elasticsearch.base-internal-es-plugin'
  91. implementationClass = 'org.elasticsearch.gradle.internal.BaseInternalPluginBuildPlugin'
  92. }
  93. internalTestArtifact {
  94. id = 'elasticsearch.internal-test-artifact'
  95. implementationClass = 'org.elasticsearch.gradle.internal.InternalTestArtifactPlugin'
  96. }
  97. internalTestArtifactBase {
  98. id = 'elasticsearch.internal-test-artifact-base'
  99. implementationClass = 'org.elasticsearch.gradle.internal.InternalTestArtifactBasePlugin'
  100. }
  101. internalTestClusters {
  102. id = 'elasticsearch.internal-testclusters'
  103. implementationClass = 'org.elasticsearch.gradle.internal.InternalTestClustersPlugin'
  104. }
  105. internalTestRerun {
  106. id = 'elasticsearch.internal-test-rerun'
  107. implementationClass = 'org.elasticsearch.gradle.internal.test.rerun.TestRerunPlugin'
  108. }
  109. javaToolChainPlugin {
  110. id = 'elasticsearch.java-toolchain'
  111. implementationClass = 'org.elasticsearch.gradle.internal.toolchain.JavaToolChainResolverPlugin'
  112. }
  113. javaDoc {
  114. id = 'elasticsearch.java-doc'
  115. implementationClass = 'org.elasticsearch.gradle.internal.ElasticsearchJavadocPlugin'
  116. }
  117. java {
  118. id = 'elasticsearch.java'
  119. implementationClass = 'org.elasticsearch.gradle.internal.ElasticsearchJavaPlugin'
  120. }
  121. legacyInternalJavaRestTest {
  122. id = 'elasticsearch.legacy-java-rest-test'
  123. implementationClass = 'org.elasticsearch.gradle.internal.test.rest.LegacyJavaRestTestPlugin'
  124. }
  125. internalJavaRestTest {
  126. id = 'elasticsearch.internal-java-rest-test'
  127. implementationClass = 'org.elasticsearch.gradle.internal.test.rest.InternalJavaRestTestPlugin'
  128. }
  129. jdkDownload {
  130. id = 'elasticsearch.jdk-download'
  131. implementationClass = 'org.elasticsearch.gradle.internal.JdkDownloadPlugin'
  132. }
  133. javaModulePath {
  134. id = 'elasticsearch.java-module'
  135. implementationClass = 'org.elasticsearch.gradle.internal.ElasticsearchJavaModulePathPlugin'
  136. }
  137. releaseTools {
  138. id = 'elasticsearch.release-tools'
  139. implementationClass = 'org.elasticsearch.gradle.internal.release.ReleaseToolsPlugin'
  140. }
  141. repositories {
  142. id = 'elasticsearch.repositories'
  143. implementationClass = 'org.elasticsearch.gradle.internal.RepositoriesSetupPlugin'
  144. }
  145. restResources {
  146. id = 'elasticsearch.rest-resources'
  147. implementationClass = 'org.elasticsearch.gradle.internal.test.rest.RestResourcesPlugin'
  148. }
  149. standaloneRestTest {
  150. id = 'elasticsearch.standalone-rest-test'
  151. implementationClass = 'org.elasticsearch.gradle.internal.test.StandaloneRestTestPlugin'
  152. }
  153. standaloneTest {
  154. id = 'elasticsearch.standalone-test'
  155. implementationClass = 'org.elasticsearch.gradle.internal.test.StandaloneTestPlugin'
  156. }
  157. stringTemplate {
  158. id = 'elasticsearch.string-templates'
  159. implementationClass = 'org.elasticsearch.gradle.internal.StringTemplatePlugin'
  160. }
  161. testFixtures {
  162. id = 'elasticsearch.test.fixtures'
  163. implementationClass = 'org.elasticsearch.gradle.internal.testfixtures.TestFixturesPlugin'
  164. }
  165. testBase {
  166. id = 'elasticsearch.test-base'
  167. implementationClass = 'org.elasticsearch.gradle.internal.ElasticsearchTestBasePlugin'
  168. }
  169. testWithDependencies {
  170. id = 'elasticsearch.test-with-dependencies'
  171. implementationClass = 'org.elasticsearch.gradle.internal.test.TestWithDependenciesPlugin'
  172. }
  173. testWithSsl {
  174. id = 'elasticsearch.test-with-ssl'
  175. implementationClass = 'org.elasticsearch.gradle.internal.test.TestWithSslPlugin'
  176. }
  177. validateRestSpec {
  178. id = 'elasticsearch.validate-rest-spec'
  179. implementationClass = 'org.elasticsearch.gradle.internal.precommit.ValidateRestSpecPlugin'
  180. }
  181. legacyYamlRestCompatTest {
  182. id = 'elasticsearch.legacy-yaml-rest-compat-test'
  183. implementationClass = 'org.elasticsearch.gradle.internal.test.rest.compat.compat.LegacyYamlRestCompatTestPlugin'
  184. }
  185. yamlRestCompatTest {
  186. id = 'elasticsearch.yaml-rest-compat-test'
  187. implementationClass = 'org.elasticsearch.gradle.internal.test.rest.compat.compat.YamlRestCompatTestPlugin'
  188. }
  189. legacyYamlRestTest {
  190. id = 'elasticsearch.legacy-yaml-rest-test'
  191. implementationClass = 'org.elasticsearch.gradle.internal.test.rest.LegacyYamlRestTestPlugin'
  192. }
  193. yamlRestTest {
  194. id = 'elasticsearch.internal-yaml-rest-test'
  195. implementationClass = 'org.elasticsearch.gradle.internal.test.rest.InternalYamlRestTestPlugin'
  196. }
  197. }
  198. }
  199. /*****************************************************************************
  200. * Java version *
  201. *****************************************************************************/
  202. def minCompilerJava = versions.get("minimumCompilerJava")
  203. java {
  204. targetCompatibility = minCompilerJava
  205. sourceCompatibility = minCompilerJava
  206. }
  207. if (JavaVersion.current() < JavaVersion.toVersion(minCompilerJava)) {
  208. throw new GradleException("Java ${minCompilerJava} is required to build Elasticsearch but current Java is version ${JavaVersion.current()}.")
  209. }
  210. sourceSets {
  211. integTest {
  212. compileClasspath += sourceSets["main"].output + configurations["testRuntimeClasspath"]
  213. runtimeClasspath += output + compileClasspath
  214. }
  215. }
  216. tasks.withType(JavaCompile).configureEach {
  217. options.encoding = 'UTF-8'
  218. }
  219. tasks.named('licenseHeaders').configure {
  220. // ignore gradle generated binary script plugins
  221. excludes << "Elasticsearch*Plugin.java"
  222. }
  223. /*****************************************************************************
  224. * Dependencies used by the entire build *
  225. *****************************************************************************/
  226. repositories {
  227. mavenCentral()
  228. gradlePluginPortal()
  229. }
  230. configurations {
  231. integTestRuntimeOnly.extendsFrom(testRuntimeOnly)
  232. }
  233. dependencies {
  234. components.all(JacksonAlignmentRule)
  235. constraints {
  236. // ensuring brought asm version brought in by spock is up-to-date
  237. testImplementation buildLibs.asm
  238. integTestImplementation buildLibs.asm
  239. integTestImplementation('org.ow2.asm:asm:9.5')
  240. api("org.yaml:snakeyaml") {
  241. version { strictly(versions.snakeyaml) }
  242. }
  243. }
  244. // Forcefully downgrade the jackson platform as used in production
  245. api enforcedPlatform(buildLibs.jackson.platform)
  246. api localGroovy()
  247. api gradleApi()
  248. api "org.elasticsearch:build-conventions:$version"
  249. api "org.elasticsearch.gradle:build-tools:$version"
  250. // same version as http client transitive dep
  251. api buildLibs.commons.codec
  252. api buildLibs.apache.compress
  253. api buildLibs.nebula.info
  254. api buildLibs.apache.rat
  255. api buildLibs.jna
  256. api buildLibs.shadow.plugin
  257. api buildLibs.gradle.enterprise
  258. // for our ide tweaking
  259. api buildLibs.idea.ext
  260. // When upgrading forbidden apis, ensure dependency version is bumped in ThirdPartyPrecommitPlugin as well
  261. api buildLibs.forbiddenApis
  262. api buildLibs.docker.compose
  263. api buildLibs.maven.model
  264. // needs to match the jackson minor version in use
  265. api buildLibs.json.schema.validator
  266. api buildLibs.jackson.dataformat.yaml
  267. api buildLibs.antlrst4
  268. api buildLibs.asm
  269. api buildLibs.asm.tree
  270. api buildLibs.httpclient
  271. api buildLibs.httpcore
  272. compileOnly buildLibs.checkstyle
  273. runtimeOnly "org.elasticsearch.gradle:reaper:$version"
  274. testImplementation buildLibs.checkstyle
  275. testImplementation buildLibs.wiremock
  276. testImplementation buildLibs.mockito.core
  277. testImplementation buildLibs.hamcrest
  278. testImplementation testFixtures("org.elasticsearch.gradle:build-tools:$version")
  279. testImplementation(platform(buildLibs.junit5.platform))
  280. testImplementation(buildLibs.junit5.jupiter) {
  281. because 'allows to write and run Jupiter tests'
  282. }
  283. integTestImplementation(platform(buildLibs.junit5.platform))
  284. integTestImplementation(buildLibs.junit5.jupiter) {
  285. because 'allows to write and run Jupiter tests'
  286. }
  287. integTestImplementation(buildLibs.bytebuddy) {
  288. because 'Generating dynamic mocks of internal libraries like JdkJarHell'
  289. }
  290. testRuntimeOnly(buildLibs.junit5.vintage) {
  291. because 'allows JUnit 3 and JUnit 4 tests to run'
  292. }
  293. testRuntimeOnly(buildLibs.junit5.platform.launcher) {
  294. because 'allows tests to run from IDEs that bundle older version of launcher'
  295. }
  296. testImplementation platform(buildLibs.spock.platform)
  297. testImplementation(buildLibs.spock.core) {
  298. exclude module: "groovy"
  299. }
  300. integTestImplementation platform(buildLibs.spock.platform)
  301. integTestImplementation(buildLibs.spock.core) {
  302. exclude module: "groovy"
  303. }
  304. // required as we rely on junit4 rules
  305. integTestImplementation(buildLibs.spock.junit4) {
  306. exclude module: "groovy"
  307. }
  308. testImplementation buildLibs.spock.junit4
  309. testImplementation buildLibs.json.assert
  310. integTestImplementation buildLibs.xmlunit.core
  311. }
  312. tasks.named('test').configure {
  313. useJUnitPlatform()
  314. }
  315. tasks.register("integTest", Test) {
  316. systemProperty 'test.version_under_test', version
  317. testClassesDirs = sourceSets.integTest.output.classesDirs
  318. classpath = sourceSets.integTest.runtimeClasspath
  319. useJUnitPlatform()
  320. }
  321. tasks.named("check").configure { dependsOn("integTest") }
  322. tasks.register("bootstrapPerformanceTests", Copy) {
  323. from('performance')
  324. into('build/performanceTests')
  325. def root = file('..')
  326. inputs.property('branchWrapper', gradle.gradleVersion)
  327. filter(ReplaceTokens, tokens: [
  328. testGitCommit:GitInfo.gitInfo(root).revision,
  329. mainWrapper:"${ -> resolveMainWrapperVersion()}".toString(),
  330. branchWrapper:"${-> gradle.gradleVersion}".toString()])
  331. }
  332. tasks.named("jar") {
  333. exclude("classpath.index")
  334. }
  335. def resolveMainWrapperVersion() {
  336. new URL("https://raw.githubusercontent.com/elastic/elasticsearch/main/build-tools-internal/src/main/resources/minimumGradleVersion").text.trim()
  337. }
  338. abstract class JacksonAlignmentRule implements ComponentMetadataRule {
  339. void execute(ComponentMetadataContext ctx) {
  340. ctx.details.with {d ->
  341. if (d.id.group.startsWith("com.fasterxml.jackson")) {
  342. // declare that Jackson modules all belong to the Jackson virtual platform
  343. belongsTo("com.fasterxml.jackson:jackson-bom:${d.id.version}")
  344. }
  345. }
  346. }
  347. }