How to export credentials from one jenkins instance to another?

59.6k views Asked by At

I am using the credentials plugin in Jenkins to manage credentials for git and database access for my team's builds. I would like to copy the credentials from one jenkins instance to another, independent jenkins instance. How would I go about doing this?

8

There are 8 answers

4
Pedro On BEST ANSWER

UPDATE: TL;DR Follow the link provided below in a comment by Filip Stachowiak it is the easiest way to do it. In case it doesn't work for you go on reading.

Copying the $HUDSON_HOME/credentials.xml is not the solution because Jenkins encrypts paswords and these can't be decrypted by another instance unless both share a common key.

So, either you use the same encription keys in both Jenkins instances (Where's the encryption key stored in Jenkins? ) or what you can do is:

  1. Create the same user/password, you need to share, in the 2nd Jenkins instance so that a valid password is generated
  2. What is really important is that user ids in both credentials.xml are the same. For that (see the credentials.xml example below) for user: Jenkins the identifier <id>c4855f57-5107-4b69-97fd-298e56a9977d</id> must be the same in both credentials.xml

    <com.cloudbees.plugins.credentials.SystemCredentialsProvider plugin="[email protected]">
      <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>
    
4
Bruno Lavit On

Did you try to copy the $JENKINS_HOME/users folder and the $JENKINS_HOME/credentials.xml file to the other Jenkins instance?

4
Madox On

After trying quite a few things for several days this is the best solution I found for migrating my secrets from a Jenkins 2.176 to a new clean Jenkins 2.249.1 jenkins-cli was the best approach for me.

The process is quite simple just dump the credentials from the old instance to a local machine, or Docker pod with java installed, as a XML file (unencrypted) and then uploaded to the new instance.

Before starting you should verify the following:

  • Access to the credentials section on both Jenkins instances
  • Download the jenkins-ccli.jar from one of the instances (https://www.your-jenkins-url.com/cli/)
  • Have User and Password/Token at hand.

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.

Now for the special sauce, you have to execute both parts from the same 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.


# OLD JENKINS DUMP # 

export [email protected]
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

# NEW JENKINS IMPORT # 

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
1
Richard Kiefer On

If you have the credentials.xml available and the old Jenkins instance still running, there is a way to decrypt individual credentials so you can enter them in the new Jenkins instance via the UI. The approach is described over at the DevOps stackexchange by kenorb.

This does not convert all the credentials for an easy, automated migration, but helps when you have only few credentials to migrate (manually).

To summarize, you visit the /script page over at the old Jenkins instance, and use the encrypted credential from the credentials.xml file in the following line:

println(hudson.util.Secret.decrypt("{EncryptedCredentialFromCredentialsXml=}"))
1
Jon-Eric On

To migrate all credentials to a new server, from Jenkins: Migrating credentials:

  1. Stop Jenkins on new server.

    new-server # /etc/init.d/jenkins stop
    
  2. Remove the identity.key.enc file on new server:

    new-server # rm identity.key.enc
    
  3. Copy secret* and credentials.xml to new server.

    current-server # cd /var/lib/jenkins
    current-server # tar czvf /tmp/credentials.tgz secret* credentials.xml
    current-server # scp credentials.tgz $user@$new-server:/tmp/
    
    new-server # cd /var/lib/jenkins
    new-server # tar xzvf /tmp/credentials.tgz -C ./
    
  4. Start Jenkins.

    new-server # /etc/init.d/jenkins start
    
0
Trevor On

This is what worked for me.

Create a job in Jenkins that takes the credentials and writes them to output. If Jenkins replaces the password in the output with ****, just obfuscate it first (add a space between each character, reverse the characters, base64 encode it, etc.)

I used a Powershell job to base64 encode it:

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

And then used Powershell to convert the base64 string back to a regular string:

[text.encoding]::Default.GetString([convert]::FromBase64String("bXlzZWNyZXQ="))
0
Kevin Jacob On

Migrating users from a Jenkins instance to another Jenkins on a new server - I tried following https://stackoverflow.com/a/35603191 which lead to https://itsecureadmin.com/2018/03/26/jenkins-migrating-credentials/. However I did not succeed in following these steps. Further, I experimented exporting /var/lib/jenkins/users (or {JENKINS_HOME}/users) directory to the new instance on new server. After restarting the Jenkins on new server - it looks like all the user credentials are available on new server. Additionally, I cross-checked if the users can log in to the new Jenkins instance. It works for now.

PS: This code is for redhat servers

Old server:

cd /var/lib/jeknins

or cd into wherever your Jenkins home is

tar cvzf users.tgz ./users

New server:

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

I was also facing the same problem. What worked for me is I copied the credentials.xml, config.xml and the secrets folder from existing jenkins to the new instance. After the restart of jenkins things worked fine.