Jenkins与Docker搭建CI/CD流水线实战指南 (自动化测试与部署)

更多云服务器知识,尽在hostol.com

你是否已经厌倦了那个"人肉"部署的重复循环?每一次 git push 之后,都像是一个庄严的仪式,你必须虔诚地打开SSH,小心翼翼地敲下一连串的 git pull, npm install, docker build, docker stop, docker run... 这个过程,充满了乏味的重复劳动和极高的人为出错风险。

如果我告诉你,有一种方法,可以让你彻底从这场"仪式"中解放出来,让你每一次 git push,都像是在按下一个**全自动、高精度的"软件梦工厂"**的"启动按钮"呢?

这家"工厂",就是CI/CD流水线 (Pipeline) 。而我们今天,将要聘请的、来管理这家工厂的"金牌总管 ",就是开源世界里大名鼎鼎、身经百战的Jenkins


搭建你自己的CI/CD流水线:使用Jenkins和Docker,实现自动化测试与部署

在开始搭建之前,我们必须先用一个"工厂流水线"的比喻,来理解CI/CD这两个核心概念,到底是什么。

  • CI (Continuous Integration, 持续集成):
    • 这是流水线的前半段 ,是"零件组装与质检"车间。
    • 它的核心工作是:每当有工程师(开发者)提交了一个新的"零件设计图"(代码push),流水线会自动启动,立刻根据图纸,造出这个新零件,并把它和你现有的"发动机半成品",组装在一起。然后,立刻进行一系列严格的"质量检测"(自动化测试)。
    • 目的: 确保新零件没有质量问题,并且能和旧零件完美兼容。尽早发现问题
  • CD (Continuous Deployment, 持续部署):
    • 这是流水线的后半段 ,是"总装、打包与发货"车间。
    • 它的核心工作是:一旦"质检中心"亮了绿灯,确认新零件完美无瑕,流水线就会自动 地,把这个"全新的发动机",进行"最终打包 "(构建成Docker镜像),然后,把它"发货"到"4S店"(生产服务器)的货架上,让客户立刻就能买到。
    • 目的: 实现安全、可靠、无人干预的自动化交付

而Jenkins,就是调度和管理这一切的"中央控制系统"。今天,我们将一起,搭建起这条属于我们自己的、从"代码提交"到"上线运行"的全自动流水线。

第一步:聘请"总管"------ 用Docker运行Jenkins

安装和配置原生Jenkins,是一件极其繁琐的事。但我们,已经掌握了Docker这个神器!我们将用最优雅、最干净的方式,来"聘请"我们的Jenkins总管。

  1. 准备"总管办公室" 在你的服务器上,创建一个目录,用来存放Jenkins的所有"工作档案"(配置和数据),确保它们不会因为容器的销毁而丢失。

Bash

复制代码
mkdir /var/jenkins_home
sudo chown 1000:1000 /var/jenkins_home

2.一键"召唤"Jenkins!

Bash

复制代码
sudo docker run -d --name my-jenkins -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home jenkins/jenkins:lts-jdk11
  1. 咒语解析:
    • -d: 后台运行。
    • -p 8080:8080: 把我们服务器的8080端口,映射给Jenkins的Web界面使用。
    • -v /var/jenkins_home:/var/jenkins_home: 这就是"数据持久化",把我们刚才创建的"办公室",和Jenkins容器里的"档案室"连接起来。
    • jenkins/jenkins:lts-jdk11: 使用官方的、长期支持的、基于JDK11的Jenkins镜像。

几分钟后,你的Jenkins总管,就已经在8080端口上,等待你的"唤醒"了。

第二步:唤醒"总管"------ 初始化Jenkins设置
  1. 获取"开机密码" 打开浏览器,访问 http://你的服务器IP:8080。你会看到一个"解锁Jenkins"的页面。它需要一个初始管理员密码。 在你的服务器终端里,执行以下命令,查看Jenkins在日志里输出的密码:

Bash

复制代码
sudo docker logs my-jenkins

复制那串长长的、由字母和数字组成的密码,粘贴到网页里。

2.安装"基础技能包" 接下来,Jenkins会让你安装插件。请直接选择"安装推荐的插件"。它会自动帮你安装上所有最常用的工具。

3.创建你的"管理员账号" 设置你自己的、用于登录Jenkins的用户名和密码。

完成这几步,一个功能强大的、随时可以开始工作的Jenkins"中央控制室",就正式交付给你了!

第三步:撰写"流水线操作手册"------ 你的第一个Jenkinsfile

在现代CI/CD的理念中,我们不再去Jenkins的网页上手动配置流水线了。我们采用一种更酷的方式------"流水线即代码 (Pipeline as Code)"。

我们会把流水线的所有步骤,都写在一个名为Jenkinsfile的"操作手册"里,并且,把这份手册,和我们的应用程序代码,放在同一个Git仓库里

我们的演练项目:一个带测试的Node.js应用

  • server.js (应用本身):

JavaScript

复制代码
const express = require('express');
const app = express();
app.get('/', (req, res) => res.send('Hello from Jenkins CI/CD!'));
app.listen(3000, () => console.log('Server is running...'));
module.exports = app; // 导出app用于测试

test.js (自动化测试):

JavaScript

复制代码
const request = require('supertest');
const app = require('./server');
describe('GET /', () => {
  it('should respond with Hello Jenkins', (done) => {
    request(app).get('/').expect('Hello from Jenkins CI/CD!', done);
  });
});

Dockerfile (应用打包说明书):

Dockerfile

复制代码
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

Jenkinsfile (流水线总控手册!)

Groovy

复制代码
pipeline {
    agent any // 在任何可用的"工位"上执行

    stages {
        // 第一个"工位":安装依赖
        stage('Install Dependencies') {
            steps {
                sh 'npm install'
            }
        }

        // 第二个"工位":质检中心
        stage('Run Tests') {
            steps {
                sh 'npm test'
            }
        }

        // 第三个"工位":打包车间
        stage('Build Docker Image') {
            steps {
                script {
                    // 定义镜像名字,用构建号来确保唯一性
                    def imageName = "my-node-app:${env.BUILD_NUMBER}"
                    sh "docker build -t ${imageName} ."
                }
            }
        }

        // 第四个"工位":发货与部署
        stage('Deploy Application') {
            steps {
                script {
                    def imageName = "my-node-app:${env.BUILD_NUMBER}"
                    // 先停止并删除可能在运行的旧版本
                    sh "docker stop my-running-app || true"
                    sh "docker rm my-running-app || true"
                    // 启动新版本的容器
                    sh "docker run -d --name my-running-app -p 3001:3000 ${imageName}"
                }
            }
        }
    }
}
  • 这份Jenkinsfile,用一种清晰的"阶段 (stage)"语法,定义了我们从"安装"到"部署"的完整流水线。

把以上所有文件,都提交到你的Gitea或GitHub仓库里。

第四步:连接"设计图"与"工厂"------创建Jenkins流水线任务

现在,我们去Jenkins的控制台,告诉他,去哪里拿"操作手册"。

  1. 回到Jenkins首页,点击"新建任务 (New Item)"。
  2. 输入任务名称(比如my-first-pipeline),选择"流水线 (Pipeline)",点击确定。
  3. 在配置页面的最下方,找到"流水线 (Pipeline) "这个区块。
    • 定义: 选择"Pipeline script from SCM"(从源码管理系统中获取流水线脚本)。
    • SCM: 选择"Git"。
    • Repository URL: 填入你那个Node.js项目的Git仓库地址。
    • Credentials: 添加你的Git仓库的用户名和密码。
    • Branch Specifier: 保持默认的*/main*/master
  4. 点击"保存"。
见证你的"梦工厂"第一次运转

任务创建好之后,点击左侧菜单的"立即构建 (Build Now)"。

然后,立刻点击下方的"构建历史 "里那个正在闪烁的构建号,进入"控制台输出 "或更酷的"Blue Ocean"视图。

你会像一个真正的"总工程师"一样,亲眼看到你的流水线,正在一个一个地、有条不紊地,执行你写在Jenkinsfile里的每一个阶段:

  • Install Dependencies ... SUCCESS
  • Run Tests ... SUCCESS
  • Build Docker Image ... SUCCESS
  • Deploy Application ... SUCCESS

当所有阶段都变成绿色 时,打开你的浏览器,访问 http://你的服务器IP:3001

看到了吗?"Hello from Jenkins CI/CD!"

现在,回到你的本地代码编辑器,把这句话,改成"Hello, World!"。然后,git push

你什么都不用再做。一分钟后,再去刷新你的浏览器。页面,已经奇迹般地,自动更新了!

你,已是"工业革命家"

看看Jenkins Blue Ocean界面上那条漂亮的、全绿色的流水线。

它,就是你亲手设计并建造的、永不疲倦的"软件梦工厂 "。它让你的每一次代码提交,都充满了"确定性 "和"安全感"。你知道,你的代码,会被自动地、可靠地、经过严格测试后,分秒不差地,交付到用户的手中。

你,已经从一个只会埋头写代码的"手工艺人 ",进化成了一位懂得如何构建和优化生产流程的"工业革命家"。

你不再只是创造产品,你,正在创造"创造产品"的流程本身。

相关推荐
草履虫建模1 分钟前
若依微服务一键部署(RuoYi-Cloud):Nacos/Redis/MySQL + Gateway + Robot 接入(踩坑与修复全记录)
redis·mysql·docker·微服务·云原生·nacos·持续部署
阿鹿.3 小时前
docker-相关笔记
java·笔记·docker
007php0074 小时前
Go 语言常用命令使用与总结
java·linux·服务器·前端·数据库·docker·容器
Apex Predator5 小时前
jenkins集成liquibase
运维·jenkins
你是我的日月星河5 小时前
Docker部署单节点使用KRaft存储数据的Kafka与可视化界面Kafka-Map
docker·容器·kafka
007php0075 小时前
Go Vendor 和 Go Modules:管理和扩展依赖的最佳实践
java·开发语言·docker·微服务·golang·自动化·jenkins
chenfengxiu6 小时前
BlueKing-ci
ci/cd
Cyber4K6 小时前
企业级-搭建CICD(持续集成持续交付)实验手册
ci/cd·云原生·容器
ZLRRLZ6 小时前
【Docker/Redis】服务端高并发分布式结构演进之路
redis·docker·架构