CI/CD
CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。
CI/CD 的核心概念可以总结为三点:
- 持续集成
- 持续交付
- 持续部署
CI/CD 主要针对在集成新代码时所引发的问题(俗称"集成地狱")。
为什么会有集成地狱这个“雅称”呢?大家想想我们一个项目部署的过程,拉取代码->构建->测试->打包->部署
,如果我们经常需要部署项目,特别是在微服务时代,服务特别多的情况下,不停的测试打包部署,那估计得有个人一整天专门做这事了,而这事又是繁琐的重复无意义的。
具体而言,CI/CD 可让持续自动化和持续监控贯穿于应用的整个生命周期(从集成和测试阶段,到交付和部署),这些关联的事务通常被统称为"CI/CD 管道",由开发和运维团队以敏捷方式协同支持。
1.1 CI(Continuous Integration)
CI/CD 中的"CI"始终指持续集成,它属于开发人员的自动化流程。成功的 CI 意味着应用代码的新更改会定期构建、测试并合并到代码仓库中,该解决方案可以解决在一次开发中有太多应用分支,从而导致相互冲突的问题。
1.2 CD(Continuous Delivery/Continuous Deployment)
CI/CD 中的"CD"指的是持续交付和/或持续部署,这些相关概念有时会交叉使用。两者都事关管道后续阶段的自动化,但它们有时也会单独使用,用于说明自动化程度。
持续交付(Continuous Delivery)通常是指开发人员对应用的更改会自动进行错误测试并上传到代码仓库(如 GitHub、GitLab 等),然后由运维团队将其部署到实时生产环境中。这旨在解决开发和运维团队之间可见性及沟通较差的问题。因此,持续交付的目的就是确保尽可能减少部署新代码时所需的工作量。
持续部署(Continuous Deployment)指的是自动将开发人员的更改从代码仓库发布到生产环境,以供客户使用。通过一套全自动化的流程,来解决手动测试、编译、打包等操作。持续部署以持续交付的优势为根基,实现了管道后续阶段的自动化。
什么是Jenkins?
前面说的 CI/CD 算是一种思想,思想要落地,就需要对应的工具。
Jenkins 是一款开源的 CI/CD 软件,可以算是 CI/CD 软件领导者,它提供了超过 1000 个插件来支持构建、部署、自动化,基本上能够满足任何项目的需要。
整体来说,Jenkins 有如下六大特点:
- 持续集成和持续交付
作为一个可扩展的自动化服务器,Jenkins 可以用作简单的 CI 服务器,或者变成任何项目的持续交付中心。
- 简易安装
Jenkins 是一个基于 Java 的独立程序,可以立即运行,包含 Windows、Mac OS X 和其他类 Unix 操作系统。
- 配置简单
Jenkins 可以通过其网页界面轻松设置和配置,其中包括即时错误检查和内置帮助。
- 插件
通过更新中心中的 1000 多个插件,Jenkins 集成了持续集成和持续交付工具链中几乎所有的工具。
- 扩展
Jenkins 可以通过其插件架构进行扩展,从而为 Jenkins 可以做的事提供几乎无限的可能性。
- 分布式
Jenkins 可以轻松地在多台机器上分配工作,帮助更快速地跨多个平台推动构建、测试和部署。
安装Jenkins
查看官方文档:https://hub.docker.com/_/jenkins
看官方文档,我们只需要知道用法即可。拉去镜像推荐使用jenkins/jenkins的。
docker pull jenkins/jenkins
启动docker:
[root@localhost mydata]# docker run -p 8080:8080 -p 50000:50000 -d -v /mydata/jenkins_home:/var/jenkins_home jenkins/jenkins
如果报如下错误,需要修改下目录权限, 因为当映射本地数据卷时,/home/docker/jenkins目录的拥有者为root用户,而容器中jenkins user的uid为1000,执行如下命令即可:
touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
chown -R 1000:1000 /mydata/jenkins_home
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ee6fa3b4ff89 jenkins/jenkins "/usr/bin/tini -- /u…" 13 minutes ago Up 13 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp jovial_hertz
访问地址:http://192.168.56.100:8080/user/admin/
登录管理员密码如下,
[root@localhost jenkins_home]# docker exec -it ee6fa3b4ff89 /bin/bash
jenkins@ee6fa3b4ff89:/$ cat /var/jenkins_home/secrets/initialAdminPassword
e155fda91ae44b118096809dd73543f8
以上jenkins安装完成。
Jenkins的插件
Jenkins 启动成功之后,接下来我们安装插件:
- Maven Integration:Maven 构建工具
- Publish Over SSH:整个工具,将来把 Jenkins 打包好的 jar 上传到应用服务器上。
安装插件之后需要进行环境配置:
插件安装成功之后,接下来我们开启 Jenkins 的配置,在正式开始配置之前,先做一点准备工作。
这个需要我们提前准备好 Maven,由于 Jenkins 容器中已经包含一个 JDK 了,所以我们可以不用提前准备 JDK,只需要提前准备 Maven 即可。为了避免权限问题,我们可以直接将 Maven 上传到 jenkins 容器中,然后去配置即可。
maven:
在宿主机上执行wget下载需要的maven安装包,并解压。
wget https://dlcdn.apache.org/maven/maven-3/3.9.3/binaries/apache-maven-3.9.3-bin.tar.gz
tar -zxvf apache-maven-3.9.3-bin.tar.gz
如下将宿主机中的 maven 拷贝到 Jenkins 容器中:
# 这个命令表示将宿主机中的 maven 目录拷贝到 jenkins 容器中的 /opt/ 目录下
docker cp maven jenkins:/opt/ 其中jenkins是dockernamne指定,根据实际情况调整
查看当前容器情况
[root@localhost apache-maven-3.9.3]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f92b23522a0d app_docker "java -jar app.jar" 16 hours ago Up 16 hours 0.0.0.0:9999->8000/tcp, :::9999->8000/tcp app_docker
ee6fa3b4ff89 jenkins/jenkins "/usr/bin/tini -- /u…" 2 days ago Up 19 hours 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp jovial_hertz
05fc90a2f9f7 gitlab/gitlab-ce "/assets/wrapper" 6 weeks ago Up 19 hours (healthy) 443/tcp, 0.0.0.0:9922->22/tcp, :::9922->22/tcp, 0.0.0.0:9980->80/tcp, :::9980->80/tcp gitlab
[root@localhost apache-maven-3.9.3]# docker exec -it ee6fa3b4ff89 /bin/bash
jenkins@ee6fa3b4ff89:/$ cd /opt/
jenkins@ee6fa3b4ff89:/opt$ ls
java jenkins-plugin-manager.jar maven
接下来就可以开始配置了,配置的位置如下图:
JDK配置:
jenkins@ee6fa3b4ff89:/opt/java/openjdk$ ls
bin conf include legal lib release
jenkins@ee6fa3b4ff89:/opt/java/openjdk$ pwd
/opt/java/openjdk
Maven配置:
jenkins@ee6fa3b4ff89:/opt/maven/apache-maven-3.9.3$ pwd
/opt/maven/apache-maven-3.9.3
Git安装,默认即可。