DevOps自动化发布系统搭建

一、概念引入

1. DevOps 的概念

定义:开发( Developmen**)与运维(** Operations**)一体化** 的理念、流程、工具、文化的集合。DevOps 是一套打破开发、测试、运维部门壁垒 ,通过自动化流程、协作文化、工具链,实现软件快速迭代、稳定交付、持续优化的工作模式。

**核心目标:**缩短从代码提交到业务上线的周期,同时提升系统稳定性(对应实验:从开发机写代码→GitLab 提交→Jenkins 构建→Harbor 存镜像→WebServer 部署,全流程无人工手动拷贝 / 配置,就是 DevOps 的最小落地闭环)。

通俗理解:开发写完代码,不用「丢给运维说'你部署吧'」,而是通过自动化流程,开发和运维共同对最终交付负责。

2. CI/CD 的概念

  1. CI 持续集成(Continuous Integration)
  • 定义:开发频繁提交代码到仓库,系统自动完成:拉取代码→编译构建→代码检查→自动化测试。

  • 作用:多人协作频繁合并代码,提前发现 bug、代码冲突,保证代码质量。

  • 对应实验环节:开发机代码git push到 GitLab,若配置 Jenkins 触发「代码拉取 + 语法检查」(实验中简化为直接构建镜像),就是 CI 的核心动作 ------保证每次提交的代码是「可集成、无基础错误」的。

  1. CD 两层含义

(1)持续交付(Continuous Delivery) CI 流程跑完后,自动生成可部署安装包 / 镜像(如实验中的 Docker 镜像) ,发布到测试、预发环境,生产上线由人工确认

(2)持续部署(Continuous Deployment) 在持续交付基础上,全程全自动,测试通过直接部署到生产,无需人工干预。(实验中 Jenkins 直接 SSH 部署到 WebServer,就是持续部署的简化版)

对应实验环节:Jenkins 构建 Docker 镜像→推送到 Harbor→SSH 部署到 WebServer,完整覆盖「交付制品→部署上线」的 CD 流程。

  1. CI/CD = 代码提交到上线的全流程自动化。

3. DevOps 系统架构

这张图清晰展示了一个从代码提交到用户访问的完整 DevOps 自动化发布流程,我们分两部分拆解原理:

(1)用户访问流程(上半部分)

这部分是业务系统的运行架构,负责处理用户请求:

  1. **客户端发送访问请求:**用户通过浏览器 / APP 发起对 Web 服务的访问请求。

  2. **负载均衡入口:**请求首先到达负载均衡器(如 Nginx、HAProxy、SLB),它会根据预设策略(轮询、权重等)将请求分发到后端的 Web 节点,避免单点压力,提升系统可用性与性能。

  3. **WEB 集群:**由多台 Web 服务器组成的集群,负载均衡分发的请求会被其中一台节点处理,执行业务逻辑并返回响应给用户。

(2)自动化发布流程(下半部分)

这部分是CI/CD 流水线,实现代码从提交到部署的自动化:

  1. **开发者提交代码:**开发人员完成功能开发后,将代码提交到代码仓库 GitLab。

  2. GitLab 代码托管与触发: GitLab 作为代码仓库,不仅存储代码,还可以通过 Webhook(钩子),在代码被提交 / 合并时,自动触发后续的 Jenkins 构建任务。(图中的GitLab Runner是 GitLab CI/CD 的执行器,也可直接用于流水线构建,这里作为代码仓库与 CI 流程的核心枢纽)

  3. **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/

四、基础环境准备

  1. 关闭防火墙和SELinux(所有主机)
bash 复制代码
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 关闭SELinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
  1. 配置本地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)

  1. 安装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
  1. 配置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

第二步:修改root密码

第三步:登录

  • 用户名:root

  • 密码:redhat123

  • 点击"Sign in"

3. GitLab页面配置 - 创建项目

第一步:创建新项目

  1. 登录后,点击左上角"Menu" → 选择"Projects"

  2. 点击页面上的"New project"按钮(蓝色)

第二步:填写项目信息

  1. Project name(项目名称):hello-web

  2. Project URL(项目URL):自动填充为 /root/hello-web

  3. Description(描述,可选):填写项目描述

  4. Visibility Level(可见级别):选择"Public"

  5. 勾选"Initialize repository with a README":不勾选(我们手动推送代码)

  6. 点击"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"

第二步:创建项目

  1. 登录后,点击"Projects"(项目)

  2. 点击"New Project"(新建项目)

  3. 填写:

    • Project Name(项目名):library

    • Access Level(访问级别):选择"Public"(公开)

  4. 点击"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

  1. 打开浏览器,输入:http://172.25.254.33:8080

  2. 会看到"Unlock Jenkins"页面

  3. 获取初始管理员密码:cat /var/lib/jenkins/secrets/initialAdminPassword

  4. 将密码粘贴到页面输入框

  5. 点击"Continue"

第二步:安装插件

  1. 选择"Install suggested plugins"(安装推荐的插件)

  2. 等待插件安装完成(约5-10分钟)

  3. 如果部分插件安装失败,可以跳过(因为无法访问外网)

第三步:创建管理员用户

  1. 安装完成后,输入:
  • Username: admin

  • Password: redhat123

  • Confirm password: redhat123

  • Full name: Admin

  • Email: admin@example.com

  1. 点击"Save and Continue"

第四步:配置Jenkins URL

  1. Jenkins URL:http://172.25.254.33:8080

  2. 点击"Save and Finish"

第五步:开始使用Jenkins

  1. 点击"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 公钥

  1. 登录 GitLab → 右上角头像 → 设置SSH 密钥

  2. 粘贴 Jenkins 机公钥,标题填写jenkins@jenkins-server

  3. 点击「添加密钥」。

步骤 3:Jenkins 后台配置 GitLab SSH 私钥凭据

  1. 访问 Jenkins:http://172.25.254.33:8080,使用admin/redhat123登录;

  2. 左侧菜单 → 凭据系统全局凭据添加凭据

  1. 配置项(关键):
  • 类型:选择「SSH Username with private key」;

  • ID:填写gitlab-ssh-cred(后续流水线引用,自定义但需统一);

  • 描述:填写jenkins to gitlab ssh key(便于识别);

  • 用户名:填写root(GitLab 登录用户);

  • 私钥:选择「直接输入」,粘贴 Jenkins 机生成的私钥;

  1. 点击「确定」完成配置。
bash 复制代码
su  - jenkins
]$ ssh -T git@172.25.254.31
Welcome to GitLab, @root!

6.3 Jenkins/Harbor 凭据配置(Jenkins 免密推送镜像)

步骤 1:Jenkins 后台添加 Harbor 账号密码凭据

  1. Jenkins 后台 → 凭据系统全局凭据添加凭据

  2. 配置项(关键):

    • 类型:选择「用户名和密码」;

    • ID:填写harbor-cred(后续流水线引用);

    • 描述:填写jenkins to harbor login

    • 用户名:填写admin(Harbor 默认管理员);

    • 密码:填写Harbor12345(Harbor 默认密码);

  1. 点击「确定」。

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 私钥凭据

  1. Jenkins 后台 → 凭据系统全局凭据添加凭据

  2. 配置项(关键):

    • 类型:选择「SSH Username with private key」;

    • ID:填写web-server-ssh-cred

    • 描述:填写jenkins to web-server ssh key

    • 用户名:填写root(Web Server 登录用户);

    • 私钥:粘贴 Jenkins 机的私钥;

  3. 点击「确定」。

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创建流水线任务

第一步:新建任务

  1. 点击Jenkins主页左侧的"新建Item"(New Item)

  2. 输入任务名称:hello-web-build

  3. 选择"流水线"(Pipeline)

  4. 点击"确定"

第二步:配置流水线

  1. 在"流水线"区域,选择"Pipeline script"

  2. 在脚本框中粘贴以下内容:

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)!'
        }
    }
}
  1. 点击"保存"

九、开发机配置(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

相关推荐
IMPYLH1 小时前
Linux 的 stty 命令
linux·运维·服务器·python·bash
落羽的落羽2 小时前
【Linux系统】总结线程:死锁问题、实现带有日志模块的线程池类
linux·运维·服务器·c++·人工智能·机器学习
林熙蕾LXL2 小时前
Ubuntu——远程连接
linux·运维·服务器
拾光Ծ2 小时前
system V IPC :共享内存,消息队列与信号量(详解)
linux·运维·web安全·信息与通信·system v ipc
minji...2 小时前
Linux 网络套接字编程(四)支持多客户端同时在线、消息能转发给所有人的 UDP 聊天室服务器
linux·运维·开发语言·网络·c++·算法·udp
微刻时光2 小时前
影刀RPA应用落地全流程指南:从需求到运维的实战手册
运维·人工智能·机器人·自动化·rpa·影刀rpa
我重来不说话2 小时前
Android 自动化工作流平台——群控手机
android·智能手机·自动化·工作流·群控
艾莉丝努力练剑2 小时前
剑指巅峰,磨砺芳华:我的 CSDN 创作一周年深度总结
linux·运维·服务器·c++·学习
thinkMoreAndDoMore5 小时前
linux内核匹配I2C设备
linux·运维·服务器