Add Maven Toolchains Declaration (#276)
* Add (optional) Maven Toolchains Declaration after JDK is installed * Extract common/shared Maven constants Resolves #276
This commit is contained in:
parent
499ae9c28b
commit
eb1418aa81
12
README.md
12
README.md
|
@ -12,6 +12,7 @@ The `setup-java` action provides the following functionality for GitHub Actions
|
||||||
- Caching dependencies managed by Apache Maven
|
- Caching dependencies managed by Apache Maven
|
||||||
- Caching dependencies managed by Gradle
|
- Caching dependencies managed by Gradle
|
||||||
- Caching dependencies managed by sbt
|
- Caching dependencies managed by sbt
|
||||||
|
- [Maven Toolchains declaration](https://maven.apache.org/guides/mini/guide-using-toolchains.html) for specified JDK versions
|
||||||
|
|
||||||
This action allows you to work with Java and Scala projects.
|
This action allows you to work with Java and Scala projects.
|
||||||
|
|
||||||
|
@ -37,7 +38,7 @@ This action allows you to work with Java and Scala projects.
|
||||||
- `cache`: Quick [setup caching](#caching-packages-dependencies) for the dependencies managed through one of the predifined package managers. It can be one of "maven", "gradle" or "sbt".
|
- `cache`: Quick [setup caching](#caching-packages-dependencies) for the dependencies managed through one of the predifined package managers. It can be one of "maven", "gradle" or "sbt".
|
||||||
|
|
||||||
#### Maven options
|
#### Maven options
|
||||||
The action has a bunch of inputs to generate maven's [settings.xml](https://maven.apache.org/settings.html) on the fly and pass the values to Apache Maven GPG Plugin. See [advanced usage](docs/advanced-usage.md) for more.
|
The action has a bunch of inputs to generate maven's [settings.xml](https://maven.apache.org/settings.html) on the fly and pass the values to Apache Maven GPG Plugin as well as Apache Maven Toolchains. See [advanced usage](docs/advanced-usage.md) for more.
|
||||||
|
|
||||||
- `overwrite-settings`: By default action overwrites the settings.xml. In order to skip generation of file if it exists set this to `false`.
|
- `overwrite-settings`: By default action overwrites the settings.xml. In order to skip generation of file if it exists set this to `false`.
|
||||||
|
|
||||||
|
@ -53,6 +54,10 @@ This action allows you to work with Java and Scala projects.
|
||||||
|
|
||||||
- `gpg-passphrase`: description: 'Environment variable name for the GPG private key passphrase. Default is GPG_PASSPHRASE.
|
- `gpg-passphrase`: description: 'Environment variable name for the GPG private key passphrase. Default is GPG_PASSPHRASE.
|
||||||
|
|
||||||
|
- `mvn-toolchain-id`: Name of Maven Toolchain ID if the default name of `${distribution}_${java-version}` is not wanted.
|
||||||
|
|
||||||
|
- `mvn-toolchain-vendor`: Name of Maven Toolchain Vendor if the default name of `${distribution}` is not wanted.
|
||||||
|
|
||||||
### Basic Configuration
|
### Basic Configuration
|
||||||
|
|
||||||
#### Eclipse Temurin
|
#### Eclipse Temurin
|
||||||
|
@ -203,7 +208,11 @@ All versions are added to the PATH. The last version will be used and available
|
||||||
15
|
15
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Using Maven Toolchains
|
||||||
|
In the example above multiple JDKs are installed for the same job. The result after the last JDK is installed is a Maven Toolchains declaration containing references to all three JDKs. The values for `id`, `version`, and `vendor` of the individual Toolchain entries are the given input values for `distribution` and `java-version` (`vendor` being the combination of `${distribution}_${java-version}`) by default.
|
||||||
|
|
||||||
### Advanced Configuration
|
### Advanced Configuration
|
||||||
|
|
||||||
- [Selecting a Java distribution](docs/advanced-usage.md#Selecting-a-Java-distribution)
|
- [Selecting a Java distribution](docs/advanced-usage.md#Selecting-a-Java-distribution)
|
||||||
- [Eclipse Temurin](docs/advanced-usage.md#Eclipse-Temurin)
|
- [Eclipse Temurin](docs/advanced-usage.md#Eclipse-Temurin)
|
||||||
- [Adopt](docs/advanced-usage.md#Adopt)
|
- [Adopt](docs/advanced-usage.md#Adopt)
|
||||||
|
@ -219,6 +228,7 @@ All versions are added to the PATH. The last version will be used and available
|
||||||
- [Publishing using Apache Maven](docs/advanced-usage.md#Publishing-using-Apache-Maven)
|
- [Publishing using Apache Maven](docs/advanced-usage.md#Publishing-using-Apache-Maven)
|
||||||
- [Publishing using Gradle](docs/advanced-usage.md#Publishing-using-Gradle)
|
- [Publishing using Gradle](docs/advanced-usage.md#Publishing-using-Gradle)
|
||||||
- [Hosted Tool Cache](docs/advanced-usage.md#Hosted-Tool-Cache)
|
- [Hosted Tool Cache](docs/advanced-usage.md#Hosted-Tool-Cache)
|
||||||
|
- [Modifying Maven Toolchains](docs/advanced-usage.md#Modifying-Maven-Toolchains)
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
|
|
@ -5,9 +5,10 @@ import * as core from '@actions/core';
|
||||||
import os from 'os';
|
import os from 'os';
|
||||||
|
|
||||||
import * as auth from '../src/auth';
|
import * as auth from '../src/auth';
|
||||||
|
import { M2_DIR, MVN_SETTINGS_FILE } from '../src/constants';
|
||||||
|
|
||||||
const m2Dir = path.join(__dirname, auth.M2_DIR);
|
const m2Dir = path.join(__dirname, M2_DIR);
|
||||||
const settingsFile = path.join(m2Dir, auth.SETTINGS_FILE);
|
const settingsFile = path.join(m2Dir, MVN_SETTINGS_FILE);
|
||||||
|
|
||||||
describe('auth tests', () => {
|
describe('auth tests', () => {
|
||||||
let spyOSHomedir: jest.SpyInstance;
|
let spyOSHomedir: jest.SpyInstance;
|
||||||
|
@ -38,7 +39,7 @@ describe('auth tests', () => {
|
||||||
const password = 'TOLKIEN';
|
const password = 'TOLKIEN';
|
||||||
|
|
||||||
const altHome = path.join(__dirname, 'runner', 'settings');
|
const altHome = path.join(__dirname, 'runner', 'settings');
|
||||||
const altSettingsFile = path.join(altHome, auth.SETTINGS_FILE);
|
const altSettingsFile = path.join(altHome, MVN_SETTINGS_FILE);
|
||||||
await io.rmRF(altHome); // ensure it doesn't already exist
|
await io.rmRF(altHome); // ensure it doesn't already exist
|
||||||
|
|
||||||
await auth.createAuthenticationSettings(id, username, password, altHome, true);
|
await auth.createAuthenticationSettings(id, username, password, altHome, true);
|
||||||
|
|
|
@ -0,0 +1,292 @@
|
||||||
|
import * as fs from 'fs';
|
||||||
|
import os from 'os';
|
||||||
|
import * as path from 'path';
|
||||||
|
import * as core from '@actions/core';
|
||||||
|
import * as io from '@actions/io';
|
||||||
|
import * as toolchains from '../src/toolchains';
|
||||||
|
import { M2_DIR, MVN_TOOLCHAINS_FILE } from '../src/constants';
|
||||||
|
|
||||||
|
const m2Dir = path.join(__dirname, M2_DIR);
|
||||||
|
const toolchainsFile = path.join(m2Dir, MVN_TOOLCHAINS_FILE);
|
||||||
|
|
||||||
|
describe('toolchains tests', () => {
|
||||||
|
let spyOSHomedir: jest.SpyInstance;
|
||||||
|
let spyInfo: jest.SpyInstance;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
await io.rmRF(m2Dir);
|
||||||
|
spyOSHomedir = jest.spyOn(os, 'homedir');
|
||||||
|
spyOSHomedir.mockReturnValue(__dirname);
|
||||||
|
spyInfo = jest.spyOn(core, 'info');
|
||||||
|
spyInfo.mockImplementation(() => null);
|
||||||
|
}, 300000);
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
try {
|
||||||
|
await io.rmRF(m2Dir);
|
||||||
|
} catch {
|
||||||
|
console.log('Failed to remove test directories');
|
||||||
|
}
|
||||||
|
jest.resetAllMocks();
|
||||||
|
jest.clearAllMocks();
|
||||||
|
jest.restoreAllMocks();
|
||||||
|
}, 100000);
|
||||||
|
|
||||||
|
it('creates toolchains.xml in alternate locations', async () => {
|
||||||
|
const jdkInfo = {
|
||||||
|
version: '17',
|
||||||
|
vendor: 'Eclipse Temurin',
|
||||||
|
id: 'temurin_17',
|
||||||
|
jdkHome: '/opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/17.0.1-12/x64'
|
||||||
|
};
|
||||||
|
|
||||||
|
const altHome = path.join(__dirname, 'runner', 'toolchains');
|
||||||
|
const altToolchainsFile = path.join(altHome, MVN_TOOLCHAINS_FILE);
|
||||||
|
await io.rmRF(altHome); // ensure it doesn't already exist
|
||||||
|
|
||||||
|
await toolchains.createToolchainsSettings({
|
||||||
|
jdkInfo,
|
||||||
|
settingsDirectory: altHome,
|
||||||
|
overwriteSettings: true
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(fs.existsSync(m2Dir)).toBe(false);
|
||||||
|
expect(fs.existsSync(toolchainsFile)).toBe(false);
|
||||||
|
|
||||||
|
expect(fs.existsSync(altHome)).toBe(true);
|
||||||
|
expect(fs.existsSync(altToolchainsFile)).toBe(true);
|
||||||
|
expect(fs.readFileSync(altToolchainsFile, 'utf-8')).toEqual(
|
||||||
|
toolchains.generateToolchainDefinition(
|
||||||
|
'',
|
||||||
|
jdkInfo.version,
|
||||||
|
jdkInfo.vendor,
|
||||||
|
jdkInfo.id,
|
||||||
|
jdkInfo.jdkHome
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
await io.rmRF(altHome);
|
||||||
|
}, 100000);
|
||||||
|
|
||||||
|
it('creates toolchains.xml with minimal configuration', async () => {
|
||||||
|
const jdkInfo = {
|
||||||
|
version: '17',
|
||||||
|
vendor: 'Eclipse Temurin',
|
||||||
|
id: 'temurin_17',
|
||||||
|
jdkHome: '/opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/17.0.1-12/x64'
|
||||||
|
};
|
||||||
|
|
||||||
|
const result = `<?xml version="1.0"?>
|
||||||
|
<toolchains xmlns="https://maven.apache.org/TOOLCHAINS/1.1.0"
|
||||||
|
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="https://maven.apache.org/TOOLCHAINS/1.1.0 https://maven.apache.org/xsd/toolchains-1.1.0.xsd">
|
||||||
|
<toolchain>
|
||||||
|
<type>jdk</type>
|
||||||
|
<provides>
|
||||||
|
<version>17</version>
|
||||||
|
<vendor>Eclipse Temurin</vendor>
|
||||||
|
<id>temurin_17</id>
|
||||||
|
</provides>
|
||||||
|
<configuration>
|
||||||
|
<jdkHome>/opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/17.0.1-12/x64</jdkHome>
|
||||||
|
</configuration>
|
||||||
|
</toolchain>
|
||||||
|
</toolchains>`;
|
||||||
|
|
||||||
|
await toolchains.createToolchainsSettings({
|
||||||
|
jdkInfo,
|
||||||
|
settingsDirectory: m2Dir,
|
||||||
|
overwriteSettings: true
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(fs.existsSync(m2Dir)).toBe(true);
|
||||||
|
expect(fs.existsSync(toolchainsFile)).toBe(true);
|
||||||
|
expect(fs.readFileSync(toolchainsFile, 'utf-8')).toEqual(
|
||||||
|
toolchains.generateToolchainDefinition(
|
||||||
|
'',
|
||||||
|
jdkInfo.version,
|
||||||
|
jdkInfo.vendor,
|
||||||
|
jdkInfo.id,
|
||||||
|
jdkInfo.jdkHome
|
||||||
|
)
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
toolchains.generateToolchainDefinition(
|
||||||
|
'',
|
||||||
|
jdkInfo.version,
|
||||||
|
jdkInfo.vendor,
|
||||||
|
jdkInfo.id,
|
||||||
|
jdkInfo.jdkHome
|
||||||
|
)
|
||||||
|
).toEqual(result);
|
||||||
|
}, 100000);
|
||||||
|
|
||||||
|
it('reuses existing toolchains.xml files', async () => {
|
||||||
|
const jdkInfo = {
|
||||||
|
version: '17',
|
||||||
|
vendor: 'Eclipse Temurin',
|
||||||
|
id: 'temurin_17',
|
||||||
|
jdkHome: '/opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/17.0.1-12/x64'
|
||||||
|
};
|
||||||
|
|
||||||
|
const originalFile = `<toolchains>
|
||||||
|
<toolchain>
|
||||||
|
<type>jdk</type>
|
||||||
|
<provides>
|
||||||
|
<version>1.6</version>
|
||||||
|
<vendor>Sun</vendor>
|
||||||
|
<id>sun_1.6</id>
|
||||||
|
</provides>
|
||||||
|
<configuration>
|
||||||
|
<jdkHome>/opt/jdk/sun/1.6</jdkHome>
|
||||||
|
</configuration>
|
||||||
|
</toolchain>
|
||||||
|
</toolchains>`;
|
||||||
|
const result = `<?xml version="1.0"?>
|
||||||
|
<toolchains>
|
||||||
|
<toolchain>
|
||||||
|
<type>jdk</type>
|
||||||
|
<provides>
|
||||||
|
<version>1.6</version>
|
||||||
|
<vendor>Sun</vendor>
|
||||||
|
<id>sun_1.6</id>
|
||||||
|
</provides>
|
||||||
|
<configuration>
|
||||||
|
<jdkHome>/opt/jdk/sun/1.6</jdkHome>
|
||||||
|
</configuration>
|
||||||
|
</toolchain>
|
||||||
|
<toolchain>
|
||||||
|
<type>jdk</type>
|
||||||
|
<provides>
|
||||||
|
<version>17</version>
|
||||||
|
<vendor>Eclipse Temurin</vendor>
|
||||||
|
<id>temurin_17</id>
|
||||||
|
</provides>
|
||||||
|
<configuration>
|
||||||
|
<jdkHome>/opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/17.0.1-12/x64</jdkHome>
|
||||||
|
</configuration>
|
||||||
|
</toolchain>
|
||||||
|
</toolchains>`;
|
||||||
|
|
||||||
|
fs.mkdirSync(m2Dir, { recursive: true });
|
||||||
|
fs.writeFileSync(toolchainsFile, originalFile);
|
||||||
|
expect(fs.existsSync(m2Dir)).toBe(true);
|
||||||
|
expect(fs.existsSync(toolchainsFile)).toBe(true);
|
||||||
|
|
||||||
|
await toolchains.createToolchainsSettings({
|
||||||
|
jdkInfo,
|
||||||
|
settingsDirectory: m2Dir,
|
||||||
|
overwriteSettings: true
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(fs.existsSync(m2Dir)).toBe(true);
|
||||||
|
expect(fs.existsSync(toolchainsFile)).toBe(true);
|
||||||
|
expect(fs.readFileSync(toolchainsFile, 'utf-8')).toEqual(
|
||||||
|
toolchains.generateToolchainDefinition(
|
||||||
|
originalFile,
|
||||||
|
jdkInfo.version,
|
||||||
|
jdkInfo.vendor,
|
||||||
|
jdkInfo.id,
|
||||||
|
jdkInfo.jdkHome
|
||||||
|
)
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
toolchains.generateToolchainDefinition(
|
||||||
|
originalFile,
|
||||||
|
jdkInfo.version,
|
||||||
|
jdkInfo.vendor,
|
||||||
|
jdkInfo.id,
|
||||||
|
jdkInfo.jdkHome
|
||||||
|
)
|
||||||
|
).toEqual(result);
|
||||||
|
}, 100000);
|
||||||
|
|
||||||
|
it('does not overwrite existing toolchains.xml files', async () => {
|
||||||
|
const jdkInfo = {
|
||||||
|
version: '17',
|
||||||
|
vendor: 'Eclipse Temurin',
|
||||||
|
id: 'temurin_17',
|
||||||
|
jdkHome: '/opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/17.0.1-12/x64'
|
||||||
|
};
|
||||||
|
|
||||||
|
const originalFile = `<toolchains>
|
||||||
|
<toolchain>
|
||||||
|
<type>jdk</type>
|
||||||
|
<provides>
|
||||||
|
<version>1.6</version>
|
||||||
|
<vendor>Sun</vendor>
|
||||||
|
<id>sun_1.6</id>
|
||||||
|
</provides>
|
||||||
|
<configuration>
|
||||||
|
<jdkHome>/opt/jdk/sun/1.6</jdkHome>
|
||||||
|
</configuration>
|
||||||
|
</toolchain>
|
||||||
|
</toolchains>`;
|
||||||
|
|
||||||
|
fs.mkdirSync(m2Dir, { recursive: true });
|
||||||
|
fs.writeFileSync(toolchainsFile, originalFile);
|
||||||
|
expect(fs.existsSync(m2Dir)).toBe(true);
|
||||||
|
expect(fs.existsSync(toolchainsFile)).toBe(true);
|
||||||
|
|
||||||
|
await toolchains.createToolchainsSettings({
|
||||||
|
jdkInfo,
|
||||||
|
settingsDirectory: m2Dir,
|
||||||
|
overwriteSettings: false
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(fs.existsSync(m2Dir)).toBe(true);
|
||||||
|
expect(fs.existsSync(toolchainsFile)).toBe(true);
|
||||||
|
expect(fs.readFileSync(toolchainsFile, 'utf-8')).toEqual(originalFile);
|
||||||
|
}, 100000);
|
||||||
|
|
||||||
|
it('generates valid toolchains.xml with minimal configuration', () => {
|
||||||
|
const jdkInfo = {
|
||||||
|
version: 'JAVA_VERSION',
|
||||||
|
vendor: 'JAVA_VENDOR',
|
||||||
|
id: 'VENDOR_VERSION',
|
||||||
|
jdkHome: 'JAVA_HOME'
|
||||||
|
};
|
||||||
|
|
||||||
|
const expectedToolchains = `<?xml version="1.0"?>
|
||||||
|
<toolchains xmlns="https://maven.apache.org/TOOLCHAINS/1.1.0"
|
||||||
|
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="https://maven.apache.org/TOOLCHAINS/1.1.0 https://maven.apache.org/xsd/toolchains-1.1.0.xsd">
|
||||||
|
<toolchain>
|
||||||
|
<type>jdk</type>
|
||||||
|
<provides>
|
||||||
|
<version>${jdkInfo.version}</version>
|
||||||
|
<vendor>${jdkInfo.vendor}</vendor>
|
||||||
|
<id>${jdkInfo.id}</id>
|
||||||
|
</provides>
|
||||||
|
<configuration>
|
||||||
|
<jdkHome>${jdkInfo.jdkHome}</jdkHome>
|
||||||
|
</configuration>
|
||||||
|
</toolchain>
|
||||||
|
</toolchains>`;
|
||||||
|
|
||||||
|
expect(
|
||||||
|
toolchains.generateToolchainDefinition(
|
||||||
|
'',
|
||||||
|
jdkInfo.version,
|
||||||
|
jdkInfo.vendor,
|
||||||
|
jdkInfo.id,
|
||||||
|
jdkInfo.jdkHome
|
||||||
|
)
|
||||||
|
).toEqual(expectedToolchains);
|
||||||
|
}, 100000);
|
||||||
|
|
||||||
|
it('creates toolchains.xml with correct id when none is supplied', async () => {
|
||||||
|
const version = '17';
|
||||||
|
const distributionName = 'temurin';
|
||||||
|
const id = 'temurin_17';
|
||||||
|
const jdkHome = '/opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/17.0.1-12/x64';
|
||||||
|
|
||||||
|
await toolchains.configureToolchains(version, distributionName, jdkHome, undefined);
|
||||||
|
|
||||||
|
expect(fs.existsSync(m2Dir)).toBe(true);
|
||||||
|
expect(fs.existsSync(toolchainsFile)).toBe(true);
|
||||||
|
expect(fs.readFileSync(toolchainsFile, 'utf-8')).toEqual(
|
||||||
|
toolchains.generateToolchainDefinition('', version, distributionName, id, jdkHome)
|
||||||
|
);
|
||||||
|
}, 100000);
|
||||||
|
});
|
|
@ -62,6 +62,12 @@ inputs:
|
||||||
token:
|
token:
|
||||||
description: Used to pull java versions from setup-java. Since there is a default value, token is typically not supplied by the user.
|
description: Used to pull java versions from setup-java. Since there is a default value, token is typically not supplied by the user.
|
||||||
default: ${{ github.token }}
|
default: ${{ github.token }}
|
||||||
|
mvn-toolchain-id:
|
||||||
|
description: 'Name of Maven Toolchain ID if the default name of "${distribution}_${java-version}" is not wanted. See examples of supported syntax in Advanced Usage file'
|
||||||
|
required: false
|
||||||
|
mvn-toolchain-vendor:
|
||||||
|
description: 'Name of Maven Toolchain Vendor if the default name of "${distribution}" is not wanted. See examples of supported syntax in Advanced Usage file'
|
||||||
|
required: false
|
||||||
outputs:
|
outputs:
|
||||||
distribution:
|
distribution:
|
||||||
description: 'Distribution of Java that has been installed'
|
description: 'Distribution of Java that has been installed'
|
||||||
|
|
|
@ -68406,7 +68406,7 @@ else {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||||
exports.STATE_GPG_PRIVATE_KEY_FINGERPRINT = exports.INPUT_JOB_STATUS = exports.INPUT_CACHE = exports.INPUT_DEFAULT_GPG_PASSPHRASE = exports.INPUT_DEFAULT_GPG_PRIVATE_KEY = exports.INPUT_GPG_PASSPHRASE = exports.INPUT_GPG_PRIVATE_KEY = exports.INPUT_OVERWRITE_SETTINGS = exports.INPUT_SETTINGS_PATH = exports.INPUT_SERVER_PASSWORD = exports.INPUT_SERVER_USERNAME = exports.INPUT_SERVER_ID = exports.INPUT_CHECK_LATEST = exports.INPUT_JDK_FILE = exports.INPUT_DISTRIBUTION = exports.INPUT_JAVA_PACKAGE = exports.INPUT_ARCHITECTURE = exports.INPUT_JAVA_VERSION = exports.MACOS_JAVA_CONTENT_POSTFIX = void 0;
|
exports.INPUT_MVN_TOOLCHAIN_VENDOR = exports.INPUT_MVN_TOOLCHAIN_ID = exports.MVN_TOOLCHAINS_FILE = exports.MVN_SETTINGS_FILE = exports.M2_DIR = exports.STATE_GPG_PRIVATE_KEY_FINGERPRINT = exports.INPUT_JOB_STATUS = exports.INPUT_CACHE = exports.INPUT_DEFAULT_GPG_PASSPHRASE = exports.INPUT_DEFAULT_GPG_PRIVATE_KEY = exports.INPUT_GPG_PASSPHRASE = exports.INPUT_GPG_PRIVATE_KEY = exports.INPUT_OVERWRITE_SETTINGS = exports.INPUT_SETTINGS_PATH = exports.INPUT_SERVER_PASSWORD = exports.INPUT_SERVER_USERNAME = exports.INPUT_SERVER_ID = exports.INPUT_CHECK_LATEST = exports.INPUT_JDK_FILE = exports.INPUT_DISTRIBUTION = exports.INPUT_JAVA_PACKAGE = exports.INPUT_ARCHITECTURE = exports.INPUT_JAVA_VERSION = exports.MACOS_JAVA_CONTENT_POSTFIX = void 0;
|
||||||
exports.MACOS_JAVA_CONTENT_POSTFIX = 'Contents/Home';
|
exports.MACOS_JAVA_CONTENT_POSTFIX = 'Contents/Home';
|
||||||
exports.INPUT_JAVA_VERSION = 'java-version';
|
exports.INPUT_JAVA_VERSION = 'java-version';
|
||||||
exports.INPUT_ARCHITECTURE = 'architecture';
|
exports.INPUT_ARCHITECTURE = 'architecture';
|
||||||
|
@ -68426,6 +68426,11 @@ exports.INPUT_DEFAULT_GPG_PASSPHRASE = 'GPG_PASSPHRASE';
|
||||||
exports.INPUT_CACHE = 'cache';
|
exports.INPUT_CACHE = 'cache';
|
||||||
exports.INPUT_JOB_STATUS = 'job-status';
|
exports.INPUT_JOB_STATUS = 'job-status';
|
||||||
exports.STATE_GPG_PRIVATE_KEY_FINGERPRINT = 'gpg-private-key-fingerprint';
|
exports.STATE_GPG_PRIVATE_KEY_FINGERPRINT = 'gpg-private-key-fingerprint';
|
||||||
|
exports.M2_DIR = '.m2';
|
||||||
|
exports.MVN_SETTINGS_FILE = 'settings.xml';
|
||||||
|
exports.MVN_TOOLCHAINS_FILE = 'toolchains.xml';
|
||||||
|
exports.INPUT_MVN_TOOLCHAIN_ID = 'mvn-toolchain-id';
|
||||||
|
exports.INPUT_MVN_TOOLCHAIN_VENDOR = 'mvn-toolchain-vendor';
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
|
@ -103216,7 +103216,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||||
exports.generate = exports.createAuthenticationSettings = exports.configureAuthentication = exports.SETTINGS_FILE = exports.M2_DIR = void 0;
|
exports.generate = exports.createAuthenticationSettings = exports.configureAuthentication = void 0;
|
||||||
const path = __importStar(__nccwpck_require__(1017));
|
const path = __importStar(__nccwpck_require__(1017));
|
||||||
const core = __importStar(__nccwpck_require__(2186));
|
const core = __importStar(__nccwpck_require__(2186));
|
||||||
const io = __importStar(__nccwpck_require__(7436));
|
const io = __importStar(__nccwpck_require__(7436));
|
||||||
|
@ -103226,14 +103226,12 @@ const xmlbuilder2_1 = __nccwpck_require__(151);
|
||||||
const constants = __importStar(__nccwpck_require__(9042));
|
const constants = __importStar(__nccwpck_require__(9042));
|
||||||
const gpg = __importStar(__nccwpck_require__(3759));
|
const gpg = __importStar(__nccwpck_require__(3759));
|
||||||
const util_1 = __nccwpck_require__(2629);
|
const util_1 = __nccwpck_require__(2629);
|
||||||
exports.M2_DIR = '.m2';
|
|
||||||
exports.SETTINGS_FILE = 'settings.xml';
|
|
||||||
function configureAuthentication() {
|
function configureAuthentication() {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
const id = core.getInput(constants.INPUT_SERVER_ID);
|
const id = core.getInput(constants.INPUT_SERVER_ID);
|
||||||
const username = core.getInput(constants.INPUT_SERVER_USERNAME);
|
const username = core.getInput(constants.INPUT_SERVER_USERNAME);
|
||||||
const password = core.getInput(constants.INPUT_SERVER_PASSWORD);
|
const password = core.getInput(constants.INPUT_SERVER_PASSWORD);
|
||||||
const settingsDirectory = core.getInput(constants.INPUT_SETTINGS_PATH) || path.join(os.homedir(), exports.M2_DIR);
|
const settingsDirectory = core.getInput(constants.INPUT_SETTINGS_PATH) || path.join(os.homedir(), constants.M2_DIR);
|
||||||
const overwriteSettings = util_1.getBooleanInput(constants.INPUT_OVERWRITE_SETTINGS, true);
|
const overwriteSettings = util_1.getBooleanInput(constants.INPUT_OVERWRITE_SETTINGS, true);
|
||||||
const gpgPrivateKey = core.getInput(constants.INPUT_GPG_PRIVATE_KEY) || constants.INPUT_DEFAULT_GPG_PRIVATE_KEY;
|
const gpgPrivateKey = core.getInput(constants.INPUT_GPG_PRIVATE_KEY) || constants.INPUT_DEFAULT_GPG_PRIVATE_KEY;
|
||||||
const gpgPassphrase = core.getInput(constants.INPUT_GPG_PASSPHRASE) ||
|
const gpgPassphrase = core.getInput(constants.INPUT_GPG_PASSPHRASE) ||
|
||||||
|
@ -103252,7 +103250,7 @@ function configureAuthentication() {
|
||||||
exports.configureAuthentication = configureAuthentication;
|
exports.configureAuthentication = configureAuthentication;
|
||||||
function createAuthenticationSettings(id, username, password, settingsDirectory, overwriteSettings, gpgPassphrase = undefined) {
|
function createAuthenticationSettings(id, username, password, settingsDirectory, overwriteSettings, gpgPassphrase = undefined) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
core.info(`Creating ${exports.SETTINGS_FILE} with server-id: ${id}`);
|
core.info(`Creating ${constants.MVN_SETTINGS_FILE} with server-id: ${id}`);
|
||||||
// when an alternate m2 location is specified use only that location (no .m2 directory)
|
// when an alternate m2 location is specified use only that location (no .m2 directory)
|
||||||
// otherwise use the home/.m2/ path
|
// otherwise use the home/.m2/ path
|
||||||
yield io.mkdirP(settingsDirectory);
|
yield io.mkdirP(settingsDirectory);
|
||||||
|
@ -103294,7 +103292,7 @@ function generate(id, username, password, gpgPassphrase) {
|
||||||
exports.generate = generate;
|
exports.generate = generate;
|
||||||
function write(directory, settings, overwriteSettings) {
|
function write(directory, settings, overwriteSettings) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
const location = path.join(directory, exports.SETTINGS_FILE);
|
const location = path.join(directory, constants.MVN_SETTINGS_FILE);
|
||||||
const settingsExists = fs.existsSync(location);
|
const settingsExists = fs.existsSync(location);
|
||||||
if (settingsExists && overwriteSettings) {
|
if (settingsExists && overwriteSettings) {
|
||||||
core.info(`Overwriting existing file ${location}`);
|
core.info(`Overwriting existing file ${location}`);
|
||||||
|
@ -103510,7 +103508,7 @@ function isProbablyGradleDaemonProblem(packageManager, error) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||||
exports.STATE_GPG_PRIVATE_KEY_FINGERPRINT = exports.INPUT_JOB_STATUS = exports.INPUT_CACHE = exports.INPUT_DEFAULT_GPG_PASSPHRASE = exports.INPUT_DEFAULT_GPG_PRIVATE_KEY = exports.INPUT_GPG_PASSPHRASE = exports.INPUT_GPG_PRIVATE_KEY = exports.INPUT_OVERWRITE_SETTINGS = exports.INPUT_SETTINGS_PATH = exports.INPUT_SERVER_PASSWORD = exports.INPUT_SERVER_USERNAME = exports.INPUT_SERVER_ID = exports.INPUT_CHECK_LATEST = exports.INPUT_JDK_FILE = exports.INPUT_DISTRIBUTION = exports.INPUT_JAVA_PACKAGE = exports.INPUT_ARCHITECTURE = exports.INPUT_JAVA_VERSION = exports.MACOS_JAVA_CONTENT_POSTFIX = void 0;
|
exports.INPUT_MVN_TOOLCHAIN_VENDOR = exports.INPUT_MVN_TOOLCHAIN_ID = exports.MVN_TOOLCHAINS_FILE = exports.MVN_SETTINGS_FILE = exports.M2_DIR = exports.STATE_GPG_PRIVATE_KEY_FINGERPRINT = exports.INPUT_JOB_STATUS = exports.INPUT_CACHE = exports.INPUT_DEFAULT_GPG_PASSPHRASE = exports.INPUT_DEFAULT_GPG_PRIVATE_KEY = exports.INPUT_GPG_PASSPHRASE = exports.INPUT_GPG_PRIVATE_KEY = exports.INPUT_OVERWRITE_SETTINGS = exports.INPUT_SETTINGS_PATH = exports.INPUT_SERVER_PASSWORD = exports.INPUT_SERVER_USERNAME = exports.INPUT_SERVER_ID = exports.INPUT_CHECK_LATEST = exports.INPUT_JDK_FILE = exports.INPUT_DISTRIBUTION = exports.INPUT_JAVA_PACKAGE = exports.INPUT_ARCHITECTURE = exports.INPUT_JAVA_VERSION = exports.MACOS_JAVA_CONTENT_POSTFIX = void 0;
|
||||||
exports.MACOS_JAVA_CONTENT_POSTFIX = 'Contents/Home';
|
exports.MACOS_JAVA_CONTENT_POSTFIX = 'Contents/Home';
|
||||||
exports.INPUT_JAVA_VERSION = 'java-version';
|
exports.INPUT_JAVA_VERSION = 'java-version';
|
||||||
exports.INPUT_ARCHITECTURE = 'architecture';
|
exports.INPUT_ARCHITECTURE = 'architecture';
|
||||||
|
@ -103530,6 +103528,11 @@ exports.INPUT_DEFAULT_GPG_PASSPHRASE = 'GPG_PASSPHRASE';
|
||||||
exports.INPUT_CACHE = 'cache';
|
exports.INPUT_CACHE = 'cache';
|
||||||
exports.INPUT_JOB_STATUS = 'job-status';
|
exports.INPUT_JOB_STATUS = 'job-status';
|
||||||
exports.STATE_GPG_PRIVATE_KEY_FINGERPRINT = 'gpg-private-key-fingerprint';
|
exports.STATE_GPG_PRIVATE_KEY_FINGERPRINT = 'gpg-private-key-fingerprint';
|
||||||
|
exports.M2_DIR = '.m2';
|
||||||
|
exports.MVN_SETTINGS_FILE = 'settings.xml';
|
||||||
|
exports.MVN_TOOLCHAINS_FILE = 'toolchains.xml';
|
||||||
|
exports.INPUT_MVN_TOOLCHAIN_ID = 'mvn-toolchain-id';
|
||||||
|
exports.INPUT_MVN_TOOLCHAIN_VENDOR = 'mvn-toolchain-vendor';
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
@ -104952,6 +104955,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||||
const core = __importStar(__nccwpck_require__(2186));
|
const core = __importStar(__nccwpck_require__(2186));
|
||||||
const auth = __importStar(__nccwpck_require__(3497));
|
const auth = __importStar(__nccwpck_require__(3497));
|
||||||
const util_1 = __nccwpck_require__(2629);
|
const util_1 = __nccwpck_require__(2629);
|
||||||
|
const toolchains = __importStar(__nccwpck_require__(9322));
|
||||||
const constants = __importStar(__nccwpck_require__(9042));
|
const constants = __importStar(__nccwpck_require__(9042));
|
||||||
const cache_1 = __nccwpck_require__(4810);
|
const cache_1 = __nccwpck_require__(4810);
|
||||||
const path = __importStar(__nccwpck_require__(1017));
|
const path = __importStar(__nccwpck_require__(1017));
|
||||||
|
@ -104966,8 +104970,12 @@ function run() {
|
||||||
const jdkFile = core.getInput(constants.INPUT_JDK_FILE);
|
const jdkFile = core.getInput(constants.INPUT_JDK_FILE);
|
||||||
const cache = core.getInput(constants.INPUT_CACHE);
|
const cache = core.getInput(constants.INPUT_CACHE);
|
||||||
const checkLatest = util_1.getBooleanInput(constants.INPUT_CHECK_LATEST, false);
|
const checkLatest = util_1.getBooleanInput(constants.INPUT_CHECK_LATEST, false);
|
||||||
|
let toolchainIds = core.getMultilineInput(constants.INPUT_MVN_TOOLCHAIN_ID);
|
||||||
|
if (versions.length !== toolchainIds.length) {
|
||||||
|
toolchainIds = [];
|
||||||
|
}
|
||||||
core.startGroup('Installed distributions');
|
core.startGroup('Installed distributions');
|
||||||
for (const version of versions) {
|
for (const [index, version] of versions.entries()) {
|
||||||
const installerOptions = {
|
const installerOptions = {
|
||||||
architecture,
|
architecture,
|
||||||
packageType,
|
packageType,
|
||||||
|
@ -104979,6 +104987,7 @@ function run() {
|
||||||
throw new Error(`No supported distribution was found for input ${distributionName}`);
|
throw new Error(`No supported distribution was found for input ${distributionName}`);
|
||||||
}
|
}
|
||||||
const result = yield distribution.setupJava();
|
const result = yield distribution.setupJava();
|
||||||
|
yield toolchains.configureToolchains(version, distributionName, result.path, toolchainIds[index]);
|
||||||
core.info('');
|
core.info('');
|
||||||
core.info('Java configuration:');
|
core.info('Java configuration:');
|
||||||
core.info(` Distribution: ${distributionName}`);
|
core.info(` Distribution: ${distributionName}`);
|
||||||
|
@ -105002,6 +105011,166 @@ function run() {
|
||||||
run();
|
run();
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 9322:
|
||||||
|
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||||
|
if (k2 === undefined) k2 = k;
|
||||||
|
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
||||||
|
}) : (function(o, m, k, k2) {
|
||||||
|
if (k2 === undefined) k2 = k;
|
||||||
|
o[k2] = m[k];
|
||||||
|
}));
|
||||||
|
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||||
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||||
|
}) : function(o, v) {
|
||||||
|
o["default"] = v;
|
||||||
|
});
|
||||||
|
var __importStar = (this && this.__importStar) || function (mod) {
|
||||||
|
if (mod && mod.__esModule) return mod;
|
||||||
|
var result = {};
|
||||||
|
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
||||||
|
__setModuleDefault(result, mod);
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||||
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||||
|
return new (P || (P = Promise))(function (resolve, reject) {
|
||||||
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||||
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||||
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||||
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||||
|
});
|
||||||
|
};
|
||||||
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||||
|
exports.generateToolchainDefinition = exports.createToolchainsSettings = exports.configureToolchains = void 0;
|
||||||
|
const fs = __importStar(__nccwpck_require__(7147));
|
||||||
|
const os = __importStar(__nccwpck_require__(2037));
|
||||||
|
const path = __importStar(__nccwpck_require__(1017));
|
||||||
|
const core = __importStar(__nccwpck_require__(2186));
|
||||||
|
const io = __importStar(__nccwpck_require__(7436));
|
||||||
|
const constants = __importStar(__nccwpck_require__(9042));
|
||||||
|
const util_1 = __nccwpck_require__(2629);
|
||||||
|
const xmlbuilder2_1 = __nccwpck_require__(151);
|
||||||
|
function configureToolchains(version, distributionName, jdkHome, toolchainId) {
|
||||||
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
const vendor = core.getInput(constants.INPUT_MVN_TOOLCHAIN_VENDOR) || distributionName;
|
||||||
|
const id = toolchainId || `${vendor}_${version}`;
|
||||||
|
const settingsDirectory = core.getInput(constants.INPUT_SETTINGS_PATH) || path.join(os.homedir(), constants.M2_DIR);
|
||||||
|
const overwriteSettings = util_1.getBooleanInput(constants.INPUT_OVERWRITE_SETTINGS, true);
|
||||||
|
yield createToolchainsSettings({
|
||||||
|
jdkInfo: {
|
||||||
|
version,
|
||||||
|
vendor,
|
||||||
|
id,
|
||||||
|
jdkHome
|
||||||
|
},
|
||||||
|
settingsDirectory,
|
||||||
|
overwriteSettings
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
exports.configureToolchains = configureToolchains;
|
||||||
|
function createToolchainsSettings({ jdkInfo, settingsDirectory, overwriteSettings }) {
|
||||||
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
core.info(`Creating ${constants.MVN_TOOLCHAINS_FILE} for JDK version ${jdkInfo.version} from ${jdkInfo.vendor}`);
|
||||||
|
// when an alternate m2 location is specified use only that location (no .m2 directory)
|
||||||
|
// otherwise use the home/.m2/ path
|
||||||
|
yield io.mkdirP(settingsDirectory);
|
||||||
|
const originalToolchains = yield readExistingToolchainsFile(settingsDirectory);
|
||||||
|
const updatedToolchains = generateToolchainDefinition(originalToolchains, jdkInfo.version, jdkInfo.vendor, jdkInfo.id, jdkInfo.jdkHome);
|
||||||
|
yield writeToolchainsFileToDisk(settingsDirectory, updatedToolchains, overwriteSettings);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
exports.createToolchainsSettings = createToolchainsSettings;
|
||||||
|
// only exported for testing purposes
|
||||||
|
function generateToolchainDefinition(original, version, vendor, id, jdkHome) {
|
||||||
|
let xmlObj;
|
||||||
|
if (original === null || original === void 0 ? void 0 : original.length) {
|
||||||
|
xmlObj = xmlbuilder2_1.create(original)
|
||||||
|
.root()
|
||||||
|
.ele({
|
||||||
|
toolchain: {
|
||||||
|
type: 'jdk',
|
||||||
|
provides: {
|
||||||
|
version: `${version}`,
|
||||||
|
vendor: `${vendor}`,
|
||||||
|
id: `${id}`
|
||||||
|
},
|
||||||
|
configuration: {
|
||||||
|
jdkHome: `${jdkHome}`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
xmlObj = xmlbuilder2_1.create({
|
||||||
|
toolchains: {
|
||||||
|
'@xmlns': 'https://maven.apache.org/TOOLCHAINS/1.1.0',
|
||||||
|
'@xmlns:xsi': 'https://www.w3.org/2001/XMLSchema-instance',
|
||||||
|
'@xsi:schemaLocation': 'https://maven.apache.org/TOOLCHAINS/1.1.0 https://maven.apache.org/xsd/toolchains-1.1.0.xsd',
|
||||||
|
toolchain: [
|
||||||
|
{
|
||||||
|
type: 'jdk',
|
||||||
|
provides: {
|
||||||
|
version: `${version}`,
|
||||||
|
vendor: `${vendor}`,
|
||||||
|
id: `${id}`
|
||||||
|
},
|
||||||
|
configuration: {
|
||||||
|
jdkHome: `${jdkHome}`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return xmlObj.end({
|
||||||
|
format: 'xml',
|
||||||
|
wellFormed: false,
|
||||||
|
headless: false,
|
||||||
|
prettyPrint: true,
|
||||||
|
width: 80
|
||||||
|
});
|
||||||
|
}
|
||||||
|
exports.generateToolchainDefinition = generateToolchainDefinition;
|
||||||
|
function readExistingToolchainsFile(directory) {
|
||||||
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
const location = path.join(directory, constants.MVN_TOOLCHAINS_FILE);
|
||||||
|
if (fs.existsSync(location)) {
|
||||||
|
return fs.readFileSync(location, {
|
||||||
|
encoding: 'utf-8',
|
||||||
|
flag: 'r'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function writeToolchainsFileToDisk(directory, settings, overwriteSettings) {
|
||||||
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
const location = path.join(directory, constants.MVN_TOOLCHAINS_FILE);
|
||||||
|
const settingsExists = fs.existsSync(location);
|
||||||
|
if (settingsExists && overwriteSettings) {
|
||||||
|
core.info(`Overwriting existing file ${location}`);
|
||||||
|
}
|
||||||
|
else if (!settingsExists) {
|
||||||
|
core.info(`Writing to ${location}`);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
core.info(`Skipping generation of ${location} because file already exists and overwriting is not enabled`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return fs.writeFileSync(location, settings, {
|
||||||
|
encoding: 'utf-8',
|
||||||
|
flag: 'w'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
/***/ 2629:
|
/***/ 2629:
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
- [Publishing using Apache Maven](#Publishing-using-Apache-Maven)
|
- [Publishing using Apache Maven](#Publishing-using-Apache-Maven)
|
||||||
- [Publishing using Gradle](#Publishing-using-Gradle)
|
- [Publishing using Gradle](#Publishing-using-Gradle)
|
||||||
- [Hosted Tool Cache](#Hosted-Tool-Cache)
|
- [Hosted Tool Cache](#Hosted-Tool-Cache)
|
||||||
|
- [Modifying Maven Toolchains](#Modifying-Maven-Toolchains)
|
||||||
|
|
||||||
See [action.yml](../action.yml) for more details on task inputs.
|
See [action.yml](../action.yml) for more details on task inputs.
|
||||||
|
|
||||||
|
@ -350,3 +351,100 @@ GitHub Hosted Runners have a tool cache that comes with some Java versions pre-i
|
||||||
Currently, LTS versions of Adopt OpenJDK (`adopt`) are cached on the GitHub Hosted Runners.
|
Currently, LTS versions of Adopt OpenJDK (`adopt`) are cached on the GitHub Hosted Runners.
|
||||||
|
|
||||||
The tools cache gets updated on a weekly basis. For information regarding locally cached versions of Java on GitHub hosted runners, check out [GitHub Actions Virtual Environments](https://github.com/actions/virtual-environments).
|
The tools cache gets updated on a weekly basis. For information regarding locally cached versions of Java on GitHub hosted runners, check out [GitHub Actions Virtual Environments](https://github.com/actions/virtual-environments).
|
||||||
|
|
||||||
|
## Modifying Maven Toolchains
|
||||||
|
The `setup-java` action generates a basic [Maven Toolchains declaration](https://maven.apache.org/guides/mini/guide-using-toolchains.html) for specified Java versions by either creating a minimal toolchains file or extending an existing declaration with the additional JDKs.
|
||||||
|
|
||||||
|
### Installing Multiple JDKs With Toolchains
|
||||||
|
Subsequent calls to `setup-java` with distinct distribution and version parameters will continue to extend the toolchains declaration and make all specified Java versions available.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
steps:
|
||||||
|
- uses: actions/setup-java@v3
|
||||||
|
with:
|
||||||
|
distribution: '<distribution>'
|
||||||
|
java-version: |
|
||||||
|
8
|
||||||
|
11
|
||||||
|
|
||||||
|
- uses: actions/setup-java@v3
|
||||||
|
with:
|
||||||
|
distribution: '<distribution>'
|
||||||
|
java-version: 15
|
||||||
|
```
|
||||||
|
|
||||||
|
The result is a Toolchain with entries for JDKs 8, 11 and 15. You can even combine this with custom JDKs of arbitrary versions:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- run: |
|
||||||
|
download_url="https://example.com/java/jdk/6u45-b06/jdk-6u45-linux-x64.tar.gz"
|
||||||
|
wget -O $RUNNER_TEMP/java_package.tar.gz $download_url
|
||||||
|
- uses: actions/setup-java@v3
|
||||||
|
with:
|
||||||
|
distribution: 'jdkfile'
|
||||||
|
jdkFile: ${{ runner.temp }}/java_package.tar.gz
|
||||||
|
java-version: '1.6'
|
||||||
|
architecture: x64
|
||||||
|
```
|
||||||
|
|
||||||
|
This will generate a Toolchains entry with the following values: `version: 1.6`, `vendor: jkdfile`, `id: Oracle_1.6`.
|
||||||
|
|
||||||
|
### Modifying The Toolchain Vendor For JDKs
|
||||||
|
Each JDK provider will receive a default `vendor` using the `distribution` input value but this can be overridden with the `mvn-toolchain-vendor` parameter as follows.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- run: |
|
||||||
|
download_url="https://example.com/java/jdk/6u45-b06/jdk-6u45-linux-x64.tar.gz"
|
||||||
|
wget -O $RUNNER_TEMP/java_package.tar.gz $download_url
|
||||||
|
- uses: actions/setup-java@v3
|
||||||
|
with:
|
||||||
|
distribution: 'jdkfile'
|
||||||
|
jdkFile: ${{ runner.temp }}/java_package.tar.gz
|
||||||
|
java-version: '1.6'
|
||||||
|
architecture: x64
|
||||||
|
mvn-toolchain-vendor: 'Oracle'
|
||||||
|
```
|
||||||
|
|
||||||
|
This will generate a Toolchains entry with the following values: `version: 1.6`, `vendor: Oracle`, `id: Oracle_1.6`.
|
||||||
|
|
||||||
|
In case you install multiple versions of Java at once with multi-line `java-version` input setting the `mvn-toolchain-vendor` still only accepts one value and will use this value for installed JDKs as expected when installing multiple versions of the same `distribution`.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
steps:
|
||||||
|
- uses: actions/setup-java@v3
|
||||||
|
with:
|
||||||
|
distribution: '<distribution>'
|
||||||
|
java-version: |
|
||||||
|
8
|
||||||
|
11
|
||||||
|
mvn-toolchain-vendor: Eclipse Temurin
|
||||||
|
```
|
||||||
|
|
||||||
|
### Modifying The Toolchain ID For JDKs
|
||||||
|
Each JDK provider will receive a default `id` based on the combination of `distribution` and `java-version` in the format of `distribution_java-version` (e.g. `temurin_11`) but this can be overridden with the `mvn-toolchain-id` parameter as follows.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: actions/setup-java@v3
|
||||||
|
with:
|
||||||
|
distribution: 'temurin'
|
||||||
|
java-version: '11'
|
||||||
|
mvn-toolchain-id: 'some_other_id'
|
||||||
|
- run: java -cp java HelloWorldApp
|
||||||
|
```
|
||||||
|
|
||||||
|
In case you install multiple versions of Java at once you can use the same syntax as used in `java-versions`. Please note that you have to declare an ID for all Java versions that will be installed or the `mvn-toolchain-id` instruction will be skipped wholesale due to mapping ambiguities.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
steps:
|
||||||
|
- uses: actions/setup-java@v3
|
||||||
|
with:
|
||||||
|
distribution: '<distribution>'
|
||||||
|
java-version: |
|
||||||
|
8
|
||||||
|
11
|
||||||
|
mvn-toolchain-id: |
|
||||||
|
something_else
|
||||||
|
something_other
|
||||||
|
```
|
||||||
|
|
|
@ -10,15 +10,12 @@ import * as constants from './constants';
|
||||||
import * as gpg from './gpg';
|
import * as gpg from './gpg';
|
||||||
import { getBooleanInput } from './util';
|
import { getBooleanInput } from './util';
|
||||||
|
|
||||||
export const M2_DIR = '.m2';
|
|
||||||
export const SETTINGS_FILE = 'settings.xml';
|
|
||||||
|
|
||||||
export async function configureAuthentication() {
|
export async function configureAuthentication() {
|
||||||
const id = core.getInput(constants.INPUT_SERVER_ID);
|
const id = core.getInput(constants.INPUT_SERVER_ID);
|
||||||
const username = core.getInput(constants.INPUT_SERVER_USERNAME);
|
const username = core.getInput(constants.INPUT_SERVER_USERNAME);
|
||||||
const password = core.getInput(constants.INPUT_SERVER_PASSWORD);
|
const password = core.getInput(constants.INPUT_SERVER_PASSWORD);
|
||||||
const settingsDirectory =
|
const settingsDirectory =
|
||||||
core.getInput(constants.INPUT_SETTINGS_PATH) || path.join(os.homedir(), M2_DIR);
|
core.getInput(constants.INPUT_SETTINGS_PATH) || path.join(os.homedir(), constants.M2_DIR);
|
||||||
const overwriteSettings = getBooleanInput(constants.INPUT_OVERWRITE_SETTINGS, true);
|
const overwriteSettings = getBooleanInput(constants.INPUT_OVERWRITE_SETTINGS, true);
|
||||||
const gpgPrivateKey =
|
const gpgPrivateKey =
|
||||||
core.getInput(constants.INPUT_GPG_PRIVATE_KEY) || constants.INPUT_DEFAULT_GPG_PRIVATE_KEY;
|
core.getInput(constants.INPUT_GPG_PRIVATE_KEY) || constants.INPUT_DEFAULT_GPG_PRIVATE_KEY;
|
||||||
|
@ -54,7 +51,7 @@ export async function createAuthenticationSettings(
|
||||||
overwriteSettings: boolean,
|
overwriteSettings: boolean,
|
||||||
gpgPassphrase: string | undefined = undefined
|
gpgPassphrase: string | undefined = undefined
|
||||||
) {
|
) {
|
||||||
core.info(`Creating ${SETTINGS_FILE} with server-id: ${id}`);
|
core.info(`Creating ${constants.MVN_SETTINGS_FILE} with server-id: ${id}`);
|
||||||
// when an alternate m2 location is specified use only that location (no .m2 directory)
|
// when an alternate m2 location is specified use only that location (no .m2 directory)
|
||||||
// otherwise use the home/.m2/ path
|
// otherwise use the home/.m2/ path
|
||||||
await io.mkdirP(settingsDirectory);
|
await io.mkdirP(settingsDirectory);
|
||||||
|
@ -106,7 +103,7 @@ export function generate(
|
||||||
}
|
}
|
||||||
|
|
||||||
async function write(directory: string, settings: string, overwriteSettings: boolean) {
|
async function write(directory: string, settings: string, overwriteSettings: boolean) {
|
||||||
const location = path.join(directory, SETTINGS_FILE);
|
const location = path.join(directory, constants.MVN_SETTINGS_FILE);
|
||||||
const settingsExists = fs.existsSync(location);
|
const settingsExists = fs.existsSync(location);
|
||||||
if (settingsExists && overwriteSettings) {
|
if (settingsExists && overwriteSettings) {
|
||||||
core.info(`Overwriting existing file ${location}`);
|
core.info(`Overwriting existing file ${location}`);
|
||||||
|
|
|
@ -20,3 +20,9 @@ export const INPUT_CACHE = 'cache';
|
||||||
export const INPUT_JOB_STATUS = 'job-status';
|
export const INPUT_JOB_STATUS = 'job-status';
|
||||||
|
|
||||||
export const STATE_GPG_PRIVATE_KEY_FINGERPRINT = 'gpg-private-key-fingerprint';
|
export const STATE_GPG_PRIVATE_KEY_FINGERPRINT = 'gpg-private-key-fingerprint';
|
||||||
|
|
||||||
|
export const M2_DIR = '.m2';
|
||||||
|
export const MVN_SETTINGS_FILE = 'settings.xml';
|
||||||
|
export const MVN_TOOLCHAINS_FILE = 'toolchains.xml';
|
||||||
|
export const INPUT_MVN_TOOLCHAIN_ID = 'mvn-toolchain-id';
|
||||||
|
export const INPUT_MVN_TOOLCHAIN_VENDOR = 'mvn-toolchain-vendor';
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import * as core from '@actions/core';
|
import * as core from '@actions/core';
|
||||||
import * as auth from './auth';
|
import * as auth from './auth';
|
||||||
import { getBooleanInput, isCacheFeatureAvailable } from './util';
|
import { getBooleanInput, isCacheFeatureAvailable } from './util';
|
||||||
|
import * as toolchains from './toolchains';
|
||||||
import * as constants from './constants';
|
import * as constants from './constants';
|
||||||
import { restore } from './cache';
|
import { restore } from './cache';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
|
@ -16,9 +17,14 @@ async function run() {
|
||||||
const jdkFile = core.getInput(constants.INPUT_JDK_FILE);
|
const jdkFile = core.getInput(constants.INPUT_JDK_FILE);
|
||||||
const cache = core.getInput(constants.INPUT_CACHE);
|
const cache = core.getInput(constants.INPUT_CACHE);
|
||||||
const checkLatest = getBooleanInput(constants.INPUT_CHECK_LATEST, false);
|
const checkLatest = getBooleanInput(constants.INPUT_CHECK_LATEST, false);
|
||||||
|
let toolchainIds = core.getMultilineInput(constants.INPUT_MVN_TOOLCHAIN_ID);
|
||||||
|
|
||||||
|
if (versions.length !== toolchainIds.length) {
|
||||||
|
toolchainIds = [];
|
||||||
|
}
|
||||||
|
|
||||||
core.startGroup('Installed distributions');
|
core.startGroup('Installed distributions');
|
||||||
for (const version of versions) {
|
for (const [index, version] of versions.entries()) {
|
||||||
const installerOptions: JavaInstallerOptions = {
|
const installerOptions: JavaInstallerOptions = {
|
||||||
architecture,
|
architecture,
|
||||||
packageType,
|
packageType,
|
||||||
|
@ -32,6 +38,12 @@ async function run() {
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = await distribution.setupJava();
|
const result = await distribution.setupJava();
|
||||||
|
await toolchains.configureToolchains(
|
||||||
|
version,
|
||||||
|
distributionName,
|
||||||
|
result.path,
|
||||||
|
toolchainIds[index]
|
||||||
|
);
|
||||||
|
|
||||||
core.info('');
|
core.info('');
|
||||||
core.info('Java configuration:');
|
core.info('Java configuration:');
|
||||||
|
|
|
@ -0,0 +1,158 @@
|
||||||
|
import * as fs from 'fs';
|
||||||
|
import * as os from 'os';
|
||||||
|
import * as path from 'path';
|
||||||
|
import * as core from '@actions/core';
|
||||||
|
import * as io from '@actions/io';
|
||||||
|
import * as constants from './constants';
|
||||||
|
|
||||||
|
import { getBooleanInput } from './util';
|
||||||
|
import { create as xmlCreate } from 'xmlbuilder2';
|
||||||
|
|
||||||
|
interface JdkInfo {
|
||||||
|
version: string;
|
||||||
|
vendor: string;
|
||||||
|
id: string;
|
||||||
|
jdkHome: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function configureToolchains(
|
||||||
|
version: string,
|
||||||
|
distributionName: string,
|
||||||
|
jdkHome: string,
|
||||||
|
toolchainId?: string
|
||||||
|
) {
|
||||||
|
const vendor = core.getInput(constants.INPUT_MVN_TOOLCHAIN_VENDOR) || distributionName;
|
||||||
|
const id = toolchainId || `${vendor}_${version}`;
|
||||||
|
const settingsDirectory =
|
||||||
|
core.getInput(constants.INPUT_SETTINGS_PATH) || path.join(os.homedir(), constants.M2_DIR);
|
||||||
|
const overwriteSettings = getBooleanInput(constants.INPUT_OVERWRITE_SETTINGS, true);
|
||||||
|
|
||||||
|
await createToolchainsSettings({
|
||||||
|
jdkInfo: {
|
||||||
|
version,
|
||||||
|
vendor,
|
||||||
|
id,
|
||||||
|
jdkHome
|
||||||
|
},
|
||||||
|
settingsDirectory,
|
||||||
|
overwriteSettings
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function createToolchainsSettings({
|
||||||
|
jdkInfo,
|
||||||
|
settingsDirectory,
|
||||||
|
overwriteSettings
|
||||||
|
}: {
|
||||||
|
jdkInfo: JdkInfo;
|
||||||
|
settingsDirectory: string;
|
||||||
|
overwriteSettings: boolean;
|
||||||
|
}) {
|
||||||
|
core.info(
|
||||||
|
`Creating ${constants.MVN_TOOLCHAINS_FILE} for JDK version ${jdkInfo.version} from ${jdkInfo.vendor}`
|
||||||
|
);
|
||||||
|
// when an alternate m2 location is specified use only that location (no .m2 directory)
|
||||||
|
// otherwise use the home/.m2/ path
|
||||||
|
await io.mkdirP(settingsDirectory);
|
||||||
|
const originalToolchains = await readExistingToolchainsFile(settingsDirectory);
|
||||||
|
const updatedToolchains = generateToolchainDefinition(
|
||||||
|
originalToolchains,
|
||||||
|
jdkInfo.version,
|
||||||
|
jdkInfo.vendor,
|
||||||
|
jdkInfo.id,
|
||||||
|
jdkInfo.jdkHome
|
||||||
|
);
|
||||||
|
await writeToolchainsFileToDisk(settingsDirectory, updatedToolchains, overwriteSettings);
|
||||||
|
}
|
||||||
|
|
||||||
|
// only exported for testing purposes
|
||||||
|
export function generateToolchainDefinition(
|
||||||
|
original: string,
|
||||||
|
version: string,
|
||||||
|
vendor: string,
|
||||||
|
id: string,
|
||||||
|
jdkHome: string
|
||||||
|
) {
|
||||||
|
let xmlObj;
|
||||||
|
if (original?.length) {
|
||||||
|
xmlObj = xmlCreate(original)
|
||||||
|
.root()
|
||||||
|
.ele({
|
||||||
|
toolchain: {
|
||||||
|
type: 'jdk',
|
||||||
|
provides: {
|
||||||
|
version: `${version}`,
|
||||||
|
vendor: `${vendor}`,
|
||||||
|
id: `${id}`
|
||||||
|
},
|
||||||
|
configuration: {
|
||||||
|
jdkHome: `${jdkHome}`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else
|
||||||
|
xmlObj = xmlCreate({
|
||||||
|
toolchains: {
|
||||||
|
'@xmlns': 'https://maven.apache.org/TOOLCHAINS/1.1.0',
|
||||||
|
'@xmlns:xsi': 'https://www.w3.org/2001/XMLSchema-instance',
|
||||||
|
'@xsi:schemaLocation':
|
||||||
|
'https://maven.apache.org/TOOLCHAINS/1.1.0 https://maven.apache.org/xsd/toolchains-1.1.0.xsd',
|
||||||
|
toolchain: [
|
||||||
|
{
|
||||||
|
type: 'jdk',
|
||||||
|
provides: {
|
||||||
|
version: `${version}`,
|
||||||
|
vendor: `${vendor}`,
|
||||||
|
id: `${id}`
|
||||||
|
},
|
||||||
|
configuration: {
|
||||||
|
jdkHome: `${jdkHome}`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return xmlObj.end({
|
||||||
|
format: 'xml',
|
||||||
|
wellFormed: false,
|
||||||
|
headless: false,
|
||||||
|
prettyPrint: true,
|
||||||
|
width: 80
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function readExistingToolchainsFile(directory: string) {
|
||||||
|
const location = path.join(directory, constants.MVN_TOOLCHAINS_FILE);
|
||||||
|
if (fs.existsSync(location)) {
|
||||||
|
return fs.readFileSync(location, {
|
||||||
|
encoding: 'utf-8',
|
||||||
|
flag: 'r'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
async function writeToolchainsFileToDisk(
|
||||||
|
directory: string,
|
||||||
|
settings: string,
|
||||||
|
overwriteSettings: boolean
|
||||||
|
) {
|
||||||
|
const location = path.join(directory, constants.MVN_TOOLCHAINS_FILE);
|
||||||
|
const settingsExists = fs.existsSync(location);
|
||||||
|
if (settingsExists && overwriteSettings) {
|
||||||
|
core.info(`Overwriting existing file ${location}`);
|
||||||
|
} else if (!settingsExists) {
|
||||||
|
core.info(`Writing to ${location}`);
|
||||||
|
} else {
|
||||||
|
core.info(
|
||||||
|
`Skipping generation of ${location} because file already exists and overwriting is not enabled`
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return fs.writeFileSync(location, settings, {
|
||||||
|
encoding: 'utf-8',
|
||||||
|
flag: 'w'
|
||||||
|
});
|
||||||
|
}
|
Loading…
Reference in New Issue