Jenkins 配置CI/CD任务
本文演示如何通过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
,对应值有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源码库发生更新后触发执行;
- 磁盘优化任务会在设定的时间定时执行。
Jenkins 配置CI/CD任务的更多相关文章
- 使用 Jenkins 搭建 CI/CD All In One
使用 Jenkins 搭建 CI/CD All In One https://ci.jenkins.io/ https://www.jenkins.io/zh/ jobs pipelines refs ...
- Jenkins自动化CI CD流水线之1--介绍与安装
第1章 大纲 CI/CD, DevOps介绍 Git安装与使用 Jenkins安装与使用 权限管理 参数化构建 Master-Slave 流水线(Pipeline) 邮件通知 应用案例 自动发布PHP ...
- .Net在Windows上使用Jenkins做CI/CD的那些事
背景 最近入职了一家新公司,公司各个方面都让我非常的满意,我也怀着紧张与兴奋的心情入职后,在第一天接到了领导给我的第一个任务——把整个项目的依赖引用重新整理并实施项目的CI/CD. 本篇的重点主要分享 ...
- gitlab+jenkins+tomcat CI/CD 部署
整个项目的框架为: gitlab的安装与使用(Centos7) gitlab的安装 新建yum源 vim /etc/yum.repos.d/gitlab-ce.repo [gitlab-ce] nam ...
- jenkins、gitlab配置CI/CD
1. 在gitlab中创建好项目(gitlab的安装和基本使用这里不在说明) 2. 创建jenkins任务 jenkins 需要几个插件请先安装好 - Git plugin - GitLab Plug ...
- Jenkins自动化CI CD流水线之8--流水线自动化发布Java项目
一.前提 插件:Maven Integration plugin 环境: maven.tomcat 用的博客系统代码: git clone https://github.com/b3log/solo. ...
- Jenkins搭建CI/CD
所需Jenkins插件: Maven Integration pluginPublish Over SSHSSH plugin 1.配置全局工具 配置JDK: 配置Git: 配置maven: 2.创建 ...
- Jenkins自动化CI&CD流水线
1 环境说明 主机名称 IP cpu核数/内存/硬盘 安装软件 用途 controlnode 172.16.1.120 2/2/60 git 代码仓库 slavenode1 172.16.1.121 ...
- 使用 jenkins 搭建CI/CD流水线 (MAC)
如何搭建持续集成/持续交付平台?? 如何使用jenkins搭建持续交付流水线,以及和其他工具(如artifactory)集成?如何使用元数据,记录软件发布过程的构建信息,测试结果,并用rest Api ...
随机推荐
- Struts2框架(4)---Action类访问servlet
Action类访问servlet Action类有三种方式servlet: (1)间接的方式访问Servlet API ---使用ActionContext对象 (2) 实现接口,访问Action ...
- Java单元测试(Junit+Mock+代码覆盖率)
微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...
- 【原创】Windows服务管家婆之Service Control Manager
Service Control Manager,服务控制管理器,人称SCM就是它!在Windows内核中,都可以看到她忙碌的身影,可以说是系统服务和驱动的管家婆了! SCM管家婆起早贪黑,每次 ...
- 解读经典-《C#高级编程》第七版-Chapter1-.Net体系结构-Page6-13
01 中间语言(IL) .Net中间语言(IL)的特性,很大程度上来自于要支持多语言互操作性.要支持多语言互操作性,是因为微软想搞一个大事情,将它的老产品线VB和VC++,VJ++都装入.Net架构中 ...
- Docker之使用Dockerfile创建定制化镜像(四)--技术流ken
前言 在之前的博客<Docker端口映射及创建镜像演示(二)--技术流ken>,演示了如何使用一个现有容器创建一个镜像,以及镜像在阿里云的上传和下载. 但是这样的镜像有很大的局限性,不能根 ...
- Linux核心命令
Linux核心命令 strace(查看系统调用的一个过程) 例:strace cat /test.txt netstat perf top pidstat mpstat dstat vmstat sl ...
- 个渣渣C语言之数组
---恢复内容开始--- 学c语言就知道数组.指针在c中有着特殊的地位.而且是必须掌握的一项知识,学会它会让你受益无穷. 一.数组 1.数组:室友一系列相同元素构成的.它连续的存储在内存中. 2.数组 ...
- [转]virtualBox实现主机和虚拟机相互ping通,配置静态IP地址
本文转自:https://blog.csdn.net/u010486658/article/details/70871940 背景: 需要在linux上安装软件用来练习,但是需要将安装包发送到linu ...
- SQL 語法
查詢 Sql = ("SELECT A1, A2, A5, A4 FROM Table1 ") 筆數 Sql = ("Select COUNT(*) From TW01. ...
- mysql中union 查询
UNION ALL只是简单的将两个结果合并后就返回.这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了. 从效率上说,UNION ALL 要比UNION快很多,所以,如果可 ...