Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。
持续集成(Continuous Integration, CI)和持续交付/部署(Continuous Delivery/Deployment, CD),下面介绍两种方式部署 Jenkins。
一、环境准备
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 查看防火墙状态
firewall-cmd --state
二、使用 rpm 包安装
1、rpm 包下载
2、Jenkins 和 Java JDK 版本对应关系
Jenkins 是使用 Java 编程语言编写的跨平台应用程序,Jenkins 的运行依赖于Java环境。官网地址

3、安装 java jdk
列出系统中所有与 JDK(Java 开发工具包)相关的软件包
dnf list | grep java | grep jdk
根据上面列出的版本列表自行选择 jdk 版本,推荐安装 java jdk 17
dnf install java-17-openjdk.x86_64 -y
4、安装 jenkins
下载完 rpm 包后放到 linux root 目录下,然后执行下面命令
dnf install jenkins-2.504.2-1.1.noarch.rpm -y
5、设置 Jenkins 开机自启并启动 Jenkins 服务
systemctl enable jenkins --now
6、浏览器访问 Jenkins
(1)访问 http://192.168.31.116:8080/ (虚拟机ip地址,默认端口号8080)。使用下面命令查看登陆密码,密码文件路径可在浏览器查看
cat /var/lib/jenkins/secrets/initialAdminPassword

(2) 点击 安装推荐的插件

(3) 创建管理员用户

(4) 点击 保存并完成,就可以开始使用 Jenkins

7、修改默认端口号(可选)
Jenkins 的默认配置文件 /usr/lib/systemd/system/jenkins.service(新版)或 /etc/sysconfig/jenkins(旧版)
(1)编辑 Jenkins 的默认配置文件
sudo vi /usr/lib/systemd/system/jenkins.service
(2)找到 JENKINS_PORT 参数并修改(例如改为 8081)
Environment="JENKINS_PORT=8081"
(3)重新加载 systemd 配置并重启 Jenkins 服务
sudo systemctl daemon-reload
sudo systemctl restart jenkins
8、jenkins 需要执行 docker 命令
# 在 Linux 系统中,默认情况下 Jenkins 以 jenkins 用户身份运行。
# 检查 Jenkins 用户所属组
id jenkins
# 将 Jenkins 用户添加到 docker 用户组,服务器需要安装 docker
sudo usermod -aG docker jenkins
# 重启 Jenkins 服务
sudo systemctl restart jenkins
# 以 jenkins 用户身份执行 shell,然后执行 docker ps,可以查看 jenkins 是否有权限执行 docker ps
sudo -u jenkins bash
# 根据下面输出可以看出 jenkins 有权限执行 docker 命令
[root@jenkins ~]# sudo -u jenkins bash
bash-5.1$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bash-5.1$ exit
exit
9、其它
# 检查系统中是否存在名为 jenkins 的用户账户
[root@jenkins ~]# cat /etc/passwd | grep jenkins
jenkins:x:993:990:Jenkins Automation Server:/var/lib/jenkins:/bin/false
# 将名为 jenkins 的用户的默认登录 shell 修改为 /bin/bash
sudo usermod -s /bin/bash jenkins
# 恢复 jenkins 用户禁止登录
sudo usermod -s /bin/false jenkins
# 在 Jenkins 服务器上以 jenkins 用户生成密钥:
sudo -u jenkins ssh-keygen -t ed25519 -f /var/lib/jenkins/.ssh/id_ed25519
# 查看公钥内容
sudo -u jenkins cat /var/lib/jenkins/.ssh/id_ed25519.pub
# 将公钥拷贝到目标服务器
sudo -u jenkins ssh-copy-id -i /var/lib/jenkins/.ssh/id_ed25519.pub root@192.168.31.110
三、使用 docker 安装
1、安装 docker
# 添加阿里云docker-ce仓库
dnf config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 列出当前系统中所有可安装的 docker-ce 版本,并按照版本号从高到低进行排序,同时显示重复的版本。
dnf list docker-ce --showduplicates | sort -r
# 安装最新版本 docker-ce,也可以指定版本安装(dnf install -y docker-ce-3:28.1.1-1.el9)
dnf install -y docker-ce
# 启用 Docker Cgroup用于限制进程的资源使用量,如CPU、内存资源
# 创建目录,存放 docker 的配置文件
mkdir -p /etc/docker
# 创建并写入 /etc/docker/daemon.json 文件,设置 Docker 使用 systemd 作为 Cgroup 驱动
# registry-mirrors 配置:docker 镜像加速器的地址列表。
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": [
"https://docker.m.daocloud.io"
]
}
EOF
# 设置 docker 开机自启,并启动 docker
systemctl enable docker --now
2、拉取 Jenkins LTS 镜像
docker pull jenkins/jenkins:lts
3、安装 Jenkins
(1)两种方式
方式 1:使用 Docker Compose 安装(推荐)
① root 目录下创建 jenkins.yaml 文件,内容如下:
version: '3.8'
services:
jenkins:
image: jenkins/jenkins:lts
container_name: jenkins
ports:
- "8080:8080" # Jenkins Web UI 端口
- "50000:50000" # Jenkins 分布式构建端口(可选)
volumes:
- jenkins_home:/var/jenkins_home # 持久化 Jenkins 数据
restart: unless-stopped
volumes:
jenkins_home: # 定义一个名为 jenkins_home 的数据卷
② 启动 jenkins 服务
docker compose -f jenkins.yaml up -d
方式 2: 使用 Docker 直接运行
sudo docker run -d \
--name jenkins \
--restart unless-stopped \
-p 8080:8080 \
-p 50000:50000 \
-v jenkins_home:/var/jenkins_home \
jenkins/jenkins:lts
(2)浏览器中访问 http://192.168.31.116:8080(虚拟机ip地址,默认端口号8080)
# 查看 jenkins 管理员密码
[root@jenkins ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
37bff193c116 jenkins/jenkins:lts "/usr/bin/tini -- /u…" 4 hours ago Up 4 hours 0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp, 0.0.0.0:50000->50000/tcp, [::]:50000->50000/tcp jenkins
# 根据容器 id 进入容器,查看 jenkins 管理员密码
[root@jenkins ~]# docker exec -it 37bff193c116 bash
jenkins@37bff193c116:/$ cat /var/jenkins_home/secrets/initialAdminPassword
2b525474a18041bfad7a81a41c523cac
(3)当 jenkins 中需要执行 docker 命令时
# 获取宿主机的 docker 组 GID,比如这里得到的是 992,下面会使用
getent group docker | cut -d: -f3
# 在宿主机运行以下命令,确认 UID 1000 的用户是否存在:
id -nu 1000 # 应返回 "jenkins" 或其他用户名
# 如果不存在,需先创建用户并指定 UID:
sudo useradd -u 1000 -m jenkins
# 将 UID 1000 的用户加入 docker 组
sudo usermod -aG docker $(id -nu 1000)
# 查看 jenkins 是否有执行 docker ps 的权限
[root@jenkins ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9acb30a66cc7 jenkins/jenkins:lts "/usr/bin/tini -- /u…" About a minute ago Up About a minute 0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp, 0.0.0.0:50000->50000/tcp, [::]:50000->50000/tcp jenkins
[root@jenkins ~]# docker exec -it 9acb30a66cc7 bash
jenkins@9acb30a66cc7:/$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9acb30a66cc7 jenkins/jenkins:lts "/usr/bin/tini -- /u…" 2 minutes ago Up 2 minutes 0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp, 0.0.0.0:50000->50000/tcp, [::]:50000->50000/tcp jenkins
# 如果要重新部署 jenkins 的话,需要先停止并删除之前已经部署的 jenkins
# 停止当前正在运行的 Jenkins 容器
docker stop jenkins
# 删除当前正在运行的 Jenkins 容器
docker rm jenkins
jenkins.yaml 文件修改
version: '3.8'
services:
jenkins:
image: jenkins/jenkins:lts
container_name: jenkins
user: "1000:992"
ports:
- "8080:8080" # Jenkins Web UI 端口
- "50000:50000" # Jenkins 分布式构建端口(可选)
volumes:
- jenkins_home:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
- /etc/localtime:/etc/localtime:ro
restart: unless-stopped
volumes:
jenkins_home: # 定义一个名为 jenkins_home 的数据卷
docker run 命令更改
# jenkins 需要执行 docker 操作
# Docker 容器默认使用 UTC 时间,最简单的方法是将宿主机的时区文件挂载到容器中。这样容器会继承宿主机的时区设置。
# --user 在容器内以 UID=1000、GID=992 的用户身份运行 Jenkins
sudo docker run -d \
--name jenkins \
--restart unless-stopped \
-p 8080:8080 \
-p 50000:50000 \
-v jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-v /etc/localtime:/etc/localtime:ro \
--user "1000:992" \
jenkins/jenkins:lts
(4)其它
# 1. 在 Jenkins 容器内生成 SSH 密钥,发布到其它服务器的时候可以用 ssh 连接
# 进入 Jenkins 容器
docker exec -it jenkins bash
# 生成 SSH 密钥对
mkdir -p ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N "" # 无密码
# 2. 将公钥复制到目标服务器
# 示例: ssh-copy-id -i ~/.ssh/id_ed25519.pub root@192.168.31.110
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@target-server
266

被折叠的 条评论
为什么被折叠?



