Jenkins CI/CD 实践

1. 自由风格任务:拉取代码

  1. Jenkins 创建任务

    • Dashboard -> 新建任务
    • 输入任务名称 oldboyedu-linux98-yiliao
    • 选择 构建一个自由风格的软件项目

    [此处插入图片16: Jenkins新建任务页面,数字标示了:1.输入任务名称 -> 2.选择自由风格项目 -> 3.点击确定]

    413528a785607fc6a9e15fdb0853be31

  2. 配置源码管理

    • 在任务配置页面,进入 源码管理 (Source Code Management)
    • 选择 Git
    • Repository URL: http://10.0.0.153/root/oldboyedu-yiliao.git
    • Credentials: 点击 添加,输入 GitLab 的用户名 root 和密码,保存凭证。
    • 保存配置。

    [此处插入图片17: Jenkins任务配置-源码管理,数字标示了:1.源码管理Tab -> 2.选Git -> 3.添加凭证 -> 4.填写仓库URL -> 5.选择刚添加的凭证 -> 6.保存]

    6842e0dffd48ade847d79416217d8b8d

  3. 配置构建步骤

    • 在 构建步骤 (Build Steps) 中,选择 执行 shell

    • 输入脚本:

      1
      2
      3
      pwd
      ls -l
      cat Dockerfile
  4. 构建与验证

    • 点击 立即构建 (Build Now)。
    • 查看 Console Output (控制台输出),确认代码已成功拉取,并显示了 Dockerfile 的内容。

    [此处插入图片18: Jenkins控制台输出,红框和勾号表示ls -l命令成功执行,显示了从Git仓库拉取的文件列表]

    285804ab6b1b1b30f51c1f4ecb68aeb9

    [此处插入图片19: Jenkins控制台输出,红框标识了cat Dockerfile命令的输出,显示了Dockerfile内容]

    269e5fa1340445c02bcba248241bee7d

2. 持续交付:构建镜像并推送到 Harbor

  1. 配置 Jenkins 服务器

    • 安装 Docker: 在 Jenkins 服务器(211)上安装 Docker。

      1
      2
      3
      [root@jenkins211 ~]# wget http://192.168.21.253/Resources/Docker/scripts/oldboyedu-autoinstall-docker-docker-compose.tar.gz
      [root@jenkins211 ~]# tar xf ...
      [root@jenkins211 ~]# ./install-docker.sh i
    • 配置 Harbor 解析和证书:

      1
      2
      [root@jenkins211 ~]# echo "10.0.0.250 harbor250.oldboyedu.com" >> /etc/hosts
      [root@jenkins211 ~]# scp -r 10.0.0.231:/etc/docker/certs.d/ /etc/docker/
  2. 修改 Jenkins 任务

    • 修改 执行 shell 步骤的脚本:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      # 定义版本号,可以硬编码或后续参数化
      VERSION=v0.1

      # 构建镜像
      docker build -t harbor250.oldboyedu.com/oldboyedu-cicd/yiliao:${VERSION} .

      # 登录并推送镜像
      docker login -u admin -p 1 harbor250.oldboyedu.com
      docker push harbor250.oldboyedu.com/oldboyedu-cicd/yiliao:${VERSION}
  3. 构建与验证

    • 再次 立即构建。
    • 登录 Harbor UI,检查 oldboyedu-cicd 项目下是否已存在 yiliao:v0.1 镜像。

3. 持续部署:部署服务到 K8S

  1. 配置 Jenkins 服务器

    • 安装 kubectl:

      1
      2
      [root@jenkins211 ~]# wget http://192.168.21.253/Resources/Kubernetes/Project/DevOps/Jenkins/kubectl-1.23.17
      [root@jenkins211 ~]# install kubectl-1.23.17 /usr/local/bin/kubectl
    • 准备 K8S 认证文件:

      1
      2
      3
      [root@jenkins211 ~]# mkdir -p ~/.kube/
      [root@jenkins211 ~]# scp 10.0.0.231:/root/.kube/config ~/.kube/
      [root@jenkins211 ~]# kubectl version # 验证是否能连接到K8S集群
  2. 修改 Jenkins 任务

    • 更新 执行 shell 脚本,在推送镜像后加入部署逻辑:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      # ... (前面 build 和 push 的脚本) ...

      # 部署到K8S
      # 判断服务是否存在,不存在则创建,存在则更新(此处简化为仅创建)
      # 实际生产中建议使用 apply -f file.yaml
      cat <<EOF | kubectl apply -f -
      apiVersion: apps/v1
      kind: Deployment
      metadata:
      name: deploy-yiliao
      spec:
      replicas: 3
      selector:
      matchLabels:
      apps: yiliao
      template:
      metadata:
      labels:
      apps: yiliao
      spec:
      containers:
      - name: c1
      image: harbor250.oldboyedu.com/oldboyedu-cicd/yiliao:v0.1
      ---
      apiVersion: v1
      kind: Service
      metadata:
      name: svc-yiliao
      spec:
      type: LoadBalancer
      selector:
      apps: yiliao
      ports:
      - protocol: TCP
      port: 80
      EOF

      # 检查部署状态
      kubectl get pods -o wide -l apps=yiliao
      kubectl get svc svc-yiliao
  3. 构建与验证

    • 立即构建。
    • 查看控制台输出,可以看到 K8S 资源已创建,并获取到 EXTERNAL-IP(如 10.0.0.154)。
    • 访问 http://10.0.0.154/ 查看应用是否部署成功。

4. 升级与回滚 (参数化构建)

  1. 修改代码 (模拟版本更新)

    • 在本地代码库中,修改 index.html 文件,添加一行醒目的 H1 标题。
    • git commit 和 git push 推送新代码。
  2. 配置参数化构建

    • 在 Jenkins 任务配置页面,勾选 This project is parameterized (此项目为参数化构建)。
    • 添加一个 String Parameter (字符串参数),名称为 version,默认值为 v0.2。

    [此处插入图片20: Jenkins参数化构建配置页面,红框标识了添加参数的选项和version参数的设置]

    6004c783c9cb7f7bd384ca988b72ce7e

  3. 修改 Jenkins 任务脚本

    • 更新 执行 shell 脚本,使用 ${version} 变量,并改用 kubectl set image 进行滚动更新。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      #!/bin/bash
      docker build -t harbor250.oldboyedu.com/oldboyedu-cicd/yiliao:${version} .
      docker login -u admin -p 1 harbor250.oldboyedu.com
      docker push harbor250.oldboyedu.com/oldboyedu-cicd/yiliao:${version}

      # 滚动更新Deployment的镜像
      kubectl set image deploy deploy-yiliao c1=harbor250.oldboyedu.com/oldboyedu-cicd/yiliao:${version}

      # 检查状态
      kubectl get pods -o wide -l apps=yiliao
  4. 构建与验证 (升级)

    [此处插入图片21: 浏览器访问部署的应用,红框和箭头指向了升级后显示的新内容]

  5. 构建与验证 (回滚)