CI/CD应该是大部分公司进行迭代开发的模式。个人理解就是系统规范流程化地去进行迭代开发,而中间又涉及到多个部分,包含需求,编码,编译,测试,上线,部署,运维,管理。这些形成了一个闭环。
image.png
关于CI/CD的工具,之前用过AzureDevOps,当时没有深入研究,大致感觉就是提交代码之后会自动进行版本发布(并且经常会莫名其妙失败),然后项目经理能够很好地去看到项目迭代情况。
现在公司的项目都再用TAPD来进行迭代开发管理,但是修改后重新发布都需要手动去进行(今年疫情期间在家办公,前后端有任何更新都得直接发布),经历过的人都知道,频繁手动发布很浪费时间。特别是进入微服务时代之后,多个应用需要全部发布,手动挨个发布基本不可行。
本文目的很简单,就是希望在提交代码到仓库的时候也能自动发布到测试环境上面(妈妈在也不用担心我被前端同事催着发布更新),我们使用现在比较流行地Jenkins去完成。
Docker启动Jenkins/Jenkins
我们选择使用Docker去进行发布Jenkins,需要注意的是使用Jenkins/Jenkins这个镜像(已经包含很多常用组件)。
image.png
创建容器:
docker run -d -p 8000:8080 -p 50000:50000 -v /home/jenkins:/var/jenkins_home --name jenkins --restart always --privileged=true -u root jenkins/jenkins
这里挂载的数据卷对应目录是/var/jenkins_home,其中包含项目的配置以及Jenkins的任务工作区内容,启动完成后还需要对容器去进行配置。由于宿主机上已经存在对应的挂载目录,因此可以直接宿主上的配置,这些配置大致和插件更新等有关:
- 修改/home/jenkins/hudson.model.UpdateCenter.xml,将Url修改为http://mirror.xmission.com/jenkins/updates/update-center.json
- 修改/home/jenkins/updates/default.json,修改http://www.google.com/为http://www.baidu.com/
配置Jenkins
解锁
浏览器访问8000端口,第一次访问需要解锁,密码在提示的文件中。
image.png
安装组件
可以选择【选择插件来安装】来查看有哪些插件。
image.png
可以先安装推荐的插件。
image.png
创建一个新任务
选择Freestyle Project去创建一个任务。
image.png
基础配置
image.png配置源代码
源代码管理这里使用的是github,配置完地址以及访问凭证,如果需要使用其他的工具,可以安装对应插件。
image.png
从系统管理->系统配置中找到GitHub配置,选择”高级“,拷贝Hook地址。
image.png
登录GitHub,在对应Repository中的Webhooks配置钩子地址。这样一旦Git有更新就会去触发Jenkins上的任务。Recent Deliveries可以查看最近的触发,也可以方便调试。
image.png
配置触发方式
配置触发器,配置如下,H/1表示每一分钟去检查源代码是否有更新,可以根据自己项目实际情况去进行配置。
image.png
配置构建步骤
这个例子中Jenkins服务器负责根据新的代码去构建Docker镜像,并且上传到DockerHub上,接着SSH到另外一台发布服务器上,拉去对应镜像并且启动容器:
- 构建镜像,选择执行shell。
这里使用到Docker,因为这里的Jenkins本身就是在运行在Docker里面的,因此涉及到在Docker里面安装Docker,可参考我自己写的另外一篇文章:
image.png
相关脚本:
cd /var/jenkins_home/workspace/Test;
docker rmi testjenkins &>/dev/null;
docker login -u alexwillbegood -p {DockerHub密码};
docker build -t alexwillbegood/testjenkins .;
docker push alexwillbegood/testjenkins;
-
发布服务,选择使用ssh执行脚本。
需要从系统管理->插件管理中安装SSH插件,配置好远程SSH地址。
image.png
相关脚本:
docker rmi alexwillbegood/testjenkins &>/dev/null;
docker stop testjenkins &>/dev/null;
docker rm testjenkins &>/dev/null;
docker login -u alexwillbegood -p {DockerHub密码};
docker pull alexwillbegood/testjenkins;
docker run -d --name testjenkins -p 8001:80 -e ASPNETCORE_ENVIRONMENT="Development" --restart=always alexwillbegood/testjenkins;
注意这里的脚本还有大量的优化空间,比如:
- 直接使用了&>/dev/null将异常丢进"黑洞",没有去判断镜像是否存在,容器是否启动/存在等等问题。
- 这里的DockerHub登录直接使用账户密码的方式(明文写在配置中其实是件可怕的事情),DockerHub提供了CredentialStore的方式解决这个问题。
- 脚本文件也可以以文本文件的形式存在,这里的脚本只写“”sh build.sh”.这样做的好处是能够使得构建方式可以跟随代码一起更新,不需要每次更改都上服务器,更加灵活。
查看构建历史
image.png完结
至此,更新Git后就能够使用Docker自动部署到对应服务器。因为我是已经完成后再写的这篇文章,没有完全重复这些步骤,有问题或者有更好的方案可以评论交流。
网友评论