使用Jenkins持续部署Docker应用

CI/CD应该是大部分公司进行迭代开发的模式。个人理解就是系统规范流程化地去进行迭代开发,而中间又涉及到多个部分,包含需求,编码,编译,测试,上线,部署,运维,管理。这些形成了一个闭环。


使用Jenkins持续部署Docker应用_第1张图片
image.png

关于CI/CD的工具,之前用过AzureDevOps,当时没有深入研究,大致感觉就是提交代码之后会自动进行版本发布(并且经常会莫名其妙失败),然后项目经理能够很好地去看到项目迭代情况。
现在公司的项目都再用TAPD来进行迭代开发管理,但是修改后重新发布都需要手动去进行(今年疫情期间在家办公,前后端有任何更新都得直接发布),经历过的人都知道,频繁手动发布很浪费时间。特别是进入微服务时代之后,多个应用需要全部发布,手动挨个发布基本不可行。
本文目的很简单,就是希望在提交代码到仓库的时候也能自动发布到测试环境上面(妈妈在也不用担心我被前端同事催着发布更新),我们使用现在比较流行地Jenkins去完成。

Docker启动Jenkins/Jenkins

我们选择使用Docker去进行发布Jenkins,需要注意的是使用Jenkins/Jenkins这个镜像(已经包含很多常用组件)。


使用Jenkins持续部署Docker应用_第2张图片
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端口,第一次访问需要解锁,密码在提示的文件中。


使用Jenkins持续部署Docker应用_第3张图片
image.png

安装组件

可以选择【选择插件来安装】来查看有哪些插件。


使用Jenkins持续部署Docker应用_第4张图片
image.png

可以先安装推荐的插件。


使用Jenkins持续部署Docker应用_第5张图片
image.png

创建一个新任务

选择Freestyle Project去创建一个任务。


使用Jenkins持续部署Docker应用_第6张图片
image.png

基础配置

使用Jenkins持续部署Docker应用_第7张图片
image.png

配置源代码

源代码管理这里使用的是github,配置完地址以及访问凭证,如果需要使用其他的工具,可以安装对应插件。


使用Jenkins持续部署Docker应用_第8张图片
image.png

从系统管理->系统配置中找到GitHub配置,选择”高级“,拷贝Hook地址。


使用Jenkins持续部署Docker应用_第9张图片
image.png

登录GitHub,在对应Repository中的Webhooks配置钩子地址。这样一旦Git有更新就会去触发Jenkins上的任务。Recent Deliveries可以查看最近的触发,也可以方便调试。
使用Jenkins持续部署Docker应用_第10张图片
image.png

配置触发方式

配置触发器,配置如下,H/1表示每一分钟去检查源代码是否有更新,可以根据自己项目实际情况去进行配置。


使用Jenkins持续部署Docker应用_第11张图片
image.png

配置构建步骤

这个例子中Jenkins服务器负责根据新的代码去构建Docker镜像,并且上传到DockerHub上,接着SSH到另外一台发布服务器上,拉去对应镜像并且启动容器:

  • 构建镜像,选择执行shell。
    这里使用到Docker,因为这里的Jenkins本身就是在运行在Docker里面的,因此涉及到在Docker里面安装Docker,可参考我自己写的另外一篇文章:

https://www.jianshu.com/p/8bdefb618a98

使用Jenkins持续部署Docker应用_第12张图片
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地址。


    使用Jenkins持续部署Docker应用_第13张图片
    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”.这样做的好处是能够使得构建方式可以跟随代码一起更新,不需要每次更改都上服务器,更加灵活。

查看构建历史

使用Jenkins持续部署Docker应用_第14张图片
image.png

完结

至此,更新Git后就能够使用Docker自动部署到对应服务器。因为我是已经完成后再写的这篇文章,没有完全重复这些步骤,有问题或者有更好的方案可以评论交流。

你可能感兴趣的:(使用Jenkins持续部署Docker应用)