一、简介

在部署完 Jenkins 后首先要准备的就是数据备份问题,尤其是在生产环境下的 Jenkins,如果数据丢失很可能导致项目上线和开发时间受到影响,所以备份数据很重要。还好,Jnekins 中存在数据备份插件 ThinBackup,方便我们通过界面化方式对数据进行备份与恢复。

背景,需要把Jenkins 迁移到另外一台服务器。

二、安装 ThinBackup 插件

Jenkins通过插件ThinBackup来完成自身的备份与恢复。

2.1.插件安装

插件管理直接搜索ThinBackup安装。

安装完成,空闲时重启下。

安装完成

2.2.Settings 备份设置

设置每日凌晨1点执行备份,备份包保存30天。

2.2.1、服务器上先创建备份目录

1
mkdir -p /data/backup/jenkins

2.2.2、设置备份

完整备份写计划任务时,和传统的crontab 计划任务写法有些区别
如果写成 0 1 * * *

根据提示修改就行

2.3、查看备份

1
2
3
4
5
6
7
8
$ pwd
/data/backup/jenkins
$ ll
total 44576
-rw-r--r--. 1 root root 45286477 Apr 19 12:03 BACKUPSET_2019-04-17_10-24_.zip
-rw-r--r--. 1 root root 242632 Apr 19 12:03 BACKUPSET_2019-04-18_01-00_.zip
-rw-r--r--. 1 root root 105308 Apr 19 12:03 BACKUPSET_2019-04-19_01-00_.zip
drwxr-xr-x. 6 root root 4096 Apr 19 12:03 FULL-2019-04-19_12-03

三、恢复备份

3.1 新服务器安装Jenkins

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 安装java
yum -y install java-11-openjdk-devel

# 要验证
/etc/alternatives/java -version
openjdk version "11.0.17" 2022-10-18 LTS
OpenJDK Runtime Environment (Red_Hat-11.0.17.0.8-2.el7_9) (build 11.0.17+8-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-11.0.17.0.8-2.el7_9) (build 11.0.17+8-LTS, mixed mode, sharing)

# 然后是jenkins
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key

# 一定版本要一样,不然太坑
yum install -y jenkins-2.361.3
# 启动
systemctl daemon-reload
systemctl enable --now jenkins
  • 访问Jenkins IP:8080 按照提示安装



选项

1
2
3
4
5
6
7
8
9
# 如果java是二进制安装,目录不一样,则需要修改配置文件 
sed -i '/candidates=/a \/usr/local/jdk/bin/java' /etc/init.d/jenkins
JAVA_OPTS=-Djava.awt.headless=true

# Jenkins home 需要也可以修改,默认安装在/var/lib/jenkins 根目录。
systemctl stop Jenkins
mv /var/lib/jenkins /data/server/jenkins/data
ln -s /data/server/jenkins/data /var/lib/jenkins
systemctl start

3.2 java 版本问题

启动Jenkins 报错

报错:java版本不符

java jkd 11 版本也试过,也会报错,忘记记录了。这边建议使用 java-11-openjdk

3.3 安装插件ThinBackup

上面有写、以及相关设置

四、恢复数据

4.1 拷贝数据、

把备份zip包或者备份时间戳的文件夹,拷贝到新Jenkins的备份路径下/data/backup/jenkins

4.2 操作恢复

登入新的 Jenkins后台
Restore Configuration

五、碰到的问题

5.1 账号密码登入不上

原因,源Jenkins 用的是 ldap 来管理账号密码,Thinbackup 备份的config.xml中ldap密码凭据是之前按旧服务器的,所以我们的重新生成。

思路:

  • 1、备份config.xml (旧Jenkins还原的)
  • 2、用访客登入到管理后台,重新设置连接下ldap
  • 3、Jenkins 配置文件config.xml 会生成新的密码串。
  • 4、把新的密码串换到刚刚备份的 config.xml
  • 5、还原config.xml文件,重启解决问题。
1
2
3
4
5
6
7
8
# Thinbackup 还原后,备份配置文件
cpsave config.xml
# 修改配置文件
<useSecurity>true</useSecurity>
#改成
<useSecurity>false</useSecurity>
# 重启Jenkins
systemctl restart jenkins

进入系统配置ldap

1
2
3
4
5
6
7
8
9
10
# 配置完ldap
# 把config.xml 的passwd
<securityRealm class="hudson.security.LDAPSecurityRealm" plugin="ldap@2.12">
# 下的
<managerPasswordSecret>xxxx
# 还原到之前备份的config.xml
mv config.xml config.xml-bak
mv congfig.xml.save config.xml
# 重启Jenkins
systemctl restart jenkins

用户正常登入和策略都正常了

5.2 凭据失效

因为Jenkins Thinbackup 备份的凭据换一台服务器会无效,所以我们的把所有凭据账号密码都要重新输入密码保存下。

5.3. 反向代理设置有误

jenkins报:反向代理设置有误

系统管理->系统设置->Jenkins URL 改成新服务器的监听地址

5.4、更新插件

系统管理→”插件管理”,更新出现以上错误的组件即可。

插件更新完成,所有报错消失

六、业务报错

6.1、无法加载环境

What do you want to do? You're able to run, edit, delete or create new scripts from here. If you select a script to be executed, you'll be able to select the node where you would like it to run.
The scripts are saved at:
/var/lib/jenkins/scriptler/scripts
Currently you do not have any scripts available. You can import scripts from a remote catalog or create your own.

解决

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cat /var/lib/jenkins/scriptler/scriptler.xml
<?xml version='1.1' encoding='UTF-8'?>
<scriptler plugin="scriptler@3.5">
<scriptSet class="sorted-set">
<script>
<id>subNameSpace.groovy</id>
<name>subNameSpace</name>
<comment></comment>
<parameters/>
<available>true</available>
<nonAdministerUsing>true</nonAdministerUsing>
<onlyMaster>true</onlyMaster>
</script>
</scriptSet>
<disbableRemoteCatalog>false</disbableRemoteCatalog>
<allowRunScriptPermission>false</allowRunScriptPermission>
<allowRunScriptEdit>false</allowRunScriptEdit>

cat /var/lib/jenkins/scriptler/scripts/subNameSpace.groovy
return [":selected", "test-01","prod-01"]

6.2、安装依赖(可选根据自己业务)

这边需要安装node 两个版本
下载二进制包

1
2
tar -xvf node-v14.15.4-linux-x64.tar.xz -C /usr/local/
tar -xvf node-v14.15.4-linux-x64.tar.xz -C /usr/local/

6.2.1 加载node变量报错

/var/lib/jenkins/workspace/mdd-nuxt-index@2@tmp/durable-7f7f445b/script.sh: line 2: /etc/profile.d/node14.sh: No such file or directory

对应的脚本也要拷贝过去

1
2
3
4
5
cat node14.sh 
export NODE_HOME=/usr/local/node-v14.21.1-linux-x64
export PATH=${NODE_HOME}/bin:$PATH
# 给权限
chmod 655 /etc/profile.d/node14.sh

6.2.2 yarn 未装报错

/var/lib/jenkins/workspace/mdd-nuxt-index@2@tmp/durable-02e989cb/script.sh: line 3: yarn: command not found
1
2
source /etc/profile.d/node14.sh
/usr/local/node-v14.21.1-linux-x64/bin/npm install --global yarn

6.3、docker 权限报错

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock

解决

1
chmod 655 /var/run/docker.sock

七、其他

7.1 修改端口

7.1.1 修改1

1
2
3
4
vim /usr/lib/systemd/system/jenkins.service

# 修改为想要的端口
Environment="JENKINS_PORT=8989"

7.1.2 修改2

1
2
3
4
vim /etc/sysconfig/jenkins
# 默认8080
JENKINS_PORT="1xxx"

7.1.3 修改3

1
2
vim /usr/lib/firewalld/services/jenkins.xml
port="1xxx"

7.1.4 修改4

重新加载配置文件

1
2
systemctl daemon-reload
systemctl restart jenkins

7.2 修改用户 (可选)

使用Jenkins用户比较安全,但对应环境复杂,需要调用大量外部接口的,建议使用root

1
2
3
vim /usr/lib/systemd/system/jenkins.service
User=root
Group=root

参考资料
参考资料
参考资料