Jenkins 配置CI/CD任务

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 本文的目标是通过Jenkins创建CI/CD任务,部署一整套微服务体系结构,并运行在之前搭建的mini云平台上。如果是初始尝试实践,可能需要参考 搭建云平台和DevOps实践环境 和 Jhipster技术实践 等相关文章。

本文的目标是通过Jenkins创建CI/CD任务,部署一整套微服务体系结构,并运行在之前搭建的mini云平台上。
如果是初始尝试实践,可能需要参考 搭建云平台和DevOps实践环境Jhipster技术实践 等相关文章。

1 整体规划

1.1 拓扑架构

img_f13f2bd1a40eef1bc6723227d8686ffe.png

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



你现在的气质里,藏着你走过的路,读过的书,爱过的人。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
5天前
|
安全 jenkins 持续交付
如何在 Jenkins 中配置邮件通知?
如何在 Jenkins 中配置邮件通知?
|
26天前
|
运维 监控 jenkins
运维自动化实战:利用Jenkins构建高效CI/CD流程
【10月更文挑战第18天】运维自动化实战:利用Jenkins构建高效CI/CD流程
|
1月前
|
Java jenkins 持续交付
Centos7下docker的jenkins下载并配置jdk与maven
通过上述步骤,您将成功在CentOS 7上的Docker容器中部署了Jenkins,并配置好了JDK与Maven,为持续集成和自动化构建打下了坚实基础。
99 1
|
1月前
|
jenkins Shell 持续交付
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(二)
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(二)
69 0
|
26天前
|
运维 监控 jenkins
运维自动化实践:利用Jenkins实现高效CI/CD流程
【10月更文挑战第18天】运维自动化实践:利用Jenkins实现高效CI/CD流程
|
1月前
|
jenkins Shell 持续交付
【10月更文挑战第3天】通过jenkins的pipline执行任务
【10月更文挑战第3天】通过jenkins的pipline执行任务
|
1月前
|
jenkins Shell 持续交付
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(一)
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(一)
143 0
|
3月前
|
持续交付 jenkins Devops
WPF与DevOps的完美邂逅:从Jenkins配置到自动化部署,全流程解析持续集成与持续交付的最佳实践
【8月更文挑战第31天】WPF与DevOps的结合开启了软件生命周期管理的新篇章。通过Jenkins等CI/CD工具,实现从代码提交到自动构建、测试及部署的全流程自动化。本文详细介绍了如何配置Jenkins来管理WPF项目的构建任务,确保每次代码提交都能触发自动化流程,提升开发效率和代码质量。这一方法不仅简化了开发流程,还加强了团队协作,是WPF开发者拥抱DevOps文化的理想指南。
82 1
|
2月前
|
jenkins 持续交付 网络安全
利用 Jenkins 实现持续集成与持续部署-代码拉取终端的配置
安装Git、配置用户信息、生成SSH密钥以及在Gitee上创建项目仓库等。
77 0
|
3月前
|
持续交付 jenkins C#
“WPF与DevOps深度融合:从Jenkins配置到自动化部署全流程解析,助你实现持续集成与持续交付的无缝衔接”
【8月更文挑战第31天】本文详细介绍如何在Windows Presentation Foundation(WPF)项目中应用DevOps实践,实现自动化部署与持续集成。通过具体代码示例和步骤指导,介绍选择Jenkins作为CI/CD工具,结合Git进行源码管理,配置构建任务、触发器、环境、构建步骤、测试及部署等环节,显著提升开发效率和代码质量。
76 0