本文演示如何通过Jenkins创建CI/CD任务,部署一整套微服务体系结构,并运行在之前搭建的mini云平台上。

如果是初始尝试实践,可能需要参考 快速搭建云原生架构的实践环境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,对应值有workermanager
d, 在UCP中为各个节点新增标签node.env,对应值有datadev

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源码库发生更新后触发执行;
  • 磁盘优化任务会在设定的时间定时执行。

Jenkins 配置CI/CD任务的更多相关文章

  1. 使用 Jenkins 搭建 CI/CD All In One

    使用 Jenkins 搭建 CI/CD All In One https://ci.jenkins.io/ https://www.jenkins.io/zh/ jobs pipelines refs ...

  2. Jenkins自动化CI CD流水线之1--介绍与安装

    第1章 大纲 CI/CD, DevOps介绍 Git安装与使用 Jenkins安装与使用 权限管理 参数化构建 Master-Slave 流水线(Pipeline) 邮件通知 应用案例 自动发布PHP ...

  3. .Net在Windows上使用Jenkins做CI/CD的那些事

    背景 最近入职了一家新公司,公司各个方面都让我非常的满意,我也怀着紧张与兴奋的心情入职后,在第一天接到了领导给我的第一个任务——把整个项目的依赖引用重新整理并实施项目的CI/CD. 本篇的重点主要分享 ...

  4. gitlab+jenkins+tomcat CI/CD 部署

    整个项目的框架为: gitlab的安装与使用(Centos7) gitlab的安装 新建yum源 vim /etc/yum.repos.d/gitlab-ce.repo [gitlab-ce] nam ...

  5. jenkins、gitlab配置CI/CD

    1. 在gitlab中创建好项目(gitlab的安装和基本使用这里不在说明) 2. 创建jenkins任务 jenkins 需要几个插件请先安装好 - Git plugin - GitLab Plug ...

  6. Jenkins自动化CI CD流水线之8--流水线自动化发布Java项目

    一.前提 插件:Maven Integration plugin 环境: maven.tomcat 用的博客系统代码: git clone https://github.com/b3log/solo. ...

  7. Jenkins搭建CI/CD

    所需Jenkins插件: Maven Integration pluginPublish Over SSHSSH plugin 1.配置全局工具 配置JDK: 配置Git: 配置maven: 2.创建 ...

  8. Jenkins自动化CI&CD流水线

    1 环境说明 主机名称 IP cpu核数/内存/硬盘 安装软件 用途 controlnode 172.16.1.120 2/2/60 git 代码仓库 slavenode1 172.16.1.121 ...

  9. 使用 jenkins 搭建CI/CD流水线 (MAC)

    如何搭建持续集成/持续交付平台?? 如何使用jenkins搭建持续交付流水线,以及和其他工具(如artifactory)集成?如何使用元数据,记录软件发布过程的构建信息,测试结果,并用rest Api ...

随机推荐

  1. xcodebuild构建时报错unknown error -1=ffffffffffffffff Command /bin/sh failed with exit code 1

    CI今日构建时报出如下错误: /Users/xxx/Library/Developer/Xcode/DerivedData/Snowball-ebllohyukujrncbaldsfojfjxwep/ ...

  2. shell运算符与流程控制-2

    1.shell运算符 1.1.算数运算符 原生的bash不支持算数运算,可以通过其它方式实现例如expr. `expr a + b` #a b为数字,和运算符之间要有空格 #``不是单引号,为键盘上E ...

  3. Poi 生成xls

    来首小诗: 今日不胜昨日寒,我却把那拖鞋穿,脚儿冰冰秋风瑟,抬头一看碧蓝天.         ---泥沙砖瓦浆木匠 项目需求: p2p项目中,需要一些数据报表一xls的格式,提供下载.并给主管签名. ...

  4. Web Service 部分内容简述(1)

    1.什么是Web服务(web service) Wb服务是一种可以用来解决跨网络应用集成问题的开发模式,是基于网络的.分布式的模块化组件,它执行特定的任务遵守具体的技术规范,这些规范使得Web Ser ...

  5. Go语言的map如何判断key是否存在

    判断方式为value,ok := map[key], ok为true则存在 package main import "fmt" func main() { demo := map[ ...

  6. Go语言远程执行ssh命令简单封装(支持带交互命令)

    使用包:golang.org/x/crypto/ssh 以下封装一个发送命令的Cli结构体 type Cli struct { IP string //IP地址 Username string //用 ...

  7. 基于FineUIMVC的代码生成器(传统三层)v1.0-2

    第一篇博客只是粗略说明了一下,其实这个工具真正用话可能大家还要细看下,我今天(连夜)写个例子,截几个图,做一下自定义模板的实例教程,因为代码生成本身是个工具,动画效果都是次要的,主要是工具本身,其中自 ...

  8. SpringBoot系列——WebSocket

    关于websocket的介绍与实现,我之前写过一篇博客,记录了用springboot-websocket实现了私聊.群聊的简单实例,这里就只提供一个入口,不再重复的写了,WebSocket+Java ...

  9. 【转载】C#防SQL注入过滤危险字符信息

    不过是java开发还是C#开发或者PHP的开发中,都需要关注SQL注入攻击的安全性问题,为了保证客户端提交过来的数据不会产生SQL注入的风险,我们需要对接收的数据进行危险字符过滤来防范SQL注入攻击的 ...

  10. 【转载】Centos系统采用NVM安装Node.js环境

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,用来方便地搭建快速的易于扩展的网络应用.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又 ...