Skip to content

Commit

Permalink
feat(gradle): chmod gradlew (#5806)
Browse files Browse the repository at this point in the history
  • Loading branch information
jGleitz committed Mar 28, 2020
1 parent ebdda4d commit f5c5a57
Show file tree
Hide file tree
Showing 7 changed files with 383 additions and 151 deletions.
2 changes: 1 addition & 1 deletion jest.config.js
Expand Up @@ -7,7 +7,7 @@ module.exports = {
collectCoverageFrom: [
'lib/**/*.{js,ts}',
'!lib/**/*.{d,spec}.ts',
'!lib/**/{__fixtures__,__mocks__}/**/*.{js,ts}',
'!lib/**/{__fixtures__,__mocks__,__testutil__}/**/*.{js,ts}',
],
coverageReporters: ci
? ['html', 'json', 'text-summary']
Expand Down
92 changes: 77 additions & 15 deletions lib/manager/gradle/__snapshots__/index.spec.ts.snap
Expand Up @@ -16,7 +16,29 @@ Array [
"NO_PROXY": "localhost",
"PATH": "/tmp/path",
},
"timeout": 20000,
"timeout": 60000,
},
},
]
`;

exports[`manager/gradle extractPackageFile should execute gradle if gradlew is not available 1`] = `
Array [
Object {
"cmd": "gradle --init-script renovate-plugin.gradle renovate",
"options": Object {
"cwd": "localDir",
"encoding": "utf-8",
"env": Object {
"HOME": "/home/user",
"HTTPS_PROXY": "https://example.com",
"HTTP_PROXY": "http://example.com",
"LANG": "en_US.UTF-8",
"LC_ALL": "en_US",
"NO_PROXY": "localhost",
"PATH": "/tmp/path",
},
"timeout": 60000,
},
},
]
Expand All @@ -38,7 +60,29 @@ Array [
"NO_PROXY": "localhost",
"PATH": "/tmp/path",
},
"timeout": 20000,
"timeout": 60000,
},
},
]
`;

exports[`manager/gradle extractPackageFile should execute gradlew.bat when available on Windows 1`] = `
Array [
Object {
"cmd": "gradlew.bat --init-script renovate-plugin.gradle renovate",
"options": Object {
"cwd": "localDir",
"encoding": "utf-8",
"env": Object {
"HOME": "/home/user",
"HTTPS_PROXY": "https://example.com",
"HTTP_PROXY": "http://example.com",
"LANG": "en_US.UTF-8",
"LC_ALL": "en_US",
"NO_PROXY": "localhost",
"PATH": "/tmp/path",
},
"timeout": 60000,
},
},
]
Expand All @@ -60,7 +104,7 @@ Array [
"NO_PROXY": "localhost",
"PATH": "/tmp/path",
},
"timeout": 20000,
"timeout": 60000,
},
},
]
Expand All @@ -82,7 +126,7 @@ Array [
"NO_PROXY": "localhost",
"PATH": "/tmp/path",
},
"timeout": 20000,
"timeout": 60000,
},
},
]
Expand All @@ -91,7 +135,7 @@ Array [
exports[`manager/gradle extractPackageFile should return empty if there is no dependency report 1`] = `
Array [
Object {
"cmd": "gradle --init-script renovate-plugin.gradle renovate",
"cmd": "./gradlew --init-script renovate-plugin.gradle renovate",
"options": Object {
"cwd": "localDir",
"encoding": "utf-8",
Expand All @@ -104,7 +148,7 @@ Array [
"NO_PROXY": "localhost",
"PATH": "/tmp/path",
},
"timeout": 20000,
"timeout": 60000,
},
},
]
Expand Down Expand Up @@ -247,7 +291,7 @@ Array [
"NO_PROXY": "localhost",
"PATH": "/tmp/path",
},
"timeout": 20000,
"timeout": 60000,
},
},
]
Expand Down Expand Up @@ -332,7 +376,7 @@ Array [
"NO_PROXY": "localhost",
"PATH": "/tmp/path",
},
"timeout": 20000,
"timeout": 60000,
},
},
]
Expand Down Expand Up @@ -475,18 +519,30 @@ Array [
"NO_PROXY": "localhost",
"PATH": "/tmp/path",
},
"timeout": 20000,
"timeout": 60000,
},
},
]
`;

exports[`manager/gradle extractPackageFile should return null and gradle should not be executed if no root build.gradle 1`] = `Array []`;

exports[`manager/gradle extractPackageFile should run gradlew through \`sh\` when available but not executable 1`] = `
exports[`manager/gradle extractPackageFile should use docker even if gradlew is available 1`] = `
Array [
Object {
"cmd": "sh gradlew --init-script renovate-plugin.gradle renovate",
"cmd": "docker pull renovate/gradle",
"options": Object {
"encoding": "utf-8",
},
},
Object {
"cmd": "docker ps --filter name=renovate_gradle -aq | xargs --no-run-if-empty docker rm -f",
"options": Object {
"encoding": "utf-8",
},
},
Object {
"cmd": "docker run --rm --name=renovate_gradle --label=renovate_child -v \\"localDir\\":\\"localDir\\" -w \\"localDir\\" renovate/gradle bash -l -c \\"./gradlew --init-script renovate-plugin.gradle renovate\\"",
"options": Object {
"cwd": "localDir",
"encoding": "utf-8",
Expand All @@ -499,14 +555,20 @@ Array [
"NO_PROXY": "localhost",
"PATH": "/tmp/path",
},
"timeout": 20000,
"timeout": 900000,
},
},
]
`;

exports[`manager/gradle extractPackageFile should use docker even if gradlew is available 1`] = `
exports[`manager/gradle extractPackageFile should use docker even if gradlew.bat is available on Windows 1`] = `
Array [
Object {
"cmd": "docker pull renovate/gradle",
"options": Object {
"encoding": "utf-8",
},
},
Object {
"cmd": "docker ps --filter name=renovate_gradle -aq | xargs --no-run-if-empty docker rm -f",
"options": Object {
Expand Down Expand Up @@ -561,7 +623,7 @@ Array [
"NO_PROXY": "localhost",
"PATH": "/tmp/path",
},
"timeout": 20000,
"timeout": 60000,
},
},
]
Expand Down Expand Up @@ -623,7 +685,7 @@ Array [
"NO_PROXY": "localhost",
"PATH": "/tmp/path",
},
"timeout": 20000,
"timeout": 60000,
},
},
]
Expand Down
87 changes: 87 additions & 0 deletions lib/manager/gradle/__testutil__/gradle.ts
@@ -0,0 +1,87 @@
import { spawnSync, SpawnSyncReturns } from 'child_process';

const failIfNoJavaEnv = 'CI';

const gradleJavaVersionSupport = {
5: { min: 8, max: 12 },
6: { min: 8, max: 13 },
};

const skipJava = process.env.SKIP_JAVA_TESTS === 'true';
const enforceJava = process.env[failIfNoJavaEnv] === 'true' && !skipJava;

function parseJavaVersion(javaVersionOutput: string): number {
const versionMatch = /version "(?:1\.)?(\d+)[\d._-]*"/.exec(
javaVersionOutput
);
if (versionMatch !== null && versionMatch.length === 2) {
return parseInt(versionMatch[1], 10);
}
if (enforceJava) {
throw Error(`This test suite needs Java and ${failIfNoJavaEnv} is set. However, we cannot parse the Java version.
The output of java -version was:
${javaVersionOutput}`);
}
return 0;
}

let cachedJavaVersion: number | null = null;

function determineJavaVersion(): number {
if (cachedJavaVersion == null) {
let javaVersionCommand: SpawnSyncReturns<string>;
let error: Error;
try {
javaVersionCommand = spawnSync('java', ['-version'], {
encoding: 'utf8',
windowsHide: true,
});
} catch (e) {
error = e;
}
if (javaVersionCommand.error) {
error = javaVersionCommand.error;
}
if (error) {
if (!enforceJava) {
return 0;
}
throw Error(
`This test suite needs Java and ${failIfNoJavaEnv} is set.
Result of java -version:
${error}`
);
}
cachedJavaVersion = parseJavaVersion(javaVersionCommand.stderr);
}
return cachedJavaVersion;
}

class WithGradle {
private gradleSupportsThisJavaVersion: boolean;

constructor(private gradleVersion: number) {
const javaVersion = determineJavaVersion();
if (gradleJavaVersionSupport[gradleVersion] === undefined) {
throw Error(`Unknown gradle version '${gradleVersion}'!`);
}

const supportedJavaVersions = gradleJavaVersionSupport[gradleVersion];
this.gradleSupportsThisJavaVersion =
javaVersion >= supportedJavaVersions.min &&
javaVersion <= supportedJavaVersions.max;
if (!this.gradleSupportsThisJavaVersion && enforceJava) {
throw Error(
`This test needs a Java version between ${supportedJavaVersions.min} and ${supportedJavaVersions.max}. The current Java version is ${javaVersion} and ${failIfNoJavaEnv} is set!`
);
}
}

get it(): jest.It {
return !this.gradleSupportsThisJavaVersion || skipJava ? it.skip : it;
}
}

export function ifSystemSupportsGradle(gradleVersion: number): WithGradle {
return new WithGradle(gradleVersion);
}
65 changes: 2 additions & 63 deletions lib/manager/gradle/gradle-updates-report.spec.ts
@@ -1,87 +1,26 @@
import tmp, { DirectoryResult } from 'tmp-promise';
import * as fs from 'fs-extra';
import * as path from 'path';
import { spawnSync, SpawnSyncReturns } from 'child_process';
import { exec } from '../../util/exec';
import { GRADLE_DEPENDENCY_REPORT_OPTIONS } from './index';
import {
createRenovateGradlePlugin,
GRADLE_DEPENDENCY_REPORT_FILENAME,
} from './gradle-updates-report';
import { ifSystemSupportsGradle } from './__testutil__/gradle';

const fixtures = 'lib/manager/gradle/__fixtures__';
const failIfNoJavaEnv = 'CI';

const gradleJavaVersionSupport = {
5: { min: 8, max: 12 },
6: { min: 8, max: 13 },
};

const skipJava = process.env.SKIP_JAVA_TESTS === 'true';
const enforceJava = process.env[failIfNoJavaEnv] === 'true' && !skipJava;

function parseJavaVersion(javaVersionOutput: string) {
const versionMatch = /version "(?:1\.)?(\d+)[\d._-]*"/.exec(
javaVersionOutput
);
if (versionMatch !== null && versionMatch.length === 2) {
return parseInt(versionMatch[1], 10);
}
if (enforceJava) {
throw Error(`This test suite needs Java and ${failIfNoJavaEnv} is set. However, we cannot parse the Java version.
The output of java -version was:
${javaVersionOutput}`);
}
return 0;
}

function determineJavaVersion(): number {
let javaVersionCommand: SpawnSyncReturns<string>;
let error: Error;
try {
javaVersionCommand = spawnSync('java', ['-version'], {
encoding: 'utf8',
windowsHide: true,
});
} catch (e) {
error = e;
}
if (javaVersionCommand.error) {
error = javaVersionCommand.error;
}
if (error) {
if (!enforceJava) {
return 0;
}
throw Error(
`This test suite needs Java and ${failIfNoJavaEnv} is set.
Result of java -version:
${error}`
);
}
return parseJavaVersion(javaVersionCommand.stderr);
}

describe('lib/manager/gradle/gradle-updates-report', () => {
let workingDir: DirectoryResult;
const javaVersion = determineJavaVersion();

beforeEach(async () => {
workingDir = await tmp.dir({ unsafeCleanup: true });
});

describe('createRenovateGradlePlugin', () => {
for (const gradleVersion of [5, 6]) {
const supportedJavaVersions = gradleJavaVersionSupport[gradleVersion];
const gradleSupportsThisJavaVersion =
javaVersion >= supportedJavaVersions.min &&
javaVersion <= supportedJavaVersions.max;
if (!gradleSupportsThisJavaVersion && enforceJava) {
throw Error(
`This test needs a Java version between ${supportedJavaVersions.min} and ${supportedJavaVersions.max}. The current Java version is ${javaVersion} and ${failIfNoJavaEnv} is set!`
);
}
(!gradleSupportsThisJavaVersion || skipJava ? it.skip : it)(
ifSystemSupportsGradle(gradleVersion).it(
`generates a report for Gradle version ${gradleVersion}`,
// the function creation is correct and intended
// eslint-disable-next-line no-loop-func
Expand Down

0 comments on commit f5c5a57

Please sign in to comment.