Skip to content

reproducible builds - groovydoc 4, profile fixes, and ensuring gradle projects build docs #14710

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 10 commits into
base: 7.0.x
Choose a base branch
from
10 changes: 8 additions & 2 deletions etc/bin/test-reproducible-builds.sh
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ set -e

export SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct)

CWD=$(pwd)
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
cd "${SCRIPT_DIR}/../.."

Expand All @@ -29,19 +30,24 @@ mkdir -p "${SCRIPT_DIR}/results"

git clean -xdf --exclude='etc/bin'
killall -e java || true
cd grails-gradle
./gradlew build --rerun-tasks -PskipTests --no-build-cache
cd ..
./gradlew build --rerun-tasks -PskipTests --no-build-cache
"${SCRIPT_DIR}/generate-build-artifact-hashes.groovy" > "${SCRIPT_DIR}/results/first.txt"
mkdir -p "${SCRIPT_DIR}/results/first"
find . -path ./etc -prune -o -type f -path '*/build/libs/*.jar' -print0 | xargs -0 cp --parents -t "${SCRIPT_DIR}/results/first/"

git clean -xdf --exclude='etc/bin'
killall -e java || true
cd grails-gradle
./gradlew build --rerun-tasks -PskipTests --no-build-cache
cd ..
./gradlew build --rerun-tasks -PskipTests --no-build-cache
"${SCRIPT_DIR}/generate-build-artifact-hashes.groovy" > "${SCRIPT_DIR}/results/second.txt"
mkdir -p "${SCRIPT_DIR}/results/second"
find . -path ./etc -prune -o -type f -path '*/build/libs/*.jar' -print0 | xargs -0 cp --parents -t "${SCRIPT_DIR}/results/second/"

cd -
cd "${SCRIPT_DIR}/results"

# diff -u first.txt second.txt
Expand All @@ -61,4 +67,4 @@ find second -type f -name '*.jar' -print | sed 's|^second/||' | grep -F -x -v -f
done
rm toPurge.txt
find . -type d -empty -delete
cd -
cd "$CWD"
16 changes: 8 additions & 8 deletions gradle/docs-config.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,13 @@ ext {
includeInApiDocs = true
}

tasks.named('groovydoc', Groovydoc).configure {
tasks.named('groovydoc', Groovydoc).configure { Groovydoc it ->
// TODO: Fix this for testFixtures
classpath = configurations.documentation
groovyClasspath = configurations.documentation
access = GroovydocAccess.PROTECTED
includeAuthor = true
includeMainForScripts = false
processScripts = false
noTimestamp = true
it.classpath = configurations.documentation
it.groovyClasspath = configurations.documentation
it.access = GroovydocAccess.PROTECTED
it.includeAuthor = false
it.includeMainForScripts = false
it.processScripts = false
it.noTimestamp = true
}
11 changes: 6 additions & 5 deletions gradle/docs-dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,13 @@

configurations.register('documentation')
dependencies {
add('documentation', platform("org.apache.grails:grails-gradle-bom:${projectVersion}"))
add('documentation', platform("org.apache.grails:grails-bom:${projectVersion}"))
add('documentation', 'org.fusesource.jansi:jansi')
add('documentation', 'jline:jline')
add('documentation', 'com.github.javaparser:javaparser-core')
add('documentation', 'org.codehaus.groovy:groovy')
add('documentation', 'org.codehaus.groovy:groovy-ant')
add('documentation', 'org.codehaus.groovy:groovy-docgenerator')
add('documentation', 'org.codehaus.groovy:groovy-templates')
add('documentation', 'org.apache.groovy:groovy')
add('documentation', 'org.apache.groovy:groovy-groovydoc')
add('documentation', 'org.apache.groovy:groovy-ant')
add('documentation', 'org.apache.groovy:groovy-docgenerator')
add('documentation', 'org.apache.groovy:groovy-templates')
}
10 changes: 4 additions & 6 deletions grails-bootstrap/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,10 @@ dependencies {
exclude group: 'org.codehaus.groovy'
}

// we have to continue to compile with groovy 3 only because of grails-shell
// the grails-shell will run under gradle and thus this must remain compatible
compileOnly "org.codehaus.groovy:groovy:$GroovySystem.version"
compileOnly "org.codehaus.groovy:groovy-templates:$GroovySystem.version"
compileOnly "org.codehaus.groovy:groovy-xml:$GroovySystem.version"
compileOnly "org.codehaus.groovy:groovy-ant:$GroovySystem.version"
compileOnly 'org.apache.groovy:groovy'
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I spoke to @jamesfredley about this change. Since bootstrap is included by both gorm, and core, we should be compiling with 4. We'll know if it breaks b/c shell still uses 3.

compileOnly 'org.apache.groovy:groovy-templates'
compileOnly 'org.apache.groovy:groovy-xml'
compileOnly 'org.apache.groovy:groovy-ant'

compileOnly 'io.methvin:directory-watcher'
compileOnly 'org.fusesource.jansi:jansi'
Expand Down
2 changes: 1 addition & 1 deletion grails-gradle/docs-core/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,8 @@ tasks.named('jar', Jar).configure { Jar it ->
jar.dependsOn docFilesJar

apply {
from rootProject.layout.projectDirectory.file('gradle/docs-config.gradle')
from rootProject.layout.projectDirectory.file('gradle/java-config.gradle')
from rootProject.layout.projectDirectory.file('gradle/docs-config.gradle')
from rootProject.layout.projectDirectory.file('gradle/test-config.gradle')
}

Expand Down
57 changes: 34 additions & 23 deletions grails-gradle/gradle/docs-config.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -23,36 +23,47 @@ dependencies {
add('documentation', 'org.fusesource.jansi:jansi')
add('documentation', 'jline:jline')
add('documentation', 'com.github.javaparser:javaparser-core')
add('documentation', 'org.codehaus.groovy:groovy')
add('documentation', 'org.codehaus.groovy:groovy-ant')
add('documentation', 'org.codehaus.groovy:groovy-docgenerator')
add('documentation', 'org.codehaus.groovy:groovy-templates')
add('documentation', "org.apache.groovy:groovy:${bomDependencyVersions['groovy.version']}")
add('documentation', "org.apache.groovy:groovy-groovydoc:${bomDependencyVersions['groovy.version']}")
add('documentation', "org.apache.groovy:groovy-ant:${bomDependencyVersions['groovy.version']}")
add('documentation', "org.apache.groovy:groovy-docgenerator:${bomDependencyVersions['groovy.version']}")
add('documentation', "org.apache.groovy:groovy-templates:${bomDependencyVersions['groovy.version']}")
}

ext {
includeInApiDocs = true
}

tasks.named('groovydoc', Groovydoc).configure {
classpath = configurations.documentation
groovyClasspath = configurations.documentation
access = GroovydocAccess.PROTECTED
includeAuthor = true
includeMainForScripts = false
processScripts = false
destinationDir = project.file('build/docs/api')
TaskProvider<Groovydoc> groovydocTask = tasks.named('groovydoc', Groovydoc)
groovydocTask.configure { Groovydoc it ->
it.classpath = configurations.documentation
it.groovyClasspath = configurations.documentation
it.access = GroovydocAccess.PROTECTED
it.includeAuthor = false
it.includeMainForScripts = false
it.processScripts = false
it.noTimestamp = true
it.destinationDir = project.file('build/docs/api')
}

tasks.named('javadoc', Javadoc).configure { Javadoc it ->
(it.options as StandardJavadocDocletOptions).with {
encoding = 'UTF-8'
docEncoding = 'UTF-8'
charSet = 'UTF-8'
addStringOption('Xms64M')
addStringOption('Xmx512M')
}
tasks.named('javadoc').configure {
it.enabled = false
}

tasks.named('javadocJar', Jar).configure { Jar jar ->
jar.reproducibleFileOrder = true
jar.preserveFileTimestamps = false
jar.dirMode = 0755 // To avoid platform specific defaults
jar.fileMode = 0644 // to avoid platform specific defaults

jar.dependsOn(groovydocTask)

// Ensure the java source set is included in the groovydoc source set
SourceSetContainer sourceSets = project.extensions.getByType(SourceSetContainer)
groovydocTask.get().source(project.files(sourceSets.main.java.srcDirs))

ConfigurableFileCollection groovyDocFiles = project.files(groovydocTask.get().destinationDir)
jar.from(groovyDocFiles)
jar.inputs.files(groovyDocFiles)
}

tasks.named('build').configure {
finalizedBy('groovydoc')
}
14 changes: 11 additions & 3 deletions grails-gradle/gradle/java-config.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,17 @@ extensions.configure(JavaPluginExtension) {
it.withSourcesJar()
}

tasks.withType(Javadoc).configureEach { Javadoc it ->
it.options.noTimestamp true // prevent the file header with the date
it.options.bottom "Generated ${formattedBuildDate} (UTC)"
tasks.named('sourcesJar', Jar).configure { Jar jar ->
SourceSetContainer sourceSets = project.extensions.getByType(JavaPluginExtension).sourceSets
jar.reproducibleFileOrder = true
jar.preserveFileTimestamps = false
jar.dirMode = 0755 // To avoid platform specific defaults
jar.fileMode = 0644 // to avoid platform specific defaults
jar.duplicatesStrategy = DuplicatesStrategy.EXCLUDE

// don't only include main, but any source set
jar.from sourceSets.collect { it.allSource }
jar.inputs.files(sourceSets.collect { it.allSource })
}

// JavaCompile is not configured because we put java files inside of the groovy source sets
Expand Down
2 changes: 1 addition & 1 deletion grails-gradle/model/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,8 @@ dependencies {
}

apply {
from rootProject.layout.projectDirectory.file('gradle/docs-config.gradle')
from rootProject.layout.projectDirectory.file('gradle/java-config.gradle')
from rootProject.layout.projectDirectory.file('gradle/docs-config.gradle')
from rootProject.layout.projectDirectory.file('gradle/test-config.gradle')
}

Expand Down
2 changes: 1 addition & 1 deletion grails-gradle/plugins/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ publishing {
}

apply {
from rootProject.layout.projectDirectory.file('gradle/docs-config.gradle')
from rootProject.layout.projectDirectory.file('gradle/java-config.gradle')
from rootProject.layout.projectDirectory.file('gradle/docs-config.gradle')
from rootProject.layout.projectDirectory.file('gradle/e2eTest.gradle')
}
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,8 @@ class GrailsProfileGradlePlugin implements Plugin<Project> {
jar.from(project.files(project.layout.buildDirectory.dir('resources/profile'), project.layout.buildDirectory.dir('classes/profile')))
jar.destinationDirectory.set(project.layout.buildDirectory.dir('libs'))
jar.description = 'Assembles a jar archive containing the profile classes.'
jar.reproducibleFileOrder = true
jar.preserveFileTimestamps = false
}

TaskProvider<Jar> sourcesJarTask = project.tasks.register('sourcesProfileJar', Jar)
Expand All @@ -231,6 +233,8 @@ class GrailsProfileGradlePlugin implements Plugin<Project> {
jar.archiveClassifier.set('sources')
jar.destinationDirectory.set(new File(project.layout.buildDirectory.asFile.get(), 'libs'))
jar.description = 'Assembles a jar archive containing the profile sources.'
jar.reproducibleFileOrder = true
jar.preserveFileTimestamps = false
jar.group = BUILD_GROUP
}

Expand All @@ -244,6 +248,8 @@ class GrailsProfileGradlePlugin implements Plugin<Project> {
jar.destinationDirectory.set(new File(project.layout.buildDirectory.asFile.get(), 'libs'))
jar.description = 'Assembles a jar archive containing the profile javadoc.'
jar.group = BUILD_GROUP
jar.reproducibleFileOrder = true
jar.preserveFileTimestamps = false
}

project.tasks.named('assemble').configure { Task it ->
Expand Down
Loading