From 3384951fff0530e41845d5223ea5cf171d282d05 Mon Sep 17 00:00:00 2001 From: Bruno Borges Date: Tue, 14 Jul 2026 21:54:47 -0400 Subject: [PATCH] Use gpg.passphraseEnvName instead of gpg.passphrase server The maven-gpg-plugin's `gpg.passphrase`/`passphraseServerId` mechanism is deprecated and fails when the plugin's `bestPractices` mode is enabled. Stop writing the `gpg.passphrase` server to settings.xml and instead set `gpg.passphraseEnvName` via an active profile when the configured passphrase env var name differs from the plugin default (MAVEN_GPG_PASSPHRASE). The default `gpg-passphrase` input value (GPG_PASSPHRASE) is unchanged, so the plugin reads the same environment variable as before. Fixes #760 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- __tests__/auth.test.ts | 35 +++++++++++++++++++++++++++++++++-- dist/cleanup/index.js | 6 ++++++ dist/setup/index.js | 29 ++++++++++++++++++++++++----- docs/advanced-usage.md | 24 ++++++++++++++++++------ src/auth.ts | 25 ++++++++++++++++++++----- src/constants.ts | 8 ++++++++ 6 files changed, 109 insertions(+), 18 deletions(-) diff --git a/__tests__/auth.test.ts b/__tests__/auth.test.ts index 7ed67561..0c0da081 100644 --- a/__tests__/auth.test.ts +++ b/__tests__/auth.test.ts @@ -228,9 +228,40 @@ describe('auth tests', () => { \${env.${username}} \${env.&<>"''"><&} + + + + setup-java-gpg + + ${gpgPassphrase} + + + + + setup-java-gpg + +`; + + expect(auth.generate(id, username, password, gpgPassphrase)).toEqual( + expectedSettings + ); + }); + + it('does not add a gpg profile when the passphrase env var is the maven-gpg-plugin default', () => { + const id = 'packages'; + const username = 'USER'; + const password = '&<>"\'\'"><&'; + const gpgPassphrase = 'MAVEN_GPG_PASSPHRASE'; + + const expectedSettings = ` + false + - gpg.passphrase - \${env.${gpgPassphrase}} + ${id} + \${env.${username}} + \${env.&<>"''"><&} `; diff --git a/dist/cleanup/index.js b/dist/cleanup/index.js index e710603c..40b7bac3 100644 --- a/dist/cleanup/index.js +++ b/dist/cleanup/index.js @@ -95849,6 +95849,12 @@ const INPUT_GPG_PRIVATE_KEY = 'gpg-private-key'; const INPUT_GPG_PASSPHRASE = 'gpg-passphrase'; const INPUT_DEFAULT_GPG_PRIVATE_KEY = (/* unused pure expression or super */ null && (undefined)); const INPUT_DEFAULT_GPG_PASSPHRASE = 'GPG_PASSPHRASE'; +// The default name of the environment variable the maven-gpg-plugin reads the +// passphrase from (property `gpg.passphraseEnvName`). When the configured +// passphrase env var name matches this, no extra configuration is required. +const MAVEN_GPG_PASSPHRASE_DEFAULT_ENV = 'MAVEN_GPG_PASSPHRASE'; +// Id of the settings.xml profile used to set `gpg.passphraseEnvName`. +const GPG_PASSPHRASE_PROFILE_ID = 'setup-java-gpg'; const INPUT_CACHE = 'cache'; const INPUT_CACHE_DEPENDENCY_PATH = 'cache-dependency-path'; const INPUT_JOB_STATUS = 'job-status'; diff --git a/dist/setup/index.js b/dist/setup/index.js index f3456691..ee21689e 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -73294,6 +73294,12 @@ const INPUT_GPG_PRIVATE_KEY = 'gpg-private-key'; const INPUT_GPG_PASSPHRASE = 'gpg-passphrase'; const INPUT_DEFAULT_GPG_PRIVATE_KEY = undefined; const INPUT_DEFAULT_GPG_PASSPHRASE = 'GPG_PASSPHRASE'; +// The default name of the environment variable the maven-gpg-plugin reads the +// passphrase from (property `gpg.passphraseEnvName`). When the configured +// passphrase env var name matches this, no extra configuration is required. +const MAVEN_GPG_PASSPHRASE_DEFAULT_ENV = 'MAVEN_GPG_PASSPHRASE'; +// Id of the settings.xml profile used to set `gpg.passphraseEnvName`. +const GPG_PASSPHRASE_PROFILE_ID = 'setup-java-gpg'; const INPUT_CACHE = 'cache'; const INPUT_CACHE_DEPENDENCY_PATH = 'cache-dependency-path'; const constants_INPUT_JOB_STATUS = 'job-status'; @@ -127311,12 +127317,25 @@ function generate(id, username, password, gpgPassphrase) { } } }; - if (gpgPassphrase) { - const gpgServer = { - id: 'gpg.passphrase', - passphrase: `\${env.${gpgPassphrase}}` + // The maven-gpg-plugin reads the passphrase from the environment variable + // named by the `gpg.passphraseEnvName` property (default MAVEN_GPG_PASSPHRASE). + // Only configure it when the requested env var name differs from that default; + // otherwise the plugin already reads the right variable and no extra settings + // are needed. Writing `gpg.passphrase` to settings.xml is deprecated and fails + // when the plugin's `bestPractices` mode is enabled. + if (gpgPassphrase && + gpgPassphrase !== MAVEN_GPG_PASSPHRASE_DEFAULT_ENV) { + xmlObj.settings.profiles = { + profile: { + id: GPG_PASSPHRASE_PROFILE_ID, + properties: { + 'gpg.passphraseEnvName': gpgPassphrase + } + } + }; + xmlObj.settings.activeProfiles = { + activeProfile: GPG_PASSPHRASE_PROFILE_ID }; - xmlObj.settings.servers.server.push(gpgServer); } return (0,lib/* create */.vt)(xmlObj).end({ headless: true, diff --git a/docs/advanced-usage.md b/docs/advanced-usage.md index 28c6d192..8a112afc 100644 --- a/docs/advanced-usage.md +++ b/docs/advanced-usage.md @@ -682,15 +682,27 @@ If you use `maven-gpg-plugin` older than 3.2.0, or you prefer signing with the ` MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }} ``` -With these inputs, setup-java adds a `gpg.passphrase` server to the generated `settings.xml`: +The `gpg-passphrase` input is the **name of the environment variable** that holds the passphrase (not the passphrase itself). The [Maven GPG Plugin](https://maven.apache.org/plugins/maven-gpg-plugin/) reads the passphrase from the environment variable named by its `gpg.passphraseEnvName` property, which defaults to `MAVEN_GPG_PASSPHRASE`. + +- If `gpg-passphrase` is `MAVEN_GPG_PASSPHRASE`, the plugin already reads that variable by default, so setup-java writes nothing extra to `settings.xml`. +- If `gpg-passphrase` is any other name, setup-java configures `gpg.passphraseEnvName` through an active profile in the generated `settings.xml` so the plugin reads the passphrase from that variable: ```xml - - gpg.passphrase - ${env.MAVEN_GPG_PASSPHRASE} - + + + setup-java-gpg + + GPG_PASSPHRASE + + + + + setup-java-gpg + ``` +> **Note:** Earlier versions of setup-java wrote a `gpg.passphrase` server to `settings.xml`. That mechanism is deprecated by the Maven GPG Plugin and fails when its `bestPractices` mode is enabled, so setup-java now relies on `gpg.passphraseEnvName` instead. + When signing with the `gpg` executable, the Maven GPG Plugin configuration in your `pom.xml` should contain the following structure to avoid possible issues like `Inappropriate ioctl for device` or `gpg: signing failed: No such file or directory`: ```xml @@ -703,7 +715,7 @@ When signing with the `gpg` executable, the Maven GPG Plugin configuration in yo ``` -GPG 2.1 requires `--pinentry-mode` to be set to `loopback` in order to pick up the `gpg.passphrase` value defined in Maven `settings.xml`. +GPG 2.1 requires `--pinentry-mode` to be set to `loopback` in order to read the passphrase non-interactively. ***NOTE***: If, when using the default `gpg` signer, the error `gpg: Sorry, no terminal at all requested - can't get input` [is encountered](https://github.com/actions/setup-java/issues/554), please update the version of `maven-gpg-plugin` to 1.6 or higher. diff --git a/src/auth.ts b/src/auth.ts index 2f0ac608..4d9dde82 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -93,12 +93,27 @@ export function generate( } }; - if (gpgPassphrase) { - const gpgServer = { - id: 'gpg.passphrase', - passphrase: `\${env.${gpgPassphrase}}` + // The maven-gpg-plugin reads the passphrase from the environment variable + // named by the `gpg.passphraseEnvName` property (default MAVEN_GPG_PASSPHRASE). + // Only configure it when the requested env var name differs from that default; + // otherwise the plugin already reads the right variable and no extra settings + // are needed. Writing `gpg.passphrase` to settings.xml is deprecated and fails + // when the plugin's `bestPractices` mode is enabled. + if ( + gpgPassphrase && + gpgPassphrase !== constants.MAVEN_GPG_PASSPHRASE_DEFAULT_ENV + ) { + xmlObj.settings.profiles = { + profile: { + id: constants.GPG_PASSPHRASE_PROFILE_ID, + properties: { + 'gpg.passphraseEnvName': gpgPassphrase + } + } + }; + xmlObj.settings.activeProfiles = { + activeProfile: constants.GPG_PASSPHRASE_PROFILE_ID }; - xmlObj.settings.servers.server.push(gpgServer); } return xmlCreate(xmlObj).end({ diff --git a/src/constants.ts b/src/constants.ts index 2f7362b0..d3ac9c59 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -21,6 +21,14 @@ export const INPUT_GPG_PASSPHRASE = 'gpg-passphrase'; export const INPUT_DEFAULT_GPG_PRIVATE_KEY = undefined; export const INPUT_DEFAULT_GPG_PASSPHRASE = 'GPG_PASSPHRASE'; +// The default name of the environment variable the maven-gpg-plugin reads the +// passphrase from (property `gpg.passphraseEnvName`). When the configured +// passphrase env var name matches this, no extra configuration is required. +export const MAVEN_GPG_PASSPHRASE_DEFAULT_ENV = 'MAVEN_GPG_PASSPHRASE'; + +// Id of the settings.xml profile used to set `gpg.passphraseEnvName`. +export const GPG_PASSPHRASE_PROFILE_ID = 'setup-java-gpg'; + export const INPUT_CACHE = 'cache'; export const INPUT_CACHE_DEPENDENCY_PATH = 'cache-dependency-path'; export const INPUT_JOB_STATUS = 'job-status';