DevOps介绍及Jenkins安装入门

DevOps介绍

1.DevOps是什么

DevOps = Dev(开发) + Ops(运维)的组合。

DevOps 就是让写代码的人和管服务器的人像一个团队一样紧密合作,用自动化工具把软件从“写好”到“上线运行”整个过程变得又快又稳。

为什么重要?(好处超好记)

  • 更快:新功能几天甚至几小时就能上线(而不是几个月)
  • 更稳:出问题能立刻发现和修复,不用半夜被叫醒
  • 更省心:大家互相理解,不再互相甩锅,团队开心

核心口诀(方便记忆)自动化、协作、持续交付、快速反馈” —— 这四句话基本概括了DevOps的精髓。

记住这一个比喻就够了:DevOps 就是把开发和运维从“隔墙扔盘子”变成“一起开餐厅”

Dev0ps核心目标:
加速交付:快速迭代,频繁发布新功
能提高质量:通过自动化任务减少错误
增强协作:开发、运维、测试等角色紧密配合
全自动化:减少手动操作,提升效率

2.DevOps相关工具链(技术层面)

阶段 工具示例
代码管理 Git、GitLab、Gitee、Github
代码扫描 Sonarqube
持续集成 Jenkins、Tekton、Gitlab CI
持续部署 Jenkins、Tekton、ArgoCD
容器化 Docker、Containerd、Kaniko
制品管理 Harbor、Nexus
服务编排 Kubernetes

3.什么是CICD

CI/CD是Dev0ps中尤为重要的一个环节,主要是通过自动化流程实现代码从开发到生产的快速和可靠的交付。
CI/CD主要分为了三个方面:

  • 持续集成(CI,Continuous Integration)
  • 持续交付(CD.Continuous Delivery)
  • 持续部署(CD,Continuous Deployment )

3.1持续集成(CI)

CI/CD中的CI指持续集成,它属于开发人员的自动化流程,可以帮助开发人员更加频繁地将代码合并到共享分支或主干中,并触发一系列测试和构建的工作。

持续集成相关流程:

  • 代码提交:开发者推送代码到版本控制系统(如GitHub)
  • 自动化构建:Jenkins自动编译并打包应用(生成镜像或产物)
  • 自动化测试:运行单元测试、集成测试等(如Sonarqube)
  • 任务反馈:每个环节集成通知和反馈机制

3.2持续交付和持续部署

**持续交付:**用于把持续集成过程中的产物(代码、镜像、包)转变为可随时发布的状态,主要目的是拥有一个可以随时部署到生产环境的产物。

**持续部署:**持续部署是CICD最后一个环节,作为持续交付的延伸,用于把产物自动发布到生产环境中。利用持续部署可以让开发人员在修改代码后几分钟就能把新功能全自动部署到生产环境中。

持续交付和持续部署流程:

  • 制品交付:把CI阶段的产物交付到制品仓库(如Harbor)
  • 制品发布:将制品自动发布到开发、测试和生产环境环境
  • 验收测试:验证发布后的功能是否正常

CI/CD完整流程:

4.流水线Pipeline介绍

在DevOps里,Pipeline(管道)其实就是CI/CD Pipeline,全称 Continuous Integration / Continuous Delivery Pipeline,中文叫“持续集成/持续交付管道”。

一句话总结: Pipeline 就是一条全自动的“软件生产线”,从代码写好到上线运行,所有步骤连成一串,自动跑完,几乎不用人手动干预。

核心口诀(方便记忆)提交 → 测试 → 构建 → 部署 → 监控” 这五个阶段串起来,就是一条完整的Pipeline。

流水线优势:

  • 标准化流程:通过声明式方式确保每个环节的一致性,避免人工操作差异导致的错误
  • 自动化执行:Pipeline由多个任务组成,每个任务均可以自动完成,可全程无需人工操作
  • 流程可视化:Pipeline工具可以清晰的看到流水线中的每个环节
  • 可追溯性:流水线的每个环节都有执行的过程、日志和结果,方便追溯和排查问题
  • 支持并行:Pipeline支持多个任务同时运行,减少任务等待时间
  • 重复执行:Pipeline中的任务支持错误重试,无需特殊处理
  • 灵活性高:无需编写过多过多代码,即可完成对任务的编排

流水线相关工具:

工具 Jenkins Tekton Gitlab CI/CD
优点 长期占据CI/CD市场头部社区支持强大,可扩展性和可集成性强,插件生态系统丰富(超2000+插件)
基本可以满足企业内的任何场景需求
支持跨平台:Windows、Linux、Mac、容器、K8s等
专为K8s设计,以CRD方式运行天然支持容器化和动态资源分配
Pipeline定义与底层K8s解耦,迁移方便,扩展性强
方便集成于企业内部平台进行二次开发
与GitLab代码仓库深度集成:无需额外配置
使用.gitlab-ci.yaml配置适合中小团队快速上手
缺点 配置稍复杂
需要手动管理插件依赖和版本兼容性
插件支持较少
学习难度较大,部分功能需要自行开发集成
需要K8s基座支持
十高级功能需付费
扩展性一般
需要自行维护Runner
无权限隔离

5.Jenkins介绍

Jenkins是一个开源的CI/CD工具,用于自动化构建、测试和部署软件。Jenkins支持多种编程语言和版本控制系统,并可以通过插件扩展功能,是DevOps流程中最流行的自动化工具之一。

Jenkins架构为主从架构,Master节点为主节点,主要用于管理任务调度、任务配置、提供Web UI。Agent节点为从节点,主要用于执行具体的任务,可动态扩展。

Jenkins核心功能:

  • 持续集成:Jenkins可以集成各种工具完成CI过程,比如GitLab、Sonarqube等
  • 持续部署:Jenkins支持自动化部署至各种平台,比如K8s、物理机等
  • 插件生态:支持2000+插件,无需自行开发即可集成各种平台
  • 流水线:支持声明式和脚本式Pipeline,用于定制CICD中的各个阶段
  • 分布式:Jenkins支持主从架构,可以跨多台机器执行任务,也可以结合K8s实现动态slave

5.1Jenkins Pipeline介绍

Jenkins Pipeline分为声明式(Declarative Pipeline)和脚本式(Scripted Pipeline )
声明式流水线采用结构化语法实现,格式固定、易读性强,并且内置错误处理机制,可以不需要掌握Groovy语言即可完成编写,同时可以与Blue 0cean结合实现可视化,是目前比较推荐的实现方式。

在声明式流水线语法中,流水线过程定义在 Pipeline{}中,Pipeline 块定义了包含执行整个流水线的所有内容和指令,也是声明式流水线的开始,Pipeline的结构分为三层:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Jenkinsfile (Declarative Pipeline) 
pipeline {
agent any
stages {
stage('Build') {
steps {
//
}
}
stage('Test') {
steps {
//
}
}
stage('Deploy') {
steps {
//
}
}
}
}

参数说明:

  • agent any:在任何可用的代理上执行流水线或它的任何阶段,也就是执行流水线过程的位置,也可以指定到具体的节点;
  • stage:定义流水线的执行过程(相当于一个阶段),比如上文所示的 Build、Test、Deploy,但是这个名字是根据实际情况进行定义的,并非固定的名字;
  • steps:执行某阶段具体的步骤。

一个以声明式流水线的语法编写的 Jenkinsfile 文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Jenkinsfile (Declarative Pipeline) 
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'make'
}
}
stage('Test') {
steps {
sh 'make check'
junit 'reports/**/*.xml'
}
}
stage('Deploy') {
steps {
sh 'make publish'
}
}
}
}

常用参数说明:

  • pipeline:声明式流水线的一种特定语法,定义了包含执行整个流水线的所有内容和指令,也是声明式流水线的开始;pipeline的结构可分为三层:

  • agent:声明式流水线的一种特定语法,指示 Jenkins 为整个流水线分配一个执行器和工作区,也就是在流水线中的步骤在哪个 Agent 上执行,该参数同样可以在 stage 中配置;

  • stage:描述流水线阶段的语法块,在脚本式流水线语法中,stage(阶段)块是可选的;

  • steps:声明式流水线的一种特定语法,它描述了在这个 stage 中要运行的步骤;

  • sh:执行一个 shell 命令;

  • junit:用于聚合测试报告;

5.2安装Jenkins

Jenkins 的主节点可以采用 Docker、Kubernetes 或者 war 包进行部署,如果 Kubernetes 集 群中没有安装可靠的存储平台,建议直接采用 Docker 安装。这里jenkins主节点使用单独的节点,从节点使用k8s集群中的节点。

5.2.1安装Jenkins

准备单独的一台Linux 服务器,配置不低于 2C4G 和 40G 硬盘。

使用docker的方式安装Jenkins,先安装Docker服务(如果已安装忽略该步骤)

1
2
3
4
5
6
7
8
9
10
11
#安装依赖环境
yum install -y yum-utils device-mapper-persistent-data lvm2

#添加镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#安装docker
yum install docker-ce docker-ce-cli -y

#设置开机自启动
systemctl daemon-reload && systemctl enable --now docker

创建jenkins的数据目录

1
2
3
4
5
#创建数据目录
mkdir -p /data/jenkins
chmod -R 777 /data/jenkins/

docker pull registry.cn-beijing.aliyuncs.com/k8s-liujunwei/jenkins:2.504.3-debian-12-r1

启动jenkins,并配置管理账号密码为admin admin123

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
# 拉取镜像
docker pull registry.cn-beijing.aliyuncs.com/k8s-liujunwei/jenkins:2.504.3-debian-12-r1
#启动jenkins服务
docker run -d --name=jenkins --restart=always \
-u root \
-e JENKINS_PASSWORD=admin123 \
-e JENKINS_USERNAME=admin \
-e JENKINS_HTTP_PORT_NUMBER=8080 \
-e TZ=Asia/Shanghai \
-p 8080:8080 \
-p 50000:50000 \
-v /etc/localtime:/etc/localtime:ro \
-v /usr/bin/docker:/usr/bin/docker \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /data/jenkins:/bitnami/jenkins \
registry.cn-beijing.aliyuncs.com/k8s-liujunwei/jenkins:2.504.3-debian-12-r1

#参数解读
-d 表示后台运行。容器启动后不会占用当前终端,日志不会直接输出到屏幕。
--name=jenkins 给容器起一个固定名字叫 jenkins。方便后续用 docker stop/start/restart jenkins、docker logs jenkins 等命令操作,而不用记容器 ID。
--restart=always 定义容器的重启策略:无论因为什么原因退出(异常、宿主机重启等),Docker 都会自动重启这个容器。适合 Jenkins 这种需要 7×24 小时运行的服务。
-u root表示用root用户启动该容器
-e JENKINS_USERNAME=admin 环境变量:设置 Jenkins 首次启动时的管理员用户名为 admin。
-e JENKINS_PASSWORD=admin123 环境变量:设置上述管理员用户的密码为 admin123。
-e JENKINS_HTTP_PORT_NUMBER=8080 环境变量:告诉 Jenkins 内部监听的 HTTP 端口是 8080。
-p 8080:8080 端口映射:把宿主机的 8080 端口映射到容器内的 8080 端口。访问方式:浏览器打开 http://宿主机IP:8080 就能进入 Jenkins 界面。
-p 50000:50000 端口映射:把宿主机的 50000 端口映射到容器内的 50000 端口。这是 Jenkins 的 JNLP 端口(Java Network Launch Protocol),用于 Jenkins Agent(从节点)通过 TCP 方式连接主节点。如果Jenkins 需要添加 slave/agent 节点,这个端口必须暴露(否则 agent 连不上)。
-v /usr/bin/docker:/usr/bin/docker 挂载宿主机的 Docker 可执行文件到容器内。作用:让容器内的 Jenkins 能执行 docker 命令(比如在 Pipeline 中运行 docker build、docker run 等)。
-v /var/run/docker.sock:/var/run/docker.sock 挂载宿主机的 Docker daemon socket。这是最关键的一步!通过这个 socket,容器内的进程可以直接与宿主机的 Docker daemon 通信,实现“Docker-in-Docker”(DinD)的效果,但更轻量(不需要在容器里再跑一个 Docker daemon)。
结合上一条挂载,Jenkins Pipeline 就能正常使用 Docker 命令构建镜像、推镜像等。
-v /data/jenkins:/bitnami/jenkins 数据持久化挂载(最重要的持久化卷)。
宿主机路径:/data/jenkins
容器内路径:/bitnami/jenkins(Bitnami 镜像的官方推荐持久化目录)

查看jenkins日志

1
2
3
# 查看到这条日志说明 Jenkins 已完成启动
[root@jenkins yum.repos.d]# docker logs -f jenkins
Jenkins is fully up and running #表示成功

之后通过 Jenkins 宿主机的 IP+8080 即可访问 Jenkins服务

5.2.2安装常用插件

在安装之前首先配置国内的插件源, 点击 Advanced , 将插件源https://updates.jenkins.io/update-center.json更改为国内插件源:(https://mirrors.huaweicloud.com/jenkins/updates/update-center.json),修改后点击`Submit`提交


配置完国内下载地址后就可以点击[Available plugins]下载插件了,本笔记主要安装以下插件:

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
# 安装的插件如下:
Git
Git Parameter
GitLab
Git Pipeline for Blue Ocean
Credentials
Credentials Binding
Blue Ocean
Blue Ocean Pipeline Editor
Blue Ocean Core JS
Web for Blue Ocean
Pipeline SCM API for Blue Ocean
Dashboard for Blue Ocean
Build With Parameters
List Git Branches Parameter
Pipeline
Pipeline: Declarative
Kubernetes
Kubernetes CLI
Kubernetes Credentials
Image Tag Parameter
Docker
Docker Slaves
Docker Pipeline
Role-based Authorization Strategy

# 下面可选
Common API for Blue Ocean
REST API for Blue Ocean
JWT for Blue Ocean
GitHub Pipeline for Blue Ocean
Dynamic Extended Choice ParameterVersion
Config API for Blue Ocean
List Git Branches Parameter
Pipeline
Pipeline implementation for Blue Ocean
Pipeline: GitHub
Timestamper
Active Choices

选好安装的插件后点击install即可:

等待安装,勾选重启按钮,表示安装完成后会重启Jenkins服务


创建一个测试的流水线工程-【创建job】,并测试流水线是否正常工作,job的名字是test-pipeline