Jenkins 配置CI/CD任务
本文的目标是通过Jenkins创建CI/CD任务,部署一整套微服务体系结构,并运行在之前搭建的mini云平台上。
如果是初始尝试实践,可能需要参考 搭建云平台和DevOps实践环境 和 Jhipster技术实践 等相关文章。
1 整体规划
1.1 拓扑架构
1.2 基础设置
| 编号 | 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的节点 |
1.3 名词说明
| 名词 | 说明 |
|---|---|
| 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任务定时清理节点上的无效镜像和容器。 |
1.4 任务清单
一套基础微服务体系结构,包含应用服务,数据库服务,监控服务,磁盘优化服务等。
| 任务名 | 所属任务视图 | 说明 |
|---|---|---|
| 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 |
1.5 预先创建
下面任务配置中会用到的相关资源:
a, 在UCP中新建一个名为microservcie1-mysql-vol的Docker存储卷;
b, 在UCP中新建一个名为your-overlay的Docker网络;
c, 在UCP中为各个节点新增标签node.type,对应值有worker和manager;
d, 在UCP中为各个节点新增标签node.env,对应值有data和dev;
2 任务配置
2.1 持续部署数据库服务的任务
任务内容是部署/更新一个mysql数据库的容器,类似任务都在yourcompany-database任务视图下。
以microservcie1-mysql为例:
a, 新建任务
-
任务名称输入:microservcie1-mysql; - 选择
构建一个自由风格的软件项目; - 点击
确定。
b, General
- 勾选
丢弃旧的构建; -
策略 - 保持构建的天数输入:7; -
策略 - 保持构建的最大个数输入:10。
c, 源码管理
选择无。
d, 构建
点击增加构建步骤,下拉框中选择执行 shell,输入:
#!/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
2.2 持续部署应用服务的任务
任务内容是部署/更新一个应用服务的容器,类似任务都在yourcompany-app任务视图下。
以microservcie1-app为例:
a, 新建任务
-
任务名称输入:microservcie1-app; - 选择
构建一个maven项目; - 点击
确定。
b, General
- 勾选
丢弃旧的构建; -
策略 - 保持构建的天数输入:7; -
策略 - 保持构建的最大个数输入:10; -
策略 - 发布包保留天数输入:7; -
策略 - 发布包最大保留#个构建输入:1。
c, 源码管理
- 选择
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。
d, 构建触发器
- 勾选
Buidl Whenever a SNAPSHOP depentency is built; -
Poll SCM输入:H/15 * * * *,这表示每15分钟触发一次。
e, 构建环境
- 勾选
Delete workspace before build starts; - 勾选
Do not build if only specified paths have changed; - (可选)勾选
Invert ignore?,如果是maven多模块项目,可以通过设置忽略路径,指定编译某一个maven子模块; - (可选)
Ignored paths输入:microservice1-app/**。
f, 构建
-
Root POM输入:pom.xml; -
Glals and options输入:clean -Pdev package -pl microservice1-app;如果不是maven多模块项目,不需要-pl参数; - 取消勾选
Enable triggering of downstream projects。
g, Post Steps
点击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
2.3 持续部署应用监控服务的任务
任务内容是部署/更新一个应用监控服务的容器,类似任务都在yourcompany-monitor任务视图下。
以jhipster-dashboard为例:
a, 新建任务
-
任务名称输入:jhipster-dashboard; - 选择
构建一个maven项目; - 点击
确定。
b, General
- 勾选
丢弃旧的构建; -
策略 - 保持构建的天数输入:7; -
策略 - 保持构建的最大个数输入:10; -
策略 - 发布包保留天数输入:7; -
策略 - 发布包最大保留#个构建输入:1。
c, 源码管理
- 选择
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。
d, 构建触发器
- 勾选
Buidl Whenever a SNAPSHOP depentency is built; -
Poll SCM输入:H/15 * * * *,这表示每15分钟触发一次。
e, 构建环境
- 勾选
Delete workspace before build starts; - 勾选
Do not build if only specified paths have changed; - (可选)勾选
Invert ignore?,如果是maven多模块项目,可以通过设置忽略路径,指定编译某一个maven子模块; - (可选)
Ignored paths输入:jhipster-dashboard/**。
f, 构建
-
Root POM输入:pom.xml; -
Glals and options输入:clean -Pdev package -pl jhipster-dashboard;如果不是maven多模块项目,不需要-pl参数; - 取消勾选
Enable triggering of downstream projects。
g, Post Steps
点击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
2.4 定时执行磁盘优化的任务
任务内容是定时执行磁盘优化的脚本命令,类似任务都在yourcompany-cleanup任务视图下。因为使用了expect,需要先安装,请参考这里
以clean-disk-worker为例:
a, 新建任务
-
任务名称输入:clean-disk-worker; - 选择
构建一个自由风格的软件项目; - 点击
确定。
b, General
- 勾选
丢弃旧的构建; -
策略 - 保持构建的天数输入:7; -
策略 - 保持构建的最大个数输入:10。
c, 源码管理
选择无。
d, 构建触发器
- 勾选
定时构建; -
Poll SCM输入:H 5 * * *,这表示每天凌晨5点触发一次。
e, 构建
点击增加构建步骤,下拉框中选择执行 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
3 任务执行
- 数据库任务通常初次执行后,不会定时执行,除非对数据库镜像有更新;
- 应用任务和应用监控任务,会在对应的GitLab源码库发生更新后触发执行;
- 磁盘优化任务会在设定的时间定时执行。
你现在的气质里,藏着你走过的路,读过的书,爱过的人。
关注公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
AutoScaling 弹性伸缩配置重大升级
弹性伸缩配置支持修改之前,如果用户想要变更伸缩配置,只能通过新创建伸缩配置替换现有伸缩配置的方式实现,现在只需要修改原有配置即可。弹性伸缩配置新增了主机名称、镜像预设密码两大特性,更加全面地满足了用户的业务需求,如为伸缩组创建的 ECS 实例提前设置主机名称、为伸缩组创建的 ECS 实例提前设置登录密码。 本文主要分为以下两个方面: 弹性伸缩配置修改功能 弹性伸缩配置新特性 弹性伸缩配置修改功能 弹性伸缩配置支持修改以下参数: imageId instanceTypes internetMaxBandwidthOut ramRoleName keyPairName systemDiskCategory scalingConfigurationName tags userData instanceName loadBalancerWeight systemDiskS
-
下一篇
阿里云Serverless Kubernetes通过Ingress提供7层服务访问
简介 在阿里云Serverless Kubernetes集群中,我们可以通过LoadBalancer Service对外提供四层服务访问,同样我们也可以通过Ingress来对外提供七层服务访问,今天主要分享下如何在Serverless Kubernetes集群中提供七层域名服务访问。 使用说明 不指定SLB实例情况下系统会自动帮您生成一个公网SLB实例。 SLB实例默认前端监听端口为80(HTTP协议)和443(HTTPS协议);健康检查路径是根路径(/),请确保后端服务能正常提供访问(响应码为2xx或3xx)。 SLB实例HTTPS证书默认会初始化为第一个创建的Ingress配置的TLS证书,否则会初始化为系统默认证书;您完全可根据需要自行在SLB控制台上进行修改。 当您指定使用已存在的SLB实例时,要求该SLB实例规格必须是性能保障型(支
相关文章
文章评论
共有0条评论来说两句吧...


微信收款码
支付宝收款码