buildscript { repositories { maven { url "https://repo.grails.org/grails/core" } maven { url "https://plugins.gradle.org/m2/" } } dependencies { classpath "io.github.gradle-nexus:publish-plugin:1.3.0" classpath 'com.bmuschko:gradle-nexus-plugin:2.3.1' } } ext { groovyVersion = System.getenv('CI_GROOVY_VERSION') ?: project.groovyVersion // overall project version isCiBuild = System.getenv().get("CI") as Boolean isSnapshot = project.projectVersion.endsWith("-SNAPSHOT") isReleaseVersion = !isSnapshot nexusUsername = System.getenv("SONATYPE_USERNAME") ?: project.hasProperty("sonatypeOssUsername") ? project.sonatypeOssUsername : '' nexusPassword = System.getenv("SONATYPE_PASSWORD") ?: project.hasProperty("sonatypeOssPassword") ? project.sonatypeOssPassword : '' } def spockDependency = "org.spockframework:spock-core:$spockVersion" def isGroovyProject(project) { !project.name.contains("grails-plugins") } configurations { all*.exclude group: "commons-logging" } version = project.projectVersion group = "org.grails" apply plugin: 'idea' apply plugin: 'project-report' allprojects { ext.groovyVersion = System.getenv('CI_GROOVY_VERSION') ?: project.groovyVersion repositories { mavenLocal() mavenCentral() maven { url = 'https://repo.grails.org/grails/core' } if(isSnapshot) { maven { url = 'https://repo.grails.org/grails/libs-snapshots-local' } } if(groovyVersion && groovyVersion.endsWith('-SNAPSHOT')) { maven { name = 'JFrog Groovy snapshot repo' url = 'https://groovy.jfrog.io/artifactory/libs-snapshot-local' } } } configurations { all { resolutionStrategy { force "org.codehaus.groovy:groovy:$groovyVersion" force "org.codehaus.groovy:groovy-dateutil:$groovyVersion" force "org.codehaus.groovy:groovy-xml:$groovyVersion" force "org.codehaus.groovy:groovy-templates:$groovyVersion" } } } } apply from: "gradle/idea.gradle" subprojects { configurations { documentation } version = project.projectVersion group = "org.grails" afterEvaluate { subproject -> if (isGroovyProject(subproject)) { def hasSnapshotVersion = subproject.version.endsWith("-SNAPSHOT") if(isSnapshot != hasSnapshotVersion) { throw new StopExecutionException("${subproject.name} has version \"${subproject.version}\" which is${isSnapshot ? 'n\'t' : ''} a snapshot version.") } } } def isStandardGroovyMavenProject = isGroovyProject(project) if (isStandardGroovyMavenProject) { apply plugin: 'groovy' apply plugin: 'eclipse' apply plugin: 'idea' apply plugin: 'java-library' sourceCompatibility = 1.11 targetCompatibility = 1.11 } def isGormDatasource = project.name.startsWith("grails-datastore-gorm-") && !project.name.endsWith("tck") && !project.name.endsWith("-support") && !project.name.endsWith("-core") && !project.name.endsWith("-gorm-validation") && !project.name.contains("-rx") && project.name != 'grails-datastore-gorm-rest-client' dependencies { api "javax.annotation:javax.annotation-api:$javaAnnotationApiVersion" if (isStandardGroovyMavenProject) { documentation "org.fusesource.jansi:jansi:2.4.0" documentation "org.codehaus.groovy:groovy-dateutil:$groovyVersion" documentation 'info.picocli:picocli:4.6.3' documentation ("com.github.javaparser:javaparser-core:$javaParserCoreVersion") api "org.codehaus.groovy:groovy:$groovyVersion" testImplementation "org.codehaus.groovy:groovy-test-junit5:$groovyVersion" testImplementation "org.junit.jupiter:junit-jupiter-api:5.9.1" testImplementation "org.junit.platform:junit-platform-runner:1.9.1" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.9.1" testImplementation(spockDependency) { transitive = false } } if (project.name == "grails-datastore-gorm-tck") { api "org.codehaus.groovy:groovy-test-junit5:$groovyVersion" api "org.junit.jupiter:junit-jupiter-api:5.9.1" api "org.junit.platform:junit-platform-runner:1.9.1" runtimeOnly "org.junit.jupiter:junit-jupiter-engine:5.9.1" implementation(spockDependency) { transitive = false } } } if (isGormDatasource) { dependencies { testImplementation project(":grails-datastore-gorm-tck") } // We need to test against the TCK. Gradle cannot find/run tests from jars // without a lot of plumbing, so here we copy the class files from the TCK // project into this project's test classes dir so Gradle can find the test // classes and run them. See grails.gorm.tests.GormDatastoreSpec for on the TCK. // helper, used below. def toBaseClassRelativePathWithoutExtension = { String base, String classFile -> if (classFile.startsWith(base)) { def sansClass = classFile[0 .. classFile.size() - ".class".size() - 1] def dollarIndex = sansClass.indexOf('$') def baseClass = dollarIndex > 0 ? sansClass[0..dollarIndex - 1] : sansClass def relative = baseClass - base - '/' relative } else { null } } compileTestGroovy { configure(groovyOptions.forkOptions) { jvmArgs = [ '-Xmx768m'] } } test { useJUnitPlatform() testLogging { exceptionFormat ='full' } if (isCiBuild) { maxParallelForks = 2 jvmArgs = ['-server', '-Xmx1024M'] forkEvery = 20 afterSuite { System.out.print('.') System.out.flush() } } else { maxParallelForks = 4 forkEvery = 100 jvmArgs = ['-server', '-Xmx2048M'] } if(System.getProperty("debug.tests")) { jvmArgs '-Xmx2g', '-Xdebug', '-Xnoagent', '-Djava.compiler=NONE', '-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005' } } test.doFirst { File tckClassesDir = project(":grails-datastore-gorm-tck").sourceSets.main.output.classesDirs.files.first() def thisProjectsTests = // surely there is a less hardcoded way to do this copy { from tckClassesDir into sourceSets.test.output.classesDirs.files.first() include "**/*.class" exclude { details -> // Do not copy across any TCK class (or nested classes of that class) // If there is a corresponding source file in the particular modules // test source tree. Allows a module to override a test/helper. if (!details.file.isFile()) { return false } def candidatePath = details.file.absolutePath def relativePath = toBaseClassRelativePathWithoutExtension(tckClassesDir.absolutePath, candidatePath) if (relativePath == null) { throw new IllegalStateException("$candidatePath does not appear to be in the TCK") } project.file("src/test/groovy/${relativePath}.groovy").exists() } } } // Only enable to force update dependencies // configurations.all { // resolutionStrategy.cacheChangingModulesFor 0, 'seconds' // } } if (isStandardGroovyMavenProject) { configure([javadoc]) { options.encoding "UTF-8" options.docEncoding "UTF-8" options.charSet "UTF-8" options.jFlags "-Xms64M", "-Xmx512M" } configure([groovydoc]) { classpath += configurations.documentation } } } configurations { build } dependencies { build "com.cenqua.clover:clover:3.3.0" build "org.apache.ant:ant-junit:1.10.12" build "org.apache.ant:ant-nodeps:1.8.1" } task install(dependsOn: subprojects*.tasks*.withType(PublishToMavenLocal)) apply from: 'https://raw.githubusercontent.com/grails/grails-common-build/master/common-publishing.gradle' task test(dependsOn: getTasksByName("test", true)) { doLast { def reportsDir = "${buildDir}/reports" // Aggregate the test results ant.taskdef( name: 'junitreport2', classname: "org.apache.tools.ant.taskdefs.optional.junit.XMLResultAggregator", classpath: configurations.build.asPath ) def testReportsDir = new File("${reportsDir}/tests") if (testReportsDir.exists()) { testReportsDir.deleteDir() } testReportsDir.mkdirs() ant.junitreport2(todir: testReportsDir) { subprojects.each { def testResultsDir = "${it.buildDir}/test-results" if (new File(testResultsDir).exists()) { fileset(dir: testResultsDir) { include(name: "TEST-*.xml") } } } report(todir: testReportsDir) } } } if (isReleaseVersion) { nexusPublishing { transitionCheckOptions { maxRetries.set(50) delayBetween.set(java.time.Duration.ofMillis(5000)) } } } project.afterEvaluate { allprojects.repositories.each { handler -> handler.each { if (it.url.toString().startsWith("http://")) { throw new RuntimeException("Build should not define insecure HTTP-based Maven repostories") } } } }