Generally a Gradle multi-project build can have any layout in the filesystem and it does not need to be hierarchical.
But it seems SQ now demands that paths of sub-projects are below the root-project path and errors out if this is not the case.
Of course it is maybe not feasibly to support any project layout automatically and if some project uses fancy layout they also have to make sure the SQ properties are set properly.
But I’d say that at least flat-style multi-projects that follow the Gradle naming convention and are supported out-of-the-box by Gradle should be handled properly.
This means you have a structure like
/path/to/worktree/master
/path/to/worktree/sub1
/path/to/worktree/sub2
and the sonar-scanner-gradle plugin will set the sonar.projectBaseDir
property to /path/to/worktree/master
which will then error out when analyzing the subprojects with something like Caused by: java.lang.IllegalStateException: Dir /path/to/worktree/sub1/src/server/resources/META-INF should be relative to project baseDir
.
It might be tempting to just set it to the parent directory if it ends in master
, but this might also not be correct, e. g. when you have different worktrees for different branches and checked out the master
branch into a directory named master
. For flat-style project this would end up like
/path/to/worktrees/master/master
/path/to/worktrees/master/sub1
/path/to/worktrees/master/sub2
and thus work with that logic, but for historical-style projects it would be
/path/to/worktrees/master
/path/to/worktrees/master/sub1
/path/to/worktrees/master/sub2
and there having /path/to/worktree/master
would be correct.
So for a correct automatic approach I guess you should get the project directories of all projects, find the deepest common directory and use that as root sonar.projectBaseDir
and error out with a request to set them manually if no common directory can be found. (Rather rare edge case probably where projects are on different drives on windows)