本文演示如何经过Jenkins建立CI/CD任务,部署一整套微服务体系结构,并运行在以前搭建的mini云平台上。
若是是初始尝试实践,可能须要参考 快速搭建云原生架构的实践环境 和 Jhipster技术实践 等相关文章。html
编号 | IP | OS | 主机名 | 角色 | 环境 | 说明 |
---|---|---|---|---|---|---|
A | 192.168.1.101 | CentOS7.4 | ddc_node01 | Manager | Global | 运行UCP和Jenkins的节点 |
B | 192.168.1.102 | CentOS7.4 | ddc_node02 | Worker | Global | 运行DTR的节点 |
C | 192.168.1.103 | CentOS7.4 | ddc_node03 | Worker | Data | 运行有状态服务容器的节点 |
D | 192.168.1.104 | CentOS7.4 | ddc_node04 | Worker | Dev | 运行无状态服务容器和GFS Server的节点 |
E | 192.168.1.105 | CentOS7.4 | ddc_node05 | Worker | Dev | 运行无状态服务容器和GFS Server的节点 |
名词 | 说明 |
---|---|
Jenkins | DevOps工具。 |
任务视图 | Jenkins任务的逻辑分组。 |
GitLab源码库 | 保存相关应用源码的GitLab仓库。 |
Docker Swarm | 基于docker引擎的容器集群编排工具。 |
应用服务 | 基于Jhipster标准化的微服务项目,经过Jenkins构建为Docker镜像,并发布为Docker Swarm的Service。 |
数据库服务 | 基于官方的Mysql容器镜像,经过Jenkins发布为Docker Swarm的Service。 |
应用监控服务 | 基于Jihpster APM组件集合的容器镜像,经过Jenkins发布为Docker Swarm的Service。 |
磁盘优化任务 | 基于Docker API,经过Jenkins任务定时清理节点上的无效镜像和容器。 |
一套基础微服务体系结构,包含应用服务,数据库服务,监控服务,磁盘优化服务等。node
任务名 | 所属任务视图 | 说明 |
---|---|---|
microservice1-app | yourcompany-app | 持续部署名为microservice1-app的docker service |
microservice1-mysql | yourcompany-database | 持续部署名为microservice1-mysql的docker service |
gateway-app | yourcompany-app | 持续部署名为gateway-app的docker service |
gateway-mysql | yourcompany-database | 持续部署名为gateway-mysql的docker service |
jhipster-elasticsearch | yourcompany-monitor | 持续部署名为jhipster-elasticsearch的docker service |
jhipster-logstash | yourcompany-monitor | 持续部署名为jhipster-logstash的docker service |
jhipster-console | yourcompany-monitor | 持续部署名为jhipster-console的docker service |
jhipster-dashboard | yourcompany-monitor | 持续部署名为jhipster-dashboard的docker service |
jhipster-zipkin | yourcompany-monitor | 持续部署名为jhipster-zipkin的docker service |
jhipster-alerter | yourcompany-monitor | 持续部署名为jhipster-alerter的docker service |
jhipster-curator | yourcompany-monitor | 持续部署名为jhipster-alerter的docker service |
jhipster-registry | yourcompany-monitor | 持续部署名为jhipster-registry的docker service |
clean-disk-worker | yourcompany-cleanup | 清理worker节点的无效image和container |
clean-disk-manager | yourcompany-cleanup | 清理manager节点的无效image和container |
下面任务配置中会用到的相关资源:mysql
microservcie1-mysql-vol
的Docker存储卷;your-overlay
的Docker网络;node.type
,对应值有worker
和manager
;node.env
,对应值有data
和dev
;任务内容是部署/更新一个mysql数据库的容器,相似任务都在yourcompany-database
任务视图下。
以microservcie1-mysql
为例:git
任务名称
输入:microservcie1-mysql
;构建一个自由风格的软件项目
;肯定
。丢弃旧的构建
;策略 - 保持构建的天数
输入:7
;策略 - 保持构建的最大个数
输入:10
。选择无
。sql
点击增长构建步骤
,下拉框中选择执行 shell
,输入:docker
#!/bin/bash if [ "$(docker service ls -f 'name=microservcie1-mysql' | grep microservcie1-mysql)" ]; then docker service update --image dtr.yourdomain.com/common/mysql:5 microservcie1-mysql; echo 'updated service for microservcie1-mysql.'; else docker service create --name microservcie1-mysql --replicas 1 --network name=your-overlay,alias=microservcie1-mysql --constraint node.labels.node.type==worker --constraint node.labels.node.env==data --env MYSQL_ROOT_PASSWORD=my-secret-pw --publish 32800:3306 --mount type=volume,source=microservcie1-mysql-vol,destination=/var/lib/mysql dtr.yourdomain.com/common/mysql:5 echo 'started service for microservcie1-mysql.'; fi
任务内容是部署/更新一个应用服务的容器,相似任务都在yourcompany-app任务视图下。
以microservcie1-app为例:shell
任务名称
输入:microservcie1-app
;构建一个maven项目
;肯定
。丢弃旧的构建
;策略 - 保持构建的天数
输入:7
;策略 - 保持构建的最大个数
输入:10
;策略 - 发布包保留天数
输入:7
;策略 - 发布包最大保留#个构建
输入:1
。Git
;Repositories - Repository URL
输入:git@gitlab.yourdomain.com:repo/yourcompany-app.git
;Repositories - Credentials
选择配置好的Jenkins凭据
;若是须要新建一个凭据,请参考这里Branches to build - Branch Specifier (blank for 'any')
输入:refs/heads/dev
,这里表示dev分支;若是是主干,输入*/master
。Buidl Whenever a SNAPSHOP depentency is built
;Poll SCM
输入:H/15 * * * *
,这表示每15分钟触发一次。Delete workspace before build starts
;Do not build if only specified paths have changed
;Invert ignore?
,若是是maven多模块项目,能够经过设置忽略路径,指定编译某一个maven子模块;Ignored paths
输入:microservice1-app/**
。Root POM
输入:pom.xml
;Glals and options
输入:clean -Pdev package -pl microservice1-app
;若是不是maven多模块项目,不须要-pl
参数;Enable triggering of downstream projects
。点击Add post-build step
,下拉框中选择执行 shell
,输入:数据库
#!/bin/bash cd microservice1-app/; mvn -Prd dockerfile:build; docker tag microservice1-app:1.0 dtr.yourdomain.com/app/microservice1-app:1.0; docker rmi microservice1-app:1.0; docker login dtr.yourdomain.com --username admin --password dtrpassword; docker push dtr.yourdomain.com/app/microservice1-app:1.0; if [ "$(docker service ls -f 'name=microservice1-app' | grep microservice1-app)" ]; then docker service update --image dtr.yourdomain.com/app/microservice1-app:1.0 microservice1-app; echo 'updated service for microservice1-app.'; else docker service create --name microservice1-app --replicas 1 --network your-overlay --constraint node.labels.node.type==worker --constraint node.labels.node.env==dev --env SPRING_PROFILES_ACTIVE=dev,zipkin,swagger --publish 8081:8081 dtr.yourdomain.com/app/microservice1-app:1.0; echo 'created service for microservice1-app.'; fi
任务内容是部署/更新一个应用监控服务的容器,相似任务都在yourcompany-monitor
任务视图下。
以jhipster-dashboard
为例:bash
任务名称
输入:jhipster-dashboard
;构建一个maven项目
;肯定
。丢弃旧的构建
;策略 - 保持构建的天数
输入:7
;策略 - 保持构建的最大个数
输入:10
;策略 - 发布包保留天数
输入:7
;策略 - 发布包最大保留#个构建
输入:1
。Git
;Repositories - Repository URL
输入:git@gitlab.yourdomain.com:repo/yourcompany-monitor.git
;Repositories - Credentials
选择配置好的Jenkins凭据
;若是须要新建一个凭据,请参考这里Branches to build - Branch Specifier (blank for 'any')
输入:refs/heads/dev
,这里表示dev分支;若是是主干,输入*/master
。Buidl Whenever a SNAPSHOP depentency is built
;Poll SCM
输入:H/15 * * * *
,这表示每15分钟触发一次。Delete workspace before build starts
;Do not build if only specified paths have changed
;Invert ignore?
,若是是maven多模块项目,能够经过设置忽略路径,指定编译某一个maven子模块;Ignored paths
输入:jhipster-dashboard/**
。Root POM
输入:pom.xml
;Glals and options
输入:clean -Pdev package -pl jhipster-dashboard
;若是不是maven多模块项目,不须要-pl
参数;Enable triggering of downstream projects
。点击Add post-build step
,下拉框中选择执行 shell
,输入:网络
#!/bin/bash cd jhipster-dashboard/; mvn -Prd dockerfile:build; docker tag jhipster-dashboard:1.0 dtr.yourdomain.com/common/jhipster-dashboard:1.0; docker rmi jhipster-dashboard:1.0; docker login dtr.yourdomain.com --username admin --password dtrpassword; docker push dtr.yourdomain.com/common/jhipster-dashboard:1.0; if [ "$(docker service ls -f 'name=jhipster-dashboard' | grep jhipster-dashboard)" ]; then docker service update --image dtr.yourdomain.com/common/jhipster-dashboard:1.0 jhipster-dashboard; echo 'updated service for jhipster-dashboard.'; else docker service create --name jhipster-dashboard --network your-overlay --constraint node.labels.node.type==worker --constraint node.labels.node.env==data --replicas 1 --env SPRING_PROFILES_ACTIVE=dev --publish 8762:8762 --mount type=bind,source=/etc/localtime,destination=/etc/localtime dtr.yourdomain.com/common/jhipster-dashboard:1.0; echo 'created service for jhipster-dashboard.'; fi
任务内容是定时执行磁盘优化的脚本命令,相似任务都在yourcompany-cleanup
任务视图下。由于使用了expect,须要先安装,请参考这里
以clean-disk-worker
为例:
任务名称
输入:clean-disk-worker
;构建一个自由风格的软件项目
;肯定
。丢弃旧的构建
;策略 - 保持构建的天数
输入:7
;策略 - 保持构建的最大个数
输入:10
。选择无
。
定时构建
;Poll SCM
输入:H 5 * * *
,这表示天天凌晨5点触发一次。点击增长构建步骤
,下拉框中选择执行 shell
,输入:
#!/usr/bin/expect # 在192.168.1.102节点上执行 set ip 192.168.1.102 set pass yourpassword set timeout 30 spawn ssh root@$ip expect { "(yes/no)" {send "yes\r"; exp_continue} "password:" {send "$pass\r"} } expect "root@*" {send "docker rm \$(docker ps -aq --filter \"status=exited\")\r"} expect "root@*" {send "docker rmi \$(docker images -f \"dangling=true\" -q)\r"} expect "root@*" {send "exit\r"} expect eof # 在192.168.1.103节点上执行 set ip 192.168.1.103 set pass yourpassword set timeout 30 spawn ssh root@$ip expect { "(yes/no)" {send "yes\r"; exp_continue} "password:" {send "$pass\r"} } expect "root@*" {send "docker rm \$(docker ps -aq --filter \"status=exited\")\r"} expect "root@*" {send "docker rmi \$(docker images -f \"dangling=true\" -q)\r"} expect "root@*" {send "exit\r"} expect eof