如何将凭据从一个詹金斯实例导出到另一个实例?

How to export credentials from one jenkins instance to another?

我正在使用 Jenkins 中的凭据插件来管理 git 的凭据和我团队构建的数据库访问。我想将凭据从一个 jenkins 实例复制到另一个独立的 jenkins 实例。我该怎么做?

您是否尝试将 $JENKINS_HOME/users 文件夹和 $JENKINS_HOME/credentials.xml 文件复制到另一个 Jenkins 实例?

更新:TL;DR 按照 Filip Stachowiak 评论中提供的 link 进行操作,这是最简单的方法去做吧。如果它对您不起作用,请继续阅读。

复制 $HUDSON_HOME/credentials.xml 不是解决方案,因为 Jenkins 会加密密码,除非它们共享一个公共密钥,否则无法被另一个实例解密。

因此,要么在两个 Jenkins 实例 ( ) 中使用相同的加密密钥,要么您可以做的是:

  1. 创建相同的user/password,您需要在第 2 个 Jenkins 实例中共享,以便生成有效密码
  2. 真正重要的是 credentials.xml 中的用户 ID 是相同的。为此(参见下面的 credentials.xml 示例)用户:Jenkins 标识符 <id>c4855f57-5107-4b69-97fd-298e56a9977d</id> 在两个 credentials.xml

    中必须相同
    <com.cloudbees.plugins.credentials.SystemCredentialsProvider plugin="credentials@1.22">
      <domainCredentialsMap class="hudson.util.CopyOnWriteMap$Hash">
        <entry>
          <com.cloudbees.plugins.credentials.domains.Domain>
            <specifications/>
          </com.cloudbees.plugins.credentials.domains.Domain>
          <java.util.concurrent.CopyOnWriteArrayList>                
            <com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl>
              <scope>GLOBAL</scope>
              <id>c4855f57-5107-4b69-97fd-298e56a9977d</id>
              <description>Para SVN</description>
              <username>jenkins</username>
              <password>J1ztA2vSXHbm60k5PjLl5jg70ZooSFKF+kRAo08UVts=    
              </password>                        
            </com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl>
          </java.util.concurrent.CopyOnWriteArrayList>
        </entry>
      </domainCredentialsMap>
    </com.cloudbees.plugins.credentials.SystemCredentialsProvider>
    

我也遇到了同样的问题。对我有用的是我将 credentials.xml、config.xml 和 secrets 文件夹从现有的 jenkins 复制到新实例。重启 jenkins 后一切正常。

这对我有用。

在 Jenkins 中创建一个获取凭据并将其写入输出的作业。如果Jenkins将输出中的密码替换为****,那么先混淆一下即可(每个字符之间加一个space,字符倒转,base64编码等)

我使用 Powershell 作业对其进行 base64 编码:

[convert]::ToBase64String([text.encoding]::Default.GetBytes($mysecret))

然后使用 Powershell 将 base64 字符串转换回常规字符串:

[text.encoding]::Default.GetString([convert]::FromBase64String("bXlzZWNyZXQ="))

在尝试了好几天之后,这是我找到的将我的秘密从 Jenkins 2.176 迁移到新的干净的 Jenkins 2.249.1 的最佳解决方案jenkins-cli 对我来说是最好的方法。

这个过程非常简单,只需将凭证从旧实例转储到本地机器,或安装了 java 的 Docker pod,作为 XML 文件(未加密)和然后上传到新实例。

开始之前,您应该验证以下内容:

Notice: In case your jenkins uses an oAuth service you will need to create a token for your user. Once logged into jenkins at the top right if you click your profile you can verify both username and generate password.

现在对于特殊酱料,您必须从同一个 machine/pod:

执行两个部分

Notice: If your instances are using valid Certificates and you want to secure your connection you must remove the -noCertificateCheck flag from both commands.


# 旧 JENKINS 转储 #

export USER=madox@example.com
export TOKEN=f561banana6ead83b587a4a8799c12c307
export SERVER=https://old-jenkins-url.com/

java -jar jenkins-cli.jar -noCertificateCheck -s $SERVER -auth $USER:$TOKEN list-credentials-as-xml "system::system::jenkins" > /tmp/jenkins_credentials.xml

# 新 JENKINS 导入 #

export USER=admin
export TOKEN=admin
export SERVER=https://new-jenkins-url.com/

java -jar jenkins-cli.jar -noCertificateCheck -s $SERVER -auth $USER:$TOKEN import-credentials-as-xml "system::system::jenkins" < /tmp/jenkins_credentials.xml

如果您有 credentials.xml 可用并且旧的 Jenkins 实例仍然 运行,则有一种方法可以解密个人凭据,因此您可以通过 [=21] 在新的 Jenkins 实例中输入它们=]. DevOps stackexchange by kenorb.

中描述了该方法

这不会转换所有凭据以实现简单的自动迁移,但在您只有很少的凭据要迁移(手动)时会有所帮助。

总而言之,您在旧的 Jenkins 实例上访问 /script 页面,并在以下行中使用来自 credentials.xml 文件的加密凭证:

println(hudson.util.Secret.decrypt("{EncryptedCredentialFromCredentialsXml=}"))

将用户从一个 Jenkins 实例迁移到新服务器上的另一个 Jenkins - 我尝试关注 which lead to https://itsecureadmin.com/2018/03/26/jenkins-migrating-credentials/。但是我没有成功执行这些步骤。 此外,我尝试将 /var/lib/jenkins/users(或 {JENKINS_HOME}/users)目录导出到新服务器上的新实例。在新服务器上重新启动 Jenkins 后 - 看起来所有用户凭据都在新服务器上可用。 此外,我交叉检查了用户是否可以登录到新的 Jenkins 实例。目前有效。

PS: 此代码适用于 redhat 服务器

旧服务器:

cd /var/lib/jeknins

cd 进入您 Jenkins 家所在的任何地方

tar cvzf users.tgz ./users

新服务器:

cd /var/lib/jeknins 
scp <user>@<oldserver>:/var/lib/jenkins/user.tgz ~/var/lib/jenkins/.
sudo tar xvzf users.tgz
systemctl restart jenkins