diff --git a/.github/workflows/e2e-versions.yml b/.github/workflows/e2e-versions.yml index bf9b8128..ae920e90 100644 --- a/.github/workflows/e2e-versions.yml +++ b/.github/workflows/e2e-versions.yml @@ -469,7 +469,6 @@ jobs: - name: Verify Java run: bash __tests__/verify-java.sh "8" "${{ steps.setup-java.outputs.path }}" shell: bash - setup-java-version-from-pom-maven-compiler-plugin-configuration: name: ${{ matrix.distribution }} version from pom.xml - ${{ matrix.os }} runs-on: ${{ matrix.os }} @@ -513,3 +512,86 @@ jobs: - name: Verify Java run: bash __tests__/verify-java.sh "8" "${{ steps.setup-java.outputs.path }}" shell: bash + setup-java-version-from-build-gradle-java-library-plugin-specification: + name: ${{ matrix.distribution }} version from build.gradle - ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [macos-latest, windows-latest, ubuntu-latest] + distribution: ['adopt', 'zulu', 'liberica'] + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Create build.gradle file + shell: bash + run: | + echo "java {" > build.gradle + echo " toolchain {" >> build.gradle + echo " languageVersion.set(JavaLanguageVersion.of(11))" >> build.gradle + echo " }" >> build.gradle + echo "}" >> build.gradle + - name: setup-java + uses: ./ + id: setup-java + with: + distribution: ${{ matrix.distribution }} + java-version-file: 'build.gradle' + - name: Verify Java + run: bash __tests__/verify-java.sh "11" "${{ steps.setup-java.outputs.path }}" + shell: bash + + setup-java-version-from-build-gradle-java-plugin-source-compatibility-specification: + name: ${{ matrix.distribution }} version from build.gradle - ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [macos-latest, windows-latest, ubuntu-latest] + distribution: ['adopt', 'zulu', 'liberica'] + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Create pom.xml file + shell: bash + run: | + echo "java {" > build.gradle + echo " sourceCompatibility = JavaVersion.VERSION_1_8" >> build.gradle + echo " targetCompatibility = JavaVersion.VERSION_1_8" >> build.gradle + echo "}" >> build.gradle + - name: setup-java + uses: ./ + id: setup-java + with: + distribution: ${{ matrix.distribution }} + java-version-file: 'build.gradle' + - name: Verify Java + run: bash __tests__/verify-java.sh "8" "${{ steps.setup-java.outputs.path }}" + shell: bash + + setup-java-version-from-build-gradle-java-plugin-target-compatibility-specification: + name: ${{ matrix.distribution }} version from build.gradle - ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [macos-latest, windows-latest, ubuntu-latest] + distribution: ['adopt', 'zulu', 'liberica'] + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Create pom.xml file + shell: bash + run: | + echo "java {" > build.gradle + echo " targetCompatibility = JavaVersion.VERSION_21" >> build.gradle + echo "}" >> build.gradle + - name: setup-java + uses: ./ + id: setup-java + with: + distribution: ${{ matrix.distribution }} + java-version-file: 'build.gradle' + - name: Verify Java + run: bash __tests__/verify-java.sh "21" "${{ steps.setup-java.outputs.path }}" + shell: bash diff --git a/dist/cleanup/index.js b/dist/cleanup/index.js index 5758feb2..a1010163 100644 --- a/dist/cleanup/index.js +++ b/dist/cleanup/index.js @@ -103801,6 +103801,9 @@ function getVersionFromFile(fileName, content, distributionName) { else if (fileName.includes('pom.xml')) { parsedVersion = parsePomXmlFile(content); } + else if (fileName.includes('build.gradle')) { + parsedVersion = parseBuildGradleFile(content); + } else { throw new Error(`File ${fileName} not supported, files supported: '.java-version' and 'pom.xml'`); } @@ -103909,6 +103912,42 @@ function getByMavenCompilerPluginConfig(xmlDoc) { }); return (_a = source === null || source === void 0 ? void 0 : source.first().toString()) !== null && _a !== void 0 ? _a : null; } +function parseBuildGradleFile(buildGradle) { + const versionDefinitionTypes = [getByJavaLibraryPlugin, getByJavaPlugin]; + for (const definitionType of versionDefinitionTypes) { + const version = definitionType(buildGradle); + if (version !== null) { + return version; + } + } + return null; +} +function getByJavaLibraryPlugin(buildGradle) { + return getVersionByRegex(buildGradle, 'JavaLanguageVersion.of((d+))'); +} +function getByJavaPlugin(buildGradle) { + const possibleRegex = [ + 'sourceCompatibilitys?=s?JavaVersion.VERSION_(?:1_)?(d+)', + 'targetCompatibilitys?=s?JavaVersion.VERSION_(?:1_)?(d+)' + ]; + for (var regex of possibleRegex) { + const version = getVersionByRegex(buildGradle, regex); + if (version !== null) { + return version; + } + } + return null; +} +function getVersionByRegex(content, regex) { + const match = content.match(new RegExp(regex)); + if (match) { + core.debug(`Found java version: '${match[1]}' using regex: '${regex}'`); + return match[1]; + } + else { + return null; + } +} // By convention, action expects version 8 in the format `8.*` instead of `1.8` function avoidOldNotation(content) { return content.startsWith('1.') ? content.substring(2) : content; diff --git a/dist/setup/index.js b/dist/setup/index.js index e72a2897..33f2f171 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -105458,6 +105458,9 @@ function getVersionFromFile(fileName, content, distributionName) { else if (fileName.includes('pom.xml')) { parsedVersion = parsePomXmlFile(content); } + else if (fileName.includes('build.gradle')) { + parsedVersion = parseBuildGradleFile(content); + } else { throw new Error(`File ${fileName} not supported, files supported: '.java-version' and 'pom.xml'`); } @@ -105566,6 +105569,42 @@ function getByMavenCompilerPluginConfig(xmlDoc) { }); return (_a = source === null || source === void 0 ? void 0 : source.first().toString()) !== null && _a !== void 0 ? _a : null; } +function parseBuildGradleFile(buildGradle) { + const versionDefinitionTypes = [getByJavaLibraryPlugin, getByJavaPlugin]; + for (const definitionType of versionDefinitionTypes) { + const version = definitionType(buildGradle); + if (version !== null) { + return version; + } + } + return null; +} +function getByJavaLibraryPlugin(buildGradle) { + return getVersionByRegex(buildGradle, 'JavaLanguageVersion.of((d+))'); +} +function getByJavaPlugin(buildGradle) { + const possibleRegex = [ + 'sourceCompatibilitys?=s?JavaVersion.VERSION_(?:1_)?(d+)', + 'targetCompatibilitys?=s?JavaVersion.VERSION_(?:1_)?(d+)' + ]; + for (var regex of possibleRegex) { + const version = getVersionByRegex(buildGradle, regex); + if (version !== null) { + return version; + } + } + return null; +} +function getVersionByRegex(content, regex) { + const match = content.match(new RegExp(regex)); + if (match) { + core.debug(`Found java version: '${match[1]}' using regex: '${regex}'`); + return match[1]; + } + else { + return null; + } +} // By convention, action expects version 8 in the format `8.*` instead of `1.8` function avoidOldNotation(content) { return content.startsWith('1.') ? content.substring(2) : content; diff --git a/docs/advanced-usage.md b/docs/advanced-usage.md index 38146f0a..996ad483 100644 --- a/docs/advanced-usage.md +++ b/docs/advanced-usage.md @@ -485,4 +485,8 @@ It is able to parse the following files as `java-version-file`: - Maven compiler plugin - Setting the [source](https://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-source-and-target.html). - Setting the [release](https://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-release.html). - - **Note:** Since we are using a RegExp to find the java version, it doesn't grab the values from the tags `source` or `release` on `maven-compiler-plugin`. +- `build.gradle` + - Java library plugin: uses what is defined by `JavaLanguageVersion` example: `JavaLanguageVersion.of(11)` + - Java plugin [docs](https://docs.gradle.org/current/userguide/java_plugin.html#toolchain_and_compatibility): + - sourceCompatibility + - targetCompatibility diff --git a/src/util.ts b/src/util.ts index 93f2ad43..a8748805 100644 --- a/src/util.ts +++ b/src/util.ts @@ -9,6 +9,7 @@ import * as tc from '@actions/tool-cache'; import { INPUT_JOB_STATUS, DISTRIBUTIONS_ONLY_MAJOR_VERSION } from './constants'; import { create } from 'xmlbuilder2'; import { XMLBuilder } from 'xmlbuilder2/lib/interfaces'; +import { on } from 'events'; export function getTempDir() { let tempDirectory = process.env['RUNNER_TEMP'] || os.tmpdir(); @@ -114,6 +115,8 @@ export function getVersionFromFile( parsedVersion = parseJavaVersionFile(content); } else if (fileName.includes('pom.xml')) { parsedVersion = parsePomXmlFile(content); + } else if (fileName.includes('build.gradle')) { + parsedVersion = parseBuildGradleFile(content); } else { throw new Error( `File ${fileName} not supported, files supported: '.java-version' and 'pom.xml'` @@ -249,6 +252,52 @@ function getByMavenCompilerPluginConfig(xmlDoc: XMLBuilder): string | null { return source?.first().toString() ?? null; } +function parseBuildGradleFile(buildGradle: string): any { + const versionDefinitionTypes = [getByJavaLibraryPlugin, getByJavaPlugin]; + + for (const definitionType of versionDefinitionTypes) { + const version = definitionType(buildGradle); + + if (version !== null) { + return version; + } + } + + return null; +} + +function getByJavaLibraryPlugin(buildGradle: string) { + return getVersionByRegex(buildGradle, 'JavaLanguageVersion.of((d+))'); +} + +function getByJavaPlugin(buildGradle: string) { + const possibleRegex = [ + 'sourceCompatibilitys?=s?JavaVersion.VERSION_(?:1_)?(d+)', + 'targetCompatibilitys?=s?JavaVersion.VERSION_(?:1_)?(d+)' + ]; + + for (var regex of possibleRegex) { + const version = getVersionByRegex(buildGradle, regex); + + if (version !== null) { + return version; + } + } + + return null; +} + +function getVersionByRegex(content: string, regex: string): string | null { + const match = content.match(new RegExp(regex)); + + if (match) { + core.debug(`Found java version: '${match[1]}' using regex: '${regex}'`); + return match[1]; + } else { + return null; + } +} + // By convention, action expects version 8 in the format `8.*` instead of `1.8` function avoidOldNotation(content: string): string { return content.startsWith('1.') ? content.substring(2) : content;