zoukankan      html  css  js  c++  java
  • 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,对应值有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
    "; exp_continue}
            "password:" {send "$pass
    "}
    }
    expect "root@*"  {send "docker rm $(docker ps -aq --filter "status=exited")
    "}
    expect "root@*"  {send "docker rmi $(docker images -f "dangling=true" -q)
    "}
    expect "root@*"  {send "exit
    "}
    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
    "; exp_continue}
            "password:" {send "$pass
    "}
    }
    expect "root@*"  {send "docker rm $(docker ps -aq --filter "status=exited")
    "}
    expect "root@*"  {send "docker rmi $(docker images -f "dangling=true" -q)
    "}
    expect "root@*"  {send "exit
    "}
    expect eof
    

    3 任务执行

    • 数据库任务通常初次执行后,不会定时执行,除非对数据库镜像有更新;
    • 应用任务和应用监控任务,会在对应的GitLab源码库发生更新后触发执行;
    • 磁盘优化任务会在设定的时间定时执行。
  • 相关阅读:
    数据库索引的作用和长处缺点
    Spring的依赖注入
    Spring+Ibatis集成开发实例
    IOS开发之类和对象
    关于C++ const 的全面总结
    包管理器Bower使用手冊之中的一个
    项目总算完工了
    git reset and git checkout
    unity3D中协程和线程混合
    【剑指offer】左旋转字符串
  • 原文地址:https://www.cnblogs.com/yorkwu/p/9231111.html
Copyright © 2011-2022 走看看