0

我正在尝试将我的整个 Jenkins 配置从 RHEL 6.7 复制到 RHEL 6.9 ,这样做一切看起来都很好,但只有一个 jenkins 构建失败并出现以下错误

Enter pass phrase: 
can't connect to `/usr/share/tomcat6/.gnupg/S.gpg-agent': No such file or directory
gpg: skipped "Credit": Bad passphrase
gpg: signing failed: Bad passphrase
Pass phrase check failed 

gpg 私钥 1.4.5 存在于 jenkins 配置中。奇怪的是,所有其他构建都能够签署 rpm,但只有一个构建失败。

谁知道怎么修它 ?

4

2 回答 2

0

RPM 使用 getpass(3) 读取密码并通过附加的文件描述符发送到 gnupg。

这产生了两个需要通过自动化签名机制来处理的问题:

1) 某些版本的 rpm 使用 getpass(3),它将使用 tty(禁用回显)并且需要设置伪 tty,以便可以将自动密码传递给 RPM。确保您已安装 pty 文件系统,并且 expect(1) 是设置 pty 以读取密码的一种方法。还有另一种使用 /proc 文件描述符的方法,可以在 linux 上尝试。然后使用 --passphrase-fd 将密码发送到 gnupg。

2) gnupg2 还可以在单​​独的代理进程中处理持久密码,这有时很难设置并保持“自动”运行,因为检测取决于用户/进程 ID。即使您提到 1.4.5(似乎使用 gnupg1),您的报告似乎也有一个代理(这意味着 gnupg2 或特殊的 gpg1 配置)。

于 2017-07-24T10:16:01.610 回答
0

我在您的日志中看到两个需要解决的单独问题。

无法连接到`/usr/share/tomcat6/.gnupg/S.gpg-agent':没有这样的文件或目录

gpg-agent需要在构建主机上作为守护进程运行,它将连接到套接字以侦听请求。也许它已经在运行,但是 Jenkins 正在错误的目录中寻找它的套接字,因为GNUPGHOME它被设置为一些不寻常的值。或者可能gpg-agent没有运行,需要启动一个新实例。

类似此脚本的内容可用于安全地附加到现有gpg-agent实例或启动新实例。

#!/bin/bash

# Decide whether to start gpg-agent daemon.
# Create necessary symbolic link in $GNUPGHOME/.gnupg/S.gpg-agent

SOCKET=S.gpg-agent
PIDOF=`pgrep gpg-agent`
RETVAL=$?

if [ "$RETVAL" -eq 1 ]; then
    echo "Starting gpg-agent daemon."
    eval `gpg-agent --daemon `
else
    echo "Daemon gpg-agent already running."
fi

# Nasty way to find gpg-agent's socket file...
GPG_SOCKET_FILE=`find /tmp/gpg-* -name $SOCKET`
echo "Updating socket file link."
cp -fs $GPG_SOCKET_FILE $GNUPGHOME/.gnupg/S.gpg-agent

您可能需要替换pgreppidof,具体取决于您的外壳。

如果您最终启动了一个新代理,您可以通过运行来检查您的密钥是否已加载到其中gpg --list-keys。如果您没有看到它列出,您需要使用添加它gpg --import。按照 Jenkins 文档使用凭证

解决gpg-agent问题可能会解决您的其他问题,因此请先检查您的工作是否正常,然后再执行其他任何操作。

参考:

gpg:跳过“信用”:密码错误

GPG 密钥受密码保护。rpm要求输入此密码并希望手动输入。当然,Jenkins 是以非交互方式运行的,所以这是不可能的。我们需要某种方式来提供密码短语,rpm以便它可以将其转发到gpg,否则我们需要gpg通过某种缓存机制直接提供密码短语。

期望方法

rpm --addsign通过将我们的调用包装在一个期望脚本中,我们可以使用expect无头输入密码。这种做法相当普遍。假设以下脚本名为rpm_sign.exp

#!/usr/bin/expect -f

set password [lindex $argv 0]
set files [lrange $argv 1 1]
spawn rpm --define --addsign $files
expect "Enter pass phrase:"
send -- "$password\r"
expect eof

此脚本可在 Jenkins shell 步骤或管道中使用,如下所示:

echo "Signing rpms ..."
sh "./rpm_sign.exp '${GPG_PASSPHRASE}' <list-of-files>"

请注意,通过一些修改,可以指定您希望使用哪个 GPG 身份来签署您的 RPM。这是通过--define {_gpg_name $YOUR_KEY_ID_HERE}在包装脚本中作为参数传递给 rpm 来完成的。注意TCL语法。由于我们在 Jenkins 上执行此操作,它可能提供多组凭据,我认为这是相关信息。

参考:

其他方法

还有其他解决方案可能更适合您的配置。一种这样的解决方案是使用RpmSignPlugin,它expect在引擎盖下使用。其他解决方案可以在unix.stackexchange.com上的这篇帖子中找到。

于 2020-01-15T23:46:32.150 回答