gradle+jenkins+compose自动化集成持续交付

简介

本文将介绍如何使用本地搭建的jenkins自动化持续集成工具,配合Docker swarm去为Docker容器进行编排、提供集群服务,线上发布、部署。

以下操作全部在阿里云容器服务中进行。使用阿里云容器服务的原因是:可以省去一些运维、维护的人力成本。

背景

公司开发产品使用的是spring cloud微服务技术栈,线上需要使用Docker对各个单独的模块服务进行容器化部署,Docker技术发展为微服务落地提供了更加便利的环境,而Docker Swarm
<!--more--> 是 Docker 官方三剑客项目之一,提供 Docker 容器集群服务,是 Docker 官方对容器云生态进行支持的核心方案,便于我们日后对应用进行垂直扩展,弹性伸缩。

难题

  1. 部署步骤繁琐。 --> jenkins 需要将项目编译打包,构建镜像、登陆Docker仓库,tag镜像,最后再push上去。过程中还会参杂着其他的备份,替换等各种命令。
  1. 编排时,容器服务中的配置信息的统一/差异化。 --> Docker Compose 由于我们使用Docker swarm对容器进行编排,集群部署,将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,于是需要根据业务对容器中的配置信息进行统一/差异化。比如一组容器服务由三个容器集群组成,但是我们其中一个容器里面的应用的DataBase配置需要跟其他两个不一样。
  1. 热更新困难。 --> 蓝绿发布 版本迭代的时候,需要对线上应用进行热发布更新,即更新过程中不能对用户产生影响或影响可忽略。

操作步骤

  1. 在Jenkins中新建项目

  2. 打开 Jenkins

    进入项目配置页面

  3. 更改镜像版本号(如不更改,则原镜像版本会变为null)

  1. 点击立即构建

  1. 进入阿里云容器服务控制台,点击order-service的变更配置

  1. 更新前的编排文件:

  1. 更新后的编排文件:

  1. 点击确定

进入应用详情。

如果发现新发布服务失败,则点击该失败服务的变更配置。勾选restart:always,然后更新即可。

查看新应用的容器列表里面的端口映射,可在路由列表,将流量全部切换到新版本进行初步测试。

查看节点公网ip:

测试完成后选择确认蓝绿发布新应用

  1. 注意事项

    docker相关都在/var/lib/docker

    定期 df -sh *,free一下,关注磁盘和内存状态,及时清理无用的docker挂载数据卷。

    for i in `find . -name "*.log"`; do cat /dev/null >$i; done

    清空文件名以log为后缀的日志

    docker rm $(docker ps -a -q)

    删除所有未运行 Docker 容器

    docker images|grep none|awk '{print $3}'|xargs docker rmi

    批量删除 tag为none的镜像

application.yml DEMO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server:
port: ${ADDITIONAL_TOOL_SERVER_PORT}
eureka:
client:
service-url:
defaultZone: ${ADDITIONAL_EUREKA_SERVER_LIST}
logging.level.project.user.UserClient: INFO
spring:
datasource:
url: ${DATABASE_URL}
username: ${DATABASE_USERNAME}
password: ${DATABASE_PASSWORD}
redis:
database: ${REDIS_DATABASE}
host: ${REDIS_HOST}
password: ${REDIS_PASSWORD}
port: ${REDIS_PORT}
timeout: ${REDIS_TIMEOUT}
pool:
max-idle: ${REDIS_MAX_IDLE}
min-idle: ${REDIS_MIN_IDLE}
max-active: ${REDIS_MAX_ACTIVE}
max-wait: ${REDIS_MAX_WAIT}

docker-compose.yml DEMO

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
version: '2'
services:
tool-app1:
image: registry.cn-shenzhen.aliyuncs.com/zwx_cloud/tool-app:1.0.0
container_name: tool-app1
ports:
- "10086:10086"
restart: always
labels:
aliyun.routing.port_10086: tool-app
environment:
- TZ=Asia/Shanghai
- ADDITIONAL_TOOL_SERVER_PORT=10106
- ADDITIONAL_EUREKA_SERVER_LIST=http://eureka1:10011/eureka/,http://eureka2:10012/eureka/,http://eureka3:10013/eureka/
- DATABASE_URL=jdbc:mysql://123
- DATABASE_USERNAME=123
- DATABASE_PASSWORD=123
- REDIS_DATABASE=1
- REDIS_HOST=123
- REDIS_PASSWORD=123
- REDIS_PORT=123
- REDIS_TIMEOUT=500
- REDIS_MAX_IDLE=20
- REDIS_MIN_IDLE=8
- REDIS_MAX_ACTIVE=20
- REDIS_MAX_WAIT=-1
tool-app2:
image: registry.cn-shenzhen.aliyuncs.com/zwx_cloud/tool-app:1.0.0
container_name: tool-app2
ports:
- "10096:10096"
restart: always
labels:
aliyun.routing.port_10096: tool-app
environment:
- TZ=Asia/Shanghai
- ADDITIONAL_TOOL_SERVER_PORT=10106
- ADDITIONAL_EUREKA_SERVER_LIST=http://eureka1:10011/eureka/,http://eureka2:10012/eureka/,http://eureka3:10013/eureka/
- DATABASE_URL=jdbc:mysql://123
- DATABASE_USERNAME=123
- DATABASE_PASSWORD=123
- REDIS_DATABASE=1
- REDIS_HOST=123
- REDIS_PASSWORD=123
- REDIS_PORT=123
- REDIS_TIMEOUT=500
- REDIS_MAX_IDLE=20
- REDIS_MIN_IDLE=8
- REDIS_MAX_ACTIVE=20
- REDIS_MAX_WAIT=-1
tool-app3:
image: registry.cn-shenzhen.aliyuncs.com/zwx_cloud/tool-app:1.0.0
container_name: tool-app3
ports:
- "10106:10106"
restart: always
labels:
aliyun.routing.port_10106: tool-app
environment:
- TZ=Asia/Shanghai
- ADDITIONAL_TOOL_SERVER_PORT=10106
- ADDITIONAL_EUREKA_SERVER_LIST=http://eureka1:10011/eureka/,http://eureka2:10012/eureka/,http://eureka3:10013/eureka/
- DATABASE_URL=jdbc:mysql://123
- DATABASE_USERNAME=123
- DATABASE_PASSWORD=123
- REDIS_DATABASE=1
- REDIS_HOST=123
- REDIS_PASSWORD=123
- REDIS_PORT=123
- REDIS_TIMEOUT=500
- REDIS_MAX_IDLE=20
- REDIS_MIN_IDLE=8
- REDIS_MAX_ACTIVE=20
- REDIS_MAX_WAIT=-1

坚持原创技术分享,您的支持将鼓励我继续创作!