如何解决actions/setup-java@v3中gpg进程退出码2的问题
我正在开发一个自动发布Java库的GitHub Action,开发分支为MathieuSoysal/Java-maven-library-publisher的2-add-automated-tests分支。
Action的YAML代码:
name: "Java maven library publisher" author: "Mathieu Soysal (@MathieuSoysal)" description: "Build automatically Java Maven library and publish it to GitHub Packages and Maven Central." branding: icon: "package" color: "gray-dark" inputs: nexus-username: description: "Nexus username" required: true nexus-password: description: "Nexus password" required: true gpg-private-key: description: "GPG private key" required: true gpg-passphrase: description: "GPG passphrase" required: true github-token: description: "GitHub token" required: true # Java version to use java-version: description: "Java version to use" required: true default: "17" # Library version library-version: description: "Library version" required: false default: "" runs: using: "composite" steps: - name: Checkout uses: actions/checkout@v3 - name: Set up JDK 17 for deploy to OSSRH uses: actions/setup-java@v3 with: distribution: "adopt" java-version: ${{ inputs.java-version }} server-id: ossrh server-username: ${{ inputs.nexus-username }} server-password: ${{ inputs.nexus-password }} gpg-private-key: ${{ inputs.gpg-private-key }} gpg-passphrase: ${{ inputs.gpg-passphrase }} - name: Build with Maven run: mvn -B package --file pom.xml shell: bash - name: Update package version if: ${{ inputs.library-version != '' }} run: mvn versions:set -DnewVersion=${{ inputs.library-version }} shell: bash - name: Prepare Maven environnement with Java 17 for deployment to OSSRH run: export MAVEN_OPTS="--add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.text=ALL-UNNAMED --add-opens=java.desktop/java.awt.font=ALL-UNNAMED" shell: bash - name: Publish to Apache Maven Central run: mvn deploy -PossrhDeploy shell: bash env: MAVEN_USERNAME: ${{ inputs.nexus-username }} MAVEN_CENTRAL_TOKEN: ${{ inputs.nexus-password }} MAVEN_GPG_PASSPHRASE: ${{ inputs.gpg-passphrase }} - name: Set up JDK 17 for deploy to github packages uses: actions/setup-java@v3 with: distribution: "adopt" java-version: ${{ inputs.java-version }} server-id: github - name: Publish to GitHub Packages Apache Maven run: mvn deploy -PgithubDeploy shell: bash env: GITHUB_TOKEN: ${{ inputs.github-token }}
执行该Action的工作流代码:
name: Test Actions on: [push] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Maven Library build and publish uses: ./ with: nexus-username: ${{ secrets.NEXUS_USERNAME }} nexus-password: ${{ secrets.NEXUS_PASSWORD }} gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }} gpg-passphrase: ${{ secrets.GPG_PASSPHRASE }} library-version: $GITHUB_RUN_NUMBER github-token: ${{ secrets.GITHUB_TOKEN }} java-version: 17
执行Action时出现如下错误:
Getting action download info Download action repository 'actions/setup-java@v3' (SHA:c3ac5dd0ed8db40fedb61c32fbe677e6b355e94c) Run ./ Run actions/checkout@v3 Syncing repository: ***/Java-maven-library-publisher Getting Git version info Temporarily overriding HOME='/home/runner/work/_temp/45376e45-02aa-4aa5-b536-5f744f7e10d3' before making global git config changes Adding repository directory to the temporary git global config as a safe directory /usr/bin/git config --global --add safe.directory /home/runner/work/Java-maven-library-publisher/Java-maven-library-publisher /usr/bin/git config --local --get remote.origin.url https://github.com/***/Java-maven-library-publisher Removing previously created refs, to avoid conflicts Cleaning the repository Disabling automatic garbage collection Setting up auth Fetching the repository Determining the checkout info Checking out the ref /usr/bin/git log -1 --format='%H' '0e8da131bf626b218ddccbd08a661c7921dfb8da' Run actions/setup-java@v3 Installed distributions Creating settings.xml with server-id: ossrh Writing to /home/runner/.m2/settings.xml Importing private gpg key Error: The process '/usr/bin/gpg' failed with exit code 2
确认GPG私钥格式正确
私钥必须是ASCII armored格式,包含完整的-----BEGIN PGP PRIVATE KEY BLOCK-----和-----END PGP PRIVATE KEY BLOCK-----标识。导出私钥时使用以下命令:gpg --armor --export-secret-keys YOUR_KEY_ID复制输出的全部内容到GitHub Secrets的
GPG_PRIVATE_KEY中,不要遗漏任何字符或换行。验证密码短语匹配
检查GitHub Secrets里的GPG_PASSPHRASE是否和私钥设置的密码完全一致,注意区分大小写和特殊字符。处理私钥换行丢失问题
如果粘贴私钥到Secrets时换行符被自动替换为空格,导致私钥损坏,可以先将私钥Base64编码:gpg --armor --export-secret-keys YOUR_KEY_ID | base64 -w 0把编码后的字符串存入
GPG_PRIVATE_KEYSecrets,然后修改Action,手动导入私钥:
移除actions/setup-java步骤中的gpg-private-key和gpg-passphrase参数,添加以下步骤:- name: Import GPG private key run: echo "${{ secrets.GPG_PRIVATE_KEY }}" | base64 -d | gpg --import --batch --passphrase "${{ secrets.GPG_PASSPHRASE }}" shell: bash升级actions/setup-java版本
尝试将actions/setup-java@v3升级到最新版本(如v4),旧版本可能存在GPG导入的兼容性bug。
内容的提问来源于stack exchange,提问作者ThrowsError

