Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,12 @@ If you are making changes to the plugins, please see the [internal docs](https:/
on how to do that, including how to develop and test locally and the versioning information.

## Release Notes

### 8.2.0-SNAPSHOT
*Released*: TBD
(Earliest compatible LabKey version: 26.5.0)
- Add `BuildUtils.hasArtifactoryProperties` method for brevity
- Add cacheability annotations to tasks so they work with stricter plugin validation

### 8.1.0
*Released*: 22 April 2026
Expand Down
7 changes: 1 addition & 6 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,7 @@ dependencies {
}

group = 'org.labkey.build'
project.version = "8.2.0-SNAPSHOT"

// Stricter plugin validation was added in 9.4.0. Disable it for now. TODO: Address complaints and remove.
tasks.validatePlugins {
enableStricterValidation = false
}
project.version = "8.2.0-pluginValidation-SNAPSHOT"

gradlePlugin {
plugins {
Expand Down
2 changes: 2 additions & 0 deletions src/main/groovy/org/labkey/gradle/task/Bootstrap.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,10 @@
*/
package org.labkey.gradle.task

import org.gradle.api.tasks.UntrackedTask
import org.labkey.gradle.util.DatabaseProperties

@UntrackedTask(because="Should always be run")
abstract class Bootstrap extends DoThenSetup
{
@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,19 @@ import org.gradle.api.file.FileCollection
import org.gradle.api.provider.Property
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.PathSensitive
import org.gradle.api.tasks.PathSensitivity
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.UntrackedTask
import org.labkey.gradle.util.BuildUtils

import java.util.regex.Matcher

/**
* Checks for conflicts that may exist between a file collection and the files in an existing directory
*/
class CheckForVersionConflicts extends DefaultTask
@UntrackedTask(because="Should always be run")
class CheckForVersionConflicts extends DefaultTask
{
// GH Issue 1015: We are using milestone versions of spring-ai jars, which use classifiers like -M2 to distinguish the different versions.
// We want to have the later milestones replace the earlier ones, so we want to exclude the milestone classifier from the name when
Expand Down Expand Up @@ -64,7 +68,7 @@ class CheckForVersionConflicts extends DefaultTask
project.hasProperty('versionConflictAction') ? ConflictAction.valueOf((String) project.property('versionConflictAction')) : ConflictAction.fail)

/** The collection of files to check for. Usually this will come from a configuration. **/
@InputFiles
@InputFiles @PathSensitive(PathSensitivity.RELATIVE)
FileCollection collection

/** The name of a task to run if conflicts are found that will resolve the conflict (presumably by cleaning out the directory) **/
Expand Down
17 changes: 13 additions & 4 deletions src/main/groovy/org/labkey/gradle/task/ClientLibsCompress.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,13 @@ import org.gradle.api.DefaultTask
import org.gradle.api.GradleException
import org.gradle.api.Project
import org.gradle.api.file.FileTree
import org.gradle.api.tasks.CacheableTask
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.OutputDirectories
import org.gradle.api.tasks.OutputFiles
import org.gradle.api.tasks.PathSensitive
import org.gradle.api.tasks.PathSensitivity
import org.gradle.api.tasks.TaskAction
import org.labkey.gradle.plugin.NpmRun
import org.labkey.gradle.plugin.extension.LabKeyExtension
Expand All @@ -43,19 +46,24 @@ import java.util.stream.Collectors
/**
* Class for compressing javascript and css files using the yuicompressor classes.
*/
@CacheableTask
class ClientLibsCompress extends DefaultTask
{
public static final String LIB_XML_EXTENSION = ".lib.xml"

protected File workingDir = new File((String) project.labkey.explodedModuleWebDir)

// This returns the libXml files from the project directory (the actual input files)
@InputFiles
@PathSensitive(PathSensitivity.RELATIVE)
FileTree xmlFiles
private List<File> inputFiles = null
private List<File> outputFiles = null
private List<File> outputDirs = null

@Internal
String getWorkingDirPath() {
return new File((String) project.labkey.explodedModuleWebDir).getAbsolutePath()
}

/**
* Creates a map between the individual .lib.xml files and the importers used to parse these files and
* extract the css and javascript files that are referenced.
Expand Down Expand Up @@ -103,6 +111,7 @@ class ClientLibsCompress extends DefaultTask
* @return list of all the .lib.xml files and the (internal) files referenced in the .lib.xml files
*/
@InputFiles
@PathSensitive(PathSensitivity.RELATIVE)
List<File> getInputFiles()
{
if (inputFiles == null)
Expand Down Expand Up @@ -139,7 +148,7 @@ class ClientLibsCompress extends DefaultTask
getImporterMap().entrySet().each { Map.Entry<File, XmlImporter> entry ->
// The output file will be in the working directory not in the source directory used when parsing the file.
String fileName = entry.key.getAbsolutePath()
fileName = fileName.replace(entry.value.sourceDir.getAbsolutePath(), workingDir.getAbsolutePath())
fileName = fileName.replace(entry.value.sourceDir.getAbsolutePath(), getWorkingDirPath())
File workingFile = project.file(fileName)
if (entry.value.getCssFiles().size() > 0)
{
Expand Down Expand Up @@ -306,7 +315,7 @@ class ClientLibsCompress extends DefaultTask
File cssMinFile = null

File sourceDir = getSourceDir(xmlFile)
File workingFile = new File(xmlFile.getAbsolutePath().replace(sourceDir.getAbsolutePath(), workingDir.getAbsolutePath()))
File workingFile = new File(xmlFile.getAbsolutePath().replace(sourceDir.getAbsolutePath(), getWorkingDirPath()))

File packageJson = new File(getMinificationWorkingDir(xmlFile), "package.json")
project.logger.info("Creating ${packageJson} for ${xmlFile.getAbsolutePath()}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,21 @@ import org.gradle.api.file.CopySpec
import org.gradle.api.file.DuplicatesStrategy
import org.gradle.api.file.FileSystemOperations
import org.gradle.api.tasks.InputDirectory
import org.gradle.api.tasks.PathSensitive
import org.gradle.api.tasks.PathSensitivity
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.TaskExecutionException
import org.gradle.work.DisableCachingByDefault

import javax.inject.Inject

@DisableCachingByDefault(because="Does only file copying")
abstract class CopyAndInstallRPackage extends InstallRPackage
{
@Inject abstract FileSystemOperations getFs()

@InputDirectory
@PathSensitive(PathSensitivity.RELATIVE)
File packageLocation

@TaskAction
Expand Down
5 changes: 5 additions & 0 deletions src/main/groovy/org/labkey/gradle/task/CopyJsp.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,24 @@ package org.labkey.gradle.task
import org.gradle.api.DefaultTask
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.FileSystemOperations
import org.gradle.api.tasks.CacheableTask
import org.gradle.api.tasks.InputDirectory
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.PathSensitive
import org.gradle.api.tasks.PathSensitivity
import org.gradle.api.tasks.TaskAction

import javax.inject.Inject

@CacheableTask
abstract class CopyJsp extends DefaultTask
{
public static final String WEBAPP_DIR = "jspWebappDir/webapp"

@Inject abstract FileSystemOperations getFs()

@InputDirectory
@PathSensitive(PathSensitivity.RELATIVE)
final abstract DirectoryProperty srcDir = project.objects.directoryProperty().convention(project.layout.projectDirectory.dir('src'))

@OutputDirectory
Expand Down
6 changes: 6 additions & 0 deletions src/main/groovy/org/labkey/gradle/task/CreateJsDocs.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -21,20 +21,26 @@ import org.gradle.api.file.Directory
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.Property
import org.gradle.api.tasks.CacheableTask
import org.gradle.api.tasks.Classpath
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputDirectory
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.PathSensitive
import org.gradle.api.tasks.PathSensitivity
import org.gradle.api.tasks.TaskAction
import org.gradle.process.ExecOperations
import org.labkey.gradle.plugin.XsdDoc

import javax.inject.Inject

@CacheableTask
abstract class CreateJsDocs extends DefaultTask
{
@Inject abstract ExecOperations getExec()

@InputDirectory
@PathSensitive(PathSensitivity.RELATIVE)
final abstract DirectoryProperty templateDir = project.objects.directoryProperty().convention(
project.rootProject.layout.projectDirectory.dir("tools/jsdoc-toolkit/templates/jsdoc_substituted")
)
Expand Down
2 changes: 2 additions & 0 deletions src/main/groovy/org/labkey/gradle/task/CreateModule.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import org.gradle.api.file.CopySpec
import org.gradle.api.file.DuplicatesStrategy
import org.gradle.api.file.FileTree
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.UntrackedTask
import org.labkey.gradle.util.BuildUtils

import java.util.regex.Matcher
Expand All @@ -32,6 +33,7 @@ import java.util.regex.Pattern
* user input based on the prompt flag.
* Documented at <a href='https://www.labkey.org/Documentation/wiki-page.view?name=createNewModule'>labkey.org</a>
*/
@UntrackedTask(because="Has user interaction and side effects")
class CreateModule extends DefaultTask
{
@TaskAction
Expand Down
2 changes: 2 additions & 0 deletions src/main/groovy/org/labkey/gradle/task/CreateXsdDocs.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.Property
import org.gradle.api.tasks.CacheableTask
import org.gradle.api.tasks.Classpath
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputFiles
Expand All @@ -30,6 +31,7 @@ import org.labkey.gradle.plugin.XsdDoc

import javax.inject.Inject

@CacheableTask
abstract class CreateXsdDocs extends DefaultTask
{
@Inject abstract ExecOperations getExec()
Expand Down
8 changes: 7 additions & 1 deletion src/main/groovy/org/labkey/gradle/task/DeployApp.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -26,17 +26,22 @@ import org.gradle.api.tasks.InputDirectory
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.PathSensitive
import org.gradle.api.tasks.PathSensitivity
import org.gradle.api.tasks.TaskAction
import org.gradle.work.DisableCachingByDefault
import org.labkey.gradle.plugin.ServerDeploy
import org.labkey.gradle.plugin.extension.ServerDeployExtension
import org.labkey.gradle.util.BuildUtils

@DisableCachingByDefault(because="Outputs are in the deploy directory")
abstract class DeployApp extends DeployAppBase
{
@InputDirectory
@InputDirectory @PathSensitive(PathSensitivity.RELATIVE)
final abstract DirectoryProperty stagingModulesDir = BuildUtils.getRootBuildDirectoryProperty(project, ServerDeploy.STAGING_MODULES_DIR)

@InputDirectory
@PathSensitive(PathSensitivity.RELATIVE)
final abstract DirectoryProperty stagingPipelineJarDir = BuildUtils.getRootBuildDirectoryProperty(project, ServerDeploy.STAGING_PIPELINE_DIR)

@OutputDirectory
Expand All @@ -62,6 +67,7 @@ abstract class DeployApp extends DeployAppBase
final abstract DirectoryProperty embeddedDir = project.objects.directoryProperty().convention(ServerDeployExtension.getEmbeddedServerDeployDirectory(project))

@InputFiles
@PathSensitive(PathSensitivity.RELATIVE)
abstract ConfigurableFileCollection getBootJar()

@TaskAction
Expand Down
5 changes: 5 additions & 0 deletions src/main/groovy/org/labkey/gradle/task/DeployAppBase.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,20 @@ import org.gradle.api.file.DuplicatesStrategy
import org.gradle.api.file.FileSystemOperations
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.PathSensitive
import org.gradle.api.tasks.PathSensitivity
import org.gradle.work.DisableCachingByDefault
import org.labkey.gradle.util.BuildUtils

import javax.inject.Inject

@DisableCachingByDefault(because="Outputs are in the deploy directory")
abstract class DeployAppBase extends SetUpProperties {

@Inject abstract FileSystemOperations getFs()

@InputFiles
@PathSensitive(PathSensitivity.RELATIVE)
abstract ConfigurableFileCollection getBinaries()

@OutputDirectory
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,16 @@ import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputFile
import org.gradle.api.tasks.Optional
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.PathSensitive
import org.gradle.api.tasks.PathSensitivity
import org.gradle.api.tasks.TaskAction
import org.gradle.work.DisableCachingByDefault
import org.labkey.gradle.plugin.extension.DistributionExtension
import org.labkey.gradle.plugin.extension.ServerDeployExtension

import javax.inject.Inject

@DisableCachingByDefault(because="Outputs are in the deploy directory")
abstract class DeployDistribution extends DeployAppBase
{
@Inject abstract ArchiveOperations getArchiveOps()
Expand All @@ -31,6 +35,7 @@ abstract class DeployDistribution extends DeployAppBase
final abstract DirectoryProperty deployBinDir = project.objects.directoryProperty().convention(ServerDeployExtension.getEmbeddedBinDir(project))

@InputFile @Optional
@PathSensitive(PathSensitivity.RELATIVE)
final abstract RegularFileProperty distributionFile = project.objects.fileProperty().fileValue(DistributionExtension.getDistributionFile(project, distDir.get()))

@TaskAction
Expand Down
2 changes: 2 additions & 0 deletions src/main/groovy/org/labkey/gradle/task/DoThenSetup.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@
package org.labkey.gradle.task

import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.UntrackedTask

@UntrackedTask(because="No trackable file outputs")
abstract class DoThenSetup extends SetUpProperties
{
protected void doDatabaseTask()
Expand Down
1 change: 1 addition & 0 deletions src/main/groovy/org/labkey/gradle/task/GzipAction.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package org.labkey.gradle.task
import org.gradle.api.Action
import org.gradle.api.Task
import org.gradle.api.file.FileTree
import org.gradle.api.tasks.UntrackedTask
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

unused import

Suggested change
import org.gradle.api.tasks.UntrackedTask


/**
* This action can be applied to a task as a doLast action if we need to create gzipped versions of the output files
Expand Down
2 changes: 2 additions & 0 deletions src/main/groovy/org/labkey/gradle/task/InstallRPackage.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,10 @@ import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Optional
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.UntrackedTask
import org.labkey.gradle.plugin.extension.TeamCityExtension

@UntrackedTask(because="Does only file copying outside the build directory")
class InstallRPackage extends DefaultTask
{
@Optional @Input
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,7 @@ abstract class JspCompile2Java extends DefaultTask
@Input
final abstract Property<String> sourceCompatibility = project.objects.property(String).convention((String) project.property('sourceCompatibility'))

@PathSensitive(PathSensitivity.RELATIVE)
@InputDirectory
@InputDirectory @PathSensitive(PathSensitivity.RELATIVE)
File webappDirectory

@OutputDirectory
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import org.gradle.api.file.CopySpec
import org.gradle.api.file.DuplicatesStrategy
import org.gradle.api.file.FileSystemOperations
import org.gradle.api.provider.Property
import org.gradle.api.tasks.CacheableTask
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Optional
import org.gradle.api.tasks.OutputDirectory
Expand All @@ -37,6 +38,7 @@ import org.labkey.gradle.util.GroupNames

import javax.inject.Inject

@CacheableTask
abstract class ModuleDistribution extends DefaultTask
{
@Inject abstract FileSystemOperations getFs()
Expand Down
2 changes: 2 additions & 0 deletions src/main/groovy/org/labkey/gradle/task/ModuleXmlFile.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import org.gradle.api.DefaultTask
import org.gradle.api.GradleException
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.provider.MapProperty
import org.gradle.api.tasks.CacheableTask
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction
Expand All @@ -12,6 +13,7 @@ import org.labkey.gradle.util.PropertiesUtils

import java.util.regex.Matcher

@CacheableTask
abstract class ModuleXmlFile extends DefaultTask
{
@Input
Expand Down
Loading
Loading