如何解决GitHub Actions中的“no default secret key”错误?
解决GitHub Actions中sbt-pgp签名时"no default secret key"错误
你遇到的问题是:在GitHub Actions工作流执行Scala项目发布时,尽管已配置PGP_PASSPHRASE和PGP_SECRET密钥,仍出现gpg找不到默认私钥的错误,导致签名失败。
核心原因
GitHub Actions的Runner环境是临时全新的,仅配置环境变量不足以让gpg识别密钥——必须手动将PGP私钥导入到Runner的gpg密钥环中,否则gpg无法找到可用的签名密钥。
解决方案
在工作流中添加PGP密钥导入步骤
在执行sbt发布命令前,插入以下步骤导入私钥并设置默认密钥:- name: 导入PGP私钥 run: | echo "$PGP_SECRET" | gpg --batch --import # 自动设置导入的私钥为默认密钥 DEFAULT_KEY=$(gpg --list-secret-keys --keyid-format LONG | grep sec | awk '{print $2}' | cut -d/ -f2 | head -n1) gpg --batch --default-key "$DEFAULT_KEY" env: PGP_SECRET: ${{ secrets.PGP_SECRET }}检查PGP密钥格式
- 确认
PGP_SECRET包含完整的私钥内容,首尾的-----BEGIN PGP PRIVATE KEY BLOCK-----和-----END PGP PRIVATE KEY BLOCK-----不能缺失 - 若私钥是加密状态,确保
PGP_PASSPHRASE与私钥的加密密码完全一致
- 确认
验证密钥导入结果
可在导入步骤后添加验证命令,确认密钥已成功导入:- name: 验证PGP密钥 run: gpg --list-secret-keys
你提供的错误日志
[warn] so tooling can use it for eviction errors etc - https://www.scala-sbt.org/1.x/docs/Publishing.html [info] gpg: no default secret key: No secret key [info] gpg: signing failed: No secret key [error] java.lang.RuntimeException: Failure running 'gpg --batch --pinentry-mode loopback --passphrase *** --detach-sign --armor --use-agent --output /home/runner/work/scala-reflection/scala-reflection/target/scala-3.3.0/scala-reflection-1.2.2.pom.asc /home/runner/work/scala-reflection/scala-reflection/target/scala-3.3.0/scala-reflection-1.2.2.pom'. Exit code: 2 [error] at scala.sys.package$.error(package.scala:30) [error] at com.jsuereth.sbtpgp.CommandLineGpgSigner.sign(PgpSigner.scala:74) [error] at com.jsuereth.sbtpgp.PgpSettings$.$anonfun$signingSettings$2(PgpSettings.scala:151) [error] at scala.collection.TraversableLike.$anonfun$flatMap$1(TraversableLike.scala:293) [error] at scala.collection.immutable.Map$Map4.foreach(Map.scala:493) [error] at scala.collection.TraversableLike.flatMap(TraversableLike.scala:293) [error] at scala.collection.TraversableLike.flatMap$(TraversableLike.scala:290) [error] at scala.collection.AbstractTraversable.flatMap(Traversable.scala:108) [error] at com.jsuereth.sbtpgp.PgpSettings$.$anonfun$signingSettings$1(PgpSettings.scala:146) [error] at scala.Function1.$anonfun$compose$1(Function1.scala:49) [error] at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:62) [error] at sbt.std.Transform$$anon$4.work(Transform.scala:68) [error] at sbt.Execute.$anonfun$submit$2(Execute.scala:282) [error] at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:23) [error] at sbt.Execute.work(Execute.scala:291) [error] at sbt.Execute.$anonfun$submit$1(Execute.scala:282) [error] at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:265) [error] at sbt.CompletionService$$anon$2.call(CompletionService.scala:64) [error] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [error] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [error] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [error] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [error] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [error] at java.lang.Thread.run(Thread.java:750) [error] (signedArtifacts) Failure running 'gpg --batch --pinentry-mode loopback --passphrase *** --detach-sign --armor --use-agent --output /home/runner/work/scala-reflection/scala-reflection/target/scala-3.3.0/scala-reflection-1.2.2.pom.asc /home/runner/work/scala-reflection/scala-reflection/target/scala-3.3.0/scala-reflection-1.2.2.pom'. Exit code: 2 [error] Total time: 17 s, completed Sep 5, 2023 7:45:12 PM Error: Process completed with exit code 1.
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

