Compare commits

..

1 Commits

Author SHA1 Message Date
copilot-swe-agent[bot] cb0d854574 Initial plan 2026-08-17 14:47:46 +00:00
28 changed files with 171 additions and 1982 deletions
@@ -24,7 +24,6 @@ jobs:
warm-caches: warm-caches:
name: Warm ${{ matrix.tool }} ${{ matrix.profile }} caches (${{ matrix.os }}) name: Warm ${{ matrix.tool }} ${{ matrix.profile }} caches (${{ matrix.os }})
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
cache-mode: write-only
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
@@ -66,7 +65,6 @@ jobs:
name: Benchmark ${{ matrix.tool }} ${{ matrix.profile }} (${{ matrix.os }}) name: Benchmark ${{ matrix.tool }} ${{ matrix.profile }} (${{ matrix.os }})
needs: warm-caches needs: warm-caches
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
cache-mode: read
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
-17
View File
@@ -21,7 +21,6 @@ defaults:
jobs: jobs:
gradle-save: gradle-save:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
cache-mode: write-only
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
@@ -49,7 +48,6 @@ jobs:
bash __tests__/check-dir.sh "$HOME/.gradle/wrapper/dists" bash __tests__/check-dir.sh "$HOME/.gradle/wrapper/dists"
gradle-restore: gradle-restore:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
cache-mode: read
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
@@ -74,7 +72,6 @@ jobs:
run: bash __tests__/check-dir.sh "$HOME/.gradle/wrapper/dists" run: bash __tests__/check-dir.sh "$HOME/.gradle/wrapper/dists"
maven-save: maven-save:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
cache-mode: write-only
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
@@ -100,7 +97,6 @@ jobs:
bash __tests__/check-dir.sh "$HOME/.m2/wrapper/dists" bash __tests__/check-dir.sh "$HOME/.m2/wrapper/dists"
maven-restore: maven-restore:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
cache-mode: read
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
@@ -125,7 +121,6 @@ jobs:
run: bash __tests__/check-dir.sh "$HOME/.m2/wrapper/dists" run: bash __tests__/check-dir.sh "$HOME/.m2/wrapper/dists"
sbt-save: sbt-save:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
cache-mode: write-only
defaults: defaults:
run: run:
shell: bash shell: bash
@@ -165,7 +160,6 @@ jobs:
run: bash "$GITHUB_WORKSPACE/__tests__/check-dir.sh" "$HOME/.cache/coursier" run: bash "$GITHUB_WORKSPACE/__tests__/check-dir.sh" "$HOME/.cache/coursier"
sbt-restore: sbt-restore:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
cache-mode: read
defaults: defaults:
run: run:
shell: bash shell: bash
@@ -200,7 +194,6 @@ jobs:
run: bash "$GITHUB_WORKSPACE/__tests__/check-dir.sh" "$HOME/.cache/coursier" run: bash "$GITHUB_WORKSPACE/__tests__/check-dir.sh" "$HOME/.cache/coursier"
gradle1-save: gradle1-save:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
cache-mode: write-only
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
@@ -229,7 +222,6 @@ jobs:
bash __tests__/check-dir.sh "$HOME/.gradle/wrapper/dists" bash __tests__/check-dir.sh "$HOME/.gradle/wrapper/dists"
gradle1-restore: gradle1-restore:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
cache-mode: read
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
@@ -254,7 +246,6 @@ jobs:
run: bash __tests__/check-dir.sh "$HOME/.gradle/wrapper/dists" run: bash __tests__/check-dir.sh "$HOME/.gradle/wrapper/dists"
gradle2-restore: gradle2-restore:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
cache-mode: read
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
@@ -277,7 +268,6 @@ jobs:
run: bash __tests__/check-dir.sh "$HOME/.gradle/caches" absent run: bash __tests__/check-dir.sh "$HOME/.gradle/caches" absent
maven1-save: maven1-save:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
cache-mode: write-only
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
@@ -304,7 +294,6 @@ jobs:
bash __tests__/check-dir.sh "$HOME/.m2/wrapper/dists" bash __tests__/check-dir.sh "$HOME/.m2/wrapper/dists"
maven1-restore: maven1-restore:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
cache-mode: read
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
@@ -329,7 +318,6 @@ jobs:
run: bash __tests__/check-dir.sh "$HOME/.m2/wrapper/dists" run: bash __tests__/check-dir.sh "$HOME/.m2/wrapper/dists"
maven2-restore: maven2-restore:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
cache-mode: read
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
@@ -354,7 +342,6 @@ jobs:
run: bash __tests__/check-dir.sh "$HOME/.m2/repository" absent run: bash __tests__/check-dir.sh "$HOME/.m2/repository" absent
sbt1-save: sbt1-save:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
cache-mode: write-only
defaults: defaults:
run: run:
shell: bash shell: bash
@@ -395,7 +382,6 @@ jobs:
run: bash "$GITHUB_WORKSPACE/__tests__/check-dir.sh" "$HOME/.cache/coursier" run: bash "$GITHUB_WORKSPACE/__tests__/check-dir.sh" "$HOME/.cache/coursier"
sbt1-restore: sbt1-restore:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
cache-mode: read
defaults: defaults:
run: run:
shell: bash shell: bash
@@ -430,7 +416,6 @@ jobs:
run: bash "$GITHUB_WORKSPACE/__tests__/check-dir.sh" "$HOME/.cache/coursier" run: bash "$GITHUB_WORKSPACE/__tests__/check-dir.sh" "$HOME/.cache/coursier"
sbt2-restore: sbt2-restore:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
cache-mode: read
defaults: defaults:
run: run:
shell: bash shell: bash
@@ -465,7 +450,6 @@ jobs:
run: bash "$GITHUB_WORKSPACE/__tests__/check-dir.sh" "$HOME/.cache/coursier" absent run: bash "$GITHUB_WORKSPACE/__tests__/check-dir.sh" "$HOME/.cache/coursier" absent
custom-maven-path-save: custom-maven-path-save:
runs-on: ubuntu-latest runs-on: ubuntu-latest
cache-mode: write-only
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v7 uses: actions/checkout@v7
@@ -490,7 +474,6 @@ jobs:
bash __tests__/check-dir.sh "$RUNNER_TEMP/setup-java-custom-maven-repository" bash __tests__/check-dir.sh "$RUNNER_TEMP/setup-java-custom-maven-repository"
custom-maven-path-restore: custom-maven-path-restore:
runs-on: ubuntu-latest runs-on: ubuntu-latest
cache-mode: read
needs: custom-maven-path-save needs: custom-maven-path-save
steps: steps:
- name: Checkout - name: Checkout
+1 -21
View File
@@ -71,7 +71,7 @@ jobs:
version: 25 version: 25
- distribution: oracle - distribution: oracle
os: macos-15-intel os: macos-15-intel
version: 21 version: 17
- distribution: oracle - distribution: oracle
os: windows-latest os: windows-latest
version: 21 version: 21
@@ -636,26 +636,6 @@ jobs:
run: bash __tests__/verify-java.sh "17.0.10" "$JAVA_PATH" run: bash __tests__/verify-java.sh "17.0.10" "$JAVA_PATH"
shell: bash shell: bash
setup-java-version-from-sdkman-major:
name: temurin 26 from .sdkmanrc - ubuntu-latest
runs-on: ubuntu-latest
steps:
- *checkout_step
- name: Create SDKMAN and Gradle files
run: |
echo "java=26-tem" > .sdkmanrc
touch build.gradle
- name: setup-java
uses: ./
id: setup-java
with:
java-version-file: .sdkmanrc
cache: gradle
- name: Verify Java
env:
JAVA_PATH: ${{ steps.setup-java.outputs.path }}
run: bash __tests__/verify-java.sh "26" "$JAVA_PATH"
setup-java-set-default: setup-java-set-default:
name: set-default option - ${{ matrix.os }} name: set-default option - ${{ matrix.os }}
needs: setup-java-major-versions needs: setup-java-major-versions
+1 -11
View File
@@ -170,10 +170,6 @@ steps:
| `server-id` | Maven repository ID used in generated `settings.xml`. | `github` | | `server-id` | Maven repository ID used in generated `settings.xml`. | `github` |
| `server-username-env-var` | Environment variable name for Maven repository username. | `GITHUB_ACTOR` | | `server-username-env-var` | Environment variable name for Maven repository username. | `GITHUB_ACTOR` |
| `server-password-env-var` | Environment variable name for Maven repository password or token. | `GITHUB_TOKEN` | | `server-password-env-var` | Environment variable name for Maven repository password or token. | `GITHUB_TOKEN` |
| `mvn-server-credentials` | Multiline Maven server credentials in the format `server-id:USERNAME_ENV:PASSWORD_ENV`. Replaces the single server configured by the three inputs above when set. | |
| `mvn-repositories` | Multiline Maven dependency repositories in the format `repository-id:repository-url:snapshots-enabled`. | |
| `mvn-repositories-include-central` | Include Maven Central in the generated dependency repositories profile. When `false`, Central is disabled unless an explicit `central` repository is declared. | `true` |
| `mvn-repositories-prioritize-central` | Place Maven Central before custom dependency repositories. Has no effect when Maven Central is excluded. | `true` |
| `settings-path` | Directory where `settings.xml` is written. | `~/.m2` | | `settings-path` | Directory where `settings.xml` is written. | `~/.m2` |
| `overwrite-settings` | Overwrite an existing `settings.xml`. | `true` | | `overwrite-settings` | Overwrite an existing `settings.xml`. | `true` |
| `gpg-private-key` | GPG private key to import into an isolated temporary keyring. | | | `gpg-private-key` | GPG private key to import into an isolated temporary keyring. | |
@@ -211,7 +207,6 @@ Deprecated aliases `jdkFile`, `server-username`, `server-password`, and `gpg-pas
| `microsoft` | [Microsoft Build of OpenJDK](https://www.microsoft.com/openjdk) | [License](https://docs.microsoft.com/java/openjdk/faq) | | `microsoft` | [Microsoft Build of OpenJDK](https://www.microsoft.com/openjdk) | [License](https://docs.microsoft.com/java/openjdk/faq) |
| `oracle` | [Oracle JDK](https://www.oracle.com/java/technologies/downloads/) | [License](https://java.com/freeuselicense) | | `oracle` | [Oracle JDK](https://www.oracle.com/java/technologies/downloads/) | [License](https://java.com/freeuselicense) |
| `oracle-openjdk` | [Oracle OpenJDK](https://jdk.java.net/) | [License](https://openjdk.org/legal/gplv2+ce.html) | | `oracle-openjdk` | [Oracle OpenJDK](https://jdk.java.net/) | [License](https://openjdk.org/legal/gplv2+ce.html) |
| `redhat` | [Red Hat Build of OpenJDK](https://developers.redhat.com/products/openjdk/overview) | [License](https://openjdk.org/legal/gplv2+ce.html) |
| `sapmachine` | [SAP SapMachine JDK/JRE](https://sapmachine.io/) | [License](https://github.com/SAP/SapMachine/blob/sapmachine/LICENSE) | | `sapmachine` | [SAP SapMachine JDK/JRE](https://sapmachine.io/) | [License](https://github.com/SAP/SapMachine/blob/sapmachine/LICENSE) |
| `semeru` | [IBM Semeru Runtime Open Edition](https://developer.ibm.com/languages/java/semeru-runtimes/downloads/) | [License](https://openjdk.java.net/legal/gplv2+ce.html) | | `semeru` | [IBM Semeru Runtime Open Edition](https://developer.ibm.com/languages/java/semeru-runtimes/downloads/) | [License](https://openjdk.java.net/legal/gplv2+ce.html) |
| `temurin` | [Eclipse Temurin](https://adoptium.net/) | [License](https://adoptium.net/about.html) | | `temurin` | [Eclipse Temurin](https://adoptium.net/) | [License](https://adoptium.net/about.html) |
@@ -457,11 +452,6 @@ steps:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
``` ```
For dependencies hosted outside Maven Central, use `mvn-repositories` to add
resolution repositories to an active profile in the generated `settings.xml`.
Repository IDs can match `mvn-server-credentials` IDs when authentication is
required. See [Resolving Maven dependencies from custom repositories](docs/advanced-usage.md#resolving-maven-dependencies-from-custom-repositories).
### GPG signing ### GPG signing
```yaml ```yaml
@@ -522,7 +512,7 @@ The scripts and documentation in this project are released under the [MIT Licens
## Contributions ## Contributions
Contributions are welcome. See our [Contributor's Guide](docs/CONTRIBUTING.md). Contributions are welcome. See our [Contributor's Guide](docs/contributors.md).
## Code of Conduct ## Code of Conduct
+28 -479
View File
@@ -26,7 +26,7 @@ jest.unstable_mockModule('@actions/core', () => ({
setOutput: jest.fn(), setOutput: jest.fn(),
getInput: jest.fn(), getInput: jest.fn(),
getBooleanInput: jest.fn(), getBooleanInput: jest.fn(),
getMultilineInput: jest.fn(() => []), getMultilineInput: jest.fn(),
addPath: jest.fn(), addPath: jest.fn(),
exportVariable: jest.fn(), exportVariable: jest.fn(),
saveState: jest.fn(), saveState: jest.fn(),
@@ -57,18 +57,6 @@ const {M2_DIR, MVN_SETTINGS_FILE, STATE_GPG_HOME} =
const __dirname = path.dirname(fileURLToPath(import.meta.url)); const __dirname = path.dirname(fileURLToPath(import.meta.url));
const m2Dir = path.join(__dirname, M2_DIR); const m2Dir = path.join(__dirname, M2_DIR);
const settingsFile = path.join(m2Dir, MVN_SETTINGS_FILE); const settingsFile = path.join(m2Dir, MVN_SETTINGS_FILE);
const credentials = (id: string, username: string, password: string) => [
{id, usernameEnvVar: username, passwordEnvVar: password}
];
const repositorySettings = (
repositories: auth.MavenRepository[],
includeCentral = true,
prioritizeCentral = true
): auth.MavenRepositorySettings => ({
repositories,
includeCentral,
prioritizeCentral
});
describe('auth tests', () => { describe('auth tests', () => {
let spyOSHomedir: any; let spyOSHomedir: any;
@@ -85,9 +73,6 @@ describe('auth tests', () => {
afterEach(() => { afterEach(() => {
(core.getInput as jest.Mock).mockReset(); (core.getInput as jest.Mock).mockReset();
(core.getMultilineInput as jest.Mock).mockReset();
(core.getMultilineInput as jest.Mock).mockReturnValue([]);
(core.warning as jest.Mock).mockReset();
(core.exportVariable as jest.Mock).mockReset(); (core.exportVariable as jest.Mock).mockReset();
(gpg.importKey as jest.Mock).mockReset(); (gpg.importKey as jest.Mock).mockReset();
(gpg.removeGpgHome as jest.Mock).mockReset(); (gpg.removeGpgHome as jest.Mock).mockReset();
@@ -115,7 +100,9 @@ describe('auth tests', () => {
await io.rmRF(altHome); // ensure it doesn't already exist await io.rmRF(altHome); // ensure it doesn't already exist
await auth.createAuthenticationSettings( await auth.createAuthenticationSettings(
credentials(id, username, password), id,
username,
password,
altHome, altHome,
true true
); );
@@ -126,7 +113,7 @@ describe('auth tests', () => {
expect(fs.existsSync(altHome)).toBe(true); expect(fs.existsSync(altHome)).toBe(true);
expect(fs.existsSync(altSettingsFile)).toBe(true); expect(fs.existsSync(altSettingsFile)).toBe(true);
expect(fs.readFileSync(altSettingsFile, 'utf-8')).toEqual( expect(fs.readFileSync(altSettingsFile, 'utf-8')).toEqual(
auth.generate(credentials(id, username, password)) auth.generate(id, username, password)
); );
await io.rmRF(altHome); await io.rmRF(altHome);
@@ -138,7 +125,9 @@ describe('auth tests', () => {
const password = 'TOKEN'; const password = 'TOKEN';
await auth.createAuthenticationSettings( await auth.createAuthenticationSettings(
credentials(id, username, password), id,
username,
password,
m2Dir, m2Dir,
true true
); );
@@ -146,7 +135,7 @@ describe('auth tests', () => {
expect(fs.existsSync(m2Dir)).toBe(true); expect(fs.existsSync(m2Dir)).toBe(true);
expect(fs.existsSync(settingsFile)).toBe(true); expect(fs.existsSync(settingsFile)).toBe(true);
expect(fs.readFileSync(settingsFile, 'utf-8')).toEqual( expect(fs.readFileSync(settingsFile, 'utf-8')).toEqual(
auth.generate(credentials(id, username, password)) auth.generate(id, username, password)
); );
}, 100000); }, 100000);
@@ -157,7 +146,9 @@ describe('auth tests', () => {
const gpgPassphrase = 'GPG'; const gpgPassphrase = 'GPG';
await auth.createAuthenticationSettings( await auth.createAuthenticationSettings(
credentials(id, username, password), id,
username,
password,
m2Dir, m2Dir,
true, true,
gpgPassphrase gpgPassphrase
@@ -166,7 +157,7 @@ describe('auth tests', () => {
expect(fs.existsSync(m2Dir)).toBe(true); expect(fs.existsSync(m2Dir)).toBe(true);
expect(fs.existsSync(settingsFile)).toBe(true); expect(fs.existsSync(settingsFile)).toBe(true);
expect(fs.readFileSync(settingsFile, 'utf-8')).toEqual( expect(fs.readFileSync(settingsFile, 'utf-8')).toEqual(
auth.generate(credentials(id, username, password), gpgPassphrase) auth.generate(id, username, password, gpgPassphrase)
); );
}, 100000); }, 100000);
@@ -227,7 +218,9 @@ describe('auth tests', () => {
expect(fs.existsSync(settingsFile)).toBe(true); expect(fs.existsSync(settingsFile)).toBe(true);
await auth.createAuthenticationSettings( await auth.createAuthenticationSettings(
credentials(id, username, password), id,
username,
password,
m2Dir, m2Dir,
true true
); );
@@ -235,7 +228,7 @@ describe('auth tests', () => {
expect(fs.existsSync(m2Dir)).toBe(true); expect(fs.existsSync(m2Dir)).toBe(true);
expect(fs.existsSync(settingsFile)).toBe(true); expect(fs.existsSync(settingsFile)).toBe(true);
expect(fs.readFileSync(settingsFile, 'utf-8')).toEqual( expect(fs.readFileSync(settingsFile, 'utf-8')).toEqual(
auth.generate(credentials(id, username, password)) auth.generate(id, username, password)
); );
}, 100000); }, 100000);
@@ -250,7 +243,9 @@ describe('auth tests', () => {
expect(fs.existsSync(settingsFile)).toBe(true); expect(fs.existsSync(settingsFile)).toBe(true);
await auth.createAuthenticationSettings( await auth.createAuthenticationSettings(
credentials(id, username, password), id,
username,
password,
m2Dir, m2Dir,
false false
); );
@@ -278,9 +273,7 @@ describe('auth tests', () => {
</servers> </servers>
</settings>`; </settings>`;
expect(auth.generate(credentials(id, username, password))).toEqual( expect(auth.generate(id, username, password)).toEqual(expectedSettings);
expectedSettings
);
}); });
it('generates valid settings.xml with additional configuration', () => { it('generates valid settings.xml with additional configuration', () => {
@@ -313,9 +306,9 @@ describe('auth tests', () => {
</activeProfiles> </activeProfiles>
</settings>`; </settings>`;
expect( expect(auth.generate(id, username, password, gpgPassphrase)).toEqual(
auth.generate(credentials(id, username, password), gpgPassphrase) expectedSettings
).toEqual(expectedSettings); );
}); });
it('does not add a gpg profile when the passphrase env var is the maven-gpg-plugin default', () => { it('does not add a gpg profile when the passphrase env var is the maven-gpg-plugin default', () => {
@@ -337,9 +330,9 @@ describe('auth tests', () => {
</servers> </servers>
</settings>`; </settings>`;
expect( expect(auth.generate(id, username, password, gpgPassphrase)).toEqual(
auth.generate(credentials(id, username, password), gpgPassphrase) expectedSettings
).toEqual(expectedSettings); );
}); });
it('escapes settings.xml values while preserving parsed semantics', () => { it('escapes settings.xml values while preserving parsed semantics', () => {
@@ -348,10 +341,7 @@ describe('auth tests', () => {
const password = `TOKEN&<>"'é`; const password = `TOKEN&<>"'é`;
const gpgPassphrase = `GPG&<>"'é`; const gpgPassphrase = `GPG&<>"'é`;
const xml = auth.generate( const xml = auth.generate(id, username, password, gpgPassphrase);
credentials(id, username, password),
gpgPassphrase
);
const parsed = parseXmlObject(xml) as any; const parsed = parseXmlObject(xml) as any;
expect(parsed.settings.interactiveMode).toBe('false'); expect(parsed.settings.interactiveMode).toBe('false');
@@ -362,447 +352,6 @@ describe('auth tests', () => {
expect(parsed.settings.activeProfiles.activeProfile).toBe('setup-java-gpg'); expect(parsed.settings.activeProfiles.activeProfile).toBe('setup-java-gpg');
}); });
it('generates ordered settings.xml entries for multiple servers', () => {
const servers = [
{
id: 'releases',
usernameEnvVar: 'RELEASES_USERNAME',
passwordEnvVar: 'RELEASES_PASSWORD'
},
{
id: 'snapshots',
usernameEnvVar: 'SNAPSHOTS_USERNAME',
passwordEnvVar: 'SNAPSHOTS_PASSWORD'
}
];
const parsed = parseXmlObject(auth.generate(servers)) as any;
expect(parsed.settings.servers.server).toEqual([
{
id: 'releases',
username: '${env.RELEASES_USERNAME}',
password: '${env.RELEASES_PASSWORD}'
},
{
id: 'snapshots',
username: '${env.SNAPSHOTS_USERNAME}',
password: '${env.SNAPSHOTS_PASSWORD}'
}
]);
});
it('generates an active profile with Central before custom repositories by default', () => {
const parsed = parseXmlObject(
auth.generate(
credentials('packages', 'USERNAME', 'PASSWORD'),
undefined,
repositorySettings([
{
id: 'private',
url: 'https://repo.example.com/maven',
snapshotsEnabled: true
}
])
)
) as any;
expect(parsed.settings.profiles.profile).toEqual({
id: 'setup-java-repositories',
repositories: {
repository: [
{
id: 'central',
url: 'https://repo.maven.apache.org/maven2',
snapshots: {enabled: 'false'}
},
{
id: 'private',
url: 'https://repo.example.com/maven',
snapshots: {enabled: 'true'}
}
]
}
});
expect(parsed.settings.activeProfiles.activeProfile).toBe(
'setup-java-repositories'
);
});
it('places custom repositories before Central when configured', () => {
const parsed = parseXmlObject(
auth.generate(
credentials('packages', 'USERNAME', 'PASSWORD'),
undefined,
repositorySettings(
[
{
id: 'first',
url: 'https://first.example.com',
snapshotsEnabled: false
},
{
id: 'second',
url: 'https://second.example.com',
snapshotsEnabled: true
}
],
true,
false
)
)
) as any;
expect(
parsed.settings.profiles.profile.repositories.repository.map(
(repository: {id: string}) => repository.id
)
).toEqual(['first', 'second', 'central']);
});
it('excludes Central from the generated repository profile when configured', () => {
const parsed = parseXmlObject(
auth.generate(
credentials('packages', 'USERNAME', 'PASSWORD'),
undefined,
repositorySettings(
[
{
id: 'private',
url: 'https://repo.example.com',
snapshotsEnabled: false
}
],
false
)
)
) as any;
expect(parsed.settings.profiles.profile.repositories.repository).toEqual([
{
id: 'private',
url: 'https://repo.example.com',
snapshots: {enabled: 'false'}
},
{
id: 'central',
url: 'https://repo.maven.apache.org/maven2',
releases: {enabled: 'false'},
snapshots: {enabled: 'false'}
}
]);
});
it('combines repository and GPG configuration in shared profile blocks', () => {
const parsed = parseXmlObject(
auth.generate(
credentials('packages', 'USERNAME', 'PASSWORD'),
'GPG_PASSPHRASE',
repositorySettings(
[
{
id: 'private',
url: 'https://repo.example.com',
snapshotsEnabled: false
}
],
false
)
)
) as any;
expect(parsed.settings.profiles.profile).toEqual([
{
id: 'setup-java-repositories',
repositories: {
repository: [
{
id: 'private',
url: 'https://repo.example.com',
snapshots: {enabled: 'false'}
},
{
id: 'central',
url: 'https://repo.maven.apache.org/maven2',
releases: {enabled: 'false'},
snapshots: {enabled: 'false'}
}
]
}
},
{
id: 'setup-java-gpg',
properties: {['gpg.passphraseEnvName']: 'GPG_PASSPHRASE'}
}
]);
expect(parsed.settings.activeProfiles.activeProfile).toEqual([
'setup-java-repositories',
'setup-java-gpg'
]);
});
it('escapes repository values while preserving parsed semantics', () => {
const repository = {
id: `private&<>"'é`,
url: `https://repo.example.com/a?x=1&y=<value>"'é`,
snapshotsEnabled: true
};
const xml = auth.generate(
credentials('packages', 'USERNAME', 'PASSWORD'),
undefined,
repositorySettings([repository], false)
);
const parsed = parseXmlObject(xml) as any;
expect(
parsed.settings.profiles.profile.repositories.repository.find(
(entry: {id: string}) => entry.id === repository.id
)
).toEqual({
id: repository.id,
url: repository.url,
snapshots: {enabled: 'true'}
});
});
it('parses and trims multiline Maven server credentials', () => {
expect(
auth.parseMavenServerCredentials([
'',
' releases : RELEASES_USERNAME : RELEASES_PASSWORD ',
'snapshots:SNAPSHOTS_USERNAME:SNAPSHOTS_PASSWORD'
])
).toEqual([
{
id: 'releases',
usernameEnvVar: 'RELEASES_USERNAME',
passwordEnvVar: 'RELEASES_PASSWORD'
},
{
id: 'snapshots',
usernameEnvVar: 'SNAPSHOTS_USERNAME',
passwordEnvVar: 'SNAPSHOTS_PASSWORD'
}
]);
});
it('parses Maven repositories while preserving colons in URLs', () => {
expect(
auth.parseMavenRepositories(
[
'',
' private : https://repo.example.com:8443/maven : true ',
'releases:https://repo.example.com/releases:false'
],
true
)
).toEqual([
{
id: 'private',
url: 'https://repo.example.com:8443/maven',
snapshotsEnabled: true
},
{
id: 'releases',
url: 'https://repo.example.com/releases',
snapshotsEnabled: false
}
]);
});
it.each([
{
entries: ['private'],
error:
'Invalid mvn-repositories entry at line 1. Expected format: repository-id:repository-url:snapshots-enabled'
},
{
entries: ['private:https://repo.example.com'],
error:
"Invalid snapshots-enabled value '//repo.example.com' in mvn-repositories entry at line 1. Expected true or false"
},
{
entries: ['private::true'],
error:
'Invalid mvn-repositories entry at line 1. repository-id, repository URL, and snapshots-enabled are required'
},
{
entries: ['private:https://repo.example.com:sometimes'],
error:
"Invalid snapshots-enabled value 'sometimes' in mvn-repositories entry at line 1. Expected true or false"
}
])('rejects malformed Maven repositories: $entries', ({entries, error}) => {
expect(() => auth.parseMavenRepositories(entries, true)).toThrow(error);
});
it('rejects duplicate Maven repository ids', () => {
expect(() =>
auth.parseMavenRepositories(
[
'private:https://first.example.com:false',
'private:https://second.example.com:true'
],
true
)
).toThrow("Duplicate repository-id 'private' in mvn-repositories input");
});
it('reserves the Central repository id only when automatic Central inclusion is enabled', () => {
const central = 'central:https://custom.example.com/maven:false';
expect(() => auth.parseMavenRepositories([central], true)).toThrow(
"Repository-id 'central' is reserved when mvn-repositories-include-central is enabled"
);
expect(auth.parseMavenRepositories([central], false)).toEqual([
{
id: 'central',
url: 'https://custom.example.com/maven',
snapshotsEnabled: false
}
]);
});
it('uses an explicit Central repository instead of adding a disabled override', () => {
const parsed = parseXmlObject(
auth.generate(
credentials('packages', 'USERNAME', 'PASSWORD'),
undefined,
repositorySettings(
auth.parseMavenRepositories(
['central:https://mirror.example.com/maven:true'],
false
),
false
)
)
) as any;
expect(parsed.settings.profiles.profile.repositories.repository).toEqual({
id: 'central',
url: 'https://mirror.example.com/maven',
snapshots: {enabled: 'true'}
});
});
it('reads Maven repository settings and Central controls', () => {
(core.getMultilineInput as jest.Mock).mockImplementation((name: string) =>
name === 'mvn-repositories'
? ['private:https://repo.example.com:true']
: []
);
(core.getInput as jest.Mock).mockImplementation((name: string) => {
const inputs: Record<string, string> = {
'mvn-repositories-include-central': 'false',
'mvn-repositories-prioritize-central': 'false'
};
return inputs[name] ?? '';
});
expect(auth.getMavenRepositorySettings()).toEqual({
repositories: [
{
id: 'private',
url: 'https://repo.example.com',
snapshotsEnabled: true
}
],
includeCentral: false,
prioritizeCentral: false
});
});
it('does not read repository controls when no repositories are configured', () => {
expect(auth.getMavenRepositorySettings()).toBeUndefined();
expect(core.getInput).not.toHaveBeenCalled();
});
it.each([
{
entries: ['releases:RELEASES_USERNAME'],
error:
'Invalid mvn-server-credentials entry at line 1. Expected format: server-id:USERNAME_ENV:PASSWORD_ENV'
},
{
entries: ['', 'releases:RELEASES_USERNAME:RELEASES_PASSWORD:EXTRA'],
error:
'Invalid mvn-server-credentials entry at line 2. Expected format: server-id:USERNAME_ENV:PASSWORD_ENV'
},
{
entries: ['releases::RELEASES_PASSWORD'],
error:
'Invalid mvn-server-credentials entry at line 1. server-id, username environment variable, and password environment variable are required'
}
])(
'rejects malformed Maven server credentials: $entries',
({entries, error}) => {
expect(() => auth.parseMavenServerCredentials(entries)).toThrow(error);
}
);
it('rejects duplicate Maven server ids', () => {
expect(() =>
auth.parseMavenServerCredentials([
'releases:RELEASES_USERNAME:RELEASES_PASSWORD',
'releases:OTHER_USERNAME:OTHER_PASSWORD'
])
).toThrow("Duplicate server-id 'releases' in mvn-server-credentials input");
});
it('uses multiline Maven server credentials instead of single-server inputs', () => {
(core.getMultilineInput as jest.Mock).mockReturnValue([
'releases:RELEASES_USERNAME:RELEASES_PASSWORD',
'snapshots:SNAPSHOTS_USERNAME:SNAPSHOTS_PASSWORD'
]);
expect(auth.getMavenServerSettings()).toEqual([
{
id: 'releases',
usernameEnvVar: 'RELEASES_USERNAME',
passwordEnvVar: 'RELEASES_PASSWORD'
},
{
id: 'snapshots',
usernameEnvVar: 'SNAPSHOTS_USERNAME',
passwordEnvVar: 'SNAPSHOTS_PASSWORD'
}
]);
expect(core.getInput).not.toHaveBeenCalled();
});
it('uses the existing single-server inputs when multiline credentials are absent', () => {
(core.getInput as jest.Mock).mockImplementation((name: string) =>
name === 'server-id' ? 'github' : ''
);
expect(auth.getMavenServerSettings()).toEqual([
{
id: 'github',
usernameEnvVar: 'GITHUB_ACTOR',
passwordEnvVar: 'GITHUB_TOKEN'
}
]);
});
it('preserves deprecated single-server aliases as fallback inputs', () => {
(core.getInput as jest.Mock).mockImplementation((name: string) => {
const inputs: Record<string, string> = {
'server-id': 'legacy',
'server-username': 'LEGACY_USERNAME',
'server-password': 'LEGACY_PASSWORD'
};
return inputs[name] ?? '';
});
expect(auth.getMavenServerSettings()).toEqual([
{
id: 'legacy',
usernameEnvVar: 'LEGACY_USERNAME',
passwordEnvVar: 'LEGACY_PASSWORD'
}
]);
expect(core.warning).toHaveBeenCalledTimes(2);
});
function xmlElementText(xml: string, tagName: string): string { function xmlElementText(xml: string, tagName: string): string {
const match = new RegExp(`<${tagName}>([\\s\\S]*?)</${tagName}>`).exec(xml); const match = new RegExp(`<${tagName}>([\\s\\S]*?)</${tagName}>`).exec(xml);
expect(match).not.toBeNull(); expect(match).not.toBeNull();
@@ -1,11 +0,0 @@
{
"result": [
{
"filename": "java-21-openjdk-21.0.8.0.9-1.portable.jdk.x86_64.tar.xz",
"direct_download_uri": "https://developers.redhat.com/content-gateway/file/pub/openjdk/java-21-openjdk-21.0.8.0.9-1.portable.jdk.x86_64.tar.xz",
"checksum": "91a6f3284cbded9de17f65985a4fca48dd4fd0aa295162178631c23ade335aad",
"checksum_type": "sha256"
}
],
"message": ""
}
-71
View File
@@ -1,71 +0,0 @@
{
"result": [
{
"id": "redhat-21.0.8-jdk-linux-x64",
"archive_type": "tar.xz",
"distribution": "redhat",
"java_version": "21.0.8+9",
"release_status": "ga",
"operating_system": "linux",
"architecture": "x64",
"package_type": "jdk",
"directly_downloadable": true
},
{
"id": "redhat-21.0.7-jdk-linux-x64",
"archive_type": "tar.xz",
"distribution": "redhat",
"java_version": "21.0.7+6",
"release_status": "ga",
"operating_system": "linux",
"architecture": "x64",
"package_type": "jdk",
"directly_downloadable": true
},
{
"id": "redhat-17.0.16-jdk-linux-x64",
"archive_type": "tar.xz",
"distribution": "redhat",
"java_version": "17.0.16+8",
"release_status": "ga",
"operating_system": "linux",
"architecture": "x64",
"package_type": "jdk",
"directly_downloadable": true
},
{
"id": "redhat-9-jdk-linux-x64",
"archive_type": "tar.xz",
"distribution": "redhat",
"java_version": "9+181",
"release_status": "ga",
"operating_system": "linux",
"architecture": "x64",
"package_type": "jdk",
"directly_downloadable": true
},
{
"id": "redhat-21.0.8-jre-linux-x64",
"archive_type": "tar.xz",
"distribution": "redhat",
"java_version": "21.0.8+9",
"release_status": "ga",
"operating_system": "linux",
"architecture": "x64",
"package_type": "jre",
"directly_downloadable": true
},
{
"id": "redhat-17.0.16-jdk-windows-x64",
"archive_type": "zip",
"distribution": "redhat",
"java_version": "17.0.16+8",
"release_status": "ga",
"operating_system": "windows",
"architecture": "x64",
"package_type": "jdk",
"directly_downloadable": true
}
],
"message": "6 package(s) found"
}
@@ -1,109 +0,0 @@
import {beforeEach, describe, expect, it, jest} from '@jest/globals';
import path from 'path';
const mockReaddirSync = jest.fn();
const realFs = await import('fs');
jest.unstable_mockModule('fs', () => ({
...realFs,
default: {...realFs.default, readdirSync: mockReaddirSync},
readdirSync: mockReaddirSync
}));
jest.unstable_mockModule('@actions/core', () => ({
info: jest.fn(),
debug: jest.fn(),
isDebug: jest.fn(() => false),
startGroup: jest.fn(),
endGroup: jest.fn()
}));
const realUtil = await import('../../src/util.js');
const mockCacheJdkDir = jest.fn();
const mockExtractJdkFile = jest.fn();
const mockRenameWinArchive = jest.fn();
jest.unstable_mockModule('../../src/util.js', () => ({
...realUtil,
cacheJdkDir: mockCacheJdkDir,
extractJdkFile: mockExtractJdkFile,
renameWinArchive: mockRenameWinArchive
}));
const {RedHatDistribution} =
await import('../../src/distributions/redhat/installer.js');
const release = {
version: '21.0.8+9',
url: 'https://developers.redhat.com/openjdk-21.tar.xz',
checksum: {
algorithm: 'sha256' as const,
value: 'a'.repeat(64)
}
};
const createDistribution = () =>
new RedHatDistribution({
version: '21',
architecture: 'x64',
packageType: 'jdk',
checkLatest: false
});
beforeEach(() => {
jest.clearAllMocks();
mockReaddirSync.mockReturnValue(['jdk-21']);
mockExtractJdkFile.mockResolvedValue('/tmp/extracted');
mockCacheJdkDir.mockResolvedValue('/toolcache/Java_RedHat_jdk/21.0.8-9/x64');
mockRenameWinArchive.mockReturnValue('/tmp/download.zip');
});
describe('Red Hat package installation', () => {
it('extracts and caches Linux tar.xz archives', async () => {
const distribution = createDistribution();
distribution['downloadAndVerify'] = jest
.fn()
.mockResolvedValue('/tmp/download');
distribution['getArchiveType'] = () => 'tar.xz';
const result = await distribution['downloadTool'](release);
expect(mockExtractJdkFile).toHaveBeenCalledWith('/tmp/download', 'tar.xz');
expect(mockRenameWinArchive).not.toHaveBeenCalled();
expect(mockCacheJdkDir).toHaveBeenCalledWith(
path.join('/tmp/extracted', 'jdk-21'),
'Java_RedHat_jdk',
'21.0.8-9',
'x64'
);
expect(result).toEqual({
version: '21.0.8+9',
path: '/toolcache/Java_RedHat_jdk/21.0.8-9/x64'
});
});
it('renames downloaded Windows ZIP archives before extraction', async () => {
const distribution = createDistribution();
distribution['downloadAndVerify'] = jest
.fn()
.mockResolvedValue('/tmp/download');
distribution['getArchiveType'] = () => 'zip';
await distribution['downloadTool'](release);
expect(mockRenameWinArchive).toHaveBeenCalledWith('/tmp/download');
expect(mockExtractJdkFile).toHaveBeenCalledWith('/tmp/download.zip', 'zip');
});
it('fails when the extracted archive is empty', async () => {
mockReaddirSync.mockReturnValue([]);
const distribution = createDistribution();
distribution['downloadAndVerify'] = jest
.fn()
.mockResolvedValue('/tmp/download');
distribution['getArchiveType'] = () => 'tar.xz';
await expect(distribution['downloadTool'](release)).rejects.toThrow(
'The Red Hat archive for Java 21.0.8+9 was empty.'
);
expect(mockCacheJdkDir).not.toHaveBeenCalled();
});
});
@@ -1,181 +0,0 @@
import {afterEach, describe, expect, it, jest} from '@jest/globals';
import {HttpClient} from '@actions/http-client';
import packageDetails from '../data/redhat-package-details.json' with {type: 'json'};
import packages from '../data/redhat-packages.json' with {type: 'json'};
import {RedHatDistribution} from '../../src/distributions/redhat/installer.js';
const createDistribution = (
version: string,
packageType = 'jdk'
): RedHatDistribution => {
const distribution = new RedHatDistribution({
version,
architecture: 'x64',
packageType,
checkLatest: false
});
distribution['getOperatingSystem'] = () => 'linux';
distribution['getArchiveType'] = () => 'tar.xz';
return distribution;
};
const mockDisco = (
packageResponse: unknown = packages,
detailsResponse: unknown = packageDetails
) =>
jest.spyOn(HttpClient.prototype, 'getJson').mockImplementation(async url => ({
result: url.includes('/packages?') ? packageResponse : detailsResponse,
statusCode: 200,
headers: {}
}));
afterEach(() => {
jest.restoreAllMocks();
});
describe('Red Hat package resolution', () => {
it('resolves the newest matching release and authoritative checksum', async () => {
const getJson = mockDisco();
const distribution = createDistribution('21');
const release = await distribution['findPackageForDownload']('21');
expect(release).toEqual({
version: '21.0.8+9',
url: packageDetails.result[0].direct_download_uri,
checksum: {
algorithm: 'sha256',
value: packageDetails.result[0].checksum,
source:
'https://api.foojay.io/disco/v3.0/ids/redhat-21.0.8-jdk-linux-x64'
}
});
expect(getJson).toHaveBeenNthCalledWith(
1,
expect.stringContaining(
'distro=redhat&release_status=ga&operating_system=linux&architecture=x64&package_type=jdk&archive_type=tar.xz&directly_downloadable=true'
)
);
expect(getJson).toHaveBeenNthCalledWith(
2,
'https://api.foojay.io/disco/v3.0/ids/redhat-21.0.8-jdk-linux-x64'
);
});
it('normalizes feature-only Disco versions before matching', async () => {
mockDisco(undefined, {
result: [
{
...packageDetails.result[0],
direct_download_uri: 'https://developers.redhat.com/openjdk-9.tar.xz'
}
],
message: ''
});
const distribution = createDistribution('9');
const release = await distribution['findPackageForDownload']('9');
expect(release.version).toBe('9.0.0+181');
});
it('selects the requested package type', async () => {
const getJson = mockDisco();
const distribution = createDistribution('21', 'jre');
await distribution['findPackageForDownload']('21');
expect(getJson).toHaveBeenNthCalledWith(
1,
expect.stringContaining('package_type=jre')
);
expect(getJson).toHaveBeenNthCalledWith(
2,
'https://api.foojay.io/disco/v3.0/ids/redhat-21.0.8-jre-linux-x64'
);
});
it('maps Windows to ZIP packages', async () => {
const getJson = mockDisco();
const distribution = createDistribution('17');
distribution['getOperatingSystem'] = () => 'windows';
distribution['getArchiveType'] = () => 'zip';
await distribution['findPackageForDownload']('17');
expect(getJson).toHaveBeenNthCalledWith(
1,
expect.stringContaining(
'operating_system=windows&architecture=x64&package_type=jdk&archive_type=zip'
)
);
expect(getJson).toHaveBeenNthCalledWith(
2,
'https://api.foojay.io/disco/v3.0/ids/redhat-17.0.16-jdk-windows-x64'
);
});
it('rejects Alpine before requesting glibc package metadata', async () => {
const getJson = mockDisco();
const distribution = new RedHatDistribution({
version: '21',
architecture: 'x64',
packageType: 'jdk',
checkLatest: false
});
expect(() => distribution['getOperatingSystem'](true)).toThrow(
"Distribution 'redhat' does not support Alpine Linux because Red Hat portable archives require glibc."
);
expect(getJson).not.toHaveBeenCalled();
});
it('rejects early-access versions before requesting metadata', async () => {
const getJson = mockDisco();
const distribution = createDistribution('21-ea');
await expect(distribution['findPackageForDownload']('21')).rejects.toThrow(
'Early access versions are not supported'
);
expect(getJson).not.toHaveBeenCalled();
});
it('reports available versions when no release matches', async () => {
mockDisco();
const distribution = createDistribution('25');
await expect(distribution['findPackageForDownload']('25')).rejects.toThrow(
"No matching version found for SemVer '25'.\nDistribution: RedHat"
);
});
it('fails when the package detail has no direct Red Hat URL', async () => {
mockDisco(packages, {result: [], message: ''});
const distribution = createDistribution('21');
await expect(distribution['findPackageForDownload']('21')).rejects.toThrow(
'returned no direct Red Hat download URL'
);
});
it('fails when the package detail has no SHA-256 checksum', async () => {
mockDisco(packages, {
result: [{...packageDetails.result[0], checksum: ''}],
message: ''
});
const distribution = createDistribution('21');
await expect(distribution['findPackageForDownload']('21')).rejects.toThrow(
'returned no SHA-256 checksum'
);
});
it('fails with a targeted error when package metadata is missing', async () => {
mockDisco(null);
const distribution = createDistribution('21');
await expect(distribution['findPackageForDownload']('21')).rejects.toThrow(
'Could not fetch Red Hat package metadata from Foojay Disco'
);
});
});
-12
View File
@@ -405,18 +405,6 @@ describe('extractJdkFile', () => {
expect(io.which).not.toHaveBeenCalled(); expect(io.which).not.toHaveBeenCalled();
}); });
it('extracts xz-compressed tarballs with xz tar flags', async () => {
(tc.extractTar as jest.Mock).mockResolvedValue('/extracted' as never);
await expect(extractJdkFile('/tmp/jdk.tar.xz')).resolves.toBe('/extracted');
expect(tc.extractTar).toHaveBeenCalledWith(
'/tmp/jdk.tar.xz',
undefined,
'xJ'
);
expect(io.which).not.toHaveBeenCalled();
});
it('uses the bundled tar.exe for zip archives on Windows', async () => { it('uses the bundled tar.exe for zip archives on Windows', async () => {
setPlatform('win32'); setPlatform('win32');
const systemRoot = path.join(workDir, 'Windows'); const systemRoot = path.join(workDir, 'Windows');
-1
View File
@@ -263,7 +263,6 @@ describe('validatePaginationUrl', () => {
describe('getVersionFromFileContent', () => { describe('getVersionFromFileContent', () => {
describe('.sdkmanrc', () => { describe('.sdkmanrc', () => {
it.each([ it.each([
['java=26-tem', '26', 'temurin'],
['java=11.0.20.1-tem', '11.0.20', 'temurin'], ['java=11.0.20.1-tem', '11.0.20', 'temurin'],
['java = 11.0.20.1-tem', '11.0.20', 'temurin'], ['java = 11.0.20.1-tem', '11.0.20', 'temurin'],
['java=11.0.20.1-tem # a comment in sdkmanrc', '11.0.20', 'temurin'], ['java=11.0.20.1-tem # a comment in sdkmanrc', '11.0.20', 'temurin'],
-14
View File
@@ -64,20 +64,6 @@ inputs:
server-password: server-password:
description: 'Deprecated alias for server-password-env-var' description: 'Deprecated alias for server-password-env-var'
required: false required: false
mvn-server-credentials:
description: 'Multiline list of Maven server credentials in the format `server-id:USERNAME_ENV:PASSWORD_ENV`. When set, replaces the single server configured by server-id, server-username-env-var, and server-password-env-var.'
required: false
mvn-repositories:
description: 'Multiline list of Maven dependency repositories in the format `repository-id:repository-url:snapshots-enabled`.'
required: false
mvn-repositories-include-central:
description: 'Include Maven Central in the generated dependency repositories profile. When false, Central is disabled unless an explicit repository with ID `central` is declared.'
required: false
default: true
mvn-repositories-prioritize-central:
description: 'Place Maven Central before custom dependency repositories. Has no effect when Maven Central is excluded.'
required: false
default: true
settings-path: settings-path:
description: 'Path to where the settings.xml file will be written. Default is ~/.m2.' description: 'Path to where the settings.xml file will be written. Default is ~/.m2.'
required: false required: false
+1 -12
View File
@@ -30774,7 +30774,7 @@ module.exports = {
/* harmony export */ gk: () => (/* binding */ INPUT_CACHE), /* harmony export */ gk: () => (/* binding */ INPUT_CACHE),
/* harmony export */ wG: () => (/* binding */ INPUT_JOB_STATUS) /* harmony export */ wG: () => (/* binding */ INPUT_JOB_STATUS)
/* harmony export */ }); /* harmony export */ });
/* unused harmony exports MACOS_JAVA_CONTENT_POSTFIX, INPUT_JAVA_VERSION, INPUT_JAVA_VERSION_FILE, INPUT_ARCHITECTURE, INPUT_JAVA_PACKAGE, INPUT_DISTRIBUTION, INPUT_JDK_FILE, INPUT_JDK_FILE_DEPRECATED, INPUT_CHECK_LATEST, INPUT_FORCE_DOWNLOAD, INPUT_SET_DEFAULT, INPUT_PROBLEM_MATCHER, INPUT_VERIFY_SIGNATURE, INPUT_VERIFY_SIGNATURE_PUBLIC_KEY, INPUT_MVN_SERVER_CREDENTIALS, INPUT_MVN_REPOSITORIES, INPUT_MVN_REPOSITORIES_INCLUDE_CENTRAL, INPUT_MVN_REPOSITORIES_PRIORITIZE_CENTRAL, INPUT_SERVER_ID, INPUT_SERVER_USERNAME_ENV_VAR, INPUT_SERVER_PASSWORD_ENV_VAR, INPUT_SERVER_USERNAME_DEPRECATED, INPUT_SERVER_PASSWORD_DEPRECATED, INPUT_SETTINGS_PATH, INPUT_OVERWRITE_SETTINGS, INPUT_GPG_PRIVATE_KEY, INPUT_GPG_PASSPHRASE_ENV_VAR, INPUT_GPG_PASSPHRASE_DEPRECATED, INPUT_DEFAULT_SERVER_USERNAME, INPUT_DEFAULT_SERVER_PASSWORD, INPUT_DEFAULT_GPG_PRIVATE_KEY, INPUT_DEFAULT_GPG_PASSPHRASE, MAVEN_GPG_PASSPHRASE_DEFAULT_ENV, GPG_PASSPHRASE_PROFILE_ID, MAVEN_REPOSITORIES_PROFILE_ID, MAVEN_CENTRAL_REPOSITORY_ID, MAVEN_CENTRAL_REPOSITORY_URL, INPUT_CACHE_DEPENDENCY_PATH, INPUT_CACHE_PATH, M2_DIR, MVN_SETTINGS_FILE, MVN_TOOLCHAINS_FILE, INPUT_MVN_TOOLCHAIN_ID, INPUT_MVN_TOOLCHAIN_VENDOR, INPUT_SHOW_DOWNLOAD_PROGRESS, MAVEN_ARGS_ENV, MAVEN_NO_TRANSFER_PROGRESS_FLAG, MAVEN_NO_TRANSFER_PROGRESS_LONG_FLAG, DISTRIBUTIONS_ONLY_MAJOR_VERSION */ /* unused harmony exports MACOS_JAVA_CONTENT_POSTFIX, INPUT_JAVA_VERSION, INPUT_JAVA_VERSION_FILE, INPUT_ARCHITECTURE, INPUT_JAVA_PACKAGE, INPUT_DISTRIBUTION, INPUT_JDK_FILE, INPUT_JDK_FILE_DEPRECATED, INPUT_CHECK_LATEST, INPUT_FORCE_DOWNLOAD, INPUT_SET_DEFAULT, INPUT_PROBLEM_MATCHER, INPUT_VERIFY_SIGNATURE, INPUT_VERIFY_SIGNATURE_PUBLIC_KEY, INPUT_SERVER_ID, INPUT_SERVER_USERNAME_ENV_VAR, INPUT_SERVER_PASSWORD_ENV_VAR, INPUT_SERVER_USERNAME_DEPRECATED, INPUT_SERVER_PASSWORD_DEPRECATED, INPUT_SETTINGS_PATH, INPUT_OVERWRITE_SETTINGS, INPUT_GPG_PRIVATE_KEY, INPUT_GPG_PASSPHRASE_ENV_VAR, INPUT_GPG_PASSPHRASE_DEPRECATED, INPUT_DEFAULT_SERVER_USERNAME, INPUT_DEFAULT_SERVER_PASSWORD, INPUT_DEFAULT_GPG_PRIVATE_KEY, INPUT_DEFAULT_GPG_PASSPHRASE, MAVEN_GPG_PASSPHRASE_DEFAULT_ENV, GPG_PASSPHRASE_PROFILE_ID, INPUT_CACHE_DEPENDENCY_PATH, INPUT_CACHE_PATH, M2_DIR, MVN_SETTINGS_FILE, MVN_TOOLCHAINS_FILE, INPUT_MVN_TOOLCHAIN_ID, INPUT_MVN_TOOLCHAIN_VENDOR, INPUT_SHOW_DOWNLOAD_PROGRESS, MAVEN_ARGS_ENV, MAVEN_NO_TRANSFER_PROGRESS_FLAG, MAVEN_NO_TRANSFER_PROGRESS_LONG_FLAG, DISTRIBUTIONS_ONLY_MAJOR_VERSION */
const MACOS_JAVA_CONTENT_POSTFIX = 'Contents/Home'; const MACOS_JAVA_CONTENT_POSTFIX = 'Contents/Home';
const INPUT_JAVA_VERSION = 'java-version'; const INPUT_JAVA_VERSION = 'java-version';
const INPUT_JAVA_VERSION_FILE = 'java-version-file'; const INPUT_JAVA_VERSION_FILE = 'java-version-file';
@@ -30789,10 +30789,6 @@ const INPUT_SET_DEFAULT = 'set-default';
const INPUT_PROBLEM_MATCHER = 'problem-matcher'; const INPUT_PROBLEM_MATCHER = 'problem-matcher';
const INPUT_VERIFY_SIGNATURE = 'verify-signature'; const INPUT_VERIFY_SIGNATURE = 'verify-signature';
const INPUT_VERIFY_SIGNATURE_PUBLIC_KEY = 'verify-signature-public-key'; const INPUT_VERIFY_SIGNATURE_PUBLIC_KEY = 'verify-signature-public-key';
const INPUT_MVN_SERVER_CREDENTIALS = 'mvn-server-credentials';
const INPUT_MVN_REPOSITORIES = 'mvn-repositories';
const INPUT_MVN_REPOSITORIES_INCLUDE_CENTRAL = 'mvn-repositories-include-central';
const INPUT_MVN_REPOSITORIES_PRIORITIZE_CENTRAL = 'mvn-repositories-prioritize-central';
const INPUT_SERVER_ID = 'server-id'; const INPUT_SERVER_ID = 'server-id';
const INPUT_SERVER_USERNAME_ENV_VAR = 'server-username-env-var'; const INPUT_SERVER_USERNAME_ENV_VAR = 'server-username-env-var';
const INPUT_SERVER_PASSWORD_ENV_VAR = 'server-password-env-var'; const INPUT_SERVER_PASSWORD_ENV_VAR = 'server-password-env-var';
@@ -30813,9 +30809,6 @@ const INPUT_DEFAULT_GPG_PASSPHRASE = 'GPG_PASSPHRASE';
const MAVEN_GPG_PASSPHRASE_DEFAULT_ENV = 'MAVEN_GPG_PASSPHRASE'; const MAVEN_GPG_PASSPHRASE_DEFAULT_ENV = 'MAVEN_GPG_PASSPHRASE';
// Id of the settings.xml profile used to set `gpg.passphraseEnvName`. // Id of the settings.xml profile used to set `gpg.passphraseEnvName`.
const GPG_PASSPHRASE_PROFILE_ID = 'setup-java-gpg'; const GPG_PASSPHRASE_PROFILE_ID = 'setup-java-gpg';
const MAVEN_REPOSITORIES_PROFILE_ID = 'setup-java-repositories';
const MAVEN_CENTRAL_REPOSITORY_ID = 'central';
const MAVEN_CENTRAL_REPOSITORY_URL = 'https://repo.maven.apache.org/maven2';
const INPUT_CACHE = 'cache'; const INPUT_CACHE = 'cache';
const INPUT_CACHE_JDK = 'cache-jdk'; const INPUT_CACHE_JDK = 'cache-jdk';
const INPUT_CACHE_DEPENDENCY_PATH = 'cache-dependency-path'; const INPUT_CACHE_DEPENDENCY_PATH = 'cache-dependency-path';
@@ -30905,8 +30898,6 @@ async function extractJdkFile(toolPath, extension) {
if (!extension) { if (!extension) {
extension = toolPath.endsWith('.tar.gz') extension = toolPath.endsWith('.tar.gz')
? 'tar.gz' ? 'tar.gz'
: toolPath.endsWith('.tar.xz')
? 'tar.xz'
: path.extname(toolPath); : path.extname(toolPath);
if (extension.startsWith('.')) { if (extension.startsWith('.')) {
extension = extension.substring(1); extension = extension.substring(1);
@@ -30915,8 +30906,6 @@ async function extractJdkFile(toolPath, extension) {
switch (extension) { switch (extension) {
case 'tar.gz': case 'tar.gz':
return await extractTarGz(toolPath); return await extractTarGz(toolPath);
case 'tar.xz':
return await tc.extractTar(toolPath, undefined, 'xJ');
case 'tar': case 'tar':
return await tc.extractTar(toolPath); return await tc.extractTar(toolPath);
case 'zip': case 'zip':
-139
View File
@@ -1,139 +0,0 @@
export const id = 228;
export const ids = [228];
export const modules = {
/***/ 8228:
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ RedHatDistribution: () => (/* binding */ RedHatDistribution)
/* harmony export */ });
/* harmony import */ var _actions_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3838);
/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9896);
/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(6928);
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_2__);
/* harmony import */ var semver__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(2088);
/* harmony import */ var semver__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(semver__WEBPACK_IMPORTED_MODULE_3__);
/* harmony import */ var _util_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(4527);
/* harmony import */ var _base_installer_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(6242);
/* harmony import */ var _platform_types_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(7444);
const DISCO_API_URL = 'https://api.foojay.io/disco/v3.0';
class RedHatDistribution extends _base_installer_js__WEBPACK_IMPORTED_MODULE_5__/* .JavaBase */ .O {
constructor(installerOptions) {
super('RedHat', installerOptions);
}
async findPackageForDownload(range) {
if (!this.stable) {
throw new Error('Early access versions are not supported');
}
const availablePackages = await this.getAvailablePackages();
const normalizedPackages = availablePackages
.map(item => ({
item,
version: this.normalizeDiscoVersion(item.java_version)
}))
.filter((item) => item.version !== null)
.sort((left, right) => -semver__WEBPACK_IMPORTED_MODULE_3___default().compareBuild(left.version, right.version));
const selectedPackage = normalizedPackages.find(item => (0,_util_js__WEBPACK_IMPORTED_MODULE_4__/* .isVersionSatisfies */ .y)(range, item.version));
if (!selectedPackage) {
throw this.createVersionNotFoundError(range, normalizedPackages.map(item => item.version), `Operating system: ${this.getOperatingSystem()}`);
}
const detailsUrl = `${DISCO_API_URL}/ids/${selectedPackage.item.id}`;
const response = await this.http.getJson(detailsUrl);
const details = response.result?.result?.[0];
if (!details?.direct_download_uri) {
throw new Error(`Foojay Disco returned no direct Red Hat download URL for package '${selectedPackage.item.id}'.`);
}
const checksum = details.checksum?.trim();
if (details.checksum_type?.toLowerCase() !== 'sha256' || !checksum) {
throw new Error(`Foojay Disco returned no SHA-256 checksum for Red Hat package '${selectedPackage.item.id}'.`);
}
return {
version: selectedPackage.version,
url: details.direct_download_uri,
checksum: {
algorithm: 'sha256',
value: checksum,
source: detailsUrl
}
};
}
async downloadTool(javaRelease) {
_actions_core__WEBPACK_IMPORTED_MODULE_0__/* .info */ .pq(`Downloading Java ${javaRelease.version} (${this.distribution}) from ${javaRelease.url} ...`);
let javaArchivePath = await this.downloadAndVerify(javaRelease);
_actions_core__WEBPACK_IMPORTED_MODULE_0__/* .info */ .pq('Extracting Java archive...');
const archiveType = this.getArchiveType();
if (archiveType === 'zip') {
javaArchivePath = (0,_util_js__WEBPACK_IMPORTED_MODULE_4__/* .renameWinArchive */ .n2)(javaArchivePath);
}
const extractedJavaPath = await (0,_util_js__WEBPACK_IMPORTED_MODULE_4__/* .extractJdkFile */ .PE)(javaArchivePath, archiveType);
const archiveName = fs__WEBPACK_IMPORTED_MODULE_1___default().readdirSync(extractedJavaPath)[0];
if (!archiveName) {
throw new Error(`The Red Hat archive for Java ${javaRelease.version} was empty.`);
}
const archivePath = path__WEBPACK_IMPORTED_MODULE_2___default().join(extractedJavaPath, archiveName);
const javaPath = await (0,_util_js__WEBPACK_IMPORTED_MODULE_4__/* .cacheJdkDir */ .Vj)(archivePath, this.toolcacheFolderName, this.getToolcacheVersionName(javaRelease.version), this.architecture);
return { version: javaRelease.version, path: javaPath };
}
async getAvailablePackages() {
const operatingSystem = this.getOperatingSystem();
const archiveType = this.getArchiveType();
const query = new URLSearchParams({
distro: 'redhat',
release_status: 'ga',
operating_system: operatingSystem,
architecture: this.distributionArchitecture(),
package_type: this.packageType,
archive_type: archiveType,
directly_downloadable: 'true'
});
const url = `${DISCO_API_URL}/packages?${query.toString()}`;
const response = await this.http.getJson(url);
const packages = response.result?.result;
if (!Array.isArray(packages)) {
throw new Error(`Could not fetch Red Hat package metadata from Foojay Disco: ${url}`);
}
return packages.filter(item => item.distribution === 'redhat' &&
item.release_status === 'ga' &&
item.operating_system === operatingSystem &&
item.architecture === this.distributionArchitecture() &&
item.package_type === this.packageType &&
item.archive_type === archiveType &&
item.directly_downloadable);
}
getOperatingSystem(alpine = (0,_platform_types_js__WEBPACK_IMPORTED_MODULE_6__/* .isAlpineLinux */ .G6)()) {
if (alpine) {
throw new Error("Distribution 'redhat' does not support Alpine Linux because Red Hat portable archives require glibc.");
}
return process.platform === 'win32' ? 'windows' : 'linux';
}
getArchiveType() {
return process.platform === 'win32' ? 'zip' : 'tar.xz';
}
normalizeDiscoVersion(version) {
let normalizedVersion = version.trim();
if (/^\d+\+\d+$/.test(normalizedVersion)) {
normalizedVersion = normalizedVersion.replace('+', '.0.0+');
}
else if (/^\d+$/.test(normalizedVersion)) {
normalizedVersion = `${normalizedVersion}.0.0`;
}
else if (/^\d+\.\d+$/.test(normalizedVersion)) {
normalizedVersion = `${normalizedVersion}.0`;
}
return semver__WEBPACK_IMPORTED_MODULE_3___default().valid(normalizedVersion) ? normalizedVersion : null;
}
}
/***/ })
};
+17 -149
View File
@@ -10,11 +10,7 @@ __webpack_require__.r(__webpack_exports__);
/* harmony export */ configureAuthentication: () => (/* binding */ configureAuthentication), /* harmony export */ configureAuthentication: () => (/* binding */ configureAuthentication),
/* harmony export */ createAuthenticationSettings: () => (/* binding */ createAuthenticationSettings), /* harmony export */ createAuthenticationSettings: () => (/* binding */ createAuthenticationSettings),
/* harmony export */ generate: () => (/* binding */ generate), /* harmony export */ generate: () => (/* binding */ generate),
/* harmony export */ getInputWithDeprecatedAlias: () => (/* binding */ getInputWithDeprecatedAlias), /* harmony export */ getInputWithDeprecatedAlias: () => (/* binding */ getInputWithDeprecatedAlias)
/* harmony export */ getMavenRepositorySettings: () => (/* binding */ getMavenRepositorySettings),
/* harmony export */ getMavenServerSettings: () => (/* binding */ getMavenServerSettings),
/* harmony export */ parseMavenRepositories: () => (/* binding */ parseMavenRepositories),
/* harmony export */ parseMavenServerCredentials: () => (/* binding */ parseMavenServerCredentials)
/* harmony export */ }); /* harmony export */ });
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6928); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6928);
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__);
@@ -38,8 +34,9 @@ __webpack_require__.r(__webpack_exports__);
async function configureAuthentication() { async function configureAuthentication() {
const servers = getMavenServerSettings(); const id = _actions_core__WEBPACK_IMPORTED_MODULE_1__/* .getInput */ .V4(_constants_js__WEBPACK_IMPORTED_MODULE_7__/* .INPUT_SERVER_ID */ .fd);
const repositorySettings = getMavenRepositorySettings(); const usernameEnvVar = getInputWithDeprecatedAlias(_constants_js__WEBPACK_IMPORTED_MODULE_7__/* .INPUT_SERVER_USERNAME_ENV_VAR */ .sc, _constants_js__WEBPACK_IMPORTED_MODULE_7__/* .INPUT_SERVER_USERNAME_DEPRECATED */ .sp, _constants_js__WEBPACK_IMPORTED_MODULE_7__/* .INPUT_DEFAULT_SERVER_USERNAME */ .Wj);
const passwordEnvVar = getInputWithDeprecatedAlias(_constants_js__WEBPACK_IMPORTED_MODULE_7__/* .INPUT_SERVER_PASSWORD_ENV_VAR */ .r4, _constants_js__WEBPACK_IMPORTED_MODULE_7__/* .INPUT_SERVER_PASSWORD_DEPRECATED */ .Vt, _constants_js__WEBPACK_IMPORTED_MODULE_7__/* .INPUT_DEFAULT_SERVER_PASSWORD */ .xp);
const settingsDirectory = _actions_core__WEBPACK_IMPORTED_MODULE_1__/* .getInput */ .V4(_constants_js__WEBPACK_IMPORTED_MODULE_7__/* .INPUT_SETTINGS_PATH */ .Xh) || const settingsDirectory = _actions_core__WEBPACK_IMPORTED_MODULE_1__/* .getInput */ .V4(_constants_js__WEBPACK_IMPORTED_MODULE_7__/* .INPUT_SETTINGS_PATH */ .Xh) ||
path__WEBPACK_IMPORTED_MODULE_0__.join(os__WEBPACK_IMPORTED_MODULE_4__.homedir(), _constants_js__WEBPACK_IMPORTED_MODULE_7__/* .M2_DIR */ .iT); path__WEBPACK_IMPORTED_MODULE_0__.join(os__WEBPACK_IMPORTED_MODULE_4__.homedir(), _constants_js__WEBPACK_IMPORTED_MODULE_7__/* .M2_DIR */ .iT);
const overwriteSettings = (0,_util_js__WEBPACK_IMPORTED_MODULE_6__/* .getBooleanInput */ .Vt)(_constants_js__WEBPACK_IMPORTED_MODULE_7__/* .INPUT_OVERWRITE_SETTINGS */ .TS, true); const overwriteSettings = (0,_util_js__WEBPACK_IMPORTED_MODULE_6__/* .getBooleanInput */ .Vt)(_constants_js__WEBPACK_IMPORTED_MODULE_7__/* .INPUT_OVERWRITE_SETTINGS */ .TS, true);
@@ -49,7 +46,7 @@ async function configureAuthentication() {
if (gpgPrivateKey) { if (gpgPrivateKey) {
_actions_core__WEBPACK_IMPORTED_MODULE_1__/* .setSecret */ .Pq(gpgPrivateKey); _actions_core__WEBPACK_IMPORTED_MODULE_1__/* .setSecret */ .Pq(gpgPrivateKey);
} }
await createAuthenticationSettings(servers, settingsDirectory, overwriteSettings, gpgPassphraseEnvVar, repositorySettings); await createAuthenticationSettings(id, usernameEnvVar, passwordEnvVar, settingsDirectory, overwriteSettings, gpgPassphraseEnvVar);
if (gpgPrivateKey) { if (gpgPrivateKey) {
_actions_core__WEBPACK_IMPORTED_MODULE_1__/* .info */ .pq('Importing private gpg key'); _actions_core__WEBPACK_IMPORTED_MODULE_1__/* .info */ .pq('Importing private gpg key');
const gpgHome = await _gpg_js__WEBPACK_IMPORTED_MODULE_5__/* .importKey */ .Fh(gpgPrivateKey); const gpgHome = await _gpg_js__WEBPACK_IMPORTED_MODULE_5__/* .importKey */ .Fh(gpgPrivateKey);
@@ -71,106 +68,15 @@ function getInputWithDeprecatedAlias(inputName, deprecatedInputName, defaultValu
} }
return value || deprecatedValue || defaultValue || ''; return value || deprecatedValue || defaultValue || '';
} }
// only exported for testing purposes async function createAuthenticationSettings(id, usernameEnvVar, passwordEnvVar, settingsDirectory, overwriteSettings, gpgPassphraseEnvVar = undefined) {
function getMavenServerSettings() { _actions_core__WEBPACK_IMPORTED_MODULE_1__/* .info */ .pq(`Creating ${_constants_js__WEBPACK_IMPORTED_MODULE_7__/* .MVN_SETTINGS_FILE */ .vO} with server-id: ${id}`);
const entries = _actions_core__WEBPACK_IMPORTED_MODULE_1__/* .getMultilineInput */ .q3(_constants_js__WEBPACK_IMPORTED_MODULE_7__/* .INPUT_MVN_SERVER_CREDENTIALS */ .MM);
if (entries.some(entry => entry.trim())) {
return parseMavenServerCredentials(entries);
}
return [
{
id: _actions_core__WEBPACK_IMPORTED_MODULE_1__/* .getInput */ .V4(_constants_js__WEBPACK_IMPORTED_MODULE_7__/* .INPUT_SERVER_ID */ .fd),
usernameEnvVar: getInputWithDeprecatedAlias(_constants_js__WEBPACK_IMPORTED_MODULE_7__/* .INPUT_SERVER_USERNAME_ENV_VAR */ .sc, _constants_js__WEBPACK_IMPORTED_MODULE_7__/* .INPUT_SERVER_USERNAME_DEPRECATED */ .sp, _constants_js__WEBPACK_IMPORTED_MODULE_7__/* .INPUT_DEFAULT_SERVER_USERNAME */ .Wj),
passwordEnvVar: getInputWithDeprecatedAlias(_constants_js__WEBPACK_IMPORTED_MODULE_7__/* .INPUT_SERVER_PASSWORD_ENV_VAR */ .r4, _constants_js__WEBPACK_IMPORTED_MODULE_7__/* .INPUT_SERVER_PASSWORD_DEPRECATED */ .Vt, _constants_js__WEBPACK_IMPORTED_MODULE_7__/* .INPUT_DEFAULT_SERVER_PASSWORD */ .xp)
}
];
}
// only exported for testing purposes
function parseMavenServerCredentials(entries) {
const servers = [];
const serverIds = new Set();
entries.forEach((entry, index) => {
if (!entry.trim()) {
return;
}
const fields = entry.split(':');
if (fields.length !== 3) {
throw new Error(`Invalid mvn-server-credentials entry at line ${index + 1}. Expected format: server-id:USERNAME_ENV:PASSWORD_ENV`);
}
const [id, usernameEnvVar, passwordEnvVar] = fields.map(field => field.trim());
if (!id || !usernameEnvVar || !passwordEnvVar) {
throw new Error(`Invalid mvn-server-credentials entry at line ${index + 1}. server-id, username environment variable, and password environment variable are required`);
}
if (serverIds.has(id)) {
throw new Error(`Duplicate server-id '${id}' in mvn-server-credentials input`);
}
serverIds.add(id);
servers.push({ id, usernameEnvVar, passwordEnvVar });
});
return servers;
}
// only exported for testing purposes
function getMavenRepositorySettings() {
const entries = _actions_core__WEBPACK_IMPORTED_MODULE_1__/* .getMultilineInput */ .q3(_constants_js__WEBPACK_IMPORTED_MODULE_7__/* .INPUT_MVN_REPOSITORIES */ .W2);
if (!entries.some(entry => entry.trim())) {
return undefined;
}
const includeCentral = (0,_util_js__WEBPACK_IMPORTED_MODULE_6__/* .getBooleanInput */ .Vt)(_constants_js__WEBPACK_IMPORTED_MODULE_7__/* .INPUT_MVN_REPOSITORIES_INCLUDE_CENTRAL */ .H5, true);
return {
repositories: parseMavenRepositories(entries, includeCentral),
includeCentral,
prioritizeCentral: (0,_util_js__WEBPACK_IMPORTED_MODULE_6__/* .getBooleanInput */ .Vt)(_constants_js__WEBPACK_IMPORTED_MODULE_7__/* .INPUT_MVN_REPOSITORIES_PRIORITIZE_CENTRAL */ .OT, true)
};
}
// only exported for testing purposes
function parseMavenRepositories(entries, includeCentral) {
const repositories = [];
const repositoryIds = new Set();
entries.forEach((entry, index) => {
if (!entry.trim()) {
return;
}
const firstSeparator = entry.indexOf(':');
const lastSeparator = entry.lastIndexOf(':');
if (firstSeparator <= 0 || lastSeparator <= firstSeparator) {
throw new Error(`Invalid mvn-repositories entry at line ${index + 1}. Expected format: repository-id:repository-url:snapshots-enabled`);
}
const id = entry.slice(0, firstSeparator).trim();
const url = entry.slice(firstSeparator + 1, lastSeparator).trim();
const snapshotsValue = entry
.slice(lastSeparator + 1)
.trim()
.toLowerCase();
if (!id || !url || !snapshotsValue) {
throw new Error(`Invalid mvn-repositories entry at line ${index + 1}. repository-id, repository URL, and snapshots-enabled are required`);
}
if (snapshotsValue !== 'true' && snapshotsValue !== 'false') {
throw new Error(`Invalid snapshots-enabled value '${snapshotsValue}' in mvn-repositories entry at line ${index + 1}. Expected true or false`);
}
if (repositoryIds.has(id)) {
throw new Error(`Duplicate repository-id '${id}' in mvn-repositories input`);
}
if (includeCentral && id === _constants_js__WEBPACK_IMPORTED_MODULE_7__/* .MAVEN_CENTRAL_REPOSITORY_ID */ .xg) {
throw new Error(`Repository-id '${_constants_js__WEBPACK_IMPORTED_MODULE_7__/* .MAVEN_CENTRAL_REPOSITORY_ID */ .xg}' is reserved when ${_constants_js__WEBPACK_IMPORTED_MODULE_7__/* .INPUT_MVN_REPOSITORIES_INCLUDE_CENTRAL */ .H5} is enabled`);
}
repositoryIds.add(id);
repositories.push({
id,
url,
snapshotsEnabled: snapshotsValue === 'true'
});
});
return repositories;
}
async function createAuthenticationSettings(servers, settingsDirectory, overwriteSettings, gpgPassphraseEnvVar = undefined, repositorySettings = undefined) {
_actions_core__WEBPACK_IMPORTED_MODULE_1__/* .info */ .pq(`Creating ${_constants_js__WEBPACK_IMPORTED_MODULE_7__/* .MVN_SETTINGS_FILE */ .vO} with server-id: ${servers.map(server => server.id).join(', ')}`);
// 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 _actions_io__WEBPACK_IMPORTED_MODULE_2__/* .mkdirP */ .U$(settingsDirectory); await _actions_io__WEBPACK_IMPORTED_MODULE_2__/* .mkdirP */ .U$(settingsDirectory);
await write(settingsDirectory, generate(servers, gpgPassphraseEnvVar, repositorySettings), overwriteSettings); await write(settingsDirectory, generate(id, usernameEnvVar, passwordEnvVar, gpgPassphraseEnvVar), overwriteSettings);
} }
// only exported for testing purposes // only exported for testing purposes
function generate(servers, gpgPassphraseEnvVar, repositorySettings) { function generate(id, usernameEnvVar, passwordEnvVar, gpgPassphraseEnvVar) {
// The maven-gpg-plugin reads the passphrase from the environment variable // The maven-gpg-plugin reads the passphrase from the environment variable
// named by the `gpg.passphraseEnvName` property (default MAVEN_GPG_PASSPHRASE). // named by the `gpg.passphraseEnvName` property (default MAVEN_GPG_PASSPHRASE).
// Only configure it when the requested env var name differs from that default; // Only configure it when the requested env var name differs from that default;
@@ -184,54 +90,16 @@ function generate(servers, gpgPassphraseEnvVar, repositorySettings) {
' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"', ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"',
' xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">', ' xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">',
' <interactiveMode>false</interactiveMode>', ' <interactiveMode>false</interactiveMode>',
' <servers>' ' <servers>',
' <server>',
` <id>${(0,_xml_js__WEBPACK_IMPORTED_MODULE_8__/* .escapeXmlText */ .I)(id)}</id>`,
` <username>${(0,_xml_js__WEBPACK_IMPORTED_MODULE_8__/* .escapeXmlText */ .I)(`\${env.${usernameEnvVar}}`)}</username>`,
` <password>${(0,_xml_js__WEBPACK_IMPORTED_MODULE_8__/* .escapeXmlText */ .I)(`\${env.${passwordEnvVar}}`)}</password>`,
' </server>',
' </servers>'
]; ];
for (const server of servers) {
lines.push(' <server>', ` <id>${(0,_xml_js__WEBPACK_IMPORTED_MODULE_8__/* .escapeXmlText */ .I)(server.id)}</id>`, ` <username>${(0,_xml_js__WEBPACK_IMPORTED_MODULE_8__/* .escapeXmlText */ .I)(`\${env.${server.usernameEnvVar}}`)}</username>`, ` <password>${(0,_xml_js__WEBPACK_IMPORTED_MODULE_8__/* .escapeXmlText */ .I)(`\${env.${server.passwordEnvVar}}`)}</password>`, ' </server>');
}
lines.push(' </servers>');
if (repositorySettings || includeGpgPassphraseProfile) {
lines.push(' <profiles>');
if (repositorySettings) {
const centralRepository = {
id: _constants_js__WEBPACK_IMPORTED_MODULE_7__/* .MAVEN_CENTRAL_REPOSITORY_ID */ .xg,
url: _constants_js__WEBPACK_IMPORTED_MODULE_7__/* .MAVEN_CENTRAL_REPOSITORY_URL */ .jv,
snapshotsEnabled: false
};
const customCentralConfigured = repositorySettings.repositories.some(repository => repository.id === _constants_js__WEBPACK_IMPORTED_MODULE_7__/* .MAVEN_CENTRAL_REPOSITORY_ID */ .xg);
const repositories = repositorySettings.includeCentral
? repositorySettings.prioritizeCentral
? [centralRepository, ...repositorySettings.repositories]
: [...repositorySettings.repositories, centralRepository]
: customCentralConfigured
? repositorySettings.repositories
: [
...repositorySettings.repositories,
{ ...centralRepository, releasesEnabled: false }
];
lines.push(' <profile>', ` <id>${_constants_js__WEBPACK_IMPORTED_MODULE_7__/* .MAVEN_REPOSITORIES_PROFILE_ID */ .hq}</id>`, ' <repositories>');
for (const repository of repositories) {
lines.push(' <repository>', ` <id>${(0,_xml_js__WEBPACK_IMPORTED_MODULE_8__/* .escapeXmlText */ .I)(repository.id)}</id>`, ` <url>${(0,_xml_js__WEBPACK_IMPORTED_MODULE_8__/* .escapeXmlText */ .I)(repository.url)}</url>`, ...(repository.releasesEnabled === undefined
? []
: [
' <releases>',
` <enabled>${repository.releasesEnabled}</enabled>`,
' </releases>'
]), ' <snapshots>', ` <enabled>${repository.snapshotsEnabled}</enabled>`, ' </snapshots>', ' </repository>');
}
lines.push(' </repositories>', ' </profile>');
}
if (includeGpgPassphraseProfile) { if (includeGpgPassphraseProfile) {
lines.push(' <profile>', ` <id>${_constants_js__WEBPACK_IMPORTED_MODULE_7__/* .GPG_PASSPHRASE_PROFILE_ID */ .K$}</id>`, ' <properties>', ` <gpg.passphraseEnvName>${(0,_xml_js__WEBPACK_IMPORTED_MODULE_8__/* .escapeXmlText */ .I)(gpgPassphraseEnvVar)}</gpg.passphraseEnvName>`, ' </properties>', ' </profile>'); lines.push(' <profiles>', ' <profile>', ` <id>${_constants_js__WEBPACK_IMPORTED_MODULE_7__/* .GPG_PASSPHRASE_PROFILE_ID */ .K$}</id>`, ' <properties>', ` <gpg.passphraseEnvName>${(0,_xml_js__WEBPACK_IMPORTED_MODULE_8__/* .escapeXmlText */ .I)(gpgPassphraseEnvVar)}</gpg.passphraseEnvName>`, ' </properties>', ' </profile>', ' </profiles>', ' <activeProfiles>', ` <activeProfile>${_constants_js__WEBPACK_IMPORTED_MODULE_7__/* .GPG_PASSPHRASE_PROFILE_ID */ .K$}</activeProfile>`, ' </activeProfiles>');
}
lines.push(' </profiles>', ' <activeProfiles>');
if (repositorySettings) {
lines.push(` <activeProfile>${_constants_js__WEBPACK_IMPORTED_MODULE_7__/* .MAVEN_REPOSITORIES_PROFILE_ID */ .hq}</activeProfile>`);
}
if (includeGpgPassphraseProfile) {
lines.push(` <activeProfile>${_constants_js__WEBPACK_IMPORTED_MODULE_7__/* .GPG_PASSPHRASE_PROFILE_ID */ .K$}</activeProfile>`);
}
lines.push(' </activeProfiles>');
} }
lines.push('</settings>'); lines.push('</settings>');
return lines.join('\n'); return lines.join('\n');
+1 -38
View File
@@ -30772,20 +30772,16 @@ module.exports = {
/* harmony export */ E8: () => (/* binding */ INPUT_SET_DEFAULT), /* harmony export */ E8: () => (/* binding */ INPUT_SET_DEFAULT),
/* harmony export */ Fi: () => (/* binding */ STATE_GPG_HOME), /* harmony export */ Fi: () => (/* binding */ STATE_GPG_HOME),
/* harmony export */ GL: () => (/* binding */ INPUT_CACHE_JDK), /* harmony export */ GL: () => (/* binding */ INPUT_CACHE_JDK),
/* harmony export */ H5: () => (/* binding */ INPUT_MVN_REPOSITORIES_INCLUDE_CENTRAL),
/* harmony export */ I9: () => (/* binding */ INPUT_FORCE_DOWNLOAD), /* harmony export */ I9: () => (/* binding */ INPUT_FORCE_DOWNLOAD),
/* harmony export */ K$: () => (/* binding */ GPG_PASSPHRASE_PROFILE_ID), /* harmony export */ K$: () => (/* binding */ GPG_PASSPHRASE_PROFILE_ID),
/* harmony export */ LS: () => (/* binding */ INPUT_ARCHITECTURE), /* harmony export */ LS: () => (/* binding */ INPUT_ARCHITECTURE),
/* harmony export */ MM: () => (/* binding */ INPUT_MVN_SERVER_CREDENTIALS),
/* harmony export */ OD: () => (/* binding */ INPUT_DEFAULT_GPG_PRIVATE_KEY), /* harmony export */ OD: () => (/* binding */ INPUT_DEFAULT_GPG_PRIVATE_KEY),
/* harmony export */ OT: () => (/* binding */ INPUT_MVN_REPOSITORIES_PRIORITIZE_CENTRAL),
/* harmony export */ PG: () => (/* binding */ MACOS_JAVA_CONTENT_POSTFIX), /* harmony export */ PG: () => (/* binding */ MACOS_JAVA_CONTENT_POSTFIX),
/* harmony export */ QM: () => (/* binding */ INPUT_JAVA_VERSION), /* harmony export */ QM: () => (/* binding */ INPUT_JAVA_VERSION),
/* harmony export */ RX: () => (/* binding */ INPUT_DEFAULT_GPG_PASSPHRASE), /* harmony export */ RX: () => (/* binding */ INPUT_DEFAULT_GPG_PASSPHRASE),
/* harmony export */ TS: () => (/* binding */ INPUT_OVERWRITE_SETTINGS), /* harmony export */ TS: () => (/* binding */ INPUT_OVERWRITE_SETTINGS),
/* harmony export */ TY: () => (/* binding */ INPUT_GPG_PASSPHRASE_DEPRECATED), /* harmony export */ TY: () => (/* binding */ INPUT_GPG_PASSPHRASE_DEPRECATED),
/* harmony export */ Vt: () => (/* binding */ INPUT_SERVER_PASSWORD_DEPRECATED), /* harmony export */ Vt: () => (/* binding */ INPUT_SERVER_PASSWORD_DEPRECATED),
/* harmony export */ W2: () => (/* binding */ INPUT_MVN_REPOSITORIES),
/* harmony export */ Wj: () => (/* binding */ INPUT_DEFAULT_SERVER_USERNAME), /* harmony export */ Wj: () => (/* binding */ INPUT_DEFAULT_SERVER_USERNAME),
/* harmony export */ Wt: () => (/* binding */ INPUT_PROBLEM_MATCHER), /* harmony export */ Wt: () => (/* binding */ INPUT_PROBLEM_MATCHER),
/* harmony export */ Xh: () => (/* binding */ INPUT_SETTINGS_PATH), /* harmony export */ Xh: () => (/* binding */ INPUT_SETTINGS_PATH),
@@ -30796,9 +30792,7 @@ module.exports = {
/* harmony export */ fd: () => (/* binding */ INPUT_SERVER_ID), /* harmony export */ fd: () => (/* binding */ INPUT_SERVER_ID),
/* harmony export */ g_: () => (/* binding */ INPUT_DISTRIBUTION), /* harmony export */ g_: () => (/* binding */ INPUT_DISTRIBUTION),
/* harmony export */ gk: () => (/* binding */ INPUT_CACHE), /* harmony export */ gk: () => (/* binding */ INPUT_CACHE),
/* harmony export */ hq: () => (/* binding */ MAVEN_REPOSITORIES_PROFILE_ID),
/* harmony export */ iT: () => (/* binding */ M2_DIR), /* harmony export */ iT: () => (/* binding */ M2_DIR),
/* harmony export */ jv: () => (/* binding */ MAVEN_CENTRAL_REPOSITORY_URL),
/* harmony export */ kM: () => (/* binding */ INPUT_JDK_FILE), /* harmony export */ kM: () => (/* binding */ INPUT_JDK_FILE),
/* harmony export */ kN: () => (/* binding */ MAVEN_NO_TRANSFER_PROGRESS_LONG_FLAG), /* harmony export */ kN: () => (/* binding */ MAVEN_NO_TRANSFER_PROGRESS_LONG_FLAG),
/* harmony export */ ko: () => (/* binding */ MAVEN_GPG_PASSPHRASE_DEFAULT_ENV), /* harmony export */ ko: () => (/* binding */ MAVEN_GPG_PASSPHRASE_DEFAULT_ENV),
@@ -30818,7 +30812,6 @@ module.exports = {
/* harmony export */ wX: () => (/* binding */ INPUT_SHOW_DOWNLOAD_PROGRESS), /* harmony export */ wX: () => (/* binding */ INPUT_SHOW_DOWNLOAD_PROGRESS),
/* harmony export */ wc: () => (/* binding */ INPUT_JDK_FILE_DEPRECATED), /* harmony export */ wc: () => (/* binding */ INPUT_JDK_FILE_DEPRECATED),
/* harmony export */ wz: () => (/* binding */ INPUT_GPG_PRIVATE_KEY), /* harmony export */ wz: () => (/* binding */ INPUT_GPG_PRIVATE_KEY),
/* harmony export */ xg: () => (/* binding */ MAVEN_CENTRAL_REPOSITORY_ID),
/* harmony export */ xp: () => (/* binding */ INPUT_DEFAULT_SERVER_PASSWORD) /* harmony export */ xp: () => (/* binding */ INPUT_DEFAULT_SERVER_PASSWORD)
/* harmony export */ }); /* harmony export */ });
/* unused harmony exports INPUT_CACHE_READ_ONLY, INPUT_JOB_STATUS */ /* unused harmony exports INPUT_CACHE_READ_ONLY, INPUT_JOB_STATUS */
@@ -30836,10 +30829,6 @@ const INPUT_SET_DEFAULT = 'set-default';
const INPUT_PROBLEM_MATCHER = 'problem-matcher'; const INPUT_PROBLEM_MATCHER = 'problem-matcher';
const INPUT_VERIFY_SIGNATURE = 'verify-signature'; const INPUT_VERIFY_SIGNATURE = 'verify-signature';
const INPUT_VERIFY_SIGNATURE_PUBLIC_KEY = 'verify-signature-public-key'; const INPUT_VERIFY_SIGNATURE_PUBLIC_KEY = 'verify-signature-public-key';
const INPUT_MVN_SERVER_CREDENTIALS = 'mvn-server-credentials';
const INPUT_MVN_REPOSITORIES = 'mvn-repositories';
const INPUT_MVN_REPOSITORIES_INCLUDE_CENTRAL = 'mvn-repositories-include-central';
const INPUT_MVN_REPOSITORIES_PRIORITIZE_CENTRAL = 'mvn-repositories-prioritize-central';
const INPUT_SERVER_ID = 'server-id'; const INPUT_SERVER_ID = 'server-id';
const INPUT_SERVER_USERNAME_ENV_VAR = 'server-username-env-var'; const INPUT_SERVER_USERNAME_ENV_VAR = 'server-username-env-var';
const INPUT_SERVER_PASSWORD_ENV_VAR = 'server-password-env-var'; const INPUT_SERVER_PASSWORD_ENV_VAR = 'server-password-env-var';
@@ -30860,9 +30849,6 @@ const INPUT_DEFAULT_GPG_PASSPHRASE = 'GPG_PASSPHRASE';
const MAVEN_GPG_PASSPHRASE_DEFAULT_ENV = 'MAVEN_GPG_PASSPHRASE'; const MAVEN_GPG_PASSPHRASE_DEFAULT_ENV = 'MAVEN_GPG_PASSPHRASE';
// Id of the settings.xml profile used to set `gpg.passphraseEnvName`. // Id of the settings.xml profile used to set `gpg.passphraseEnvName`.
const GPG_PASSPHRASE_PROFILE_ID = 'setup-java-gpg'; const GPG_PASSPHRASE_PROFILE_ID = 'setup-java-gpg';
const MAVEN_REPOSITORIES_PROFILE_ID = 'setup-java-repositories';
const MAVEN_CENTRAL_REPOSITORY_ID = 'central';
const MAVEN_CENTRAL_REPOSITORY_URL = 'https://repo.maven.apache.org/maven2';
const INPUT_CACHE = 'cache'; const INPUT_CACHE = 'cache';
const INPUT_CACHE_JDK = 'cache-jdk'; const INPUT_CACHE_JDK = 'cache-jdk';
const INPUT_CACHE_DEPENDENCY_PATH = 'cache-dependency-path'; const INPUT_CACHE_DEPENDENCY_PATH = 'cache-dependency-path';
@@ -30915,7 +30901,6 @@ var JavaDistribution;
JavaDistribution["JetBrains"] = "jetbrains"; JavaDistribution["JetBrains"] = "jetbrains";
JavaDistribution["Kona"] = "kona"; JavaDistribution["Kona"] = "kona";
JavaDistribution["OracleOpenJdk"] = "oracle-openjdk"; JavaDistribution["OracleOpenJdk"] = "oracle-openjdk";
JavaDistribution["RedHat"] = "redhat";
})(JavaDistribution || (JavaDistribution = {})); })(JavaDistribution || (JavaDistribution = {}));
const JAVA_PACKAGE_CAPABILITIES = { const JAVA_PACKAGE_CAPABILITIES = {
[JavaDistribution.Temurin]: ['jdk', 'jre', 'jdk+jmods'], [JavaDistribution.Temurin]: ['jdk', 'jre', 'jdk+jmods'],
@@ -30947,8 +30932,7 @@ const JAVA_PACKAGE_CAPABILITIES = {
'jre+ft' 'jre+ft'
], ],
[JavaDistribution.Kona]: ['jdk'], [JavaDistribution.Kona]: ['jdk'],
[JavaDistribution.OracleOpenJdk]: ['jdk'], [JavaDistribution.OracleOpenJdk]: ['jdk']
[JavaDistribution.RedHat]: ['jdk', 'jre']
}; };
function validateJavaPackage(distributionName, packageType, version) { function validateJavaPackage(distributionName, packageType, version) {
if (!isJavaDistribution(distributionName)) { if (!isJavaDistribution(distributionName)) {
@@ -31133,19 +31117,6 @@ const JAVA_PLATFORM_CAPABILITIES = {
macos: X64_ARM64, macos: X64_ARM64,
windows: ['x64'] windows: ['x64']
} }
},
[_package_types_js__WEBPACK_IMPORTED_MODULE_2__/* .JavaDistribution */ .zS.RedHat]: {
platforms: {
linux: [
'x64',
{ architecture: 'aarch64', versionRange: '<12' },
{ architecture: 'ppc64le', versionRange: '<12' }
],
windows: [
{ architecture: 'x64', versionRange: '<22' },
{ architecture: 'x86', versionRange: '<11' }
]
}
} }
}; };
const ARCHITECTURE_ALIASES = { const ARCHITECTURE_ALIASES = {
@@ -31361,8 +31332,6 @@ async function extractJdkFile(toolPath, extension) {
if (!extension) { if (!extension) {
extension = toolPath.endsWith('.tar.gz') extension = toolPath.endsWith('.tar.gz')
? 'tar.gz' ? 'tar.gz'
: toolPath.endsWith('.tar.xz')
? 'tar.xz'
: path__WEBPACK_IMPORTED_MODULE_1___default().extname(toolPath); : path__WEBPACK_IMPORTED_MODULE_1___default().extname(toolPath);
if (extension.startsWith('.')) { if (extension.startsWith('.')) {
extension = extension.substring(1); extension = extension.substring(1);
@@ -31371,8 +31340,6 @@ async function extractJdkFile(toolPath, extension) {
switch (extension) { switch (extension) {
case 'tar.gz': case 'tar.gz':
return await extractTarGz(toolPath); return await extractTarGz(toolPath);
case 'tar.xz':
return await _actions_tool_cache__WEBPACK_IMPORTED_MODULE_5__/* .extractTar */ .nN(toolPath, undefined, 'xJ');
case 'tar': case 'tar':
return await _actions_tool_cache__WEBPACK_IMPORTED_MODULE_5__/* .extractTar */ .nN(toolPath); return await _actions_tool_cache__WEBPACK_IMPORTED_MODULE_5__/* .extractTar */ .nN(toolPath);
case 'zip': case 'zip':
@@ -36328,10 +36295,6 @@ async function getJavaDistribution(distributionName, installerOptions, jdkFile)
const { OpenJdkDistribution } = await Promise.all(/* import() */[__nccwpck_require__.e(242), __nccwpck_require__.e(735)]).then(__nccwpck_require__.bind(__nccwpck_require__, 3735)); const { OpenJdkDistribution } = await Promise.all(/* import() */[__nccwpck_require__.e(242), __nccwpck_require__.e(735)]).then(__nccwpck_require__.bind(__nccwpck_require__, 3735));
return new OpenJdkDistribution(normalizedInstallerOptions); return new OpenJdkDistribution(normalizedInstallerOptions);
} }
case package_types/* JavaDistribution */.zS.RedHat: {
const { RedHatDistribution } = await Promise.all(/* import() */[__nccwpck_require__.e(242), __nccwpck_require__.e(228)]).then(__nccwpck_require__.bind(__nccwpck_require__, 8228));
return new RedHatDistribution(normalizedInstallerOptions);
}
default: default:
return null; return null;
} }
-135
View File
@@ -27,7 +27,6 @@
- [Testing against different Java distributions](#Testing-against-different-Java-distributions) - [Testing against different Java distributions](#Testing-against-different-Java-distributions)
- [Testing against different platforms](#Testing-against-different-platforms) - [Testing against different platforms](#Testing-against-different-platforms)
- [Publishing using Apache Maven](#Publishing-using-Apache-Maven) - [Publishing using Apache Maven](#Publishing-using-Apache-Maven)
- [Publishing to multiple Maven servers](#publishing-to-multiple-maven-servers)
- [Apache Maven with a settings path](#apache-maven-with-a-settings-path) - [Apache Maven with a settings path](#apache-maven-with-a-settings-path)
- [Maven transfer progress (download logs)](#Maven-transfer-progress-download-logs) - [Maven transfer progress (download logs)](#Maven-transfer-progress-download-logs)
- [Java problem matcher (compiler annotations)](#java-problem-matcher-compiler-annotations) - [Java problem matcher (compiler annotations)](#java-problem-matcher-compiler-annotations)
@@ -77,19 +76,6 @@ steps:
- run: java --version - run: java --version
``` ```
### Red Hat Build of OpenJDK
```yaml
steps:
- uses: actions/checkout@v7
- uses: actions/setup-java@v6
with:
distribution: 'redhat'
java-version: '21'
java-package: jdk # optional (jdk or jre) - defaults to jdk
- run: java --version
```
### Liberica ### Liberica
```yaml ```yaml
@@ -342,7 +328,6 @@ The package types have these meanings:
| `corretto` | `jdk`, `jre` | Accepts major versions only. JDK availability follows Amazon's platform catalog. For the operating systems directly selected by `setup-java`, JRE downloads are limited to Java 8 on Windows; Linux and macOS use `jdk`. | | `corretto` | `jdk`, `jre` | Accepts major versions only. JDK availability follows Amazon's platform catalog. For the operating systems directly selected by `setup-java`, JRE downloads are limited to Java 8 on Windows; Linux and macOS use `jdk`. |
| `oracle` | `jdk` | Stable Oracle JDK 17 and later only. | | `oracle` | `jdk` | Stable Oracle JDK 17 and later only. |
| `oracle-openjdk` | `jdk` | Installs the GA or early-access JDK builds currently listed or archived on `jdk.java.net`; use a `-ea` version such as `27-ea` for early access. | | `oracle-openjdk` | `jdk` | Installs the GA or early-access JDK builds currently listed or archived on `jdk.java.net`; use a `-ea` version such as `27-ea` for early access. |
| `redhat` | `jdk`, `jre` | Stable builds only. Version availability follows the Foojay Disco catalog for Red Hat Build of OpenJDK and can lag Red Hat's downloads page. |
| `dragonwell` | `jdk` | Stable builds only. The current vendor catalog provides Java 8, 11, 17, 21, and 25. | | `dragonwell` | `jdk` | Stable builds only. The current vendor catalog provides Java 8, 11, 17, 21, and 25. |
| `sapmachine` | `jdk`, `jre` | Follows the SapMachine catalog. Both editions are represented from Java 10 onward, but individual versions and platforms can differ. | | `sapmachine` | `jdk`, `jre` | Follows the SapMachine catalog. Both editions are represented from Java 10 onward, but individual versions and platforms can differ. |
| `graalvm` | `jdk` | Stable Oracle GraalVM for JDK 17 and later only. | | `graalvm` | `jdk` | Stable Oracle GraalVM for JDK 17 and later only. |
@@ -658,7 +643,6 @@ absent from a vendor catalog.
| `corretto` | `x64`, `x86`, `armv7`, `aarch64` | `x64`, `aarch64` | `x64`, `x86` | `x86` is limited to Java 11 or earlier; Linux `armv7` is available for Java 11. | | `corretto` | `x64`, `x86`, `armv7`, `aarch64` | `x64`, `aarch64` | `x64`, `x86` | `x86` is limited to Java 11 or earlier; Linux `armv7` is available for Java 11. |
| `oracle` | `x64`, `aarch64` | `x64`, `aarch64` | `x64` | | | `oracle` | `x64`, `aarch64` | `x64`, `aarch64` | `x64` | |
| `oracle-openjdk` | `x64`, `aarch64` | `x64`, `aarch64` | `x64` | | | `oracle-openjdk` | `x64`, `aarch64` | `x64`, `aarch64` | `x64` | |
| `redhat` | `x64`, `aarch64`, `ppc64le` | — | `x64`, `x86` | Linux requires glibc; Alpine is unsupported. Linux `aarch64` and `ppc64le` are limited to Java 11 or earlier. Windows `x64` is limited to Java 21 or earlier and `x86` to Java 10 or earlier. |
| `dragonwell` | `x64`, `aarch64` | — | `x64` | | | `dragonwell` | `x64`, `aarch64` | — | `x64` | |
| `sapmachine` | `x64`, `aarch64`, `ppc64le` | `x64`, `aarch64` | `x64`, `aarch64` | | | `sapmachine` | `x64`, `aarch64`, `ppc64le` | `x64`, `aarch64` | `x64`, `aarch64` | |
| `graalvm`, `graalvm-community` | `x64`, `aarch64` | `x64`, `aarch64` | `x64` | | | `graalvm`, `graalvm-community` | `x64`, `aarch64` | `x64`, `aarch64` | `x64` | |
@@ -879,125 +863,6 @@ The two `settings.xml` files created from the above example look like the follow
If you don't want to overwrite the `settings.xml` file, you can set `overwrite-settings: false` If you don't want to overwrite the `settings.xml` file, you can set `overwrite-settings: false`
### Publishing to multiple Maven servers
Use `mvn-server-credentials` to add more than one credential entry to the generated `settings.xml`. Each line has the format `server-id:USERNAME_ENV:PASSWORD_ENV`. The username and password fields are environment variable names, not credential values.
When this input is set, it replaces the single server configured by `server-id`, `server-username-env-var`, and `server-password-env-var`.
```yaml
steps:
- uses: actions/checkout@v7
- name: Set up release and snapshot repositories
uses: actions/setup-java@v6
with:
distribution: 'temurin'
java-version: '21'
mvn-server-credentials: |
releases:RELEASES_USERNAME:RELEASES_PASSWORD
snapshots:SNAPSHOTS_USERNAME:SNAPSHOTS_PASSWORD
- name: Publish with Maven
run: mvn deploy
env:
RELEASES_USERNAME: ${{ secrets.RELEASES_USERNAME }}
RELEASES_PASSWORD: ${{ secrets.RELEASES_PASSWORD }}
SNAPSHOTS_USERNAME: ${{ secrets.SNAPSHOTS_USERNAME }}
SNAPSHOTS_PASSWORD: ${{ secrets.SNAPSHOTS_PASSWORD }}
```
This configuration produces the following server entries:
```xml
<servers>
<server>
<id>releases</id>
<username>${env.RELEASES_USERNAME}</username>
<password>${env.RELEASES_PASSWORD}</password>
</server>
<server>
<id>snapshots</id>
<username>${env.SNAPSHOTS_USERNAME}</username>
<password>${env.SNAPSHOTS_PASSWORD}</password>
</server>
</servers>
```
### Resolving Maven dependencies from custom repositories
Use `mvn-repositories` when Maven must download dependencies from repositories
outside Maven Central. Each line has the format
`repository-id:repository-url:snapshots-enabled`. The parser uses the first and
last colons as separators, so repository URLs can contain a scheme or port.
The repository ID can match a `mvn-server-credentials` server ID to authenticate
requests to a private repository:
```yaml
steps:
- uses: actions/checkout@v7
- name: Set up Java and private Maven repositories
uses: actions/setup-java@v6
with:
distribution: 'temurin'
java-version: '21'
mvn-server-credentials: |
private:PRIVATE_REPOSITORY_USERNAME:PRIVATE_REPOSITORY_TOKEN
mvn-repositories: |
private:https://maven.example.com:8443/releases:false
snapshots:https://maven.example.com:8443/snapshots:true
mvn-repositories-include-central: true
mvn-repositories-prioritize-central: true
- run: mvn --batch-mode verify
env:
PRIVATE_REPOSITORY_USERNAME: ${{ secrets.PRIVATE_REPOSITORY_USERNAME }}
PRIVATE_REPOSITORY_TOKEN: ${{ secrets.PRIVATE_REPOSITORY_TOKEN }}
```
This configuration adds the following active profile to `settings.xml`:
```xml
<profiles>
<profile>
<id>setup-java-repositories</id>
<repositories>
<repository>
<id>central</id>
<url>https://repo.maven.apache.org/maven2</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>private</id>
<url>https://maven.example.com:8443/releases</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>snapshots</id>
<url>https://maven.example.com:8443/snapshots</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>setup-java-repositories</activeProfile>
</activeProfiles>
```
Maven Central is included first by default. Set
`mvn-repositories-prioritize-central: false` to place custom repositories
first, or set `mvn-repositories-include-central: false` to disable Central. The
generated profile overrides the Central repository inherited from Maven's Super
POM with releases and snapshots disabled. When automatic Central inclusion is
off, the ID `central` may instead be declared explicitly in `mvn-repositories`
to replace it with a user-specified repository; otherwise that ID is reserved
to prevent duplicate entries.
### GPG ### GPG
The example above uses the [Maven GPG Plugin](https://maven.apache.org/plugins/maven-gpg-plugin/)'s Bouncy Castle signer (`-Dgpg.signer=bc`, available since `maven-gpg-plugin` 3.2.0). It is a pure-Java signer that reads the key directly from the `MAVEN_GPG_KEY` environment variable, so it does **not** require the `gpg` executable, importing the key into a GPG keychain, or the `--pinentry-mode loopback` workaround in your `pom.xml`. The key must be an ASCII-armored secret key (transferable secret key format). The example above uses the [Maven GPG Plugin](https://maven.apache.org/plugins/maven-gpg-plugin/)'s Bouncy Castle signer (`-Dgpg.signer=bc`, available since `maven-gpg-plugin` 3.2.0). It is a pure-Java signer that reads the key directly from the `MAVEN_GPG_KEY` environment variable, so it does **not** require the `gpg` executable, importing the key into a GPG keychain, or the `--pinentry-mode loopback` workaround in your `pom.xml`. The key must be an ASCII-armored secret key (transferable secret key format).
@@ -1,4 +1,4 @@
# Contributing # Contributors
Thank you for contributing! Thank you for contributing!
+67 -67
View File
@@ -23,18 +23,18 @@
"@eslint/js": "^10.0.1", "@eslint/js": "^10.0.1",
"@jest/globals": "^30.4.1", "@jest/globals": "^30.4.1",
"@types/node": "^26.1.1", "@types/node": "^26.1.1",
"@types/semver": "^7.8.0", "@types/semver": "^7.7.0",
"@typescript-eslint/eslint-plugin": "^8.67.0", "@typescript-eslint/eslint-plugin": "^8.64.0",
"@typescript-eslint/parser": "^8.65.0", "@typescript-eslint/parser": "^8.65.0",
"@vercel/ncc": "^0.44.0", "@vercel/ncc": "^0.44.0",
"eslint": "^10.7.0", "eslint": "^10.7.0",
"eslint-config-prettier": "^10.1.8", "eslint-config-prettier": "^10.1.8",
"eslint-plugin-jest": "^29.15.4", "eslint-plugin-jest": "^29.15.4",
"eslint-plugin-n": "^18.2.2", "eslint-plugin-n": "^18.2.2",
"globals": "^17.9.0", "globals": "^17.7.0",
"husky": "^9.1.7", "husky": "^9.1.7",
"jest": "^30.4.2", "jest": "^30.4.2",
"lint-staged": "^17.3.0", "lint-staged": "^17.2.0",
"prettier": "^3.9.5", "prettier": "^3.9.5",
"ts-jest": "^29.4.11", "ts-jest": "^29.4.11",
"typescript": "^6.0.3" "typescript": "^6.0.3"
@@ -1736,9 +1736,9 @@
} }
}, },
"node_modules/@types/semver": { "node_modules/@types/semver": {
"version": "7.8.0", "version": "7.7.1",
"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.8.0.tgz", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz",
"integrity": "sha512-1mAINjtQCXXeLkJ9ehXkwOcBpqtLxiVtKhpUf83DdRNdQKV0iXZpaHYqRr7nj+wvxuJzoAmAwXI+sCNMv1CzLQ==", "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
@@ -1767,17 +1767,17 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@typescript-eslint/eslint-plugin": { "node_modules/@typescript-eslint/eslint-plugin": {
"version": "8.67.0", "version": "8.65.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.67.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.65.0.tgz",
"integrity": "sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ==", "integrity": "sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@eslint-community/regexpp": "^4.12.2", "@eslint-community/regexpp": "^4.12.2",
"@typescript-eslint/scope-manager": "8.67.0", "@typescript-eslint/scope-manager": "8.65.0",
"@typescript-eslint/type-utils": "8.67.0", "@typescript-eslint/type-utils": "8.65.0",
"@typescript-eslint/utils": "8.67.0", "@typescript-eslint/utils": "8.65.0",
"@typescript-eslint/visitor-keys": "8.67.0", "@typescript-eslint/visitor-keys": "8.65.0",
"ignore": "^7.0.5", "ignore": "^7.0.5",
"natural-compare": "^1.4.0", "natural-compare": "^1.4.0",
"ts-api-utils": "^2.5.0" "ts-api-utils": "^2.5.0"
@@ -1790,22 +1790,22 @@
"url": "https://opencollective.com/typescript-eslint" "url": "https://opencollective.com/typescript-eslint"
}, },
"peerDependencies": { "peerDependencies": {
"@typescript-eslint/parser": "^8.67.0", "@typescript-eslint/parser": "^8.65.0",
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
"typescript": ">=4.8.4 <6.1.0" "typescript": ">=4.8.4 <6.1.0"
} }
}, },
"node_modules/@typescript-eslint/parser": { "node_modules/@typescript-eslint/parser": {
"version": "8.67.0", "version": "8.65.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.67.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.65.0.tgz",
"integrity": "sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w==", "integrity": "sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/scope-manager": "8.67.0", "@typescript-eslint/scope-manager": "8.65.0",
"@typescript-eslint/types": "8.67.0", "@typescript-eslint/types": "8.65.0",
"@typescript-eslint/typescript-estree": "8.67.0", "@typescript-eslint/typescript-estree": "8.65.0",
"@typescript-eslint/visitor-keys": "8.67.0", "@typescript-eslint/visitor-keys": "8.65.0",
"debug": "^4.4.3" "debug": "^4.4.3"
}, },
"engines": { "engines": {
@@ -1821,14 +1821,14 @@
} }
}, },
"node_modules/@typescript-eslint/project-service": { "node_modules/@typescript-eslint/project-service": {
"version": "8.67.0", "version": "8.65.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.67.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.65.0.tgz",
"integrity": "sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw==", "integrity": "sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/tsconfig-utils": "^8.67.0", "@typescript-eslint/tsconfig-utils": "^8.65.0",
"@typescript-eslint/types": "^8.67.0", "@typescript-eslint/types": "^8.65.0",
"debug": "^4.4.3" "debug": "^4.4.3"
}, },
"engines": { "engines": {
@@ -1843,14 +1843,14 @@
} }
}, },
"node_modules/@typescript-eslint/scope-manager": { "node_modules/@typescript-eslint/scope-manager": {
"version": "8.67.0", "version": "8.65.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.67.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.65.0.tgz",
"integrity": "sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg==", "integrity": "sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.67.0", "@typescript-eslint/types": "8.65.0",
"@typescript-eslint/visitor-keys": "8.67.0" "@typescript-eslint/visitor-keys": "8.65.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1861,9 +1861,9 @@
} }
}, },
"node_modules/@typescript-eslint/tsconfig-utils": { "node_modules/@typescript-eslint/tsconfig-utils": {
"version": "8.67.0", "version": "8.65.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.67.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.65.0.tgz",
"integrity": "sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg==", "integrity": "sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@@ -1878,15 +1878,15 @@
} }
}, },
"node_modules/@typescript-eslint/type-utils": { "node_modules/@typescript-eslint/type-utils": {
"version": "8.67.0", "version": "8.65.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.67.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.65.0.tgz",
"integrity": "sha512-aVWDXbRmdXO9siTfX4ditQI1T9+zVcNazT48EJCD0v40/9RIFoUgZ05CmGEq9H2gixRpjUn/iplwvlcvutJW/Q==", "integrity": "sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.67.0", "@typescript-eslint/types": "8.65.0",
"@typescript-eslint/typescript-estree": "8.67.0", "@typescript-eslint/typescript-estree": "8.65.0",
"@typescript-eslint/utils": "8.67.0", "@typescript-eslint/utils": "8.65.0",
"debug": "^4.4.3", "debug": "^4.4.3",
"ts-api-utils": "^2.5.0" "ts-api-utils": "^2.5.0"
}, },
@@ -1903,9 +1903,9 @@
} }
}, },
"node_modules/@typescript-eslint/types": { "node_modules/@typescript-eslint/types": {
"version": "8.67.0", "version": "8.65.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.67.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.65.0.tgz",
"integrity": "sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww==", "integrity": "sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@@ -1917,16 +1917,16 @@
} }
}, },
"node_modules/@typescript-eslint/typescript-estree": { "node_modules/@typescript-eslint/typescript-estree": {
"version": "8.67.0", "version": "8.65.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.67.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.65.0.tgz",
"integrity": "sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw==", "integrity": "sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/project-service": "8.67.0", "@typescript-eslint/project-service": "8.65.0",
"@typescript-eslint/tsconfig-utils": "8.67.0", "@typescript-eslint/tsconfig-utils": "8.65.0",
"@typescript-eslint/types": "8.67.0", "@typescript-eslint/types": "8.65.0",
"@typescript-eslint/visitor-keys": "8.67.0", "@typescript-eslint/visitor-keys": "8.65.0",
"debug": "^4.4.3", "debug": "^4.4.3",
"minimatch": "^10.2.2", "minimatch": "^10.2.2",
"semver": "^7.7.3", "semver": "^7.7.3",
@@ -1945,16 +1945,16 @@
} }
}, },
"node_modules/@typescript-eslint/utils": { "node_modules/@typescript-eslint/utils": {
"version": "8.67.0", "version": "8.65.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.67.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.65.0.tgz",
"integrity": "sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A==", "integrity": "sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.9.1", "@eslint-community/eslint-utils": "^4.9.1",
"@typescript-eslint/scope-manager": "8.67.0", "@typescript-eslint/scope-manager": "8.65.0",
"@typescript-eslint/types": "8.67.0", "@typescript-eslint/types": "8.65.0",
"@typescript-eslint/typescript-estree": "8.67.0" "@typescript-eslint/typescript-estree": "8.65.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1969,13 +1969,13 @@
} }
}, },
"node_modules/@typescript-eslint/visitor-keys": { "node_modules/@typescript-eslint/visitor-keys": {
"version": "8.67.0", "version": "8.65.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.67.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.65.0.tgz",
"integrity": "sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA==", "integrity": "sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.67.0", "@typescript-eslint/types": "8.65.0",
"eslint-visitor-keys": "^5.0.0" "eslint-visitor-keys": "^5.0.0"
}, },
"engines": { "engines": {
@@ -3691,9 +3691,9 @@
} }
}, },
"node_modules/globals": { "node_modules/globals": {
"version": "17.9.0", "version": "17.8.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-17.9.0.tgz", "resolved": "https://registry.npmjs.org/globals/-/globals-17.8.0.tgz",
"integrity": "sha512-m/MvAW61QVU5VDNF1Vj8axt016h8w7L5TU1e9zlab7XIttAT2YAlCwl75K1fOqvMM9apmD7lbCIRhpfkhmxhCg==", "integrity": "sha512-Zz/LMDZScFmkakeL2cTHzf+PbWKdpU3uclqkZT7TjDG58j5WPt0PpA+n9uPI24fZtlw07q0OtEi84K+umsRzqQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@@ -4714,9 +4714,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/lint-staged": { "node_modules/lint-staged": {
"version": "17.3.0", "version": "17.2.0",
"resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-17.3.0.tgz", "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-17.2.0.tgz",
"integrity": "sha512-woZS3vNe3UKqBaLPvbLOtKRY4tLANpWQhom12MGWqC8Mh1lCOO+WgSwmX2amjJAqTY9BkXYW87fCUH5H9Ph6xw==", "integrity": "sha512-FchGnFe4i4B1C/a35SPU9bNGPEHSC1+1iV0plLjzBmKVe9klZrlRfSgK6Cw4VeHyqOXbJUXP0vON61uRftNQ0A==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
+4 -4
View File
@@ -56,18 +56,18 @@
"@eslint/js": "^10.0.1", "@eslint/js": "^10.0.1",
"@jest/globals": "^30.4.1", "@jest/globals": "^30.4.1",
"@types/node": "^26.1.1", "@types/node": "^26.1.1",
"@types/semver": "^7.8.0", "@types/semver": "^7.7.0",
"@typescript-eslint/eslint-plugin": "^8.67.0", "@typescript-eslint/eslint-plugin": "^8.64.0",
"@typescript-eslint/parser": "^8.65.0", "@typescript-eslint/parser": "^8.65.0",
"@vercel/ncc": "^0.44.0", "@vercel/ncc": "^0.44.0",
"eslint": "^10.7.0", "eslint": "^10.7.0",
"eslint-config-prettier": "^10.1.8", "eslint-config-prettier": "^10.1.8",
"eslint-plugin-jest": "^29.15.4", "eslint-plugin-jest": "^29.15.4",
"eslint-plugin-n": "^18.2.2", "eslint-plugin-n": "^18.2.2",
"globals": "^17.9.0", "globals": "^17.7.0",
"husky": "^9.1.7", "husky": "^9.1.7",
"jest": "^30.4.2", "jest": "^30.4.2",
"lint-staged": "^17.3.0", "lint-staged": "^17.2.0",
"prettier": "^3.9.5", "prettier": "^3.9.5",
"ts-jest": "^29.4.11", "ts-jest": "^29.4.11",
"typescript": "^6.0.3" "typescript": "^6.0.3"
+37 -254
View File
@@ -9,28 +9,18 @@ import * as gpg from './gpg.js';
import {getBooleanInput} from './util.js'; import {getBooleanInput} from './util.js';
import {escapeXmlText} from './xml.js'; import {escapeXmlText} from './xml.js';
export interface MavenServerCredentials {
id: string;
usernameEnvVar: string;
passwordEnvVar: string;
}
export interface MavenRepository {
id: string;
url: string;
snapshotsEnabled: boolean;
releasesEnabled?: boolean;
}
export interface MavenRepositorySettings {
repositories: MavenRepository[];
includeCentral: boolean;
prioritizeCentral: boolean;
}
export async function configureAuthentication() { export async function configureAuthentication() {
const servers = getMavenServerSettings(); const id = core.getInput(constants.INPUT_SERVER_ID);
const repositorySettings = getMavenRepositorySettings(); const usernameEnvVar = getInputWithDeprecatedAlias(
constants.INPUT_SERVER_USERNAME_ENV_VAR,
constants.INPUT_SERVER_USERNAME_DEPRECATED,
constants.INPUT_DEFAULT_SERVER_USERNAME
);
const passwordEnvVar = getInputWithDeprecatedAlias(
constants.INPUT_SERVER_PASSWORD_ENV_VAR,
constants.INPUT_SERVER_PASSWORD_DEPRECATED,
constants.INPUT_DEFAULT_SERVER_PASSWORD
);
const settingsDirectory = const settingsDirectory =
core.getInput(constants.INPUT_SETTINGS_PATH) || core.getInput(constants.INPUT_SETTINGS_PATH) ||
path.join(os.homedir(), constants.M2_DIR); path.join(os.homedir(), constants.M2_DIR);
@@ -52,11 +42,12 @@ export async function configureAuthentication() {
} }
await createAuthenticationSettings( await createAuthenticationSettings(
servers, id,
usernameEnvVar,
passwordEnvVar,
settingsDirectory, settingsDirectory,
overwriteSettings, overwriteSettings,
gpgPassphraseEnvVar, gpgPassphraseEnvVar
repositorySettings
); );
if (gpgPrivateKey) { if (gpgPrivateKey) {
@@ -89,179 +80,31 @@ export function getInputWithDeprecatedAlias(
return value || deprecatedValue || defaultValue || ''; return value || deprecatedValue || defaultValue || '';
} }
// only exported for testing purposes
export function getMavenServerSettings(): MavenServerCredentials[] {
const entries = core.getMultilineInput(
constants.INPUT_MVN_SERVER_CREDENTIALS
);
if (entries.some(entry => entry.trim())) {
return parseMavenServerCredentials(entries);
}
return [
{
id: core.getInput(constants.INPUT_SERVER_ID),
usernameEnvVar: getInputWithDeprecatedAlias(
constants.INPUT_SERVER_USERNAME_ENV_VAR,
constants.INPUT_SERVER_USERNAME_DEPRECATED,
constants.INPUT_DEFAULT_SERVER_USERNAME
),
passwordEnvVar: getInputWithDeprecatedAlias(
constants.INPUT_SERVER_PASSWORD_ENV_VAR,
constants.INPUT_SERVER_PASSWORD_DEPRECATED,
constants.INPUT_DEFAULT_SERVER_PASSWORD
)
}
];
}
// only exported for testing purposes
export function parseMavenServerCredentials(
entries: string[]
): MavenServerCredentials[] {
const servers: MavenServerCredentials[] = [];
const serverIds = new Set<string>();
entries.forEach((entry, index) => {
if (!entry.trim()) {
return;
}
const fields = entry.split(':');
if (fields.length !== 3) {
throw new Error(
`Invalid mvn-server-credentials entry at line ${index + 1}. Expected format: server-id:USERNAME_ENV:PASSWORD_ENV`
);
}
const [id, usernameEnvVar, passwordEnvVar] = fields.map(field =>
field.trim()
);
if (!id || !usernameEnvVar || !passwordEnvVar) {
throw new Error(
`Invalid mvn-server-credentials entry at line ${index + 1}. server-id, username environment variable, and password environment variable are required`
);
}
if (serverIds.has(id)) {
throw new Error(
`Duplicate server-id '${id}' in mvn-server-credentials input`
);
}
serverIds.add(id);
servers.push({id, usernameEnvVar, passwordEnvVar});
});
return servers;
}
// only exported for testing purposes
export function getMavenRepositorySettings():
MavenRepositorySettings | undefined {
const entries = core.getMultilineInput(constants.INPUT_MVN_REPOSITORIES);
if (!entries.some(entry => entry.trim())) {
return undefined;
}
const includeCentral = getBooleanInput(
constants.INPUT_MVN_REPOSITORIES_INCLUDE_CENTRAL,
true
);
return {
repositories: parseMavenRepositories(entries, includeCentral),
includeCentral,
prioritizeCentral: getBooleanInput(
constants.INPUT_MVN_REPOSITORIES_PRIORITIZE_CENTRAL,
true
)
};
}
// only exported for testing purposes
export function parseMavenRepositories(
entries: string[],
includeCentral: boolean
): MavenRepository[] {
const repositories: MavenRepository[] = [];
const repositoryIds = new Set<string>();
entries.forEach((entry, index) => {
if (!entry.trim()) {
return;
}
const firstSeparator = entry.indexOf(':');
const lastSeparator = entry.lastIndexOf(':');
if (firstSeparator <= 0 || lastSeparator <= firstSeparator) {
throw new Error(
`Invalid mvn-repositories entry at line ${index + 1}. Expected format: repository-id:repository-url:snapshots-enabled`
);
}
const id = entry.slice(0, firstSeparator).trim();
const url = entry.slice(firstSeparator + 1, lastSeparator).trim();
const snapshotsValue = entry
.slice(lastSeparator + 1)
.trim()
.toLowerCase();
if (!id || !url || !snapshotsValue) {
throw new Error(
`Invalid mvn-repositories entry at line ${index + 1}. repository-id, repository URL, and snapshots-enabled are required`
);
}
if (snapshotsValue !== 'true' && snapshotsValue !== 'false') {
throw new Error(
`Invalid snapshots-enabled value '${snapshotsValue}' in mvn-repositories entry at line ${index + 1}. Expected true or false`
);
}
if (repositoryIds.has(id)) {
throw new Error(
`Duplicate repository-id '${id}' in mvn-repositories input`
);
}
if (includeCentral && id === constants.MAVEN_CENTRAL_REPOSITORY_ID) {
throw new Error(
`Repository-id '${constants.MAVEN_CENTRAL_REPOSITORY_ID}' is reserved when ${constants.INPUT_MVN_REPOSITORIES_INCLUDE_CENTRAL} is enabled`
);
}
repositoryIds.add(id);
repositories.push({
id,
url,
snapshotsEnabled: snapshotsValue === 'true'
});
});
return repositories;
}
export async function createAuthenticationSettings( export async function createAuthenticationSettings(
servers: MavenServerCredentials[], id: string,
usernameEnvVar: string,
passwordEnvVar: string,
settingsDirectory: string, settingsDirectory: string,
overwriteSettings: boolean, overwriteSettings: boolean,
gpgPassphraseEnvVar: string | undefined = undefined, gpgPassphraseEnvVar: string | undefined = undefined
repositorySettings: MavenRepositorySettings | undefined = undefined
) { ) {
core.info( core.info(`Creating ${constants.MVN_SETTINGS_FILE} with server-id: ${id}`);
`Creating ${constants.MVN_SETTINGS_FILE} with server-id: ${servers.map(server => server.id).join(', ')}`
);
// 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);
await write( await write(
settingsDirectory, settingsDirectory,
generate(servers, gpgPassphraseEnvVar, repositorySettings), generate(id, usernameEnvVar, passwordEnvVar, gpgPassphraseEnvVar),
overwriteSettings overwriteSettings
); );
} }
// only exported for testing purposes // only exported for testing purposes
export function generate( export function generate(
servers: MavenServerCredentials[], id: string,
gpgPassphraseEnvVar?: string | undefined, usernameEnvVar: string,
repositorySettings?: MavenRepositorySettings | undefined passwordEnvVar: string,
gpgPassphraseEnvVar?: string | undefined
) { ) {
// The maven-gpg-plugin reads the passphrase from the environment variable // The maven-gpg-plugin reads the passphrase from the environment variable
// named by the `gpg.passphraseEnvName` property (default MAVEN_GPG_PASSPHRASE). // named by the `gpg.passphraseEnvName` property (default MAVEN_GPG_PASSPHRASE).
@@ -278,90 +121,30 @@ export function generate(
' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"', ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"',
' xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">', ' xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">',
' <interactiveMode>false</interactiveMode>', ' <interactiveMode>false</interactiveMode>',
' <servers>' ' <servers>',
];
for (const server of servers) {
lines.push(
' <server>', ' <server>',
` <id>${escapeXmlText(server.id)}</id>`, ` <id>${escapeXmlText(id)}</id>`,
` <username>${escapeXmlText(`\${env.${server.usernameEnvVar}}`)}</username>`, ` <username>${escapeXmlText(`\${env.${usernameEnvVar}}`)}</username>`,
` <password>${escapeXmlText(`\${env.${server.passwordEnvVar}}`)}</password>`, ` <password>${escapeXmlText(`\${env.${passwordEnvVar}}`)}</password>`,
' </server>' ' </server>',
); ' </servers>'
}
lines.push(' </servers>');
if (repositorySettings || includeGpgPassphraseProfile) {
lines.push(' <profiles>');
if (repositorySettings) {
const centralRepository: MavenRepository = {
id: constants.MAVEN_CENTRAL_REPOSITORY_ID,
url: constants.MAVEN_CENTRAL_REPOSITORY_URL,
snapshotsEnabled: false
};
const customCentralConfigured = repositorySettings.repositories.some(
repository => repository.id === constants.MAVEN_CENTRAL_REPOSITORY_ID
);
const repositories = repositorySettings.includeCentral
? repositorySettings.prioritizeCentral
? [centralRepository, ...repositorySettings.repositories]
: [...repositorySettings.repositories, centralRepository]
: customCentralConfigured
? repositorySettings.repositories
: [
...repositorySettings.repositories,
{...centralRepository, releasesEnabled: false}
]; ];
lines.push(
' <profile>',
` <id>${constants.MAVEN_REPOSITORIES_PROFILE_ID}</id>`,
' <repositories>'
);
for (const repository of repositories) {
lines.push(
' <repository>',
` <id>${escapeXmlText(repository.id)}</id>`,
` <url>${escapeXmlText(repository.url)}</url>`,
...(repository.releasesEnabled === undefined
? []
: [
' <releases>',
` <enabled>${repository.releasesEnabled}</enabled>`,
' </releases>'
]),
' <snapshots>',
` <enabled>${repository.snapshotsEnabled}</enabled>`,
' </snapshots>',
' </repository>'
);
}
lines.push(' </repositories>', ' </profile>');
}
if (includeGpgPassphraseProfile) { if (includeGpgPassphraseProfile) {
lines.push( lines.push(
' <profiles>',
' <profile>', ' <profile>',
` <id>${constants.GPG_PASSPHRASE_PROFILE_ID}</id>`, ` <id>${constants.GPG_PASSPHRASE_PROFILE_ID}</id>`,
' <properties>', ' <properties>',
` <gpg.passphraseEnvName>${escapeXmlText(gpgPassphraseEnvVar)}</gpg.passphraseEnvName>`, ` <gpg.passphraseEnvName>${escapeXmlText(gpgPassphraseEnvVar)}</gpg.passphraseEnvName>`,
' </properties>', ' </properties>',
' </profile>' ' </profile>',
' </profiles>',
' <activeProfiles>',
` <activeProfile>${constants.GPG_PASSPHRASE_PROFILE_ID}</activeProfile>`,
' </activeProfiles>'
); );
} }
lines.push(' </profiles>', ' <activeProfiles>');
if (repositorySettings) {
lines.push(
` <activeProfile>${constants.MAVEN_REPOSITORIES_PROFILE_ID}</activeProfile>`
);
}
if (includeGpgPassphraseProfile) {
lines.push(
` <activeProfile>${constants.GPG_PASSPHRASE_PROFILE_ID}</activeProfile>`
);
}
lines.push(' </activeProfiles>');
}
lines.push('</settings>'); lines.push('</settings>');
return lines.join('\n'); return lines.join('\n');
-10
View File
@@ -12,12 +12,6 @@ export const INPUT_SET_DEFAULT = 'set-default';
export const INPUT_PROBLEM_MATCHER = 'problem-matcher'; export const INPUT_PROBLEM_MATCHER = 'problem-matcher';
export const INPUT_VERIFY_SIGNATURE = 'verify-signature'; export const INPUT_VERIFY_SIGNATURE = 'verify-signature';
export const INPUT_VERIFY_SIGNATURE_PUBLIC_KEY = 'verify-signature-public-key'; export const INPUT_VERIFY_SIGNATURE_PUBLIC_KEY = 'verify-signature-public-key';
export const INPUT_MVN_SERVER_CREDENTIALS = 'mvn-server-credentials';
export const INPUT_MVN_REPOSITORIES = 'mvn-repositories';
export const INPUT_MVN_REPOSITORIES_INCLUDE_CENTRAL =
'mvn-repositories-include-central';
export const INPUT_MVN_REPOSITORIES_PRIORITIZE_CENTRAL =
'mvn-repositories-prioritize-central';
export const INPUT_SERVER_ID = 'server-id'; export const INPUT_SERVER_ID = 'server-id';
export const INPUT_SERVER_USERNAME_ENV_VAR = 'server-username-env-var'; export const INPUT_SERVER_USERNAME_ENV_VAR = 'server-username-env-var';
export const INPUT_SERVER_PASSWORD_ENV_VAR = 'server-password-env-var'; export const INPUT_SERVER_PASSWORD_ENV_VAR = 'server-password-env-var';
@@ -41,10 +35,6 @@ export const MAVEN_GPG_PASSPHRASE_DEFAULT_ENV = 'MAVEN_GPG_PASSPHRASE';
// Id of the settings.xml profile used to set `gpg.passphraseEnvName`. // Id of the settings.xml profile used to set `gpg.passphraseEnvName`.
export const GPG_PASSPHRASE_PROFILE_ID = 'setup-java-gpg'; export const GPG_PASSPHRASE_PROFILE_ID = 'setup-java-gpg';
export const MAVEN_REPOSITORIES_PROFILE_ID = 'setup-java-repositories';
export const MAVEN_CENTRAL_REPOSITORY_ID = 'central';
export const MAVEN_CENTRAL_REPOSITORY_URL =
'https://repo.maven.apache.org/maven2';
export const INPUT_CACHE = 'cache'; export const INPUT_CACHE = 'cache';
export const INPUT_CACHE_JDK = 'cache-jdk'; export const INPUT_CACHE_JDK = 'cache-jdk';
@@ -98,10 +98,6 @@ export async function getJavaDistribution(
const {OpenJdkDistribution} = await import('./openjdk/installer.js'); const {OpenJdkDistribution} = await import('./openjdk/installer.js');
return new OpenJdkDistribution(normalizedInstallerOptions); return new OpenJdkDistribution(normalizedInstallerOptions);
} }
case JavaDistribution.RedHat: {
const {RedHatDistribution} = await import('./redhat/installer.js');
return new RedHatDistribution(normalizedInstallerOptions);
}
default: default:
return null; return null;
} }
+2 -4
View File
@@ -17,8 +17,7 @@ export enum JavaDistribution {
GraalVMCommunity = 'graalvm-community', GraalVMCommunity = 'graalvm-community',
JetBrains = 'jetbrains', JetBrains = 'jetbrains',
Kona = 'kona', Kona = 'kona',
OracleOpenJdk = 'oracle-openjdk', OracleOpenJdk = 'oracle-openjdk'
RedHat = 'redhat'
} }
export const JAVA_PACKAGE_CAPABILITIES = { export const JAVA_PACKAGE_CAPABILITIES = {
@@ -51,8 +50,7 @@ export const JAVA_PACKAGE_CAPABILITIES = {
'jre+ft' 'jre+ft'
], ],
[JavaDistribution.Kona]: ['jdk'], [JavaDistribution.Kona]: ['jdk'],
[JavaDistribution.OracleOpenJdk]: ['jdk'], [JavaDistribution.OracleOpenJdk]: ['jdk']
[JavaDistribution.RedHat]: ['jdk', 'jre']
} as const satisfies Record<JavaDistribution, readonly string[]>; } as const satisfies Record<JavaDistribution, readonly string[]>;
export function validateJavaPackage( export function validateJavaPackage(
-13
View File
@@ -145,19 +145,6 @@ export const JAVA_PLATFORM_CAPABILITIES: Record<
macos: X64_ARM64, macos: X64_ARM64,
windows: ['x64'] windows: ['x64']
} }
},
[JavaDistribution.RedHat]: {
platforms: {
linux: [
'x64',
{architecture: 'aarch64', versionRange: '<12'},
{architecture: 'ppc64le', versionRange: '<12'}
],
windows: [
{architecture: 'x64', versionRange: '<22'},
{architecture: 'x86', versionRange: '<11'}
]
}
} }
}; };
-180
View File
@@ -1,180 +0,0 @@
import * as core from '@actions/core';
import fs from 'fs';
import path from 'path';
import semver from 'semver';
import {
cacheJdkDir,
extractJdkFile,
isVersionSatisfies,
renameWinArchive
} from '../../util.js';
import {JavaBase} from '../base-installer.js';
import {
JavaDownloadRelease,
JavaInstallerOptions,
JavaInstallerResults
} from '../base-models.js';
import {
IDiscoPackage,
IDiscoPackageDetailsResponse,
IDiscoPackageListResponse
} from './models.js';
import {isAlpineLinux} from '../platform-types.js';
const DISCO_API_URL = 'https://api.foojay.io/disco/v3.0';
export class RedHatDistribution extends JavaBase {
constructor(installerOptions: JavaInstallerOptions) {
super('RedHat', installerOptions);
}
protected async findPackageForDownload(
range: string
): Promise<JavaDownloadRelease> {
if (!this.stable) {
throw new Error('Early access versions are not supported');
}
const availablePackages = await this.getAvailablePackages();
const normalizedPackages = availablePackages
.map(item => ({
item,
version: this.normalizeDiscoVersion(item.java_version)
}))
.filter(
(item): item is {item: IDiscoPackage; version: string} =>
item.version !== null
)
.sort((left, right) => -semver.compareBuild(left.version, right.version));
const selectedPackage = normalizedPackages.find(item =>
isVersionSatisfies(range, item.version)
);
if (!selectedPackage) {
throw this.createVersionNotFoundError(
range,
normalizedPackages.map(item => item.version),
`Operating system: ${this.getOperatingSystem()}`
);
}
const detailsUrl = `${DISCO_API_URL}/ids/${selectedPackage.item.id}`;
const response =
await this.http.getJson<IDiscoPackageDetailsResponse>(detailsUrl);
const details = response.result?.result?.[0];
if (!details?.direct_download_uri) {
throw new Error(
`Foojay Disco returned no direct Red Hat download URL for package '${selectedPackage.item.id}'.`
);
}
const checksum = details.checksum?.trim();
if (details.checksum_type?.toLowerCase() !== 'sha256' || !checksum) {
throw new Error(
`Foojay Disco returned no SHA-256 checksum for Red Hat package '${selectedPackage.item.id}'.`
);
}
return {
version: selectedPackage.version,
url: details.direct_download_uri,
checksum: {
algorithm: 'sha256',
value: checksum,
source: detailsUrl
}
};
}
protected async downloadTool(
javaRelease: JavaDownloadRelease
): Promise<JavaInstallerResults> {
core.info(
`Downloading Java ${javaRelease.version} (${this.distribution}) from ${javaRelease.url} ...`
);
let javaArchivePath = await this.downloadAndVerify(javaRelease);
core.info('Extracting Java archive...');
const archiveType = this.getArchiveType();
if (archiveType === 'zip') {
javaArchivePath = renameWinArchive(javaArchivePath);
}
const extractedJavaPath = await extractJdkFile(
javaArchivePath,
archiveType
);
const archiveName = fs.readdirSync(extractedJavaPath)[0];
if (!archiveName) {
throw new Error(
`The Red Hat archive for Java ${javaRelease.version} was empty.`
);
}
const archivePath = path.join(extractedJavaPath, archiveName);
const javaPath = await cacheJdkDir(
archivePath,
this.toolcacheFolderName,
this.getToolcacheVersionName(javaRelease.version),
this.architecture
);
return {version: javaRelease.version, path: javaPath};
}
private async getAvailablePackages(): Promise<IDiscoPackage[]> {
const operatingSystem = this.getOperatingSystem();
const archiveType = this.getArchiveType();
const query = new URLSearchParams({
distro: 'redhat',
release_status: 'ga',
operating_system: operatingSystem,
architecture: this.distributionArchitecture(),
package_type: this.packageType,
archive_type: archiveType,
directly_downloadable: 'true'
});
const url = `${DISCO_API_URL}/packages?${query.toString()}`;
const response = await this.http.getJson<IDiscoPackageListResponse>(url);
const packages = response.result?.result;
if (!Array.isArray(packages)) {
throw new Error(
`Could not fetch Red Hat package metadata from Foojay Disco: ${url}`
);
}
return packages.filter(
item =>
item.distribution === 'redhat' &&
item.release_status === 'ga' &&
item.operating_system === operatingSystem &&
item.architecture === this.distributionArchitecture() &&
item.package_type === this.packageType &&
item.archive_type === archiveType &&
item.directly_downloadable
);
}
private getOperatingSystem(alpine = isAlpineLinux()): string {
if (alpine) {
throw new Error(
"Distribution 'redhat' does not support Alpine Linux because Red Hat portable archives require glibc."
);
}
return process.platform === 'win32' ? 'windows' : 'linux';
}
private getArchiveType(): string {
return process.platform === 'win32' ? 'zip' : 'tar.xz';
}
private normalizeDiscoVersion(version: string): string | null {
let normalizedVersion = version.trim();
if (/^\d+\+\d+$/.test(normalizedVersion)) {
normalizedVersion = normalizedVersion.replace('+', '.0.0+');
} else if (/^\d+$/.test(normalizedVersion)) {
normalizedVersion = `${normalizedVersion}.0.0`;
} else if (/^\d+\.\d+$/.test(normalizedVersion)) {
normalizedVersion = `${normalizedVersion}.0`;
}
return semver.valid(normalizedVersion) ? normalizedVersion : null;
}
}
-28
View File
@@ -1,28 +0,0 @@
export interface IDiscoPackage {
id: string;
archive_type: string;
distribution: string;
java_version: string;
release_status: string;
operating_system: string;
architecture: string;
package_type: string;
directly_downloadable: boolean;
}
export interface IDiscoPackageListResponse {
result: IDiscoPackage[];
message: string;
}
export interface IDiscoPackageDetails {
filename: string;
direct_download_uri: string;
checksum: string;
checksum_type: string;
}
export interface IDiscoPackageDetailsResponse {
result: IDiscoPackageDetails[];
message: string;
}
-4
View File
@@ -59,8 +59,6 @@ export async function extractJdkFile(toolPath: string, extension?: string) {
if (!extension) { if (!extension) {
extension = toolPath.endsWith('.tar.gz') extension = toolPath.endsWith('.tar.gz')
? 'tar.gz' ? 'tar.gz'
: toolPath.endsWith('.tar.xz')
? 'tar.xz'
: path.extname(toolPath); : path.extname(toolPath);
if (extension.startsWith('.')) { if (extension.startsWith('.')) {
extension = extension.substring(1); extension = extension.substring(1);
@@ -70,8 +68,6 @@ export async function extractJdkFile(toolPath: string, extension?: string) {
switch (extension) { switch (extension) {
case 'tar.gz': case 'tar.gz':
return await extractTarGz(toolPath); return await extractTarGz(toolPath);
case 'tar.xz':
return await tc.extractTar(toolPath, undefined, 'xJ');
case 'tar': case 'tar':
return await tc.extractTar(toolPath); return await tc.extractTar(toolPath);
case 'zip': case 'zip':