Skip to content
Snippets Groups Projects
Commit 2e873d34 authored by IKEDA Sho's avatar IKEDA Sho Committed by Rhys Arkins
Browse files

feat(gradle): support Gradle projects in subdirectories (#4399)

parent 8a2a3984
No related branches found
No related tags found
No related merge requests found
import { exists } from 'fs-extra'; import { exists } from 'fs-extra';
import upath from 'upath';
import { exec } from '../../util/exec'; import { exec } from '../../util/exec';
import { logger } from '../../logger'; import { logger } from '../../logger';
...@@ -22,24 +24,38 @@ export async function extractAllPackageFiles( ...@@ -22,24 +24,38 @@ export async function extractAllPackageFiles(
config: ExtractConfig, config: ExtractConfig,
packageFiles: string[] packageFiles: string[]
): Promise<PackageFile[] | null> { ): Promise<PackageFile[] | null> {
if ( let rootBuildGradle: string | undefined;
!packageFiles.some(packageFile => for (const packageFile of packageFiles) {
['build.gradle', 'build.gradle.kts'].includes(packageFile) if (['build.gradle', 'build.gradle.kts'].includes(packageFile)) {
) rootBuildGradle = packageFile;
) { break;
}
// If there is gradlew in the same directory, the directory should be a Gradle project root
const dirname = upath.dirname(packageFile);
const gradlewPath = upath.join(dirname, 'gradlew');
const gradlewExists = await exists(
upath.join(config.localDir, gradlewPath)
);
if (gradlewExists) {
rootBuildGradle = packageFile;
break;
}
}
if (!rootBuildGradle) {
logger.warn('No root build.gradle nor build.gradle.kts found - skipping'); logger.warn('No root build.gradle nor build.gradle.kts found - skipping');
return null; return null;
} }
logger.info('Extracting dependencies from all gradle files'); logger.info('Extracting dependencies from all gradle files');
await createRenovateGradlePlugin(config.localDir); const cwd = upath.join(config.localDir, upath.dirname(rootBuildGradle));
await executeGradle(config);
await createRenovateGradlePlugin(cwd);
await executeGradle(config, cwd);
init(); init();
const dependencies = await extractDependenciesFromUpdatesReport( const dependencies = await extractDependenciesFromUpdatesReport(cwd);
config.localDir
);
if (dependencies.length === 0) { if (dependencies.length === 0) {
return []; return [];
} }
...@@ -83,18 +99,18 @@ function buildGradleDependency(config: Upgrade): GradleDependency { ...@@ -83,18 +99,18 @@ function buildGradleDependency(config: Upgrade): GradleDependency {
return { group: config.depGroup, name: config.name, version: config.version }; return { group: config.depGroup, name: config.name, version: config.version };
} }
async function executeGradle(config: ExtractConfig) { async function executeGradle(config: ExtractConfig, cwd: string) {
let stdout: string; let stdout: string;
let stderr: string; let stderr: string;
const gradleTimeout = const gradleTimeout =
config.gradle && config.gradle.timeout config.gradle && config.gradle.timeout
? config.gradle.timeout * 1000 ? config.gradle.timeout * 1000
: undefined; : undefined;
const cmd = await getGradleCommandLine(config); const cmd = await getGradleCommandLine(config, cwd);
try { try {
logger.debug({ cmd }, 'Start gradle command'); logger.debug({ cmd }, 'Start gradle command');
({ stdout, stderr } = await exec(cmd, { ({ stdout, stderr } = await exec(cmd, {
cwd: config.localDir, cwd,
timeout: gradleTimeout, timeout: gradleTimeout,
})); }));
} catch (err) { } catch (err) {
...@@ -117,11 +133,14 @@ async function executeGradle(config: ExtractConfig) { ...@@ -117,11 +133,14 @@ async function executeGradle(config: ExtractConfig) {
logger.info('Gradle report complete'); logger.info('Gradle report complete');
} }
async function getGradleCommandLine(config: ExtractConfig): Promise<string> { async function getGradleCommandLine(
config: ExtractConfig,
cwd: string
): Promise<string> {
let cmd: string; let cmd: string;
const gradlewExists = await exists(config.localDir + '/gradlew'); const gradlewExists = await exists(upath.join(cwd, 'gradlew'));
if (config.binarySource === 'docker') { if (config.binarySource === 'docker') {
cmd = `docker run --rm -v ${config.localDir}:${config.localDir} -w ${config.localDir} renovate/gradle gradle`; cmd = `docker run --rm -v ${cwd}:${cwd} -w ${cwd} renovate/gradle gradle`;
} else if (gradlewExists) { } else if (gradlewExists) {
cmd = 'sh gradlew'; cmd = 'sh gradlew';
} else { } else {
......
...@@ -79,6 +79,48 @@ Array [ ...@@ -79,6 +79,48 @@ Array [
] ]
`; `;
exports[`manager/gradle extractPackageFile should return gradle dependencies for build.gradle in subdirectories if there is gradlew in the same directory 1`] = `
Array [
Object {
"datasource": "maven",
"deps": Array [
Object {
"currentValue": null,
"depGroup": "org.springframework.boot",
"depName": "org.springframework.boot:spring-boot-starter-jersey",
"name": "spring-boot-starter-jersey",
"registryUrls": Array [
"https://repo.maven.apache.org/maven2/",
"https://jitpack.io",
],
},
Object {
"currentValue": "1.0-groovy-2.4",
"depGroup": "org.spockframework",
"depName": "org.spockframework:spock-core",
"name": "spock-core",
"registryUrls": Array [
"https://repo.maven.apache.org/maven2/",
"https://jitpack.io",
],
},
Object {
"currentValue": "3.1",
"depGroup": "cglib",
"depName": "cglib:cglib-nodep",
"name": "cglib-nodep",
"registryUrls": Array [
"https://repo.maven.apache.org/maven2/",
"https://jitpack.io",
],
},
],
"manager": "gradle",
"packageFile": "foo/build.gradle",
},
]
`;
exports[`manager/gradle extractPackageFile should return gradle.kts dependencies 1`] = ` exports[`manager/gradle extractPackageFile should return gradle.kts dependencies 1`] = `
Array [ Array [
Object { Object {
......
...@@ -117,7 +117,9 @@ describe('manager/gradle', () => { ...@@ -117,7 +117,9 @@ describe('manager/gradle', () => {
}); });
}); });
it('should return null and gradle should not be executed if no build.gradle', async () => { it('should return null and gradle should not be executed if no root build.gradle', async () => {
fs.exists.mockResolvedValue(false);
const packageFiles = ['foo/build.gradle']; const packageFiles = ['foo/build.gradle'];
expect( expect(
await manager.extractAllPackageFiles(config, packageFiles) await manager.extractAllPackageFiles(config, packageFiles)
...@@ -126,6 +128,13 @@ describe('manager/gradle', () => { ...@@ -126,6 +128,13 @@ describe('manager/gradle', () => {
expect(exec).toHaveBeenCalledTimes(0); expect(exec).toHaveBeenCalledTimes(0);
}); });
it('should return gradle dependencies for build.gradle in subdirectories if there is gradlew in the same directory', async () => {
const dependencies = await manager.extractAllPackageFiles(config, [
'foo/build.gradle',
]);
expect(dependencies).toMatchSnapshot();
});
it('should configure the renovate report plugin', async () => { it('should configure the renovate report plugin', async () => {
await manager.extractAllPackageFiles(config, ['build.gradle']); await manager.extractAllPackageFiles(config, ['build.gradle']);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment