Compare commits

...

3 Commits

Author SHA1 Message Date
augustomelo c8dd9f9d18 docs: added pom.xml and build.gradle 2024-04-27 12:49:55 +01:00
augustomelo 934495da49 feat: added support to build.gradle 2024-04-27 12:48:00 +01:00
augustomelo d878c91127 refactor: applied code review 2024-04-27 12:41:56 +01:00
7 changed files with 287 additions and 71 deletions

View File

@ -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

View File

@ -25,7 +25,7 @@ This action allows you to work with Java and Scala projects.
- `java-version`: The Java version that is going to be set up. Takes a whole or [semver](#supported-version-syntax) Java version. If not specified, the action will expect `java-version-file` input to be specified.
- `java-version-file`: The path to the `.java-version` file. See more details in [about `.java-version` file](docs/advanced-usage.md#Java-version-file).
- `java-version-file`: The path to the `.java-version` or `pom.xml` or `build.gradle` file. See more details in [about `.java-version` file](docs/advanced-usage.md#Java-version-file).
- `distribution`: _(required)_ Java [distribution](#supported-distributions).

79
dist/cleanup/index.js vendored
View File

@ -103695,7 +103695,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getVersionFromFileContent = exports.isCacheFeatureAvailable = exports.isGhes = exports.isJobStatusSuccess = exports.getToolcachePath = exports.isVersionSatisfies = exports.getDownloadArchiveExtension = exports.extractJdkFile = exports.getVersionFromToolcachePath = exports.getBooleanInput = exports.getTempDir = void 0;
exports.getVersionFromFile = exports.isCacheFeatureAvailable = exports.isGhes = exports.isJobStatusSuccess = exports.getToolcachePath = exports.isVersionSatisfies = exports.getDownloadArchiveExtension = exports.extractJdkFile = exports.getVersionFromToolcachePath = exports.getBooleanInput = exports.getTempDir = void 0;
const os_1 = __importDefault(__nccwpck_require__(2037));
const path_1 = __importDefault(__nccwpck_require__(1017));
const fs = __importStar(__nccwpck_require__(7147));
@ -103791,24 +103791,27 @@ function isCacheFeatureAvailable() {
return false;
}
exports.isCacheFeatureAvailable = isCacheFeatureAvailable;
function getVersionFromFileContent(fileName, content, distributionName) {
function getVersionFromFile(fileName, content, distributionName) {
var _a;
let fileContent = null;
let parsedVersion = null;
core.debug(`Getting version from: '${fileName}'`);
if (fileName.includes('.java-version')) {
fileContent = parseJavaVersionFile(content);
parsedVersion = parseJavaVersionFile(content);
}
else if (fileName.includes('pom.xml')) {
fileContent = parsePomXmlFile(content);
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'`);
}
if (!fileContent) {
if (!parsedVersion) {
return null;
}
core.debug(`Version from file '${fileContent}'`);
const tentativeVersion = avoidOldNotation(fileContent);
core.debug(`Version from file '${parsedVersion}'`);
const tentativeVersion = avoidOldNotation(parsedVersion);
const rawVersion = tentativeVersion.split('-')[0];
let version = semver.validRange(rawVersion) ? tentativeVersion : semver.coerce(tentativeVersion);
core.debug(`Range version from file is '${version}'`);
@ -103821,7 +103824,7 @@ function getVersionFromFileContent(fileName, content, distributionName) {
}
return version.toString();
}
exports.getVersionFromFileContent = getVersionFromFileContent;
exports.getVersionFromFile = getVersionFromFile;
function parseJavaVersionFile(content) {
var _a, _b, _c, _d;
const javaVersionRegExp = /(?<version>(?<=(^|\s|\-))(\d+\S*))(\s|$)/;
@ -103849,11 +103852,8 @@ function parsePomXmlFile(xmlFileAsString) {
return null;
}
function getByMavenProperties(xmlDoc) {
const possibleTagsRegex = [
'maven.compiler.source',
'maven.compiler.release',
];
for (var tag of possibleTagsRegex) {
const versionTags = ['maven.compiler.source', 'maven.compiler.release'];
for (const tag of versionTags) {
const version = getVersionByTagName(xmlDoc, tag);
if (version !== null) {
return version;
@ -103878,29 +103878,32 @@ function getByMavenCompilerPluginConfig(xmlDoc) {
var _a;
const source = xmlDoc.find(n => {
// Find <source> node
if (n.node.nodeName !== "source") {
if (n.node.nodeName !== 'source') {
return false;
}
if (n.node.childNodes.length !== 1) {
return false;
}
// Must be within <configuration>
if (n.up().node.nodeName !== "configuration") {
if (n.up().node.nodeName !== 'configuration') {
return false;
}
// Which must be inside <plugin>
if (n.up().up().node.nodeName !== "plugin") {
if (n.up().up().node.nodeName !== 'plugin') {
return false;
}
// Make sure the plugin is maven-compiler-plugin
const isCompilerPlugin = n.up().up().some(c => {
if (c.node.nodeName !== "artifactId") {
const isCompilerPlugin = n
.up()
.up()
.some(c => {
if (c.node.nodeName !== 'artifactId') {
return false;
}
if (c.node.childNodes.length !== 1) {
return false;
}
return c.first().toString() === "maven-compiler-plugin";
return c.first().toString() === 'maven-compiler-plugin';
}, false, true);
if (!isCompilerPlugin) {
return false;
@ -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;

81
dist/setup/index.js vendored
View File

@ -105104,7 +105104,7 @@ function run() {
.readFileSync(versionFile)
.toString()
.trim();
const version = util_1.getVersionFromFileContent(versionFile, content, distributionName);
const version = util_1.getVersionFromFile(versionFile, content, distributionName);
core.debug(`Parsed version from file '${version}'`);
if (!version) {
throw new Error(`No supported version was found in file ${versionFile}`);
@ -105352,7 +105352,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getVersionFromFileContent = exports.isCacheFeatureAvailable = exports.isGhes = exports.isJobStatusSuccess = exports.getToolcachePath = exports.isVersionSatisfies = exports.getDownloadArchiveExtension = exports.extractJdkFile = exports.getVersionFromToolcachePath = exports.getBooleanInput = exports.getTempDir = void 0;
exports.getVersionFromFile = exports.isCacheFeatureAvailable = exports.isGhes = exports.isJobStatusSuccess = exports.getToolcachePath = exports.isVersionSatisfies = exports.getDownloadArchiveExtension = exports.extractJdkFile = exports.getVersionFromToolcachePath = exports.getBooleanInput = exports.getTempDir = void 0;
const os_1 = __importDefault(__nccwpck_require__(2037));
const path_1 = __importDefault(__nccwpck_require__(1017));
const fs = __importStar(__nccwpck_require__(7147));
@ -105448,24 +105448,27 @@ function isCacheFeatureAvailable() {
return false;
}
exports.isCacheFeatureAvailable = isCacheFeatureAvailable;
function getVersionFromFileContent(fileName, content, distributionName) {
function getVersionFromFile(fileName, content, distributionName) {
var _a;
let fileContent = null;
let parsedVersion = null;
core.debug(`Getting version from: '${fileName}'`);
if (fileName.includes('.java-version')) {
fileContent = parseJavaVersionFile(content);
parsedVersion = parseJavaVersionFile(content);
}
else if (fileName.includes('pom.xml')) {
fileContent = parsePomXmlFile(content);
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'`);
}
if (!fileContent) {
if (!parsedVersion) {
return null;
}
core.debug(`Version from file '${fileContent}'`);
const tentativeVersion = avoidOldNotation(fileContent);
core.debug(`Version from file '${parsedVersion}'`);
const tentativeVersion = avoidOldNotation(parsedVersion);
const rawVersion = tentativeVersion.split('-')[0];
let version = semver.validRange(rawVersion) ? tentativeVersion : semver.coerce(tentativeVersion);
core.debug(`Range version from file is '${version}'`);
@ -105478,7 +105481,7 @@ function getVersionFromFileContent(fileName, content, distributionName) {
}
return version.toString();
}
exports.getVersionFromFileContent = getVersionFromFileContent;
exports.getVersionFromFile = getVersionFromFile;
function parseJavaVersionFile(content) {
var _a, _b, _c, _d;
const javaVersionRegExp = /(?<version>(?<=(^|\s|\-))(\d+\S*))(\s|$)/;
@ -105506,11 +105509,8 @@ function parsePomXmlFile(xmlFileAsString) {
return null;
}
function getByMavenProperties(xmlDoc) {
const possibleTagsRegex = [
'maven.compiler.source',
'maven.compiler.release',
];
for (var tag of possibleTagsRegex) {
const versionTags = ['maven.compiler.source', 'maven.compiler.release'];
for (const tag of versionTags) {
const version = getVersionByTagName(xmlDoc, tag);
if (version !== null) {
return version;
@ -105535,29 +105535,32 @@ function getByMavenCompilerPluginConfig(xmlDoc) {
var _a;
const source = xmlDoc.find(n => {
// Find <source> node
if (n.node.nodeName !== "source") {
if (n.node.nodeName !== 'source') {
return false;
}
if (n.node.childNodes.length !== 1) {
return false;
}
// Must be within <configuration>
if (n.up().node.nodeName !== "configuration") {
if (n.up().node.nodeName !== 'configuration') {
return false;
}
// Which must be inside <plugin>
if (n.up().up().node.nodeName !== "plugin") {
if (n.up().up().node.nodeName !== 'plugin') {
return false;
}
// Make sure the plugin is maven-compiler-plugin
const isCompilerPlugin = n.up().up().some(c => {
if (c.node.nodeName !== "artifactId") {
const isCompilerPlugin = n
.up()
.up()
.some(c => {
if (c.node.nodeName !== 'artifactId') {
return false;
}
if (c.node.childNodes.length !== 1) {
return false;
}
return c.first().toString() === "maven-compiler-plugin";
return c.first().toString() === 'maven-compiler-plugin';
}, false, true);
if (!isCompilerPlugin) {
return false;
@ -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;

View File

@ -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

View File

@ -1,7 +1,7 @@
import fs from 'fs';
import * as core from '@actions/core';
import * as auth from './auth';
import { getBooleanInput, isCacheFeatureAvailable, getVersionFromFileContent } from './util';
import { getBooleanInput, isCacheFeatureAvailable, getVersionFromFile } from './util';
import * as toolchains from './toolchains';
import * as constants from './constants';
import { restore } from './cache';
@ -47,7 +47,7 @@ async function run() {
.toString()
.trim();
const version = getVersionFromFileContent(versionFile, content, distributionName);
const version = getVersionFromFile(versionFile, content, distributionName);
core.debug(`Parsed version from file '${version}'`);
if (!version) {

View File

@ -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();
@ -102,31 +103,33 @@ export function isCacheFeatureAvailable(): boolean {
return false;
}
export function getVersionFromFileContent(
export function getVersionFromFile(
fileName: string,
content: string,
distributionName: string
): string | null {
let fileContent = null;
let parsedVersion = null;
core.debug(`Getting version from: '${fileName}'`);
if (fileName.includes('.java-version')) {
fileContent = parseJavaVersionFile(content);
parsedVersion = parseJavaVersionFile(content);
} else if (fileName.includes('pom.xml')) {
fileContent = parsePomXmlFile(content);
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'`
);
}
if (!fileContent) {
if (!parsedVersion) {
return null;
}
core.debug(`Version from file '${fileContent}'`);
core.debug(`Version from file '${parsedVersion}'`);
const tentativeVersion = avoidOldNotation(fileContent);
const tentativeVersion = avoidOldNotation(parsedVersion);
const rawVersion = tentativeVersion.split('-')[0];
let version = semver.validRange(rawVersion) ? tentativeVersion : semver.coerce(tentativeVersion);
@ -177,12 +180,9 @@ function parsePomXmlFile(xmlFileAsString: string): string | null {
}
function getByMavenProperties(xmlDoc: XMLBuilder): string | null {
const possibleTagsRegex = [
'maven.compiler.source',
'maven.compiler.release',
];
const versionTags = ['maven.compiler.source', 'maven.compiler.release'];
for (var tag of possibleTagsRegex) {
for (const tag of versionTags) {
const version = getVersionByTagName(xmlDoc, tag);
if (version !== null) {
@ -206,36 +206,42 @@ function getVersionByTagName(xmlDoc: XMLBuilder, tag: string): string | null {
} else {
return null;
}
}
function getByMavenCompilerPluginConfig(xmlDoc: XMLBuilder): string | null {
const source = xmlDoc.find(n => {
// Find <source> node
if (n.node.nodeName !== "source") {
if (n.node.nodeName !== 'source') {
return false;
}
if (n.node.childNodes.length !== 1) {
return false;
}
// Must be within <configuration>
if (n.up().node.nodeName !== "configuration") {
if (n.up().node.nodeName !== 'configuration') {
return false;
}
// Which must be inside <plugin>
if (n.up().up().node.nodeName !== "plugin") {
if (n.up().up().node.nodeName !== 'plugin') {
return false;
}
// Make sure the plugin is maven-compiler-plugin
const isCompilerPlugin = n.up().up().some(c => {
if (c.node.nodeName !== "artifactId") {
return false;
}
if (c.node.childNodes.length !== 1) {
return false;
}
return c.first().toString() === "maven-compiler-plugin";
}, false, true);
const isCompilerPlugin = n
.up()
.up()
.some(
c => {
if (c.node.nodeName !== 'artifactId') {
return false;
}
if (c.node.childNodes.length !== 1) {
return false;
}
return c.first().toString() === 'maven-compiler-plugin';
},
false,
true
);
if (!isCompilerPlugin) {
return false;
}
@ -246,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;