欢迎光临
我们一直在努力

DevOps自动化发布系统搭建

一、概念引入

1. DevOps 的概念

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

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

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

2. CI/CD 的概念

1. CI 持续集成(Continuous Integration)

  • 定义:开发频繁提交代码到仓库,系统自动完成:拉取代码→编译构建→代码检查→自动化测试。

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

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

2. CD 两层含义

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

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

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

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

    四、基础环境准备

    1. 关闭防火墙和SELinux(所有主机)

    # 关闭防火墙
    systemctl stop firewalld
    systemctl disable firewalld

    # 关闭SELinux
    setenforce 0
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

    2. 配置本地YUM源(所有主机)

    ]# 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

    # 安装依赖
    #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

    2. 配置Docker阿里云镜像加速器

    # 创建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

    #编写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——修复步骤

    # 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页面配置 – 创建项目

    第一步:创建新项目

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

    2. 点击页面上的"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文件

    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

    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

    # 运行安装脚本
    ./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

    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)

    更换插件地址

    [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分钟)

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

  • 第三步:创建管理员用户

    1. 安装完成后,输入:

    • Username: admin

    • Password: redhat123

    • Confirm password: redhat123

    • Full name: Admin

    • Email: admin@example.com

    2. 点击"Save and Continue"

    第四步:配置Jenkins URL

  • Jenkins URL:http://172.25.254.33:8080

  • 点击"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)主机上配置

    # 验证系统中是否有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 密钥对

    # 生成无密码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 密钥对

    # 切换到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 私钥凭据

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

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

    3. 配置项(关键):

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

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

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

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

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

    4. 点击「确定」完成配置。

    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 默认密码);

  • 3. 点击「确定」。

    6.4 Jenkins/Web Server SSH 密钥配置(Jenkins 免密部署)

    步骤 1:Jenkins 机生成 SSH 密钥(复用 GitLab 的密钥即可,无需重复生成)

    在jenkins主机上操作:
    # 切换到jenkins用户,确认密钥存在
    su – jenkins -s /bin/bash
    cat ~/.ssh/id_rsa.pub # 复制该公钥

    步骤 2:Web Server(172.25.254.34)配置 Jenkins 公钥

    # 切换到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 并保存凭证

    # 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"

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

  • 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)!'
    }
    }
    }

    3. 点击"保存"

    九、开发机配置(172.25.254.30)

    1. 准备项目代码

    创建项目目录和文件:

    # 创建项目目录
    mkdir -p /root/hello-web
    cd /root/hello-web

    创建 index.html:

    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:

    vim Dockerfile
    FROM nginx:alpine
    COPY index.html /usr/share/nginx/html/index.html
    EXPOSE 80

    2. 初始化Git并推送

    # 进入项目目录
    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服务器查看

    }# 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

    赞(0)
    未经允许不得转载:171主机测评 » DevOps自动化发布系统搭建
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址