共计 6181 个字符,预计需要花费 16 分钟才能阅读完成。
@[toc]
1. 什么是 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)指的是主动将开发人员的更改从代码仓库公布到生产环境,以供客户应用。通过一套全自动化的流程,来解决手动测试、编译、打包等操作。继续部署以继续交付的劣势为根基,实现了管道后续阶段的自动化。
2. 什么是 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 有很多好玩的用法,明天我还是想先通过一个简略的案例,先来和大家捋一捋如何应用 Jenkins 来实现一个 Spring Boot 我的项目的主动公布部署,这样大家对 Jenkins 现有一个直观的认知,各种其余应用细节松哥在当前的文章中再来和大家细聊。
3. 筹备工作
3.1 整体规划
咱们先来通过如下一张图片来看下 Jenkins 在整个流程中表演的角色:
联合第一二大节的介绍,这张图应该很好了解。
3.2 筹备代码
提前准备好测试代码,并上传到代码仓库中。为了更加真切一些,小伙伴们能够将这个代码仓库设置为公有的,这样未来能够测验 Jenkins 中的配置是否正确。
思考到 GitHub 网络有时候不稳固,我这里应用了 Gitee,一个很简略的 Spring Boot 工程,里边有一个 hello 接口,仅此而已。
我的代码仓库地址(公有仓库):
- https://gitee.com/lenve/jenki…
3.3 筹备服务器
实践上,咱们须要一台服务器用来跑 Jenkins,还须要一台服务器作为我的应用服务器,然而我手头没有多余的服务器,所以我就将 Jenkins 和我的 Spring Boot 我的项目部署到一台服务器上,在接下来的文章中我会和大家阐明每个配置是针对 Jenkins 的还是针对 Spring Boot 的。
另外,有的小伙伴可能是在虚拟机上做试验,因为未来咱们的代码提交到 Gitee 之后,Gitee 会通过一个 POST 申请将这个事件告知 Jenkins,进而触发 Jenkins 的构建操作。所以这就要求 Gitee 可能拜访到你的 Jenkins 服务器,所以如果你的 Jenkins 刚好搭建在服务器上,这事就很容易了,但如果是搭建在虚拟机里,就得通过花生壳之类的内网穿透工具来辅助你的工作了,比拟麻烦,而且花生壳网速也慢。
不过小伙伴们不用放心,如果你在虚构上搭建的 Jenkins,并且不违心折腾花生壳,那么也能够通过手动构建 / 定时构建的形式去实现我的项目构建的。
4. 搭建 Jenkins
为了省事,我决定用 Docker 搭建 Jenkins,一行命令搞定。
为了操作不便,咱们将 Jenkins 的工作目录映射到我的宿主机中来,因而首先在宿主机中筹备一个数据目录(不是必须):
# 创立 jenkins 目录
mkdir /data/jenkins_home/
# 批改目录的所有者,以便于 Jenkins 容器可能操作该目录
chown -R 1000:1000 /data/jenkins_home/
接下来创立并启动 Jenkins 容器,同时挂载数据卷:
docker run -d --name jenkins -p 8088:8080 -p 50000:50000 -v /data/jenkins_home:/var/jenkins_home jenkins/jenkins
因为 Jenkins 在运行的时候须要用到 maven,所以有的人会抉择将 maven 目录也作为挂载点,然而我感觉没有必要,特地是对于初学者而言,这块很容易出错,不如将 maven 未来间接拷贝到 Jenkins 容器中,这样反而省事一些。
执行如上命令,装置胜利之后,浏览器输出 http://localhost:8088
就能够拜访了。
而后稍等片刻,就能够拜访 Jenkins 了:
拜访之前,首先须要解锁 Jenkins,解锁明码地位网页上列出来了,然而因为咱们创立容器的时候设置了数据卷,所以,当初间接去宿主机的 /data/jenkins_home/secrets/initialAdminPassword
地位查看初始化明码,如下:
在网页中,输出明码而后持续。接下来会让咱们抉择须要的插件,第一次应用,装置举荐插件即可。
如果因为网络起因装置失败,能够点击重试按钮进行重试。
接下来创立一个新的用户,也能够不创立新的用户,间接应用 admin 即可:
再设置 Jenkins 拜访地址:
这个页面有乱码,不过不影响,设置实现后,咱们点击保留并实现按钮即可。接下来就能够进入到 Jenkins 中了。
整个过程执行结束后,倡议执行如下命令重启一下 Jenkins,因为有的插件须要重启之后才会失效。
docker restart jenkins
5. 装置插件
Jenkins 启动胜利之后,接下来咱们装置三个必要的插件:
- Maven Integration:Maven 构建工具
- Publish Over SSH:整个工具,未来把 Jenkins 打包好的 jar 上传到应用服务器上。
- Gitee:帮助应用 Gitee 仓库。
装置步骤如下:
点击右边的系统管理,而后点击左边的插件治理,进行配置。
而后在可选插件中,搜寻 Maven Integration 和 Publish Over SSH 以及 Gitee 三个插件:
搜寻实现后,点击 Install without restart。
装置胜利之后,重启 Jenkins。
倡议执行 docker restart jenkins
去重启,点击网页上的重启,会卡很久,还是执行 docker 重启命令靠谱一些。
6. 配置 Jenkins
6.1 根本的环境配置
插件装置胜利之后,接下来咱们开启 Jenkins 的配置,在正式开始配置之前,先做一点筹备工作。
这个须要咱们提前准备好 Maven,因为 Jenkins 容器中曾经蕴含一个 JDK 了,所以咱们能够不必提前准备 JDK,只须要提前准备 Maven 即可。为了防止权限问题,咱们能够间接将 Maven 上传到 jenkins 容器中,而后去配置即可。
如下将宿主机中的 maven 拷贝到 Jenkins 容器中:
# 这个命令示意将宿主机中的 maven 目录拷贝到 jenkins 容器中的 /opt/ 目录下
docker cp maven jenkins:/opt/
接下来就能够开始配置了,配置的地位如下图:
6.2 JDK
首先咱们来配置 JDK,Jenkins 中默认装置了 JDK,咱们只须要将其配置配出进去即可:
别名随便取,JAVA_HOME 则依据理论状况配置。
6.3 Maven
Maven 就是咱们刚刚上传到 docker 中期中的 Maven,配置一下地位即可,Jenkins 未来会主动从 Gitee 上将代码拉下来,而后就利用你这里配置的 Maven 进行构建:
名字随便取,MAVEN_HOME 则是后面刚刚上传到容器中的 MAVEN 目录。
6.4 Git
配置 Git,因为 Jenkins 容器中曾经存在 git 了,所以这里不须要额定装置 git,默认即可。
所有都配置实现,点击保留按钮。
6.5 近程的凭证配置
接下来还须要咱们配置两个近程登录凭证。
6.5.1 应用服务器信息
应用服务器,就是未来 Jenkins 将代码构建成 jar 包后,要上传的服务器的信息(地址、用户名以及明码)。
配置步骤如下,首先找到配置的地位:
往下拉找到 Publish Over SSH,而后点击新增,开始配置,Hostname 地位填写你服务器的域名或者 IP:
配置胜利后,点击测试连贯进行测试,确保连贯是胜利的。
有的小伙伴反馈这里用户名明码会导致 jar 包上传失败,要在应用服务器上生成 ssh 密钥对,而后将私钥配置给 Jenkins(这块大家联合本人状况来看,如果前面 jar 上传失败,能够回来改一下这里)。
6.5.2 Gitee 的信息
接下来咱们配置 Gitee 的信息。
首先配置仓库的根本信息:
接下来配置 Gitee 的凭证,要依据这些凭证,能力从 Gitee 上拉取代码下来,点击 增加 ->Jenkins
,增加凭证:
增加胜利之后,就能够抉择这个令牌了。
最初点击测试连贯,确保能够连上 Gitee。
所有配置工作都做完了,接下来咱们就能够开始构建一个我的项目了。
7. 开始一个我的项目的构建
首先咱们新建一个工作
接下来咱们抉择构建一个 Maven 我的项目
点击确定之后,拉到源码治理地位,开始配置。
首先抉择 Git,填入 Gitee 上的仓库地址,而后凭证就写 Gitee 的用户名 / 明码。
这里有一个须要留神的中央,就是默认的分支名称,GitHub 上当初默认的主分支名称是 main,Gitee 仿佛还是 master,这个无所谓了,然而小伙伴们留神图片上面的分支,按你理论的状况填写。
这里也要增加凭证信息:
这里也要留神下,有小伙伴反馈 Gitee 上的用户名和用户空间不是一回事(如果用的 GitHub 就不存在这个问题),我这里用户名地位理论填入用户空间名(如果你也不晓得什么是用户空间,那么祝贺你,间接写用户名就行了)。
加上工夫,咱们看下打印的过程:
接下来输出我的项目构建命令,未来 Jenkins 从 Gitee 上拉取代码下来之后,就执行该命令对我的项目进行打包:
最初,配置上传构建好的文件,并执行启动命令,如下:
配置的详细信息:
依据上图的配置,咱们应用 root 用户登录,root 登录胜利之后,默认进入到 /root 目录下,接下来会主动进入到 data 目录,而后咱们的 jar 包就上传到这个地位上。
而后咱们在应用服务器上也提前准备好一个 shell 脚本叫做 deploy.sh,位于 /root/data
目录下, 这个脚本内容如下:
export JAVA_HOME=/opt/java
export PATH=$JAVA_HOME/bin:$PATH
JAR_PATH=/root/data
JARFILE=jenkins_demo-0.0.1-SNAPSHOT.jar
ps -ef | grep $JARFILE | grep -v grep | awk '{print $2}' | xargs kill -9
java -jar $JAR_PATH/$JARFILE > out.log &
if [$? = 0];then
sleep 30
tail -n 50 out.log
fi
这个脚本其实很好了解,后面先配置一下环境变量,留神这个是应用服务器的环境变量,不是 Jenkins 的。
而后先检查一下,如果应用程序曾经在运行了,就先将之进行掉。而后运行咱们最新的 jar 即可。
另外,能够开启 SSH 操作日志,开启日志之后,就能够看到 Jenkins 中操作应用服务器其的过程了,特地是大家第一次配置的时候,容易出错,配置了日志,未来出错就晓得什么起因导致的谬误了。
配置形式如下图:
至此,这个我的项目就配置实现了。
保留之后,点击立刻构建按钮,就能够开始构建了:
开始构建之后,能够点击构建按钮,查看构建过程:
点击控制台输入,能够查看整个构建过程:
构建实现后,来到应用服务器,执行 jps 命令查看运行的 Java 过程,就能够看到咱们的应用程序曾经跑起来了。
8. 主动构建
好了,当初咱们的我的项目还不是主动构建,也就是当咱们向 Gitee 上的代码仓库提交代码之后,并不会触发 Jenkins 的主动构建,得咱们手动点击构建按钮,接下来咱们再来持续配置,实现主动触发构建。
为了实现主动触发构建,咱们须要批改两个中央。
8.1 批改 Jenkins
首先在 Jenkins 的以后我的项目中,配置一下触发构建的规定:
大家留神,在网页上 Jenkins 曾经给出了未来要配置的 Webhook 的地址了,大家间接拷贝该地址即可。
8.2 配置 Webhook
接下来在 Gitee 的我的项目中,配置 WebHook,在以后我的项目中,抉择治理选项卡,右边菜单点击 WebHooks,而后点击增加 WebHook。
因为 Jenkins 是要登录之后才能够操作的,处于公网的 Jenkins 咱们也不能降至设置为匿名拜访,所以这里咱们将 Jenkins 的用户名明码放在申请地址中,最终地址相似这样:http://username:password@11.11.11.11:8088/xxxx
。
好啦,这就行了,配置实现后,接下来咱们向 Gitee 代码仓库提交代码,提交胜利之后,咱们去查看是否会触发 Jenkins 主动构建性能。
9. 小结
好啦,对于 Jenkins 还有很多好玩的用法,明天的文章限于篇幅我就先通过一个简略的案例来和大家分享一下 Jenkins 的根本用法,以便于小伙伴们对 Jenkins 建设一个直观的印象,更多的玩法,松哥将在后续的文章中和大家持续介绍,小伙伴们也能够留言说说你想看 Jenkins 怎么玩。
参考资料:
- https://www.redhat.com/zh/topics/devops/what-is-ci-cd