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界面上那条漂亮的、全绿色的流水线。

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

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

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

相关推荐
jingshaoqi_ccc14 小时前
ubuntu 24下面安装docker
ubuntu·docker·eureka
jason成都14 小时前
elasticsearch部署时创建用户密码
大数据·elasticsearch·jenkins
关关长语15 小时前
Vue本地部署包快速构建为Docker镜像
前端·vue.js·docker
水滴与鱼15 小时前
DOCKER制作ROS运行的镜像文件
运维·docker·容器
杨浦老苏18 小时前
安全的消息传递和协作工具Virola Messenger
docker·即时通讯·群晖·im
jason成都20 小时前
emqx的docker部署
运维·docker·容器
mixboot21 小时前
docker 国内镜像源
docker·镜像源
java_logo21 小时前
Milvus GUI ATTU Docker 容器化部署指南
运维·数据库·docker·容器·eureka·milvus
眠晚晚1 天前
云上攻防-Docker-堡垒机安全详解
安全·web安全·网络安全·docker·容器
我叫唧唧波1 天前
【自动化部署】基于Docker构建CI/CD流水线
ci/cd·docker·node.js