Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840
  1. import groovy.json.JsonOutput
  2. import groovy.text.SimpleTemplateEngine
  3. import org.sonar.build.BlackBoxTest
  4. import static org.gradle.api.JavaVersion.VERSION_17
  5. plugins {
  6. // Ordered alphabetically
  7. id 'com.github.hierynomus.license' version '0.16.1'
  8. id "com.github.hierynomus.license-report" version "0.16.1" apply false
  9. id 'com.github.johnrengelman.shadow' version '7.1.2' apply false
  10. id 'com.google.protobuf' version '0.8.19' apply false
  11. id 'com.jfrog.artifactory' version '5.1.10'
  12. id "de.undercouch.download" version "5.6.0" apply false
  13. id 'io.spring.dependency-management' version '1.1.4'
  14. id "org.cyclonedx.bom" version "1.7.4" apply false
  15. id 'org.sonarqube' version '5.0.0.4638'
  16. }
  17. if (!JavaVersion.current().isCompatibleWith(VERSION_17)) {
  18. throw new GradleException("JDK 17+ is required to perform this build. It's currently " + System.getProperty("java.home") + ".")
  19. }
  20. /**
  21. * The BOM related tasks are disabled by default, activated by:
  22. * - running in the CI and being on a main branch or a nightly build,
  23. * - or using '-Dbom' project property
  24. * - or by explicit call to 'cyclonedxBom' Gradle task
  25. */
  26. def bomTasks = "cyclonedxBom"
  27. def ghBranch = System.getenv()["GITHUB_BRANCH"]
  28. def isMainBranch = ghBranch in ['master'] || ghBranch ==~ 'branch-[\\d.]+'
  29. def isNightlyBuild = ghBranch == "branch-nightly-build"
  30. boolean enableBom = System.getenv('CI') == "true" && (isMainBranch || isNightlyBuild) ||
  31. System.getProperty("bom") != null ||
  32. gradle.startParameter.taskNames.findAll({ it.matches(".*:($bomTasks)") })
  33. allprojects {
  34. apply plugin: 'com.jfrog.artifactory'
  35. apply plugin: 'maven-publish'
  36. ext.versionInSources = version
  37. ext.buildNumber = System.getProperty("buildNumber")
  38. // when no buildNumber is provided, then project version must end with '-SNAPSHOT'
  39. if (ext.buildNumber == null) {
  40. version = "${version}-SNAPSHOT".toString()
  41. ext.versionWithoutBuildNumber = version
  42. } else {
  43. ext.versionWithoutBuildNumber = version
  44. version = (version.toString().count('.') == 1 ? "${version}.0.${ext.buildNumber}" : "${version}.${ext.buildNumber}").toString()
  45. }
  46. task cacheDependencies {
  47. doLast {
  48. configurations.each { conf ->
  49. if (conf.isCanBeResolved()) {
  50. if (conf.getName() != 'appZip')
  51. conf.resolve()
  52. }
  53. }
  54. }
  55. }
  56. ext {
  57. release = project.hasProperty('release') && project.getProperty('release')
  58. official = project.hasProperty('official') && project.getProperty('official')
  59. testMonitoringEnabled = project.hasProperty('withTestMonitoring')
  60. }
  61. ext.enableBom = enableBom
  62. if (!enableBom) {
  63. tasks.matching { it.name.matches(bomTasks) }.all({
  64. logger.info("{} disabled", it.name);
  65. it.enabled = false
  66. })
  67. }
  68. repositories {
  69. def repository = project.hasProperty('qa') ? 'sonarsource-qa' : 'sonarsource'
  70. // The environment variables ARTIFACTORY_PRIVATE_USERNAME and ARTIFACTORY_PRIVATE_PASSWORD are used on QA env (Jenkins)
  71. // On local box, please add artifactoryUsername and artifactoryPassword to ~/.gradle/gradle.properties
  72. def artifactoryUsername = System.env.'ARTIFACTORY_PRIVATE_USERNAME' ?: (project.hasProperty('artifactoryUsername') ? project.getProperty('artifactoryUsername') : '')
  73. def artifactoryPassword = System.env.'ARTIFACTORY_PRIVATE_PASSWORD' ?: (project.hasProperty('artifactoryPassword') ? project.getProperty('artifactoryPassword') : '')
  74. def artifactoryUrl = System.getenv('ARTIFACTORY_URL') ?: (project.hasProperty('artifactoryUrl') ? project.getProperty('artifactoryUrl') : '')
  75. if (artifactoryPassword) {
  76. if (artifactoryUrl == '') {
  77. throw new GradleException('Invalid artifactoryUrl')
  78. }
  79. maven {
  80. authentication {
  81. header(HttpHeaderAuthentication)
  82. }
  83. credentials(HttpHeaderCredentials) {
  84. name = "Authorization"
  85. value = "Bearer $artifactoryPassword"
  86. }
  87. url "${artifactoryUrl}/${repository}"
  88. }
  89. } else {
  90. mavenCentral()
  91. maven {
  92. url 'https://jitpack.io'
  93. }
  94. maven {
  95. url 'https://maven.codelibs.org/'
  96. }
  97. }
  98. ivy {
  99. if (artifactoryUsername && artifactoryPassword) {
  100. url "${artifactoryUrl}/sonarsource-bucket"
  101. authentication {
  102. header(HttpHeaderAuthentication)
  103. }
  104. credentials(HttpHeaderCredentials) {
  105. name = "Authorization"
  106. value = "Bearer $artifactoryPassword"
  107. }
  108. patternLayout {
  109. artifact '/[organisation]/[module]/[module]-[revision].[ext]'
  110. }
  111. } else {
  112. // For public build
  113. url "https://artifacts.elastic.co/downloads/"
  114. patternLayout {
  115. artifact '/[organisation]/[module]-[revision].[ext]'
  116. }
  117. }
  118. metadataSources { artifact() }
  119. }
  120. }
  121. task allDependencies {
  122. dependsOn 'dependencies'
  123. }
  124. artifactory {
  125. clientConfig.setIncludeEnvVars(true)
  126. clientConfig.setEnvVarsExcludePatterns('*pass*,*psw*,*secret*,*MAVEN_CMD_LINE_ARGS*,sun.java.command,*token*,*login*,*key*,*signing*,*auth*,*pwd*')
  127. contextUrl = System.getenv('ARTIFACTORY_URL')
  128. publish {
  129. repository {
  130. repoKey = System.getenv('ARTIFACTORY_DEPLOY_REPO')
  131. username = System.getenv('ARTIFACTORY_DEPLOY_USERNAME') ?: project.properties.artifactoryUsername
  132. password = System.getenv('ARTIFACTORY_DEPLOY_PASSWORD') ?: project.properties.artifactoryPaswword
  133. }
  134. defaults {
  135. properties = [
  136. 'build.name': 'sonar-enterprise',
  137. 'build.number': System.getenv('BUILD_NUMBER'),
  138. 'pr.branch.target': System.getenv('GITHUB_BASE_BRANCH'),
  139. 'pr.number': System.getenv('PULL_REQUEST'),
  140. 'vcs.branch': ghBranch,
  141. 'vcs.revision': System.getenv('GIT_SHA1'),
  142. 'version': version
  143. ]
  144. publications('mavenJava')
  145. publishPom = true
  146. publishIvy = false
  147. }
  148. }
  149. clientConfig.info.setBuildName('sonar-enterprise')
  150. clientConfig.info.setBuildNumber(System.getenv('BUILD_NUMBER'))
  151. // Define the artifacts to be deployed to https://binaries.sonarsource.com on releases
  152. clientConfig.info.addEnvironmentProperty('ARTIFACTS_TO_PUBLISH',
  153. "${project.group}:sonar-application:zip," +
  154. "com.sonarsource.sonarqube:sonarqube-developer:zip," +
  155. "com.sonarsource.sonarqube:sonarqube-datacenter:zip," +
  156. "com.sonarsource.sonarqube:sonarqube-enterprise:zip")
  157. // The name of this variable is important because it's used by the delivery process when extracting version from Artifactory build info.
  158. clientConfig.info.addEnvironmentProperty('PROJECT_VERSION', "${version}")
  159. }
  160. }
  161. apply plugin: 'org.sonarqube'
  162. sonar {
  163. properties {
  164. property 'sonar.projectName', projectTitle
  165. property 'sonar.projectVersion', "${versionInSources}-SNAPSHOT"
  166. property 'sonar.buildString', version
  167. }
  168. }
  169. tasks.named('wrapper') {
  170. distributionType = Wrapper.DistributionType.ALL
  171. }
  172. subprojects {
  173. apply plugin: 'com.github.hierynomus.license'
  174. apply plugin: 'io.spring.dependency-management'
  175. apply plugin: 'jacoco'
  176. apply plugin: 'java-library'
  177. apply plugin: 'idea'
  178. apply plugin: 'signing'
  179. // do not deploy to Artifactory by default
  180. artifactoryPublish.skip = true
  181. compileJava.options.encoding = "UTF-8"
  182. compileTestJava.options.encoding = "UTF-8"
  183. def testFixtureSrc = 'src/testFixtures'
  184. if (file(testFixtureSrc).exists()) {
  185. apply plugin: 'java-test-fixtures'
  186. }
  187. ext {
  188. protobufVersion = '3.24.2'
  189. springVersion = '5.3.31'
  190. elasticSearchClientVersion = '7.17.20'
  191. }
  192. sonar {
  193. properties {
  194. property 'sonar.moduleKey', project.group + ':' + project.name
  195. }
  196. }
  197. sourceSets {
  198. test {
  199. resources {
  200. srcDirs += ['src/it/resources']
  201. }
  202. java {
  203. srcDirs += ['src/it/java']
  204. }
  205. }
  206. bbt {
  207. resources {
  208. srcDirs = ['src/bbt/resources']
  209. }
  210. java {
  211. srcDirs = ['src/bbt/java']
  212. }
  213. }
  214. }
  215. // Central place for definition dependency versions and exclusions.
  216. dependencyManagement {
  217. dependencies {
  218. // bundled plugin list -- keep it alphabetically ordered
  219. dependency 'com.sonarsource.abap:sonar-abap-plugin:3.14.0.5470'
  220. dependency 'com.sonarsource.cobol:sonar-cobol-plugin:5.6.0.7604'
  221. dependency 'com.sonarsource.cpp:sonar-cfamily-dependencies-plugin:6.56.0.72172'
  222. dependency 'com.sonarsource.cpp:sonar-cfamily-plugin:6.56.0.72172'
  223. dependency 'com.sonarsource.dbd:sonar-dbd-plugin:1.28.0.9315'
  224. dependency 'com.sonarsource.dbd:sonar-dbd-java-frontend-plugin:1.28.0.9315'
  225. dependency 'com.sonarsource.dbd:sonar-dbd-python-frontend-plugin:1.28.0.9315'
  226. dependency 'com.sonarsource.pli:sonar-pli-plugin:1.15.0.4810'
  227. dependency 'com.sonarsource.plsql:sonar-plsql-plugin:3.13.0.6725'
  228. dependency 'com.sonarsource.plugins.vb:sonar-vb-plugin:2.13.0.5130'
  229. dependency 'com.sonarsource.rpg:sonar-rpg-plugin:3.9.0.5001'
  230. dependency 'com.sonarsource.security:sonar-security-csharp-frontend-plugin:10.6.0.31509'
  231. dependency 'com.sonarsource.security:sonar-security-java-frontend-plugin:10.6.0.31509'
  232. dependency 'com.sonarsource.security:sonar-security-php-frontend-plugin:10.6.0.31509'
  233. dependency 'com.sonarsource.security:sonar-security-plugin:10.6.0.31509'
  234. dependency 'com.sonarsource.security:sonar-security-python-frontend-plugin:10.6.0.31509'
  235. dependency 'com.sonarsource.security:sonar-security-js-frontend-plugin:10.6.0.31509'
  236. dependency 'com.sonarsource.slang:sonar-apex-plugin:1.15.0.4655'
  237. dependency 'org.sonarsource.slang:sonar-go-plugin:1.15.0.4655'
  238. dependency 'org.sonarsource.slang:sonar-ruby-plugin:1.15.0.4655'
  239. dependency 'org.sonarsource.slang:sonar-scala-plugin:1.15.0.4655'
  240. dependency 'com.sonarsource.swift:sonar-swift-plugin:4.12.0.7262'
  241. dependency 'com.sonarsource.tsql:sonar-tsql-plugin:1.13.0.7207'
  242. dependency 'org.sonarsource.dotnet:sonar-csharp-plugin:9.27.0.93347'
  243. dependency 'org.sonarsource.dotnet:sonar-vbnet-plugin:9.27.0.93347'
  244. dependency 'org.sonarsource.flex:sonar-flex-plugin:2.12.0.4568'
  245. dependency 'org.sonarsource.html:sonar-html-plugin:3.16.0.5274'
  246. dependency 'org.sonarsource.jacoco:sonar-jacoco-plugin:1.3.0.1538'
  247. dependency 'org.sonarsource.java:sonar-java-plugin:8.0.1.36337'
  248. dependency 'org.sonarsource.java:sonar-java-symbolic-execution-plugin:8.0.1.36337'
  249. dependency 'org.sonarsource.javascript:sonar-javascript-plugin:10.14.0.26080'
  250. dependency 'org.sonarsource.php:sonar-php-plugin:3.35.0.11659'
  251. dependency 'org.sonarsource.plugins.cayc:sonar-cayc-plugin:2.3.0.1782'
  252. dependency 'org.sonarsource.python:sonar-python-plugin:4.18.0.15334'
  253. dependency 'org.sonarsource.kotlin:sonar-kotlin-plugin:2.20.0.4382'
  254. dependency "org.sonarsource.api.plugin:sonar-plugin-api:$pluginApiVersion"
  255. dependency "org.sonarsource.api.plugin:sonar-plugin-api-test-fixtures:$pluginApiVersion"
  256. dependency 'org.sonarsource.xml:sonar-xml-plugin:2.10.0.4108'
  257. dependency 'org.sonarsource.iac:sonar-iac-plugin:1.31.0.10579'
  258. dependency 'org.sonarsource.text:sonar-text-plugin:2.11.0.2807'
  259. dependency 'com.sonarsource.text:sonar-text-enterprise-plugin:2.11.0.2807'
  260. dependency 'com.sonarsource.jcl:sonar-jcl-plugin:1.2.0.1148'
  261. // please keep this list alphabetically ordered
  262. dependencySet(group: 'ch.qos.logback', version: '1.5.3') {
  263. entry 'logback-classic'
  264. entry 'logback-core'
  265. }
  266. // TODO switch to dependency 'ch.qos.logback.access:tomcat:2.0.1' when upgrading to Tomcat 10+
  267. dependency 'ch.qos.logback:logback-access:1.3.14'
  268. dependency('commons-beanutils:commons-beanutils:1.9.4') {
  269. exclude 'commons-logging:commons-logging'
  270. }
  271. dependency 'commons-codec:commons-codec:1.16.1'
  272. dependency 'commons-dbutils:commons-dbutils:1.8.1'
  273. dependency 'commons-io:commons-io:2.16.1'
  274. imports { mavenBom 'com.fasterxml.jackson:jackson-bom:2.17.0' }
  275. dependency 'com.eclipsesource.minimal-json:minimal-json:0.9.5'
  276. dependencySet(group: 'com.github.scribejava', version: '8.3.3') {
  277. entry 'scribejava-apis'
  278. entry 'scribejava-core'
  279. }
  280. dependency('com.github.erosb:json-sKema:0.15.0') {
  281. // this version of json-sKema does not make use of commons-collections, so we can exclude it safely
  282. exclude 'commons-collections:commons-collections'
  283. }
  284. // This project is no longer maintained and was forked
  285. // by https://github.com/java-diff-utils/java-diff-utils
  286. // (io.github.java-diff-utils:java-diff-utils).
  287. dependency 'com.googlecode.java-diff-utils:diffutils:1.3.0'
  288. dependency('com.googlecode.json-simple:json-simple:1.1.1') {
  289. exclude 'junit:junit'
  290. }
  291. dependency 'com.squareup.okio:okio:3.9.0'
  292. dependency 'io.github.hakky54:sslcontext-kickstart:8.3.5'
  293. dependency 'io.prometheus:simpleclient:0.16.0'
  294. dependency 'io.prometheus:simpleclient_common:0.16.0'
  295. dependency 'io.prometheus:simpleclient_servlet:0.16.0'
  296. dependency 'com.google.code.findbugs:jsr305:3.0.2'
  297. dependency 'com.google.code.gson:gson:2.10.1'
  298. dependency('com.google.guava:guava:33.1.0-jre') {
  299. exclude 'com.google.errorprone:error_prone_annotations'
  300. exclude 'com.google.guava:listenablefuture'
  301. exclude 'com.google.j2objc:j2objc-annotations'
  302. exclude 'org.checkerframework:checker-qual'
  303. exclude 'org.codehaus.mojo:animal-sniffer-annotations'
  304. }
  305. dependency "com.google.protobuf:protobuf-java:${protobufVersion}"
  306. dependency 'com.h2database:h2:2.2.224'
  307. dependencySet(group: 'com.hazelcast', version: '5.4.0') {
  308. entry 'hazelcast'
  309. }
  310. // Documentation must be updated if mssql-jdbc is updated: https://github.com/SonarSource/sonarqube/commit/03e4773ebf6cba854cdcf57a600095f65f4f53e7
  311. dependency('com.microsoft.sqlserver:mssql-jdbc:12.6.1.jre11') {
  312. exclude 'com.fasterxml.jackson.core:jackson-databind'
  313. }
  314. dependency 'com.onelogin:java-saml:2.9.0'
  315. dependency 'com.oracle.database.jdbc:ojdbc11:23.3.0.23.09'
  316. dependency 'com.datadoghq:dd-java-agent:1.30.1'
  317. dependency 'org.aspectj:aspectjtools:1.9.22'
  318. // If this gets updated the dependency on okio 3.5.0 should be reviewed
  319. dependencySet(group: 'com.squareup.okhttp3', version: '4.12.0') {
  320. entry 'okhttp'
  321. entry 'mockwebserver'
  322. entry 'okhttp-tls'
  323. entry 'logging-interceptor'
  324. }
  325. dependency 'org.json:json:20240303'
  326. // To be removed after migration to JUnit5 is finished
  327. dependency 'com.tngtech.java:junit-dataprovider:1.13.1'
  328. dependency 'com.tngtech.junit.dataprovider:junit-jupiter-params-dataprovider:2.10'
  329. dependencySet(group: 'io.jsonwebtoken', version: '0.12.5') {
  330. entry 'jjwt-api'
  331. entry 'jjwt-impl'
  332. entry 'jjwt-jackson'
  333. }
  334. dependency 'com.auth0:java-jwt:4.4.0'
  335. dependency 'io.netty:netty-all:4.1.109.Final'
  336. dependency 'com.sun.mail:javax.mail:1.6.2'
  337. dependency 'javax.annotation:javax.annotation-api:1.3.2'
  338. dependency 'javax.inject:javax.inject:1'
  339. dependency 'javax.servlet:javax.servlet-api:4.0.1'
  340. dependency 'javax.xml.bind:jaxb-api:2.3.1'
  341. dependency 'junit:junit:4.13.2'
  342. // JUnit 5
  343. dependencySet(group: 'org.junit.jupiter', version: '5.10.2') {
  344. entry 'junit-jupiter-api'
  345. entry 'junit-jupiter-engine'
  346. entry 'junit-jupiter-params'
  347. entry 'junit-vintage-engine'
  348. }
  349. dependency 'org.junit-pioneer:junit-pioneer:2.2.0'
  350. dependency 'org.xmlunit:xmlunit-core:2.9.1'
  351. dependency 'org.xmlunit:xmlunit-matchers:2.9.1'
  352. dependency 'org.lz4:lz4-java:1.8.0'
  353. dependency 'net.lightbody.bmp:littleproxy:1.1.0-beta-bmp-17'
  354. dependency 'org.awaitility:awaitility:4.2.1'
  355. dependency 'org.apache.commons:commons-collections4:4.4'
  356. dependency 'org.apache.commons:commons-csv:1.10.0'
  357. dependency 'org.apache.commons:commons-lang3:3.14.0'
  358. dependency 'org.apache.commons:commons-email:1.6.0'
  359. dependency 'org.apache.commons:commons-text:1.12.0'
  360. dependency 'com.zaxxer:HikariCP:5.1.0'
  361. dependency('org.apache.httpcomponents:httpclient:4.5.14') {
  362. exclude 'commons-logging:commons-logging'
  363. }
  364. // Be aware that Log4j is used by Elasticsearch client
  365. dependencySet(group: 'org.apache.logging.log4j', version: '2.23.1') {
  366. entry 'log4j-core'
  367. entry 'log4j-api'
  368. entry 'log4j-to-slf4j'
  369. }
  370. dependencySet(group: 'org.apache.tomcat.embed', version: '9.0.87') {
  371. entry 'tomcat-embed-core'
  372. entry('tomcat-embed-jasper') {
  373. exclude 'org.eclipse.jdt.core.compiler:ecj'
  374. }
  375. }
  376. //transitive dependency of SVNKit, to be re-assessed when updating SVNKit
  377. dependency 'org.apache.sshd:sshd-core:2.12.1'
  378. dependency 'org.assertj:assertj-core:3.25.3'
  379. dependency 'org.assertj:assertj-guava:3.25.3'
  380. dependency('org.codehaus.sonar:sonar-channel:4.2') {
  381. exclude 'org.slf4j:slf4j-api'
  382. }
  383. dependency 'com.fasterxml.staxmate:staxmate:2.4.1'
  384. dependencySet(group: 'org.eclipse.jetty', version: '9.4.6.v20170531') {
  385. entry 'jetty-proxy'
  386. entry 'jetty-server'
  387. entry 'jetty-servlet'
  388. }
  389. dependency("org.elasticsearch.client:elasticsearch-rest-high-level-client:${elasticSearchClientVersion}") {
  390. exclude 'org.apache.logging.log4j:log4j-core'
  391. }
  392. dependency "org.elasticsearch.plugin:transport-netty4-client:${elasticSearchClientVersion}"
  393. dependency 'org.elasticsearch:mocksocket:1.2'
  394. dependency 'org.eclipse.jgit:org.eclipse.jgit:6.9.0.202403050737-r'
  395. dependency "org.codelibs.elasticsearch.module:analysis-common:7.17.18"
  396. dependency "org.codelibs.elasticsearch.module:reindex:7.17.18"
  397. dependency 'org.tmatesoft.svnkit:svnkit:1.10.11'
  398. dependency 'org.hamcrest:hamcrest-all:1.3'
  399. dependency 'org.jsoup:jsoup:1.17.2'
  400. dependency 'org.mindrot:jbcrypt:0.4'
  401. dependency('org.mockito:mockito-core:5.11.0') {
  402. exclude 'org.hamcrest:hamcrest-core'
  403. }
  404. dependency('org.mockito:mockito-junit-jupiter:5.11.0') {
  405. exclude 'org.junit.jupiter:junit-jupiter-api'
  406. }
  407. dependency "org.springframework:spring-test:${springVersion}"
  408. dependency 'org.mybatis:mybatis:3.5.16'
  409. dependencySet(group: 'org.slf4j', version: '2.0.13') {
  410. entry 'jcl-over-slf4j'
  411. entry 'jul-to-slf4j'
  412. entry 'log4j-over-slf4j'
  413. entry 'slf4j-api'
  414. }
  415. dependency 'org.postgresql:postgresql:42.7.3'
  416. dependency 'org.reflections:reflections:0.10.2'
  417. dependency 'org.simpleframework:simple:5.1.6'
  418. dependency 'org.sonarsource.git.blame:git-files-blame:1.0.2.275'
  419. dependency('org.sonarsource.orchestrator:sonar-orchestrator-junit4:4.9.0.1920') {
  420. exclude 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml'
  421. }
  422. dependency('org.sonarsource.orchestrator:sonar-orchestrator-junit5:4.9.0.1920') {
  423. exclude 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml'
  424. }
  425. dependency 'org.junit.platform:junit-platform-suite-api:1.10.2'
  426. dependency 'org.junit.platform:junit-platform-suite-engine:1.10.2'
  427. dependency 'com.sonarsource.pdfreport:security-report-pdf-generation:1.0.0.98'
  428. dependency 'org.sonarsource.update-center:sonar-update-center-common:1.32.0.2441'
  429. dependency("org.springframework:spring-context:${springVersion}") {
  430. exclude 'commons-logging:commons-logging'
  431. }
  432. dependency ("org.springframework:spring-webmvc:${springVersion}") {
  433. exclude 'commons-logging:commons-logging'
  434. }
  435. dependency 'org.springdoc:springdoc-openapi-webmvc-core:1.8.0'
  436. dependency 'org.subethamail:subethasmtp:3.1.7'
  437. dependency 'org.yaml:snakeyaml:2.2'
  438. dependency 'org.hibernate:hibernate-validator:6.2.5.Final'
  439. dependency 'javax.el:javax.el-api:3.0.0'
  440. dependency 'org.glassfish:jakarta.el:3.0.4'
  441. dependency 'org.kohsuke:github-api:1.321'
  442. dependency 'org.wiremock:wiremock-standalone:3.5.4'
  443. // please keep this list alphabetically ordered
  444. }
  445. }
  446. configurations {
  447. bbtCompile.extendsFrom testCompile
  448. bbtRuntime.extendsFrom testRuntime
  449. bbtImplementation.extendsFrom testImplementation
  450. // global exclusions
  451. all {
  452. // do not conflict with com.sun.mail:javax.mail
  453. exclude group: 'javax.mail', module: 'mail'
  454. }
  455. }
  456. tasks.withType(Javadoc) {
  457. options.addStringOption('Xdoclint:none', '-quiet')
  458. options.encoding = 'UTF-8'
  459. title = project.name + ' ' + versionWithoutBuildNumber
  460. }
  461. task sourcesJar(type: Jar, dependsOn: classes) {
  462. archiveClassifier = 'sources'
  463. from sourceSets.main.allSource
  464. }
  465. task javadocJar(type: Jar, dependsOn: javadoc) {
  466. archiveClassifier = 'javadoc'
  467. from javadoc.destinationDir
  468. }
  469. // generate code before opening project in IDE (Eclipse or Intellij)
  470. task ide() {
  471. // empty by default. Dependencies are added to the task
  472. // when needed (see protobuf modules for example)
  473. }
  474. task generatePackageInfo {
  475. doLast {
  476. def allPathsContainingJavaFiles = [] as Set
  477. fileTree('src/main/java/').matching() {
  478. include "*/**/*.java"
  479. exclude "*/**/package-info.java"
  480. }.forEach {
  481. allPathsContainingJavaFiles << it.toPath().toFile().getParent();
  482. }
  483. allPathsContainingJavaFiles.each {
  484. String packageInfoPath = it + "/package-info.java"
  485. File packageInfoFile = new File (packageInfoPath)
  486. if (!packageInfoFile.exists()) {
  487. logger.info("Creating file: " + packageInfoPath)
  488. def packageName = packageInfoFile.getParent().replaceAll("[\\\\ /]", ".").takeAfter("src.main.java.");
  489. String packageInfoContent = applyPackageInfoTemplate(packageName)
  490. packageInfoFile << packageInfoContent
  491. }
  492. }
  493. def allPackageInfoFiles = [] as Set
  494. fileTree('src/main/java/').matching() {
  495. include "*/**/package-info.java"
  496. }.forEach {
  497. allPackageInfoFiles << it.toPath().toFile();
  498. }
  499. allPackageInfoFiles.forEach {
  500. File packageInfoFile = it;
  501. if (!allPathsContainingJavaFiles.contains(packageInfoFile.getParent())) {
  502. logger.warn("Deleting package info file: " + packageInfoFile)
  503. packageInfoFile.delete();
  504. }
  505. }
  506. }
  507. }
  508. build.dependsOn(generatePackageInfo)
  509. generatePackageInfo.finalizedBy(licenseFormat)
  510. jacocoTestReport {
  511. reports {
  512. xml.required = true
  513. csv.required = false
  514. html.required = false
  515. }
  516. }
  517. normalization {
  518. runtimeClasspath {
  519. // Following classpath resources contain volatile data that changes in each CI build (build number, commit id, time),
  520. // so we exclude them from calculation of build cache key of test tasks:
  521. ignore 'META-INF/MANIFEST.MF'
  522. ignore 'sonar-api-version.txt'
  523. ignore 'sq-version.txt'
  524. }
  525. }
  526. ext.failedTests = []
  527. test {
  528. jvmArgs '-Dfile.encoding=UTF8'
  529. maxHeapSize = '1500m'
  530. systemProperty 'java.awt.headless', true
  531. // Some tests are asserting on localized messages or dates
  532. systemProperty 'user.language', 'en'
  533. systemProperty 'user.country', 'US'
  534. environment 'LANGUAGE', 'en_US'
  535. testLogging {
  536. events "skipped", "failed" // verbose log for failed and skipped tests (by default the name of the tests are not logged)
  537. exceptionFormat 'full' // log the full stack trace (default is the 1st line of the stack trace)
  538. }
  539. jacoco {
  540. enabled = true // do not disable recording of code coverage, so that remote Gradle cache entry can be used locally
  541. includes = ['com.sonar.*', 'com.sonarsource.*', 'org.sonar.*', 'org.sonarqube.*', 'org.sonarsource.*']
  542. }
  543. if (project.hasProperty('maxParallelTests')) {
  544. maxParallelForks = project.maxParallelTests as int
  545. }
  546. if (project.hasProperty('parallelTests')) {
  547. // See https://guides.gradle.org/performance/#parallel_test_execution
  548. maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1
  549. }
  550. afterTest { descriptor, result ->
  551. if (result.resultType == TestResult.ResultType.FAILURE) {
  552. String failedTest = " ${descriptor.className} > ${descriptor.name}"
  553. failedTests << failedTest
  554. }
  555. }
  556. }
  557. gradle.buildFinished {
  558. if (!failedTests.empty) {
  559. println "\nFailed tests:"
  560. failedTests.each { failedTest ->
  561. println failedTest
  562. }
  563. println ""
  564. }
  565. }
  566. def protoMainSrc = 'src/main/protobuf'
  567. def protoTestSrc = 'src/test/protobuf'
  568. if (file(protoMainSrc).exists() || file(protoTestSrc).exists()) {
  569. // protobuf must be applied after java
  570. apply plugin: 'com.google.protobuf'
  571. sourceSets.main.proto.srcDir protoMainSrc // in addition to the default 'src/main/proto'
  572. sourceSets.test.proto.srcDir protoTestSrc // in addition to the default 'src/test/proto'
  573. protobuf {
  574. protoc {
  575. artifact = "com.google.protobuf:protoc:${protobufVersion}"
  576. }
  577. }
  578. jar {
  579. exclude('**/*.proto')
  580. }
  581. idea {
  582. module {
  583. sourceDirs += file("${protobuf.generatedFilesBaseDir}/main/java")
  584. testSourceDirs += file("${protobuf.generatedFilesBaseDir}/test/java")
  585. generatedSourceDirs += file("${protobuf.generatedFilesBaseDir}/main/java")
  586. generatedSourceDirs += file("${protobuf.generatedFilesBaseDir}/test/java")
  587. }
  588. }
  589. ide.dependsOn(['generateProto', 'generateTestProto'])
  590. }
  591. if (official) {
  592. jar {
  593. // do not break incremental build on non official versions
  594. manifest {
  595. attributes(
  596. 'Version': "${version}",
  597. 'Implementation-Build': System.getenv('GIT_SHA1'),
  598. 'Build-Time': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")
  599. )
  600. }
  601. }
  602. }
  603. license {
  604. header = rootProject.file('HEADER')
  605. ignoreFailures = project.hasProperty('ignoreLicenseFailures') ? project.getProperty('ignoreLicenseFailures').toBoolean() : true
  606. strictCheck true
  607. encoding = 'UTF-8'
  608. mapping {
  609. java = 'SLASHSTAR_STYLE'
  610. js = 'SLASHSTAR_STYLE'
  611. ts = 'SLASHSTAR_STYLE'
  612. tsx = 'SLASHSTAR_STYLE'
  613. css = 'SLASHSTAR_STYLE'
  614. }
  615. includes(['**/*.java', '**/*.js', '**/*.ts', '**/*.tsx', '**/*.css'])
  616. }
  617. tasks.withType(GenerateModuleMetadata) {
  618. enabled = false
  619. }
  620. publishing {
  621. publications {
  622. mavenJava(MavenPublication) {
  623. pom {
  624. name = 'SonarQube'
  625. description = project.description
  626. url = 'https://www.sonarsource.com/products/sonarqube'
  627. organization {
  628. name = 'SonarSource'
  629. url = 'https://www.sonarsource.com'
  630. }
  631. licenses {
  632. license {
  633. name = 'GNU LGPL 3'
  634. url = 'http://www.gnu.org/licenses/lgpl.txt'
  635. distribution = 'repo'
  636. }
  637. }
  638. scm {
  639. url = 'https://github.com/SonarSource/sonarqube'
  640. }
  641. developers {
  642. developer {
  643. id = 'sonarsource-team'
  644. name = 'SonarSource Team'
  645. }
  646. }
  647. }
  648. }
  649. }
  650. }
  651. tasks.withType(Test) {
  652. configurations {
  653. utMonitoring
  654. testMonitoring
  655. ddAgent
  656. }
  657. dependencies {
  658. testImplementation project(":ut-monitoring")
  659. testImplementation project(":test-monitoring")
  660. utMonitoring 'org.aspectj:aspectjweaver:1.9.22'
  661. testMonitoring 'org.aspectj:aspectjweaver:1.9.22'
  662. ddAgent 'com.datadoghq:dd-java-agent'
  663. }
  664. if (System.getenv('CI') == "true") {
  665. doFirst {
  666. ext {
  667. ddJavaAgent = configurations.ddAgent.resolvedConfiguration.resolvedArtifacts.find { it.name == 'dd-java-agent' }
  668. }
  669. jvmArgs "-javaagent:${ddJavaAgent.file}"
  670. jvmArgs "-Ddatadog.slf4j.simpleLogger.logFile=${project.projectDir}/build/datadog.log"
  671. }
  672. }
  673. }
  674. tasks.withType(BlackBoxTest) {
  675. jacoco.enabled = false
  676. testClassesDirs = sourceSets.bbt.output.classesDirs
  677. classpath = sourceSets.bbt.runtimeClasspath
  678. configurations {
  679. includeInTestResources
  680. }
  681. dependencies {
  682. bbtRuntimeOnly 'com.microsoft.sqlserver:mssql-jdbc'
  683. bbtRuntimeOnly 'com.oracle.database.jdbc:ojdbc11'
  684. bbtRuntimeOnly 'org.postgresql:postgresql'
  685. bbtRuntimeOnly project(':plugins:sonar-xoo-plugin')
  686. bbtImplementation 'org.sonarsource.orchestrator:sonar-orchestrator-junit4'
  687. bbtImplementation project(":sonar-testing-harness")
  688. bbtImplementation project(":private:it-common")
  689. bbtImplementation testFixtures(project(":sonar-ws"))
  690. }
  691. }
  692. if (isNightlyBuild) {
  693. tasks.withType(Test) {
  694. doFirst {
  695. ext {
  696. aspectJWeaver = configurations.utMonitoring.resolvedConfiguration.resolvedArtifacts.find { it.name == 'aspectjweaver' }
  697. }
  698. jvmArgs "-javaagent:${aspectJWeaver.file}"
  699. }
  700. }
  701. }
  702. if (ext.testMonitoringEnabled) {
  703. tasks.withType(Test) {
  704. doFirst {
  705. ext {
  706. aspectJWeaver = configurations.testMonitoring.resolvedConfiguration.resolvedArtifacts.find { it.name == 'aspectjweaver' }
  707. }
  708. jvmArgs "-javaagent:${aspectJWeaver.file}"
  709. }
  710. }
  711. }
  712. signing {
  713. def signingKeyId = findProperty("signingKeyId")
  714. def signingKey = findProperty("signingKey")
  715. def signingPassword = findProperty("signingPassword")
  716. useInMemoryPgpKeys(signingKeyId, signingKey, signingPassword)
  717. required {
  718. return isMainBranch && gradle.taskGraph.hasTask(":artifactoryPublish")
  719. }
  720. sign publishing.publications
  721. }
  722. tasks.withType(Sign) {
  723. onlyIf {
  724. return !artifactoryPublish.skip && isMainBranch && gradle.taskGraph.hasTask(":artifactoryPublish")
  725. }
  726. }
  727. }
  728. static def applyPackageInfoTemplate(packageName) {
  729. def engine = new SimpleTemplateEngine()
  730. def templateText = "@ParametersAreNonnullByDefault\n" +
  731. "package $packageName;\n" +
  732. "\n" +
  733. "import javax.annotation.ParametersAreNonnullByDefault;\n"
  734. def templateParams = ["packageName": packageName]
  735. engine.createTemplate(templateText).make(templateParams).toString()
  736. }
  737. gradle.projectsEvaluated { gradle ->
  738. // yarn_run tasks can't all run in parallel without random issues
  739. // this script ensure all yarn_run tasks run sequentially
  740. def yarnRunTasks = allprojects.findResults { it -> it.tasks.findByName('yarn_run') }
  741. yarnRunTasks.drop(1).eachWithIndex { it, i -> it.mustRunAfter(yarnRunTasks[0..i]) }
  742. }
  743. ext.osAdaptiveCommand = { commands ->
  744. def newCommands = []
  745. if (System.properties['os.name'].toLowerCase().contains('windows')) {
  746. newCommands = ['cmd', '/c']
  747. }
  748. newCommands.addAll(commands)
  749. return newCommands
  750. }
  751. tasks.named('sonarqube') {
  752. onlyIf {
  753. System.getenv('CI') == "true"
  754. }
  755. long taskStart
  756. doFirst {
  757. taskStart = System.currentTimeMillis()
  758. }
  759. doLast {
  760. long taskDuration = System.currentTimeMillis() - taskStart
  761. File outputFile = new File("/tmp/analysis-monitoring.log")
  762. outputFile.append(JsonOutput.toJson([category: "Analysis", suite: "Standalone", operation: "total", duration: taskDuration]) + '\n')
  763. }
  764. }