Jenkins 配置CI/CD任务

二次信任 提交于 2020-11-23 05:14:36

本文演示如何通过Jenkins创建CI/CD任务,部署一整套微服务体系结构,并运行在之前搭建的mini云平台上。 如果是初始尝试实践,可能需要参考 <a href="https://www.cnblogs.com/yorkwu/p/9230352.html" target="_blank">快速搭建云原生架构的实践环境</a><a href="https://www.cnblogs.com/yorkwu/p/9274474.html" target="_blank">Jhipster技术实践</a> 等相关文章。

#1 整体规划

###1.1 拓扑架构

###1.2 基础设置

<table width="90%"> <tr> <th width="5%">编号</th> <th width="15%">IP</th> <th width="10%">OS</th> <th width="15%">主机名</th> <th width="10%">角色</th> <th width="10%">环境</th> <th width="35%">说明</th> </tr> <tr> <td>A</td> <td>192.168.1.101</td> <td>CentOS7.4</td> <td>ddc_node01</td> <td>Manager</td> <td>Global</td> <td>运行UCP和Jenkins的节点</td> </tr> <tr> <td>B</td> <td>192.168.1.102</td> <td>CentOS7.4</td> <td>ddc_node02</td> <td>Worker</td> <td>Global</td> <td>运行DTR的节点</td> </tr> <tr> <td>C</td> <td>192.168.1.103</td> <td>CentOS7.4</td> <td>ddc_node03</td> <td>Worker</td> <td>Data</td> <td>运行有状态服务容器的节点</td> </tr> <tr> <td>D</td> <td>192.168.1.104</td> <td>CentOS7.4</td> <td>ddc_node04</td> <td>Worker</td> <td>Dev</td> <td>运行无状态服务容器和GFS Server的节点</td> </tr> <tr> <td>E</td> <td>192.168.1.105</td> <td>CentOS7.4</td> <td>ddc_node05</td> <td>Worker</td> <td>Dev</td> <td>运行无状态服务容器和GFS Server的节点</td> </tr> </table>

###1.3 名词说明

<table width="90%"> <tr> <th width="20%">名词</th> <th width="80%">说明</th> </tr> <tr> <td>Jenkins</td> <td>DevOps工具。</td> </tr> <tr> <td>任务视图</td> <td>Jenkins任务的逻辑分组。</td> </tr> <tr> <td>GitLab源码库</td> <td>保存相关应用源码的GitLab仓库。</td> </tr> <tr> <td>Docker Swarm</td> <td>基于docker引擎的容器集群编排工具。</td> </tr> <tr> <td>应用服务</td> <td>基于Jhipster标准化的微服务项目,通过Jenkins构建为Docker镜像,并发布为Docker Swarm的Service。</td> </tr> <tr> <td>数据库服务</td> <td>基于官方的Mysql容器镜像,通过Jenkins发布为Docker Swarm的Service。</td> </tr> <tr> <td>应用监控服务</td> <td>基于Jihpster APM组件集合的容器镜像,通过Jenkins发布为Docker Swarm的Service。</td> </tr> <tr> <td>磁盘优化任务</td> <td>基于Docker API,通过Jenkins任务定时清理节点上的无效镜像和容器。</td> </tr> </table>

###1.4 任务清单 一套基础微服务体系结构,包含应用服务,数据库服务,监控服务,磁盘优化服务等。

<table width="90%"> <tr> <th width="20%">任务名</th> <th width="20%">所属任务视图</th> <th width="60%">说明</th> </tr> <tr> <td>microservice1-app</td> <td>yourcompany-app</td> <td>持续部署名为microservice1-app的docker service</td> </tr> <tr> <td>microservice1-mysql</td> <td>yourcompany-database</td> <td>持续部署名为microservice1-mysql的docker service</td> </tr> <tr> <td>gateway-app</td> <td>yourcompany-app</td> <td>持续部署名为gateway-app的docker service</td> </tr> <tr> <td>gateway-mysql</td> <td>yourcompany-database</td> <td>持续部署名为gateway-mysql的docker service</td> </tr> <tr> <td>jhipster-elasticsearch</td> <td>yourcompany-monitor</td> <td>持续部署名为jhipster-elasticsearch的docker service</td> </tr> <tr> <td>jhipster-logstash</td> <td>yourcompany-monitor</td> <td>持续部署名为jhipster-logstash的docker service</td> </tr> <tr> <td>jhipster-console</td> <td>yourcompany-monitor</td> <td>持续部署名为jhipster-console的docker service</td> </tr> <tr> <td>jhipster-dashboard</td> <td>yourcompany-monitor</td> <td>持续部署名为jhipster-dashboard的docker service</td> </tr> <tr> <td>jhipster-zipkin</td> <td>yourcompany-monitor</td> <td>持续部署名为jhipster-zipkin的docker service</td> </tr> <tr> <td>jhipster-alerter</td> <td>yourcompany-monitor</td> <td>持续部署名为jhipster-alerter的docker service</td> </tr> <tr> <td>jhipster-curator</td> <td>yourcompany-monitor</td> <td>持续部署名为jhipster-alerter的docker service</td> </tr> <tr> <td>jhipster-registry</td> <td>yourcompany-monitor</td> <td>持续部署名为jhipster-registry的docker service</td> </tr> <tr> <td>clean-disk-worker</td> <td>yourcompany-cleanup</td> <td>清理worker节点的无效image和container </td> </tr> <tr> <td>clean-disk-manager</td> <td>yourcompany-cleanup</td> <td>清理manager节点的无效image和container </td> </tr> </table>

###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凭据;如果需要新建一个凭据,请*<a href="https://www.cnblogs.com/yorkwu/p/9231101.html" target="_blank">参考这里</a>*
  • 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凭据;如果需要新建一个凭据,请*<a href="https://www.cnblogs.com/yorkwu/p/9231101.html" target="_blank">参考这里</a>*
  • 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,需要先安装,请*<a href="https://www.cnblogs.com/yorkwu/p/9260322.html" target="_blank">参考这里</a>* 以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源码库发生更新后触发执行;
  • 磁盘优化任务会在设定的时间定时执行。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!