更多云服务器知识,尽在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总管。
- 准备"总管办公室" 在你的服务器上,创建一个目录,用来存放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
- 咒语解析:
-d
: 后台运行。-p 8080:8080
: 把我们服务器的8080端口,映射给Jenkins的Web界面使用。-v /var/jenkins_home:/var/jenkins_home
: 这就是"数据持久化",把我们刚才创建的"办公室",和Jenkins容器里的"档案室"连接起来。jenkins/jenkins:lts-jdk11
: 使用官方的、长期支持的、基于JDK11的Jenkins镜像。
几分钟后,你的Jenkins总管,就已经在8080端口上,等待你的"唤醒"了。
第二步:唤醒"总管"------ 初始化Jenkins设置
- 获取"开机密码" 打开浏览器,访问
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的控制台,告诉他,去哪里拿"操作手册"。
- 回到Jenkins首页,点击"新建任务 (New Item)"。
- 输入任务名称(比如
my-first-pipeline
),选择"流水线 (Pipeline)",点击确定。 - 在配置页面的最下方,找到"流水线 (Pipeline) "这个区块。
- 定义: 选择"Pipeline script from SCM"(从源码管理系统中获取流水线脚本)。
- SCM: 选择"Git"。
- Repository URL: 填入你那个Node.js项目的Git仓库地址。
- Credentials: 添加你的Git仓库的用户名和密码。
- Branch Specifier: 保持默认的
*/main
或*/master
。
- 点击"保存"。
见证你的"梦工厂"第一次运转
任务创建好之后,点击左侧菜单的"立即构建 (Build Now)"。
然后,立刻点击下方的"构建历史 "里那个正在闪烁的构建号,进入"控制台输出 "或更酷的"Blue Ocean"视图。
你会像一个真正的"总工程师"一样,亲眼看到你的流水线,正在一个一个地、有条不紊地,执行你写在Jenkinsfile
里的每一个阶段:
Install Dependencies
... SUCCESSRun Tests
... SUCCESSBuild Docker Image
... SUCCESSDeploy Application
... SUCCESS
当所有阶段都变成绿色 时,打开你的浏览器,访问 http://你的服务器IP:3001
。
看到了吗?"Hello from Jenkins CI/CD!"
现在,回到你的本地代码编辑器,把这句话,改成"Hello, World!"。然后,git push
。
你什么都不用再做。一分钟后,再去刷新你的浏览器。页面,已经奇迹般地,自动更新了!
你,已是"工业革命家"
看看Jenkins Blue Ocean界面上那条漂亮的、全绿色的流水线。
它,就是你亲手设计并建造的、永不疲倦的"软件梦工厂 "。它让你的每一次代码提交,都充满了"确定性 "和"安全感"。你知道,你的代码,会被自动地、可靠地、经过严格测试后,分秒不差地,交付到用户的手中。
你,已经从一个只会埋头写代码的"手工艺人 ",进化成了一位懂得如何构建和优化生产流程的"工业革命家"。
你不再只是创造产品,你,正在创造"创造产品"的流程本身。