CI/CD

CI/CD平台的作用我就不再啰嗦了。现在又比较流行docker容器化(快速,环境无缝切换等作用),所以世面上还没有一套成型的,固定的套件来拱企业快速搭建自己的CI/CD平台(花钱买服务的除外),docker云也更是五花八门,DaoCloud,Swarm等。作者有幸参加了公司的CI/CD平台搭建,从无到有的做了一套持续集成持续交付平台,算上大致接近尾声了。这里分享一下,阅读此博文需要以下知识储备与要求:

  • Jenkins
  • docker,docker云(Rancher或者其他云)
  • 着手做过CI平台

文章结构

  1. 基于Jenkins,Shell脚本的传统CI平台
  2. 基于Jenkins,docker云的容器化CI/CD平台

1. 基于Jenkins,Shell脚本的传统CI平台

作者在上家公司着手做了一套基于Shell脚本的CI平台,这里不再啰嗦,只简单放一张图:

2. 基于Jenkins,docker云的容器化CI/CD平台

重头戏来了。基于Shell脚本的部署其实还是能解决一般企业的CI需求,然而,对于微服务架构的多工程快速部署,平台无关性,就需要容器化部署了。
同理,上一张图:

下面开始一步一步的讲解:

1. 代码提交

2. 根据webhook触发Jenkins构建

说白了,就是代码提到Gitlab,在Gitlab配置一个webhook像Jenkins发送一个请求,Jenkins收到这个请求后就会开始执行构建。当然了,Jenkins里是依赖的Gitlab plugin插件来支持这个功能的。参考博文:Gitlab plugin使用

3. 进行构建

这一步是最繁琐的,也是要重点讲的,这里涉及到很多配置。首先需要说一下的是,我这里的Jenkins是物理部署的。这一步Jenkins的配置我会在最后贴出来。Jenkins在这一步里执行构建(clean install)后打包好工程后自动根据插件

1
2
3
复制代码                <groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>

依赖一个事先准备好的Dockerfile构建出docker镜像并推送到远程Habor.
这一步需要注意如下配置:

  1. docker环境的配置。
  2. docker-maven-plugin配置
    这两个配置都不是那么好配置的。
  • 先说第一个,docker环境的安装好后,需要设置Docker的Insecure registries里加上自己的私服Harbor地址,这是因为docker在进行推送镜像时是https协议,而Harbor是http协议的,所以要设置信任这个地址,否则在进行推送时会报错的。参考博文:docker配置信任地址,还是给大家截图一下我的配置:
    docker配置信任地址
  • 再说第二个,这个插件的配置就更难了,先上我自己的配置。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
复制代码<build>
<resources>
<resource> //必须要转换一下,因为Dockerfile里有内置变量需要转换
<directory>src/main/docker</directory>
<filtering>true</filtering>
<includes>
<include>**/Dockerfile</include>
</includes>
<targetPath>../docker</targetPath>
</resource>
<!--注意这里一定要把resources目录下的配置文件引进去,并且不要指定targetPath-->
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.yml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<serverId>docker-private-registry</serverId>
<registryUrl>${docker.repostory}</registryUrl>
<pushImage>true</pushImage>
<imageName>
${docker.repostory}/${docker.registry.name}/${project.artifactId}
</imageName>
<dockerDirectory>
${project.build.directory}/docker
</dockerDirectory>
<resources>
<rescource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</rescource>
</resources>
</configuration>
</plugin>
</plugins>
</build>

这里需要指出的是,docker-private-registry这一行,一定要在自己maven的setting文件里配置上自己Harbor和账号密码。

1
2
3
4
5
6
7
8
复制代码<server>
<id>docker-private-registry</id>
<username>zdy</username>
<password>****</password>
<configuration>
<email>something@qq.com</email>
</configuration>
</server>

给个参考博文(建议大家用我的配置,参考博文真的只能参考,很多错误):spotify插件

然后给下自己的srm/main/docker目录下的Dockerfile

1
2
3
4
5
6
7
8
9
10
11
复制代码FROM anapsix/alpine-java:8

ENV APP_NAME @project.build.finalName@.@project.packaging@
# 后期更改为日志目录,将日志挂载出来
VOLUME /tmp
#默认工作目录/
ADD $APP_NAME /app.jar

EXPOSE 8070

ENTRYPOINT ["java","-jar","/app.jar"]

上面的具体配置我就不一一讲了,因为很复杂,像dockerfile里的内置变量转换不出来什么的,大家就多参考参考我的配置,配置都是整理了很长时间才出来的,还是那句老话,只讲思路,具体配置大家多参考其他文章,思路出来了,慢慢的就可以摸索出来。

4. 构建完成后发送CURL请求触发Rancher的WebHook

按照上面的配置后,jenkins构建算是完成了,我们新构建的docker镜像也推送到了远程的HarBor私服镜像库。这时就要执行CURL指令来触发Rancher拉取镜像部署了。
下面给一下我jenkins的截图。

Jenkins配置

至于CURL后面如何写的,Rancher官网webhook,需要事先在Rancher的webhook配置,生成一些参数,然后curl.我就不多讲了,大家自行看官网。
Rancher WebHook

5. Rancher根据WebHook触发后拉取镜像并且部署。

讲的比较草率,可能很多人很蒙蔽,其实这篇博文的精华就是开头那一张图,按照图中的思路摸索摸索就大致可以出来,为什么作者不愿意详讲呢,因为说实在的配置这个东西太麻烦了,很多配置很复杂,都需要自己摸索。我也只能提一提思路。

效果我就不演示,提交完代码后,在Jenkins构建好镜像自动推送到Harbor,然后Curl Ranche的WebHook,触发Rancher拉取最新镜像并部署。
Over, Have a good day .

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%