学习笔记—CI/CD—Jenkins

什么是CI/CD

  CI/CD(持续集成/持续交付)是一组实践,用于在软件开发过程中自动化代码集成、测试、部署的流程。CI(持续集成)指的是开发人员频繁地将代码集成到共享代码库中,每次集成都会自动运行测试以确保代码的稳定性。

  CD分为持续交付和持续部署。

  持续交付是指代码在通过测试后,能够自动准备好部署;

  持续部署则是指代码在每次变更后会自动部署到生产环境中。

为什么需要CI/CD

  CI/CD通过自动化的构建、测试、部署流程,可以显著的提高软件开发的效率和质量。

  并且它还减少了人工干预的需求,从而加速了产品的交付周期,并降低了因为代码集成和发布造成的问题。通过频繁的集成和持续的测试,可以让开发团队能够更早发现问题,减少修复的成本。

  同时,CD让团队可以轻松将变更部署到生产环境,减少了发布过程中的风险。

  因此,CI/CD也是云原生时代不可或缺的一部分。

Jenkins是什么

  Jenkins是一个开源的CI/CD自动化服务器,广泛用于构建、测试、部署软件项目。它支持众多的插件,可以与不同的工具、版本控制系统和技术栈集成。Jenkins通过流水线的形式自动化了开发流程中的各个步骤,从代码提交到生产环境的发布,可以有效提升开发效率。由于其灵活性和可扩展性,Jenkins也自然成为了最受欢迎的CI/CD工具之一。

Jenkins安装

  采用docker的方式进行简单的安装:

1
2
3
4
5
6
7
8
9
10
11
12
docker search jenkins
docker pull jenkins/jenkins
// 创建文件夹
mkdir -p /home/jenkins_home
// 赋予权限
chmod 777 /home/jenkins_home
// 运行容器
docker run -d -uroot -p 9096:8080 -p 50000:50000 -v /home/jenkins_home:/var/jenkins_home --name jenkins jenkins/jenkins
// 查看容器日志
docker logs -f jenkins
// 查看密码
cat /home/jenkins_home/secrets/initialAdminPassword

  在浏览器输入IP端口,访问,输入密码,安装插件,创建用户,配置实例,可以启动使用了。

Jenkins使用

  这里,用一个简单的例子来阐述一个简单的、整个从提交git后构建部署为一个docker实例的过程:

  首先,确保jenkins在9096端口,并且有一个可以持续开发的项目,以一个简单的例子:https://github.com/gagaducko/learning_demos/tree/main/jenkins-demo

  这里面有一个简单的python文件,运行后访问localhost:8080可以得到:

1
hello! Version here is 1.0, and version is 1.0 now!

  在此基础上,开始对jenkins进行构建,首先,需要确保jenkins有以下依赖:Git Plugin:支持从 Git 仓库拉取代码;Docker Pipeline Plugin:用于 Docker 的构建和推送;Pipeline Plugin:支持使用 Pipeline 进行自动化构建。

  在dashboard创建一个test-jenkins项目,在Configuration处进行编辑。配置Jenkinsfile如下:

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
pipeline {
agent any

environment {
// 设置 Docker 镜像名称和标签
DOCKER_IMAGE = "test-jenkins"
DOCKER_TAG = "latest"
REPO_URL = "https://github.com/gagaducko/learning_demos.git"
REPO_BRANCH = "main"
DOCKERFILE_DIR = "jenkins-demo" // Dockerfile所在的目录
}

stages {
stage('Clone Repository') {
steps {
// 克隆 Git 仓库
git branch: "${REPO_BRANCH}", url: "${REPO_URL}"
}
}

stage('Build Docker Image') {
steps {
script {
// 构建 Docker 镜像,指定构建上下文为 Dockerfile 所在的目录
docker.build("${DOCKER_IMAGE}:${DOCKER_TAG}", "${DOCKERFILE_DIR}")
}
}
}

stage('Stop Old Container') {
steps {
script {
// 停止旧的 Docker 容器
sh "docker stop ${DOCKER_IMAGE} || true"
sh "docker rm ${DOCKER_IMAGE} || true"
}
}
}

stage('Run New Container') {
steps {
script {
// 启动新的 Docker 容器
sh "docker run -d --name ${DOCKER_IMAGE} -p 8080:8080 ${DOCKER_IMAGE}:${DOCKER_TAG}"
}
}
}
}

post {
always {
script {
// 仅清理当前构建镜像的旧标签
sh "docker image prune -f --filter 'dangling=true' --filter 'label=image=${DOCKER_IMAGE}'"
}
}
}
}

  这个 Jenkinsfile 定义了一个完整的 Jenkins pipeline,用于从 Git 仓库克隆代码,构建 Docker 镜像,部署新的容器并清理旧的镜像。

  pipeline {}:整个声明式的 Jenkins pipeline 被包含在 pipeline {} 块中。

  agent any:指定 Jenkins 可以在任何可用的节点上执行这条 pipeline。也可以通过 agent {} 指定特定的节点或 Docker 容器。

  environment {}:定义了全局环境变量,所有的步骤中都可以访问。

  stage {}:一个 pipeline 由多个 stage 组成,每个 stage 表示一个执行阶段。

  git branch: “${REPO_BRANCH}”, url: “${REPO_URL}”:克隆指定的 Git 仓库和分支到 Jenkins 工作目录。

  script {}:允许在声明式 pipeline 中运行任意的 Groovy 脚本。

  docker.build():这是 Docker Pipeline 插件中的一个方法,用来构建 Docker 镜像。

  docker stop:停止正在运行的容器。如果容器不存在,使用 || true 确保不会因为错误导致任务失败。

  docker rm:删除容器,以便后续启动新的容器。

  docker run:启动新的 Docker 容器。

  post {}:定义了在 pipeline 执行完后总是执行的操作。

  always {}:无论 pipeline 成功还是失败,总是执行其中的脚本。

  docker image prune:清理构建过程中生成的无用(dangling)镜像,只针对当前构建的镜像进行清理。

  需要注意的是,如果 Jenkins 本身运行在 Docker 容器中,需要挂载 Docker 的 UNIX 套接字以便 Jenkins 容器可以访问主机的 Docker 守护进程。在启动 Jenkins 容器时,添加以下挂载选项:

1
2
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \

  否则会出现如下的错误:

1
2
3
+ docker build -t test-jenkins:latest jenkins-demo
/var/jenkins_home/workspace/test-jenkins@tmp/durable-70867870/script.sh.copy: 1: docker: not found
script returned exit code 127

  当修改代码为1.1后,重新构建后,再次访问localhost:8080:

1
hello! Version here is 1.1, and version is 1.1 now!

  这是一个简单的流水线设计,jenkinsfile是很重要的。

  对于一些复杂的项目来说,也可以用类似的方式进行CI/CD的构建。


学习笔记—CI/CD—Jenkins
https://gagaducko.github.io/2024/09/18/学习笔记—CI-CD—Jenkins/
作者
gagaduck
发布于
2024年9月18日
许可协议