BitTigerio

10天前

BitTigerio

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平台,这里不再啰嗦,只简单放一张图:

CI/CD

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

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

CI/CD

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

1. 代码提交

2. 根据webhook触发Jenkins构建

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

3. 进行构建

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

                <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配置信任地址
  • 再说第二个,这个插件的配置就更难了,先上我自己的配置。
<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和账号密码。

<server>
<id>docker-private-registry</id>
<username>zdy</username>
<password>****</password>
<configuration>
<email>something@qq.com</email>
</configuration>
</server>

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

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

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 .

新闻动态联系方式广告合作招聘英才安科实验室帮助与反馈About Us

Copyright © 2013 - 2017 Ancii. All Rights Reserved京ICP备13035690号 京公网安备11010802014868号