##背景
公司现有的技术架构为分布式(粗粒度微服务)服务架构,代码版本管理工具使用的gitlab,部署是是通过Jenkins编译打包并部署的,看到原来的项目部署编写的*.sh很繁琐,故先在现有项目测试环境进行实验。
早就听闻gitlab可以集成CI CD 但一直没有尝试过,第一步当然是尝试将研发push的代码先编译,做个初步的编译异常提醒,参考了各种文章和官网文档,开始了接入runner
跟这篇文章过程一样,这里整理一下( [后端]gitlab之gitlab-ci自动部署 - 简书 https://www.jianshu.com/p/df433633816b)
###步骤
安装GitLab-CI 这个不用安装了,装好GitLab就自带了
安装GitLab-Runner
在centOS上安装gitlab-ci-multi-runner
$ curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
$ yum install gitlab-ci-multi-runner
这样就装好了gitlab-ci-multi-runner,然而我们只是装好了gitlab-runner,当然我们要接着向gitlab-CI注册这个runner,不然gitlab-CI在push事件到来的时候怎么知道要调用谁呢?这里也可以发现和webhook方式的区别,webhook方式是我们主动配置了一个连接给gitlab;gitlab-runner只要注册一下就好了。
$ gitlab-ci-multi-runner register
#引导会让你输入gitlab的url,输入自己的url,例如http://gitlab.example.com/
#引导会让你输入token,去相应的项目下找到token,例如ase12c235qazd32
#引导会让你输入tag,一个项目可能有多个runner,是根据tag来区别runner的,输入若干个就好了,比如web,hook,deploy
#引导会让你输入executor,这个是要用什么方式来执行脚本,图方便输入shell就好了。
在输入 executor 类型的时候,我尝试过docker的形式 ,会让你选择依赖的镜像,我选择的是maven官方镜像,编译的时候会在一个容器中进行 每次都会启动一个容器,环境非常干净,但后面到我自己需要构建镜像的时候遇到问题,估计不能在容器中构建镜像,就unregister后重新register,然后选择shell的方式
stages:
- build
makejava:
stage: build
script:
- mvn clean package -P test
- mvn clean
tags:
- dev
到这一步后,我们提交的项目runner会自动帮我们编译,也会给gitlab反馈一个结果,比如
我们可以从中清晰的看到谁push的代码有问题,也可以点进去看到具体的错误
你可以 根据这个错误给相关的研发提issue或者重试一次
贴了这么多图片,差点忘了我们的目标,let’s 走
首先你手里得有几台虚拟机,我们用虚拟机搭建了一个docker集群,并为这个集群安装了可视化操作界面,集群的搭建你可以参考使用Docker Swarm模式搭建Swarm集群 - 简书
https://www.jianshu.com/p/df744c4e375e ,我们安装的web界面为portainer,你可以参考官方文档安装 Portainer | Simple management UI for Docker https://portainer.io/install.html
我们的装逼(操作)思路是将编译打包的结果构建成镜像,然后将镜像推送到阿里云镜像私有仓库,最后在Portainer界面中编写stack,最后的最后就是点击发射按钮,所以接下来天才第一步是
com.spotify
docker-maven-plugin
${docker.plugin.version}
package
build
${docker.image.prefix}/${project.artifactId}
${project.basedir}/
/
${project.build.directory}
${project.build.finalName}.jar
因为我们的模块项目中有war包 所以具体的子pom里面可能为(注意一个是.jar 一个是.war)
com.spotify
docker-maven-plugin
${docker.image.prefix}/${project.artifactId}
${project.basedir}/
/
${project.build.directory}
${project.build.finalName}.war
除此之外还需要在需要的(子)项目根目录增加Dockerfile文件来描述镜像构建过程,我这里贴出两种Dockerfile,一种为Dubbo的生产者jar的,一种是Dubbo的消费者war包的
FROM java:8
VOLUME /tmp
COPY target/*.jar app.jar
COPY target/lib/ /lib/
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN bash -c 'touch /app.jar'
CMD java -Djava.security.egd=file:/dev/./urandom -Dfile.encoding=utf-8 -Duser.timezone=GMT+08 -server -jar /app.jar
FROM tomcat:8.5
VOLUME /tmp
RUN rm -rf /usr/local/tomcat/webapps && mkdir /usr/local/tomcat/webapps
COPY target/*.war /usr/local/tomcat/webapps/ROOT.war
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
CMD ["catalina.sh", "run"]
部分目录结构贴个图吧
因为前面已经将docker镜像的构建个maven的package绑在了一起,所以我们修改了.gitlab-ci.yml 使其完成后面的打包、构建镜像并推送到仓库的过程,
stages:
- build
- tagpushimage
variables:
xxxxxx_order_service: registry.cn-shanghai.aliyuncs.com/sssss/xxxxxx-order-service:latest
xxxxxx_product_service: registry.cn-shanghai.aliyuncs.com/sssss/xxxxxx-product-service:latest
xxxxxx_user_service: registry.cn-shanghai.aliyuncs.com/sssss/xxxxxx-user-service:latest
xxxxxx_webapp_app: registry.cn-shanghai.aliyuncs.com/sssss/xxxxxx-webapp-app:latest
xxxxxx_webapp_center: registry.cn-shanghai.aliyuncs.com/sssss/xxxxxx-webapp-center:latest
makejava:
stage: build
script:
- mvn clean package -P test
- mvn clean
tags:
- dev
tag_push_images:
stage: tagpushimage
when: manual
script:
- docker tag gpf/xxxxxx-order-service:latest $xxxxxx_order_service
- docker tag gpf/xxxxxx-product-service:latest $xxxxxx_product_service
- docker tag gpf/xxxxxx-user-service:latest $xxxxxx_user_service
- docker tag gpf/xxxxxx-webapp-app:latest $xxxxxx_webapp_app
- docker tag gpf/xxxxxx-webapp-center:latest $xxxxxx_webapp_center
- docker login [email protected] -p passwd registry.cn-shanghai.aliyuncs.com
- docker push $xxxxxx_order_service
- docker push $xxxxxx_product_service
- docker push $xxxxxx_user_service
- docker push $xxxxxx_webapp_app
- docker push $xxxxxx_webapp_center
tags:
- dev
关于这个文件的编写,你可以参考使用 Docker 构建 | Live Digital http://livedig.com/733
至此,我们到了推送镜像完成的过程
下面我们需要编写stack需要的描述文件,这个和docker-compose.yml的编写感觉很像,这里也有给你参考学习的文章 Compose file version 3 reference | Docker ocumentation
https://docs.docker.com/compose/compose-file/#reference-and-guidelines
version: '3'
services:
zookeeper:
image: 'registry.aliyuncs.com/acs-sample/zookeeper:3.4.8'
deploy:
replicas: 1
restart_policy:
condition: on-failure
hostname: zookeeper
networks:
- xxxxxxnetwork
ports:
- "2181:2181"
xxxxxx-order-service:
image: registry.cn-shanghai.aliyuncs.com/sssss/xxxxxx-order-service:latest
depends_on:
- zookeeper
deploy:
replicas: 2
restart_policy:
condition: on-failure
networks:
- xxxxxxnetwork
xxxxxx-user-service:
image: registry.cn-shanghai.aliyuncs.com/sssss/xxxxxx-user-service:latest
depends_on:
- zookeeper
deploy:
replicas: 2
restart_policy:
condition: on-failure
networks:
- xxxxxxnetwork
xxxxxx-product-service:
image: registry.cn-shanghai.aliyuncs.com/sssss/xxxxxx-product-service:latest
depends_on:
- zookeeper
networks:
- xxxxxxnetwork
deploy:
replicas: 2
restart_policy:
condition: on-failure
xxxxxx-webapp-center:
image: registry.cn-shanghai.aliyuncs.com/sssss/xxxxxx-webapp-center:latest
depends_on:
- zookeeper
networks:
- xxxxxxnetwork
deploy:
replicas: 2
restart_policy:
condition: on-failure
ports:
- "8080:8080"
xxxxxx-webapp-app:
image: registry.cn-shanghai.aliyuncs.com/sssss/xxxxxx-webapp-app:latest
depends_on:
- zookeeper
deploy:
replicas: 2
restart_policy:
condition: on-failure
networks:
- xxxxxxnetwork
ports:
- "8060:8080"
networks:
xxxxxxnetwork:
你需要注意的是你的linux防火墙端口是否打开,还有portainer有点问题,查看service是正常的,但是显示容器的状态的时候不正常。转载需要注明出处以及url可点击直达链接(http://blog.csdn.net/zhangruhong168/article/details/78924700),欢迎评论探讨。
转载于 http://blog.c7d8.com/blog/23.html ,原文可能有更新,以原文为准