一、概念引入
1. DevOps 的概念
定义:开发( Developmen**)与运维(** Operations**)一体化** 的理念、流程、工具、文化的集合。DevOps 是一套打破开发、测试、运维部门壁垒 ,通过自动化流程、协作文化、工具链,实现软件快速迭代、稳定交付、持续优化的工作模式。
**核心目标:**缩短从代码提交到业务上线的周期,同时提升系统稳定性(对应实验:从开发机写代码→GitLab 提交→Jenkins 构建→Harbor 存镜像→WebServer 部署,全流程无人工手动拷贝 / 配置,就是 DevOps 的最小落地闭环)。
通俗理解:开发写完代码,不用「丢给运维说'你部署吧'」,而是通过自动化流程,开发和运维共同对最终交付负责。
2. CI/CD 的概念
- CI 持续集成(Continuous Integration)
-
定义:开发频繁提交代码到仓库,系统自动完成:拉取代码→编译构建→代码检查→自动化测试。
-
作用:多人协作频繁合并代码,提前发现 bug、代码冲突,保证代码质量。
-
对应实验环节:开发机代码
git push到 GitLab,若配置 Jenkins 触发「代码拉取 + 语法检查」(实验中简化为直接构建镜像),就是 CI 的核心动作 ------保证每次提交的代码是「可集成、无基础错误」的。
- CD 两层含义
(1)持续交付(Continuous Delivery) CI 流程跑完后,自动生成可部署安装包 / 镜像(如实验中的 Docker 镜像) ,发布到测试、预发环境,生产上线由人工确认。
(2)持续部署(Continuous Deployment) 在持续交付基础上,全程全自动,测试通过直接部署到生产,无需人工干预。(实验中 Jenkins 直接 SSH 部署到 WebServer,就是持续部署的简化版)
对应实验环节:Jenkins 构建 Docker 镜像→推送到 Harbor→SSH 部署到 WebServer,完整覆盖「交付制品→部署上线」的 CD 流程。
- CI/CD = 代码提交到上线的全流程自动化。
3. DevOps 系统架构

这张图清晰展示了一个从代码提交到用户访问的完整 DevOps 自动化发布流程,我们分两部分拆解原理:
(1)用户访问流程(上半部分)
这部分是业务系统的运行架构,负责处理用户请求:
-
**客户端发送访问请求:**用户通过浏览器 / APP 发起对 Web 服务的访问请求。
-
**负载均衡入口:**请求首先到达负载均衡器(如 Nginx、HAProxy、SLB),它会根据预设策略(轮询、权重等)将请求分发到后端的 Web 节点,避免单点压力,提升系统可用性与性能。
-
**WEB 集群:**由多台 Web 服务器组成的集群,负载均衡分发的请求会被其中一台节点处理,执行业务逻辑并返回响应给用户。
(2)自动化发布流程(下半部分)
这部分是CI/CD 流水线,实现代码从提交到部署的自动化:
-
**开发者提交代码:**开发人员完成功能开发后,将代码提交到代码仓库 GitLab。
-
GitLab 代码托管与触发: GitLab 作为代码仓库,不仅存储代码,还可以通过 Webhook(钩子),在代码被提交 / 合并时,自动触发后续的 Jenkins 构建任务。(图中的
GitLab Runner是 GitLab CI/CD 的执行器,也可直接用于流水线构建,这里作为代码仓库与 CI 流程的核心枢纽) -
**Jenkins 拉取代码并构建部署:**Jenkins 是主流的CI/CD工具,流程如下:
-
收到 GitLab 的触发信号后,Jenkins 从 GitLab 拉取最新代码;
-
执行预设的流水线任务:编译、打包、单元测试、代码扫描;
-
构建完成后,将打好的包部署到上方的WEB 集群中(如通过 SSH、Ansible、K8s API 等方式);
-
最终,新的代码版本就会在 Web 集群上生效,用户的访问请求会被更新后的服务处理。
-
二、本次实验的系统架构
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│ 开发机 │─▶│ GitLab │─▶│ Jenkin │─▶│ Web Server │
│172.25.254.30 │ │172.25.254.31│ │172.25.254.33│ │172.25.254.34│
└─────────┘ └─────────┘ └─────────┘ └─────────┘
│ │
│ ┌───┴─────┐
│ │ Harbor │
└───────▶ │172.25.254.32 │
└─────────┘
1. IP 规划
| 角色 | IP地址 | 说明 |
|---|---|---|
| dev | 172.25.254.30 | 开发机,提交代码到代码仓库 2G |
| GitLab | 172.25.254.31 | 代码仓库,4G内存 |
| Harbor | 172.25.254.32 | Docker镜像仓库2G |
| Jenkins | 172.25.254.33 | CI/CD服务器4G |
| Web Server | 172.25.254.34 | 部署目标服务器2G |
三、环境版本说明
1. 软件版本汇总
| 软件 | 版本 | 说明 |
|---|---|---|
| 操作系统 | RHEL 9.6 / | 推荐使用RHEL 9.x系列 |
| GitLab | 17.x ( Omnibus ) | 最新稳定版 |
| Harbor | 2.10.2 | 推荐使用v2.x版本 |
| Jenkins | 2.541.2 | LTS长期支持版 |
| Docker | 29.3.0 | 最新稳定版 |
| Docker Compose | 2.24.0+ | 随docker-ce安装 |
| OpenJDK | 21+ | Java21 |
| Nginx | 1.25.x (Alpine) | 容器内嵌版本 |
| Git | 2.43.x | 系统自带 |
2. 各软件官方下载链接
GitLab: https://packages.gitlab.com/gitlab/gitlab-ce
Harbor: https://github.com/goharbor/harbor/releases
Jenkins: https://pkg.jenkins.io/redhat-stable/
Docker: https://docs.docker.com/engine/install/
OpenJDK: https://openjdk.org/
四、基础环境准备
- 关闭防火墙和SELinux(所有主机)
bash
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭SELinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
- 配置本地YUM源(所有主机)
bash
]# vim /etc/yum.repos.d/rhel.repo
[AppStream]
name = AppStream
baseurl = file:///mnt/AppStream
gpgcheck = 0
[BaseOS]
name = BaseOS
baseurl = file:///mnt/BaseOS
gpgcheck = 0
]# mount /dev/sr0 /mnt
mount: /mnt: WARNING: source write-protected, mounted read-only.
# 清理缓存
yum clean all
yum makecache
五、Docker 安装与配置
服务器:harbor(172.25.254.32)、Jenkins(172.25.254.33)、webserver(172.25.254.34)
- 安装docker
bash
# 安装依赖
#yum-utils提供 yum-config-manager 工具,用于添加 Docker 官方软件源。
#device-mapper-persistent-data存储设备映射的持久化数据,是 Docker 底层存储驱动依赖。
#lvm2逻辑卷管理工具,配合 Docker 使用 devicemapper 存储驱动。
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加Docker阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装Docker(指定版本)
# 查看可用版本:yum list docker-ce --showduplicates | sort -r
yum install -y docker-ce
# 启动Docker
systemctl enable docker
systemctl start docker
- 配置Docker阿里云镜像加速器
bash
# 创建docker配置目录
mkdir -p /etc/docker
# 配置镜像加速器
cat > /etc/docker/daemon.json << 'EOF'
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.xuanyuan.cn",
"https://registry.docker-cn.com",
"https://mirror.ccs.tencentyun.com"
],
"insecure-registries": ["172.25.254.32"] # Docker私有仓库地址
}
EOF
# 重启Docker
systemctl daemon-reload
systemctl restart docker
# 验证加速器是否生效
docker info | grep -A 10 "Registry Mirrors"
国内常用Docker镜像加速器:
| 加速器地址 | 提供商 |
|---|---|
| https://docker.1ms.run | 民间加速器 |
| https://docker.xuanyuan.cn | 玄学加速器 |
| https://registry.docker-cn.com | Docker官方中国镜像 |
| https://mirror.ccs.tencentyun.com | 腾讯云镜像 |
| https://mirror.azure.cn | Azure中国镜像 |
六、GitLab部署(172.25.254.31)
1. 安装GitLab
版本:GitLab CE 17.x
bash
#编写yum源
cat > /etc/yum.repos.d/gitlab.repo <<end
[gitlab]
name=gitlab-ce
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el9/
enabled=1
gpgcheck=0
end
#安装
yum install -y gitlab-ce
#配置
vim /etc/gitlab/gitlab.rb
external_url 'http://172.25.254.31'
#http://172.25.254.31必须是 GitLab 所在服务器的实际网卡 IP
#使配置生效,重新启动gitlab-ce(更改过设置,重新启动,首次配置约需3-5分钟)
gitlab-ctl reconfigure
gitlab-ctl restart
#查看状态
gitlab-ctl status
#查看初始密码,用于登录
awk '/^Password/ {print $NF}' /etc/gitlab/initial_root_password
Z6/rtGs5eNP2o2E3IJWcv0qV3xpCc7srNmWZ3ZtDER0=
无法访问gitlab------修复步骤
bash
# 1. 等待 GitLab 完全初始化(关键!)
sleep 300 # 等待 5 分钟
# 2. 本地测试 Nginx 访问
curl -I http://127.0.0.1
# 3. 若仍 502,重启 Nginx + Puma
gitlab-ctl restart nginx puma
# 4. 关闭防火墙/SELinux 测试
systemctl stop firewalld
setenforce 0
| 核心结论 | 关键操作 |
|---|---|
| 所有组件正常运行,无报错 / 内存不足 | 优先等待 3-5 分钟,让 GitLab 完成初始化 |
| 本地测试是关键 | 用 curl 分别测试 80/8080 端口,定位 502 发生在 Nginx 还是 Puma |
| 网络拦截是兜底问题 | 临时关闭防火墙 / SELinux 验证,再永久配置 |
2. 初始化GitLab
第一步:访问GitLab
-
打开浏览器,输入:http://172.25.254.31
-
等待服务启动(约2-3分钟)

第二步:修改root密码


第三步:登录
-
用户名:
root -
密码:
redhat123 -
点击"Sign in"
3. GitLab页面配置 - 创建项目
第一步:创建新项目
-
登录后,点击左上角"Menu" → 选择"Projects"
-
点击页面上的"New project"按钮(蓝色)


第二步:填写项目信息
-
Project name(项目名称):
hello-web -
Project URL(项目URL):自动填充为
/root/hello-web -
Description(描述,可选):填写项目描述
-
Visibility Level(可见级别):选择"Public"
-
勾选"Initialize repository with a README":不勾选(我们手动推送代码)
-
点击"Create project"

七、Harbor部署 (172.25.254.32)
1. 获取docker-compose文件
bash
wget https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-linux-x86_64
# 移动位置
mv docker-compose-linux-x86_64 /usr/bin/docker-compose
# 添加执行权限
chmod +x /usr/bin/docker-compose
# 查看版本
docker-compose version
2. 获取harbor
bash
wget https://github.com/goharbor/harbor/releases/download/v2.4.1/harbor-offline-installer-v2.4.1.tgz
# 解压
tar -zxf harbor-offline-installer-v2.14.0.tgz
cd harbor
# 复制配置文件
cp harbor.yml.tmpl harbor.yml
# 修改配置
vim harbor.yml
# 第5行:hostname改为服务器IP
hostname: 172.25.254.32
# https related config
#https: 注释
# https port for harbor, default is 443
# port: 443 注释
# The path of cert and key files for nginx
# certificate: /your/certificate/path 注释
# private_key: /your/private/key/path 注释
3. 启动harbor
bash
# 运行安装脚本
./install.sh
# 启动Harbor(后台运行)
docker-compose up -d
# 查看状态
docker-compose ps
Harbor容器列表:
| 容器名 | 镜像 | 说明 |
|---|---|---|
| harbor-core | harbor-core:v2.10.2 | 核心服务 |
| harbor-db | harbor-db:v2.10.2 | 数据库 |
| harbor-jobservice | harbor-jobservice:v2.10.2 | 任务服务 |
| harbor-log | harbor-log:v2.10.2 | 日志服务 |
| harbor-portal | harbor-portal:v2.10.2 | Web界面 |
| nginx | nginx:1.25 | 反向代理 |
| redis | redis:7.2 | 缓存 |
| registry | registry:2.8 | 镜像仓库 |
2. harbor页面配置
第一步:访问Harbor
-
打开浏览器,输入:
http://172.25.254.32 -
用户名:
admin -
密码:
Harbor12345 -
点击"Log in"
第二步:创建项目
-
登录后,点击"Projects"(项目)
-
点击"New Project"(新建项目)
-
填写:
-
Project Name(项目名):
library -
Access Level(访问级别):选择"Public"(公开)
-
-
点击"OK"
八、Jenkins部署
1. 安装docker(已配置加速器,见五)
2. 安装Jenkins
版本:Jenkins 2.541.2 (LTS)
https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos
根据这个页面重新部署jenkins
bash
wget -O /etc/yum.repos.d/jenkins.repo \
https://pkg.jenkins.io/rpm-stable/jenkins.repo
# 为 Jenkins 包添加所需的依赖项
yum install fontconfig java-21-openjdk
cd /etc/yum.repo.d
yum install jenkins
systemctl daemon-reload
# 启动Jenkins
systemctl enable jenkins
systemctl start jenkins
yum install git -y
Jenkins版本说明:
- Jenkins: 2.541.2 (LTS)
更换插件地址
bash
[root@jenkisn-server ~]# cd /var/lib/jenkins/updates
[root@jenkisn-server updates]# sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
3. Jenkins页面配置
第一步:解锁Jenkins
-
打开浏览器,输入:
http://172.25.254.33:8080 -
会看到"Unlock Jenkins"页面
-
获取初始管理员密码:cat /var/lib/jenkins/secrets/initialAdminPassword
-
将密码粘贴到页面输入框
-
点击"Continue"
第二步:安装插件
-
选择"Install suggested plugins"(安装推荐的插件)
-
等待插件安装完成(约5-10分钟)
-
如果部分插件安装失败,可以跳过(因为无法访问外网)

第三步:创建管理员用户
- 安装完成后,输入:
-
Username:
admin -
Password:
redhat123 -
Confirm password:
redhat123 -
Full name:
Admin -
Email:
admin@example.com
- 点击"Save and Continue"

第四步:配置Jenkins URL
-
Jenkins URL:
http://172.25.254.33:8080 -
点击"Save and Finish"

第五步:开始使用Jenkins
- 点击"Start using Jenkins"

4. 登录使用harbor
jenkins(172.25.254.33)
docker login 192.168.223.22
Username: admin
Password: 默认密码 Harbor12345
webserver(172.25.254.34)
docker login 192.168.223.22
Username: admin
Password: 默认密码 Harbor12345
5. 配置jenkins使用docker
在jenkins(172.25.254.33)主机上配置
bash
# 验证系统中是否有jenkins用户(默认jenkins用户不能使用docker命令)
grep jenkins /etc/passwd
jenkins:x:997:995:Jenkins Automation Server:/var/lib/jenkins:/bin/false
# 验证系统中是否有docker用户及用户组
grep docker /etc/group
docker:x:993:
# 添加jenkins用户到docker用户组
usermod -G docker jenkins
grep docker /etc/group
docker:x:993:jenkins
# 重启jenkins服务
systemctl restart jenkins
6. 配置凭证
6.1 Dev 主机(172.25.254.30)生成 SSH 密钥对
bash
# 生成无密码SSH密钥对(-f指定路径,-P''空密码,-q静默模式)
ssh-keygen -f ~/.ssh/id_rsa -P '' -q
# 查看生成的公钥(后续复制到GitLab)
cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDRy67jj7u/jEtzrMYIXd/r0VBTYTa11YYymEtAUp/Tp0bmj7TmQTDR+p0U5lUbm8FdG3r42S7paDbky0RStpik411jfSOllyvCVl4zKx0yQh0uTbDl2ryRfEohuD9Ls9Da9CsPoULo9OV4CbiDL4odFwi5D6pjOmpzNDhr9aW2ti79xFhsje6AWZEjmaCCK5D9mVEMu8tmofukLgnWDJd5QUMOIrmJnKGZX9kJkQ6aqCY7FhRdvhseohuNdvjltCwJLtPwOpCRVLL73V1shOJVKJJgHWA74ZfUkfxVrwGgNEiUDlbMHYJM2rptjj84bnHVC+xr+AJxzRp1up+bjdDxy0+lPvWTeCZfK4NTo+71/kDcfBVNBDOknRRsfcEWOT2jd4CziMvTv8tVr8lwWi5+zrdYJ4qCWjJt13ALgTC4+nwtFxg1aeNYO2qTjDdNB7qEv/dG2g4hVOOfD5gF3wJAHZtisfrJWbxfQeSfeCQ49xEZtNqcwN4axDE+nwurgbs= root@dev

6.2 Jenkins/GitLab SSH 密钥配置(Jenkins 免密拉取代码)
步骤 1:Jenkins 机(172.25.254.33)生成 SSH 密钥对
bash
# 切换到jenkins用户(Jenkins服务默认运行用户,避免权限问题)
su - jenkins -s /bin/bash
# 生成无密码SSH密钥对
ssh-keygen -f ~/.ssh/id_rsa -P '' -q
# 查看公钥(复制到GitLab)
cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDWrfJvK9Ar39uK1BeK0jcVCVBAauG9Oj0Dn7B3Qi5G+Z/xWYltD+CQNt1P84tBYfa3VP9Y4Ov4hmPNki1tiNqt+D5v1QH1uLqvH35AniMKOczJKBsjBtVRO16dHakTeCzMOTvf+cO3MQfoSYwAUTi5e4Ugd24F3tgSPxSUtgP0FTxEICizgBbQna/K+PleyVeQ0ICCsUZUdyCO9zWzdRY3rdiAWBSHMF2O3YjCfb13cL6Kq6JHiFeWzJs1BdJ3q67SUr1SHs1RXO1MnZE7SjCjqoZOPM8SfStTRFN2cB4WNI4IZixuHBnde0lZ9m3ke3b/HztUuRI7u5mZtXBLjD4++muaRzBbd0rwuw0rNJ0BPbn9hGK2p8N834Ve/tBXbX+AJUecdVt7fvEhTFuK0/a5morKUhWK95k0aU0ckxdP3+U2CcdjePQfl0yl5QYERD/aR4ZBKVSEGpVQEpTi22wrLB54wNbwC54Aha/b21pWV6iH5MunfZ2MYfZNjLkcyoc= jenkins@jenkins
# 查看私钥(后续配置到Jenkins凭据,先复制保存)
cat ~/.ssh/id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----
步骤 2:GitLab 后台添加 Jenkins 公钥
-
登录 GitLab → 右上角头像 → 设置 → SSH 密钥;
-
粘贴 Jenkins 机公钥,标题填写
jenkins@jenkins-server; -
点击「添加密钥」。

步骤 3:Jenkins 后台配置 GitLab SSH 私钥凭据
-
访问 Jenkins:
http://172.25.254.33:8080,使用admin/redhat123登录; -
左侧菜单 → 凭据 → 系统 → 全局凭据 → 添加凭据;




- 配置项(关键):
-
类型:选择「SSH Username with private key」;
-
ID:填写
gitlab-ssh-cred(后续流水线引用,自定义但需统一); -
描述:填写
jenkins to gitlab ssh key(便于识别); -
用户名:填写
root(GitLab 登录用户); -
私钥:选择「直接输入」,粘贴 Jenkins 机生成的私钥;

- 点击「确定」完成配置。
bash
su - jenkins
]$ ssh -T git@172.25.254.31
Welcome to GitLab, @root!
6.3 Jenkins/Harbor 凭据配置(Jenkins 免密推送镜像)
步骤 1:Jenkins 后台添加 Harbor 账号密码凭据
-
Jenkins 后台 → 凭据 → 系统 → 全局凭据 → 添加凭据;
-
配置项(关键):
-
类型:选择「用户名和密码」;
-
ID:填写
harbor-cred(后续流水线引用); -
描述:填写
jenkins to harbor login; -
用户名:填写
admin(Harbor 默认管理员); -
密码:填写
Harbor12345(Harbor 默认密码);
-


- 点击「确定」。
6.4 Jenkins/Web Server SSH 密钥配置(Jenkins 免密部署)
步骤 1:Jenkins 机生成 SSH 密钥(复用 GitLab 的密钥即可,无需重复生成)
bash
在jenkins主机上操作:
# 切换到jenkins用户,确认密钥存在
su - jenkins -s /bin/bash
cat ~/.ssh/id_rsa.pub # 复制该公钥
步骤 2:Web Server(172.25.254.34)配置 Jenkins 公钥
bash
# 切换到root用户
su - root
# 创建.ssh目录(若不存在)
mkdir -p ~/.ssh
chmod 700 ~/.ssh # 必须700权限,否则SSH免密失效
# 将Jenkins公钥添加到authorized_keys
echo "Jenkins机的公钥内容" >> ~/.ssh/authorized_keys
# 设置文件权限(必须600,否则SSH拒绝)
chmod 600 ~/.ssh/authorized_keys
步骤 3:Jenkins 后台配置 Web Server SSH 私钥凭据
-
Jenkins 后台 → 凭据 → 系统 → 全局凭据 → 添加凭据;
-
配置项(关键):
-
类型:选择「SSH Username with private key」;
-
ID:填写
web-server-ssh-cred; -
描述:填写
jenkins to web-server ssh key; -
用户名:填写
root(Web Server 登录用户); -
私钥:粘贴 Jenkins 机的私钥;
-
-
点击「确定」。
6.5 WebServer/Harbor 凭证配置(WebServer 免密拉取镜像)
步骤:Web Server 登录 Harbor 并保存凭证
bash
# Web Server(172.25.254.34)执行
docker login 172.25.254.32 -u admin -p Harbor12345
# 验证凭证是否自动保存(加密存储在config.json)
cat /root/.docker/config.json
"auths": {
"172.25.254.32": {
"auth": "YWRtaW46SGFyYm9yMTIzNDU="
}
}
}
说明 :后续 Web Server 执行docker pull 172.25.254.32/library/hello-web:latest时,Docker 会自动读取该文件的凭证,无需重复输入账号密码。
7. Jenkins创建流水线任务
第一步:新建任务
-
点击Jenkins主页左侧的"新建Item"(New Item)
-
输入任务名称:
hello-web-build -
选择"流水线"(Pipeline)
-
点击"确定"
第二步:配置流水线
-
在"流水线"区域,选择"Pipeline script"
-
在脚本框中粘贴以下内容:
bash
pipeline {
agent any
environment {
// 基础配置(仅保留IP,无http/ssh前缀)
GITLAB_URL = "172.25.254.31"
HARBOR_URL = "172.25.254.32"
WEB_SERVER = "172.25.254.34"
// 从Jenkins凭证库加载凭证(对应你的凭证ID)
GITLAB_SSH_CREDS = credentials('gitlab-ssh-cred') // GitLab SSH密钥凭证
HARBOR_CREDS = credentials('harbor-cred') // Harbor账号密码凭证
WEB_SERVER_SSH_CREDS = credentials('web-server-ssh-cred') // Web服务器SSH密钥凭证
}
stages {
stage('Clone Code (SSH)') {
steps {
echo 'Cloning code from GitLab via SSH...'
sh '''
# 清理旧代码目录(不存在则忽略错误)
rm -rf hello-web || true
# SSH方式克隆代码(核心:使用GitLab SSH地址,无需密码)
# 格式:git clone git@GitLabIP:项目路径.git
git clone git@${GITLAB_URL}:root/hello-web.git
# 验证克隆结果
if [ ! -d "hello-web" ]; then
echo "❌ Git SSH克隆失败!"
exit 1
fi
# 列出目录内容,确认代码拉取成功
ls -la hello-web/
'''
}
}
stage('Build Docker Image') {
steps {
echo 'Building Docker image...'
sh '''
cd hello-web
# 构建镜像并打Harbor标签
docker build -t ${HARBOR_URL}/library/hello-web:latest .
# 验证镜像构建成功
docker images | grep hello-web
'''
}
}
stage('Push to Harbor') {
steps {
echo 'Pushing image to Harbor...'
sh '''
# 使用Harbor凭证登录(自动拆分用户名/密码)
docker login ${HARBOR_URL} -u ${HARBOR_CREDS_USR} -p ${HARBOR_CREDS_PSW}
# 推送镜像到Harbor
docker push ${HARBOR_URL}/library/hello-web:latest
'''
}
}
stage('Deploy to Web Server (SSH)') {
steps {
echo 'Deploying to Web Server via SSH...'
// 使用SSH密钥免密登录Web服务器(无需sshpass)
sshagent(['web-server-ssh-cred']) {
sh '''
# 关键修正:here-document的EOF必须顶格,且前后无空格
ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 root@${WEB_SERVER} << EOF
# 停止并删除旧容器(不存在则忽略错误)
docker rm -f hello-web || true
# 拉取最新镜像(失败则退出)
if ! docker pull ${HARBOR_URL}/library/hello-web:latest; then
echo "拉取镜像失败"
exit 1
fi
# 启动新容器
docker run -d --name hello-web -p 80:80 ${HARBOR_URL}/library/hello-web:latest
EOF
'''
}
}
}
}
post {
success {
echo '✅ Deployment successful (SSH mode)!'
}
failure {
echo '❌ Deployment failed (SSH mode)!'
}
}
}
- 点击"保存"
九、开发机配置(172.25.254.30)
1. 准备项目代码
创建项目目录和文件:
bash
# 创建项目目录
mkdir -p /root/hello-web
cd /root/hello-web
创建 index.html:
bash
vim index.html
<!DOCTYPE html>
<html>
<head>
<title>Hello DevOps</title>
</head>
<body style="font-family:Arial;text-align:center;padding:50px;">
<h1 style="color:green;">Hello DevOps!</h1>
<p>Build Success!</p>
</body>
</html>
创建 Dockerfile:
bash
vim Dockerfile
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/index.html
EXPOSE 80
2. 初始化Git并推送
bash
# 进入项目目录
cd /root/hello-web
# 初始化Git仓库
yum install git -y
git init
# 配置用户信息
git config --global user.name "developer"
git config --global user.email "developer@example.com"
# 添加远程仓库
git remote add origin http://root:redhat123@172.25.254.31/root/hello-web.git
# 添加所有文件
git add .
# 提交代码
git commit -m "Initial commit - Hello DevOps HTML page"
# 推送到GitLab
git push -u origin master
在gitlab里面查看

在Jenkins里面构建


在webserver服务器查看
bash
}# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
049a6e35378b 172.25.254.32/library/hello-web:latest "/docker-entrypoint...." About a minute ago Up About a minute 0.0.0.0:80->80/tcp, [::]:80->80/tcp hello-web
访问172.25.254.34
