方式一、使用 rpm 包安裝
清華大學(xué)開源軟件鏡像站
rpm包地址:https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/jenkins-2.492.3-1.1.noarch.rpm
# 下載完 rpm 包后放到 linux root 目錄下
# Jenkins 需要 Java 運行環(huán)境
# 列出系統(tǒng)中所有與 JDK(Java 開發(fā)工具包)相關(guān)的軟件包
dnf list | grep java | grep jdk
# 安裝 java jdk 17
dnf install java-17-openjdk.x86_64 -y
# 安裝 jenkins
dnf install jenkins-2.492.3-1.1.noarch.rpm
# 安裝 git 版本控制系統(tǒng)軟件
dnf install git -y
# 設(shè)置 Jenkins 開機自啟
systemctl enable jenkins
# 開啟 Jenkins 服務(wù)
systemctl start jenkins
# 訪問 http://192.168.31.112:8080/ (虛擬機ip地址,端口號8080)
# 查看登陸密碼
cat /var/lib/jenkins/secrets/initialAdminPassword
# 檢查系統(tǒng)中是否存在名為 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
# 恢復(fù) jenkins 用戶禁止登錄
sudo usermod -s /bin/false jenkins
# 在 Jenkins 服務(wù)器上以 jenkins 用戶生成密鑰:
sudo -u jenkins ssh-keygen -t ed25519 -f /var/lib/jenkins/.ssh/id_ed25519
# 查看公鑰內(nèi)容
sudo -u jenkins cat /var/lib/jenkins/.ssh/id_ed25519.pub
# 將公鑰拷貝到目標服務(wù)器
sudo -u jenkins ssh-copy-id -i /var/lib/jenkins/.ssh/id_ed25519.pub root@192.168.31.110
# 在 Linux 系統(tǒng)中,默認情況下 Jenkins 以 jenkins 用戶身份運行。
# 檢查 Jenkins 用戶所屬組
id jenkins
# 將 Jenkins 用戶添加到 docker 用戶組
sudo usermod -aG docker jenkins
# 重啟 Jenkins 服務(wù)
sudo systemctl restart jenkins
# 以 jenkins 用戶身份執(zhí)行 shell,然后執(zhí)行 docker ps,可以查看 jenkins 是否有權(quán)限執(zhí)行 docker ps
sudo -u jenkins bash
方式二、使用 docker 安裝
1、安裝 docker
# 添加阿里云docker-ce倉庫
dnf config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 列出當前系統(tǒng)中所有可安裝的 docker-ce 版本,并按照版本號從高到低進行排序,同時顯示重復(fù)的版本。
dnf list docker-ce --showduplicates | sort -r
# 安裝最新版本 docker-ce,也可以指定版本安裝(dnf install -y docker-ce-20.10.15-3.el9.x86_64)
dnf install -y docker-ce
# 啟用Docker Cgroup用于限制進程的資源使用量,如CPU、內(nèi)存資源
# 創(chuàng)建目錄,存放 docker 的配置文件
mkdir /etc/docker
# 創(chuàng)建并寫入 /etc/docker/daemon.json 文件,設(shè)置 Docker 使用 systemd 作為 Cgroup 驅(qū)動
# registry-mirrors 配置:docker 鏡像加速器的地址列表。
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": [
"https://qa9ktbtj.mirror.aliyuncs.com",
"https://docker.m.daocloud.io",
"https://docker.mirrors.ustc.edu.cn",
"https://www.daocloud.io/mirror"
]
}
EOF
# 設(shè)置 docker 開機自啟
systemctl enable docker
# 啟動 docker
systemctl start docker
# 查看 docker 狀態(tài)
systemctl status docker
2、下載 jenkins
docker pull jenkins/jenkins:lts
3、安裝 jenkins
方式 1: 使用 Docker 直接運行
# 不需要執(zhí)行 docker 操作
sudo docker run -d \
--name jenkins \
--restart always \
-p 8080:8080 \
-p 50000:50000 \
-v jenkins_home:/var/jenkins_home \
jenkins/jenkins:lts
# 需要執(zhí)行 docker 操作
# Docker 容器默認使用 UTC 時間,最簡單的方法是將宿主機的時區(qū)文件掛載到容器中。這樣容器會繼承宿主機的時區(qū)設(shè)置。
# --user 查看下面?zhèn)渥?sudo docker run -d \
--name jenkins \
--restart always \
-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:993" \
jenkins/jenkins:lts
方式 2:使用 Docker Compose 安裝(推薦)
root 目錄下創(chuàng)建 jenkins.yaml 文件,內(nèi)容如下:
version: '3.8'
services:
jenkins:
image: jenkins/jenkins:lts
container_name: jenkins
ports:
- "8080:8080" # Jenkins Web UI 端口
- "50000:50000" # Jenkins 分布式構(gòu)建端口(可選)
volumes:
- jenkins_home:/var/jenkins_home # 持久化 Jenkins 數(shù)據(jù)
restart: always # 容器崩潰時自動重啟
volumes:
jenkins_home: # 定義一個名為 jenkins_home 的數(shù)據(jù)卷
# 啟動 jenkins 服務(wù)
docker compose -f jenkins.yaml up -d
# 瀏覽器中訪問 http://192.168.31.112:8080
# 查看 jenkins 管理員密碼
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
備注:當 jenkins 中添加的任務(wù)需要執(zhí)行 docker 命令的時候,需要執(zhí)行下面的命令
# 獲取宿主機的 docker 組 GID
getent group docker | cut -d: -f3
# 在宿主機運行以下命令,確認 UID 1000 的用戶是否存在:
id -nu 1000 # 應(yīng)返回 "jenkins" 或其他用戶名
# 如果不存在,需先創(chuàng)建用戶并指定 UID:
sudo useradd -u 1000 -m jenkins
# 將 UID 1000 的用戶加入 docker 組
sudo usermod -aG docker $(id -nu 1000)
# 查看 jenkins 是否有執(zhí)行 docker ps 的權(quán)限
[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
# 1. 在 Jenkins 容器內(nèi)生成 SSH 密鑰,發(fā)布到其它服務(wù)器的時候可以用 ssh 連接
# 進入 Jenkins 容器
docker exec -it jenkins bash
# 生成 SSH 密鑰對
mkdir -p ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N "" # 無密碼
# 2. 將公鑰復(fù)制到目標服務(wù)器
# 示例: ssh-copy-id -i ~/.ssh/id_ed25519.pub root@192.168.31.110
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@target-server
# jenkins.yaml 內(nèi)容添加 user: "1000:993"(UID 1000:docker 組 GID 993)
version: '3.8'
services:
jenkins:
image: jenkins/jenkins:lts
container_name: jenkins
user: "1000:993"
ports:
- "8080:8080" # Jenkins Web UI 端口
- "50000:50000" # Jenkins 分布式構(gòu)建端口(可選)
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: always # 容器崩潰時自動重啟
volumes:
jenkins_home: # 定義一個名為 jenkins_home 的數(shù)據(jù)卷