【问题标题】:How to use GPG key in github actions?如何在 github 操作中使用 GPG 密钥?
【发布时间】:2022-04-25 19:22:28
【问题描述】:

我正在尝试通过 GitHub 操作 进行 maven 部署,但出现以下错误:-

gpg: directory '/home/runner/.gnupg' created
gpg: keybox '/home/runner/.gnupg/pubring.kbx' created
gpg: no default secret key: No secret key
gpg: signing failed: No secret key
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  13.272 s
[INFO] Finished at: 2020-04-06T12:18:44Z
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-gpg-plugin:1.5:sign (sign-artifacts) on project pretty-simple-jar: Exit code: 2 -> [Help 1]

我知道我需要以某种方式将我的 gpg 密钥导入到运行操作工作流的虚拟运行器中,但我无法找到通过 GitHub 操作工作流将我的密钥导入虚拟运行器的方法?

以下是我的工作流程:-

jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up Maven Central Repository
        uses: actions/setup-java@v1
        with:
          java-version: 1.8
      - name: Display settings.xml
        run: |
          echo "<settings><servers><server><id>ossrh</id><username>${{ secrets.OSSRH_USERNAME }}</username><password>${{ secrets.OSSRH_TOKEN }}</password></server></servers><profiles><profile><id>ossrh</id><activation><activeByDefault>true</activeByDefault></activation><properties><gpg.keyname>${{ secrets.GPG_KEY_ID }}</gpg.keyname><gpg.passphrase>'${{ secrets.GPG_PASSPHRASE }}'</gpg.passphrase></properties></profile></profiles></settings>" > /home/runner/.m2/settings.xml
          cat /home/runner/.m2/settings.xml
      - name: Build Maven Project
        run: mvn clean install
      - name: Publish to Apache Maven Central
        run: mvn deploy

【问题讨论】:

  • 查看 GitHub 上的 article 使用秘密

标签: github gnupg github-actions maven-deploy-plugin


【解决方案1】:

由于 GitHub Actions 基本上是一个运行命令的容器,您是否考虑过将您的密钥定义为项目的机密,然后将其导入您的 Github Action 定义中?

以下是我之前在项目中使用的步骤,用于将生成的工件发布到 Sonatype 的临时存储库:

  • 打开一个终端窗口。
  • 如果您不知道自己的密钥 ID,请通过电子邮件搜索:gpg --list-secret-keys user@example.com
  • 将您的密钥导出为 Base64:gpg --export-secret-keys YOUR_ID_HERE | base64 &gt; private.key
  • 在您的 Github 项目中,创建一个名为 GPG_SIGNING_KEY 的新 Secret,并粘贴您的密钥的 Base64 内容。
  • 在您的 yml 工作流文件中,包含一个从您刚刚定义的密钥中导入密钥的步骤。
- name: Configure GPG Key
  run: |
    echo -n "$GPG_SIGNING_KEY" | base64 --decode | gpg --import
  env:
    GPG_SIGNING_KEY: ${{ secrets.GPG_SIGNING_KEY }}

到目前为止,它运行良好,尽管有一些我无法解决的限制:

  • 您的 GPG 密钥不应受密码保护。我想不出一种方法来导入受保护的密钥而不被询问他们的秘密。
  • 我找不到在此过程中使用我的 GitHub GPG 密钥的方法。

以防万一,here 是使用这种方法发布 Mavenartifacts 的项目的一个工作示例。不过,与上述步骤的唯一区别是命令被外部化为a bash script file。

【讨论】:

  • 只需尝试“gpg --batch --import ~/.gnupg/private.key”获取受密码保护的密钥。我假设你不需要密码来导入它,只是为了以后使用它。
  • 感谢您的回复,对我来说效果很好。要添加密码,我刚刚使用了这个回复而不是你的第三行:echo your_password | gpg --batch --yes --passphrase-fd 0 your_file.gpg unix.stackexchange.com/questions/60213/…
【解决方案2】:

感谢大家的回复。我现在使用这个 GitHub 操作,这使得过程更加简单:

第 1 步:提取密钥

gpg --list-secret-keys --keyid-format LONG
gpg --export-secret-keys --armor {your_keyId}

第 2 步:将提取的 GPG 密钥和密码存储为机密

第 3 步:将此步骤包含在您的工作流程中

- name: Import GPG Key
  uses: crazy-max/ghaction-import-gpg@v1
  env:
     GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
     PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}

【讨论】:

    【解决方案3】:

    添加一个新答案,因为这个问题是关于在 maven 部署中使用 GPG 密钥:

    与此同时,setup-java 操作支持开箱即用的所有内容,如README 文件中所述:

        - name: Set up Apache Maven Central
          uses: actions/setup-java@v3
          with: # running setup-java again overwrites the settings.xml
            java-version: 8
            distribution: 'temurin'
            cache: 'maven'
            server-id: ossrh # Value of the distributionManagement/repository/id field of the pom.xml
            server-username: OSSRH_USERNAME # env variable for username in deploy
            server-password: OSSRH_TOKEN # env variable for token in deploy
            gpg-private-key: ${{ secrets.MAVEN_GPG_PRIVATE_KEY }} # Value of the GPG private key to import
            gpg-passphrase: MAVEN_GPG_PASSPHRASE # env variable for GPG private key passphrase
    
        - name: Publish to Apache Maven Central
          run: mvn deploy
          env:
            OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }}
            OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }}
            MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
    

    请注意,setup-java 操作会自动为您配置 Maven 的 settings.xml 文件并从给定的存储密钥中导入 GPG 密钥。

    请注意,在setup-java 期间,您只需配置环境变量的名称。 IE。您需要在后面的步骤中为这些环境变量提供(秘密)值,以便使用它们。

    【讨论】:

    • 提示:如果您的环境名称不是默认名称,请务必在脚本中设置属性环境,否则您将收到“无密钥”的错误,而过程中没有任何明显的错误。
    【解决方案4】:

    您还可以使用另一个插件 https://www.simplify4u.org/sign-maven-plugin/ 来签署工件。

    sign-maven-plugin 只需从环境变量中获取签名密钥和其余配置项,无需特殊配置。

    sign-maven-plugin 的另一个优点是您不需要使用配置文件来激活或停用插件,因为当没有为插件预设签名密钥时,插件会跳过执行而不会出错。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 2018-08-17
      • 2022-08-10
      • 1970-01-01
      • 2016-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多