学习笔记—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 |
|
在浏览器输入IP端口,访问,输入密码,安装插件,创建用户,配置实例,可以启动使用了。
Jenkins使用
这里,用一个简单的例子来阐述一个简单的、整个从提交git后构建部署为一个docker实例的过程:
首先,确保jenkins在9096端口,并且有一个可以持续开发的项目,以一个简单的例子:https://github.com/gagaducko/learning_demos/tree/main/jenkins-demo
这里面有一个简单的python文件,运行后访问localhost:8080可以得到:
1 |
|
在此基础上,开始对jenkins进行构建,首先,需要确保jenkins有以下依赖:Git Plugin:支持从 Git 仓库拉取代码;Docker Pipeline Plugin:用于 Docker 的构建和推送;Pipeline Plugin:支持使用 Pipeline 进行自动化构建。
在dashboard创建一个test-jenkins项目,在Configuration处进行编辑。配置Jenkinsfile如下:
1 |
|
这个 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 |
|
否则会出现如下的错误:
1 |
|
当修改代码为1.1后,重新构建后,再次访问localhost:8080:
1 |
|
这是一个简单的流水线设计,jenkinsfile是很重要的。
对于一些复杂的项目来说,也可以用类似的方式进行CI/CD的构建。