sonarqube/sonar-application/build.gradle
2023-07-07 20:03:21 +00:00

371 lines
12 KiB
Groovy

import org.apache.tools.ant.filters.ReplaceTokens
import org.sonar.build.LicenseReader
plugins {
id "com.github.hierynomus.license-report"
id "com.github.johnrengelman.shadow"
id "de.undercouch.download"
id "org.cyclonedx.bom"
}
sonar {
properties {
property 'sonar.projectName', "${projectTitle} :: Application"
}
}
configurations {
zipDist
zip
scanner
web
shutdowner
jdbc_mssql {
transitive = false
}
jdbc_postgresql {
transitive = false
}
jdbc_h2 {
transitive = false
}
bundledPlugin {
transitive = false
}
bundledPlugin_deps {
extendsFrom bundledPlugin
transitive = true
}
appLicenses.extendsFrom(api, web, scanner, jdbc_mssql, jdbc_postgresql, jdbc_h2, bundledPlugin_deps)
cyclonedx
}
jar.enabled = false
shadowJar {
archiveBaseName = 'sonar-application'
archiveClassifier = null
mergeServiceFiles()
zip64 true
manifest {
attributes('Main-Class': 'org.sonar.application.App')
}
}
dependencies {
// please keep list ordered
api 'org.slf4j:slf4j-api'
api 'org.elasticsearch.client:elasticsearch-rest-high-level-client'
api 'org.sonarsource.api.plugin:sonar-plugin-api'
api project(':server:sonar-ce')
api project(':server:sonar-main')
api project(':server:sonar-process')
api project(':server:sonar-webserver')
api project(':sonar-core')
api project(':sonar-plugin-api-impl')
compileOnlyApi 'com.google.code.findbugs:jsr305'
scanner project(path: ':sonar-scanner-engine-shaded', configuration: 'shadow')
cyclonedx project(path: ':sonar-scanner-engine-shaded')
web project(':server:sonar-web')
shutdowner project(':sonar-shutdowner')
jdbc_h2 'com.h2database:h2'
jdbc_mssql 'com.microsoft.sqlserver:mssql-jdbc'
jdbc_postgresql 'org.postgresql:postgresql'
def artifactoryUsername = System.env.'ARTIFACTORY_PRIVATE_USERNAME' ?: (project.hasProperty('artifactoryUsername') ? project.getProperty('artifactoryUsername') : '')
def artifactoryPassword = System.env.'ARTIFACTORY_PRIVATE_PASSWORD' ?: (project.hasProperty('artifactoryPassword') ? project.getProperty('artifactoryPassword') : '')
if (artifactoryUsername && artifactoryPassword) {
zipDist "sonarqube:elasticsearch:${elasticsearchVersion}-no-jdk-linux-x86_64@tar.gz"
} else {
zipDist "elasticsearch:elasticsearch:${elasticsearchVersion}-linux-x86_64@tar.gz"
}
}
// declare dependencies in configuration bundledPlugin to be packaged in lib/extensions
apply from: 'bundled_plugins.gradle'
//verify if sonar.properties files does not have any external input
task verifySonarProperties(type: Verify) {
def propertiesFile = file('src/main/assembly/conf/sonar.properties')
propertiesFile.withReader { reader ->
def line
while ((line = reader.readLine()) != null) {
if (!line.startsWith('#') && !line.isEmpty()) {
throw new GradleException('sonar.properties file by default must not provide any user configuration.')
}
}
}
}
downloadLicenses {
dependencyConfiguration = 'appLicenses'
}
task zip(type: Zip, dependsOn: [configurations.compileClasspath]) {
duplicatesStrategy DuplicatesStrategy.EXCLUDE
def archiveDir = "sonarqube-$project.version"
if(release) {
dependsOn tasks.downloadLicenses
into("${archiveDir}/") {
from(tasks.downloadLicenses.outputs) {
include 'dependency-license.json'
filter(LicenseReader)
}
}
}
into("${archiveDir}/") {
from(file('src/main/assembly')) {
exclude 'conf/sonar.properties'
exclude 'bin/windows-x86-64/lib/SonarServiceWrapperTemplate.xml'
exclude 'bin/windows-x86-64/StartSonar.bat'
exclude 'bin/linux-x86-64/sonar.sh'
exclude 'bin/macosx-universal-64/sonar.sh'
}
}
ResolvedArtifact elasticSearchArtifact = configurations.zipDist.resolvedConfiguration.resolvedArtifacts.find {
it.moduleVersion.id.name == "elasticsearch"
}
from(tarTree(elasticSearchArtifact.file)) {
eachFile { fcd ->
def path = fcd.relativePath.segments - fcd.relativeSourcePath.segments + fcd.relativeSourcePath.segments.drop(1)
fcd.relativePath = new RelativePath(true, *path)
}
into("${archiveDir}/elasticsearch")
exclude '**/bin/elasticsearch-certgen'
exclude '**/bin/elasticsearch-certutil'
exclude '**/bin/elasticsearch-create-enrollment-token'
exclude '**/bin/elasticsearch-croneval'
exclude '**/bin/elasticsearch-env-from-file'
exclude '**/bin/elasticsearch-geoip'
exclude '**/bin/elasticsearch-keystore'
exclude '**/bin/elasticsearch-node'
exclude '**/bin/elasticsearch-plugin'
exclude '**/bin/elasticsearch-reconfigure-node'
exclude '**/bin/elasticsearch-reset-password'
exclude '**/bin/elasticsearch-saml-metadata'
exclude '**/bin/elasticsearch-service-tokens'
exclude '**/bin/elasticsearch-setup-passwords'
exclude '**/bin/elasticsearch-shard'
exclude '**/bin/elasticsearch-sql-cli'
exclude '**/bin/elasticsearch-sql-cli-8.6.1.jar'
exclude '**/bin/elasticsearch-syskeygen'
exclude '**/bin/elasticsearch-users'
exclude '**/jdk/**'
exclude '**/lib/tools/plugin-cli'
exclude '**/lib/tools/geoip-cli'
exclude '**/lib/tools/ansi-console'
exclude '**/modules/aggs-matrix-stats/**'
exclude '**/modules/constant-keyword/**'
exclude '**/modules/data-streams/**'
exclude '**/modules/frozen-indices/**'
exclude '**/modules/ingest-attachment/**'
exclude '**/modules/ingest-common/**'
exclude '**/modules/ingest-geoip/**'
exclude '**/modules/ingest-user-agent/**'
exclude '**/modules/kibana/**'
exclude '**/modules/lang-expression/**'
exclude '**/modules/lang-mustache/**'
exclude '**/modules/legacy-geo/**'
exclude '**/modules/mapper-extras/**'
exclude '**/modules/mapper-version/**'
exclude '**/modules/percolator/**'
exclude '**/modules/rank-eval/**'
exclude '**/modules/repositories-metering-api/**'
exclude '**/modules/repository-azure/**'
exclude '**/modules/repository-encrypted/**'
exclude '**/modules/repository-gcs/**'
exclude '**/modules/repository-s3/**'
exclude '**/modules/repository-url/**'
exclude '**/modules/runtime-fields-common/**'
exclude '**/modules/search-business-rules/**'
exclude '**/modules/searchable-snapshots/**'
exclude '**/modules/snapshot-based-recoveries/**'
exclude '**/modules/snapshot-repo-test-kit/**'
exclude '**/modules/spatial/**'
exclude '**/modules/transform/**'
exclude '**/modules/unsigned-long/**'
exclude '**/modules/vector-tile/**'
exclude '**/modules/vectors/**'
exclude '**/modules/wildcard/**'
exclude '**/modules/x-pack-aggregate-metric'
exclude '**/modules/x-pack-analytics/**'
exclude '**/modules/x-pack-async/**'
exclude '**/modules/x-pack-async-search/**'
exclude '**/modules/x-pack-autoscaling/**'
exclude '**/modules/x-pack-ccr/**'
exclude '**/modules/x-pack-deprecation/**'
exclude '**/modules/x-pack-enrich/**'
exclude '**/modules/x-pack-eql/**'
exclude '**/modules/x-pack-fleet/**'
exclude '**/modules/x-pack-graph/**'
exclude '**/modules/x-pack-identity-provider/**'
exclude '**/modules/x-pack-ilm/**'
exclude '**/modules/x-pack-logstash/**'
exclude '**/modules/x-pack-monitoring/**'
exclude '**/modules/x-pack-ql/**'
exclude '**/modules/x-pack-rollup/**'
exclude '**/modules/x-pack-ml/**'
exclude '**/modules/x-pack-shutdown/**'
exclude '**/modules/x-pack-sql/**'
exclude '**/modules/x-pack-stack/**'
exclude '**/modules/x-pack-text-structure/**'
exclude '**/modules/x-pack-voting-only-node/**'
exclude '**/modules/x-pack-watcher/**'
exclude '**/modules/x-pack-write-load-forecaster/**'
includeEmptyDirs = false
}
into("${archiveDir}/conf/") {
from file('src/main/assembly/conf/sonar.properties')
filter(ReplaceTokens, tokens: [
'searchDefaultHeapSize': '512MB',
'searchJavaOpts' : '-Xmx512m -Xms512m -XX:MaxDirectMemorySize=256m -XX:+HeapDumpOnOutOfMemoryError',
'ceDefaultHeapSize' : '512MB',
'ceJavaOpts' : '-Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError',
'webDefaultHeapSize' : '512MB',
'webJavaOpts' : '-Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError'
])
}
into("${archiveDir}/bin/linux-x86-64/") {
from file('src/main/assembly/bin/linux-x86-64/sonar.sh')
filter(ReplaceTokens, tokens: [
'sqversion': version
])
}
into("${archiveDir}/bin/macosx-universal-64/") {
from file('src/main/assembly/bin/macosx-universal-64/sonar.sh')
filter(ReplaceTokens, tokens: [
'sqversion': version
])
}
into("${archiveDir}/bin/windows-x86-64/") {
from file('src/main/assembly/bin/windows-x86-64/StartSonar.bat')
filter(ReplaceTokens, tokens: [
'sqversion': version
])
}
into("${archiveDir}/bin/windows-x86-64/lib/") {
from file('src/main/assembly/bin/windows-x86-64/lib/SonarServiceWrapperTemplate.xml')
filter(ReplaceTokens, tokens: [
'sqversion': version
])
}
// Create the empty dir (plugins) required by elasticsearch
into("${archiveDir}/elasticsearch/") {
// Create the empty dir required by elasticsearch
from {
new File(buildDir, 'elasticsearch/plugins').mkdirs()
"$buildDir/elasticsearch"
}
}
into("${archiveDir}/lib/extensions/") {
from configurations.bundledPlugin
}
into("${archiveDir}/lib/scanner/") {
from configurations.scanner
}
into("${archiveDir}/lib/") {
from shadowJar
}
into("${archiveDir}/web/") {
duplicatesStrategy DuplicatesStrategy.FAIL
// FIXME use configurations.web with correct artifacts
from(tasks.getByPath(':server:sonar-web:yarn_run').outputs) { a ->
if (official) {
project(':private:branding').fileTree('src').visit { b ->
if (!b.isDirectory()) {
a.exclude b.relativePath.toString()
}
}
}
}
if (official) {
from project(':private:branding').file('src')
}
}
into("${archiveDir}/lib/jdbc/mssql/") {
from configurations.jdbc_mssql
}
into("${archiveDir}/lib/jdbc/postgresql/") {
from configurations.jdbc_postgresql
}
into("${archiveDir}/lib/jdbc/h2/") {
from configurations.jdbc_h2
}
into("${archiveDir}/lib/") {
from configurations.shutdowner
}
}
// Check the size of the archive
zip.doLast {
def minLength = 340000000
def maxLength = 391000000
def length = archiveFile.get().asFile.length()
if (length < minLength)
throw new GradleException("${archiveFileName.get()} size ($length) too small. Min is $minLength")
if (length > maxLength)
throw new GradleException("${destinationDirectory.get()}/${archiveFileName.get()} size ($length) too large. Max is $maxLength")
}
assemble.dependsOn zip
// the script start.sh unpacks OSS distribution into $buildDir/distributions/sonarqube-oss.
// This directory should be deleted when the zip is changed.
task cleanLocalUnzippedDir(dependsOn: zip) {
def unzippedDir = file("$buildDir/distributions/sonarqube-$version")
inputs.files(file("$buildDir/distributions/sonar-application-${version}.zip"))
outputs.upToDateWhen { true }
doLast {
println("delete directory ${unzippedDir}")
project.delete(unzippedDir)
}
}
assemble.dependsOn cleanLocalUnzippedDir
artifacts { zip zip }
artifactoryPublish.skip = false
def bomFile = layout.buildDirectory.file('reports/bom.json')
cyclonedxBom {
includeConfigs = ["runtimeClasspath", "web", "shutdowner", "jdbc_mssql", "jdbc_postgresql", "jdbc_h2", "bundledPlugin_deps",
"cyclonedx"]
outputs.file bomFile
}
tasks.cyclonedxBom {
inputs.files(configurations.runtimeClasspath, configurations.shutdowner, configurations.jdbc_mssql,
configurations.jdbc_postgresql, configurations.jdbc_h2, configurations.bundledPlugin_deps, configurations.cyclonedx)
}
def bomArtifact = artifacts.add('archives', bomFile.get().asFile) {
type 'json'
classifier 'cyclonedx'
builtBy 'cyclonedxBom'
}
publishing {
publications {
mavenJava(MavenPublication) {
artifact zip
}
if (enableBom) {
mavenJava(MavenPublication) {
artifact bomArtifact
}
}
}
}