Merge pull request #282 from Okeanos/maven-toolchains-support
Add Maven Toolchains Declaration (#276)
This commit is contained in:
		
							
								
								
									
										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); | ||||||
|  | |||||||
							
								
								
									
										292
									
								
								__tests__/toolchains.test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										292
									
								
								__tests__/toolchains.test.ts
									
									
									
									
									
										Normal file
									
								
							| @ -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' | ||||||
|  | |||||||
							
								
								
									
										7
									
								
								dist/cleanup/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								dist/cleanup/index.js
									
									
									
									
										vendored
									
									
								
							| @ -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'; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /***/ }), | /***/ }), | ||||||
|  | |||||||
							
								
								
									
										185
									
								
								dist/setup/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										185
									
								
								dist/setup/index.js
									
									
									
									
										vendored
									
									
								
							| @ -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:'); | ||||||
|  | |||||||
							
								
								
									
										158
									
								
								src/toolchains.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								src/toolchains.ts
									
									
									
									
									
										Normal file
									
								
							| @ -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' | ||||||
|  |   }); | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user
	 Marko Zivic
					Marko Zivic