如何在Travis CI构建过程中使用gpg2导入私有签名密钥
解决方案
适配GPG 2.x非交互导入私钥的通用方案
GPG 2.x版本默认启用pinentry交互机制,root用户运行时默认强制触发密码验证,CI非交互环境下可通过以下方法绕过弹窗提示:
- 若签名密钥未设置密码短语,直接添加
--batch参数关闭交互模式即可导入:
gpg --batch --import signing.key
- 若签名密钥已设置密码短语,提前将密码存入Travis后台的加密环境变量(禁止明文写入配置文件),通过参数直接传递密码导入:
gpg --batch --passphrase "$GPG_PASSPHRASE" --import signing.key
调整GPG配置永久关闭交互提示
如果需要多次调用GPG命令,可提前修改root用户的GPG配置,后续所有操作都不会触发弹窗:
# 新增GPG配置 echo "allow-loopback-pinentry" >> ~/.gnupg/gpg-agent.conf echo "pinentry-mode loopback" >> ~/.gnupg/gpg.conf # 重启gpg-agent生效 gpgconf --kill gpg-agent
配置生效后直接执行gpg --import signing.key即可正常导入。
Maven项目部署Maven Central的通用实践
针对使用maven-gpg-plugin签名的Java项目,业界通用做法是在插件配置中新增批处理参数,避免构建阶段再次触发密码验证:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-gpg-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <id>sign-artifacts</id> <phase>verify</phase> <goals> <goal>sign</goal> </goals> <configuration> <gpgArguments> <arg>--batch</arg> <arg>--pinentry-mode</arg> <arg>loopback</arg> </gpgArguments> <passphrase>${env.GPG_PASSPHRASE}</passphrase> </configuration> </execution> </executions> </plugin>
如果不想在CI环境中存储密钥文件,也可将密钥做Base64编码后存入加密环境变量,直接从变量读取导入:
echo "$GPG_PRIVATE_KEY" | base64 -d | gpg --batch --import -
内容的提问来源于stack exchange,提问作者Phil Adams
相关产品推荐
相关产品推荐

