cicd 04--构建自动化发布流程

2023-11-19

1 简介

在实际项目中,为了提高开发人员的服务发布效率,避免用户手动build镜像、通过脚本(或kubectl)更新服务,通常需要为重要的服务构建一套自动化发布流程。

简单来说,开发人员提交代码,MR 到 master 分支,触发 build 镜像操作,并自动推送到镜像仓库,然后更新到测试或者预发布环境,用户测试ok后通知sre团队,sre团队触发更新到线上或生产环境。

本文基于该思路构建一个企业可用的自动化发布流程,分享在此处以便于有需要的i小伙伴或自己查阅学习,后续针对该类型的自动化流程的优化事宜也会补充在此处。

2 构建过程

2.1 功能说明

主要功能模块如下:

  1. 清理空间(Clean workspace)
  2. 下载代码(Clone Repo)
  3. 同步代码(Scp to sre-cicd)
  4. build镜像(Build docker images)
  5. 打tag(Set tag)
  6. 检查deploy(check deploy exists)
  7. 发布到k8s(deploy to k8s)
  8. 告警通知(Declarative: Post Actions)

2.2 jenkins & gitlab 配置

jenkins基础配置:

GitLab Repository Name: 填写gitlab 的url
Build Trigger-> Accepted Merge Request Events: True
Filter branches by regex: Target Branch Regex	填写 .*master
Secret token: 自动生成即可

gitlab 配置:

在 settings->integrations 中新加Webhooks,
URL: 填写jenkins 中build Triggers的url
Secret Token:填写jenkins中生成的 Secret token
Trigger: Merge request events(可按需增加其它方式)

涉及的参数说明:

cluster = 'yourNamespace'
namespace = 'sre-test'
deployment = 'xg-nginx-prod'
container_name = 'xg-nginx'
docker_repo = 'yourDockerRepoNamespace/yourDockerImageName'
branch = 'master'
repo_url = "git@yourGitlabUrl/test-flask.git"
work_dir = 'gitlab_test_flask'

涉及的节点:

SRE_BUILD_NODE: 用于build镜像,并将其推送到阿里云镜像仓库
slave: 该节点用于clone git代码,并将其rsync到 docker build机器上
SRE_NODE: 用于执行kubectl或helm操作

jenkinsfile 配置:

cluster = 'yourNamespace'
namespace = 'sre-test'
deployment = 'xg-nginx-prod'
container_name = 'xg-nginx'
docker_repo = 'yourDockerRepoNamespace/yourDockerImageName'
branch = 'master'
repo_url = "git@yourGitlabUrl/test-flask.git"
work_dir = 'gitlab_test_flask'

def createVersion() {
    return new Date().format('yyyyMMdd-HHmmss')
}
image_version = createVersion()

default_description = "${namespace}/${deployment}:${image_version}"
currentBuild.description = "${default_description}"

pipeline {
    agent { 
        node { 
            label 'SRE_BUILD_NODE' 
        } 
    }
    
    environment {
        para = "para_just_for_test"
    }
    
    stages {
        stage('Clean workspace') {
        agent { 
            node { 
                label 'SRE-Build01-Server' 
            } 
        }
         steps {
            sh """
            echo 'clean workspace'
            rm -fr /data/nas-sre-prod/jenkins/apps/${work_dir}/*
            """
        }
      }

      stage("Clone Repo"){
          agent { 
             node { 
                 label 'slave' 
             } 
         }
         steps {
            echo 'Clone repo, ${branch}'
            sh """
                pwd
                ls
            """
            deleteDir()
            dir("${work_dir}"){
                    git(
                        url: "${repo_url}",
                        credentialsId: '73*yourGitCredentialsId*74',
                        branch: "${branch}"
                    )
            }
         }
      }

      stage('Scp to sre-cicd') {
         agent { 
             node { 
                 label 'slave' 
             } 
         }
         steps {
            sh """
                pwd
                rsync -Lra ${work_dir} --exclude ${work_dir}/.git 106.yourSre-cicdMachine.148:/data/nas-sre-prod/jenkins/apps/
                if [ \$? -ne 0 ]
                then
                    echo "Found some error when copy the repo"
                fi
            """
         }
      }

      stage('Build docker images') {
         agent { 
             node { 
                 label 'SRE_BUILD_NODE' 
             } 
         }
         steps {
             sh """
                echo 'build docker image'
                pwd 
                ls
                cd /data/nas-sre-prod/jenkins/apps/${work_dir}/
                if [ ! -f Dockerfile ]
                then
                    echo "No available dockerfile in workspace"
                fi
                if [ ! -f build_docker.sh ]
                then
                    echo "No available build_docker.sh in workspace"
                fi
                bash build_docker.sh ${docker_repo} ${image_version}
                pwd 
                ls
            """
        }
      }

      stage('Set tag') {
         agent { 
             node { 
                 label 'slave' 
             } 
         }
         steps {
             dir("${work_dir}"){
                echo 'set tag'
                sh """
                    git tag -m "Build docker image ${image_version} for ${branch}/${image_version}" ${branch}/${image_version}`
                    git describe
                    git push origin ${branch}/${image_version}`
                """
             }
         }
      }

      stage('check deploy exists') {
         agent { 
             node { 
                 label 'SRE_NODE'
             } 
         }
         steps {
            echo 'Hello, check deployment ${cluster} ${namespace}/${deployment} exists'
            sh "/usr/local/bin/kubectl --kubeconfig /home/yourHome/.kube/config-${cluster} -n ${namespace} get deploy ${deployment}"
         }
      }
      
      stage('deploy to k8s') {
         agent { 
             node { 
                 label 'SRE_NODE'
             } 
         }
         steps {
            echo 'deploy to k8s'
            sh """
            /usr/local/bin/kubectl --kubeconfig /home/yourHome/.kube/config-${cluster} -n ${namespace} set image deployment/${deployment} ${container_name}=registry-vpc.cn-shanghai.aliyuncs.com/${docker_repo}:${image_version}
            """
         }
      }
    }
    
    post {
        always {
            echo 'I have finished'
        }
        success {
            echo "all in one, succeed!"
            sh """
            curl -X POST -H "Content-Type: application/json" -d '{"msg_type":"text","content":{"text":"sre_test_flask_debug notify, ${namespace}/${deployment}:${image_version}, succeed!"}}' https://open.feishu.cn/open-apis/bot/v2/hook/46**yourFeiShuGroupWebhook**05
            """
        }
        failure {
            echo "all in one, failed!"
            sh """
            curl -X POST -H "Content-Type: application/json" -d '{"msg_type":"text","content":{"text":"sre_test_flask_debug notify, ${namespace}/${deployment}:${image_version}, failed!"}}' https://open.feishu.cn/open-apis/bot/v2/hook/46**yourFeiShuGroupWebhook**05
            """
        }
    }

}

2.3 测试结果

jenkins 执行结果:
在这里插入图片描述
k8s 镜像效果:
在这里插入图片描述

3 注意事项

  1. jenkins 中后缀匹配方式在不同版本中可能有轻微的区别,因此使用最新版本jenkins的时候需要根据实际情况对比测试。

4 说明

软件环境:
Docker: 20.10.*
K8s: 1.12
jenkins 版本:2.299
参考文档:
jenkins 官方文档

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cicd 04--构建自动化发布流程 的相关文章

随机推荐

  • python 使用pyinstaller 打包xpinyin 问题

    打包之后 启动错误 提示 mandarin dat 未找到 于是 找到这个文件 于打包好的pin exe放一起 再次运行还是这样 查资料说 修改 pyinstaller 的hook 测试失败 转战修改源代码 增加一个函数如果 默认查找的路径
  • 2021前端开发面试题:面试中该如何与HR谈薪资?

    问题 面试中该如何与HR谈薪资 解析 HR与你谈论薪资经常有如下套路 HR 您期望的薪资是多少 你 25K OK 你已经被HR成功套路 这个时候你的最高价就是25K了 然后HR会顺着这个价往下砍 所以你最终的薪资 般都会低于25K 等你接到
  • JS获取当前网站路径的参数值

    如果要获取当前网站路径的参数值 那么可以通过这个例子来实现 比如获取页面的 id 5 page 4 代码如下
  • es ik 分词插件 词库热加载源码分析

    package org wltea analyzer dic import java io IOException import org apache http client config RequestConfig import org
  • 通过lombok减少重复劳动

    lombok 是什么 lombok是一个java开发工具 能帮助我们减少大量的重复劳动 lombok能帮助我们做什么 lombok提供了大量的注解 只要添加了这些注解 lombok就能自动完成很多代码 举个例子 我们在写java的POJO时
  • 关于三维重建的一些东西-VisualSFM+PMVS +MeshLab= PhotoScan

    三维重建 最近在写毕业论文 研究了下三维重建的一些东西 记录下来 以备留存 另外有其他的问题的朋友可以留言 这篇博文分两个部分 三维重建方法 SFM MVS 开源工具 VisualSFM PMVS Meshlab 三维重建方法主要是SFM和
  • Java中类和对象的区别

    一 类和对象 1 类 类的理解 类是对现实生活中一类具有共同属性和行为的事物的抽象 类是对象的数据类型 类是具有相同属性和行为的一组对象的集合 简单理解 类就是对现实事物的一种描述 类的组成 属性 指事物的特征 例如 手机事物 品牌 价格
  • vite创建vue3项目及使用typescript

    1 vue3项目建议使用vite工具 安装全局的vite 创建项目 npm install g create vite app create vite app vue3 demo cd vue3 vite npm install npm r
  • IBM、甲骨文、CNCF 就谷歌对 Istio 治理的处理提出抗议

    近日来 Istio 商标转让 IBM 抗议谷歌违背承诺未将 Istio 捐献给 CNCF 的事情闹的沸沸扬扬 Google 宣布将 Istio 商标转让给 Open Usage Commons 组织 IBM 声明对 Google 违背承诺未
  • Ubuntu下通过docker安装wechat

    Ubuntu下通过docker安装微信 一 安装docker sudo apt update sudo apt upgrade sudo apt full upgrade 安装证书 sudo apt install apt transpor
  • 前缀、中缀、后缀表达式和二叉树

    概念 前缀表达式 Prefix Notation 是指将运算符写在前面操作数写在后面的不包含括号的表达式 而且为了纪念其发明者波兰数学家Jan Lukasiewicz 所以前缀表达式也叫做 波兰表达式 后缀表达式 Postfix Notat
  • explain查看sql语句执行计划

    explain sql 执行结果字段描述 id select唯一标识 select type select类型 table 表名称 type 连接类型 possible keys 可能的索引选择 key 实际用到的索引 key len 实际
  • ORB_SLAM2运行官方数据集/自己数据集

    官方数据集运行结果 WeChat 20230210194425 可以正常运行 自己数据集运行结果 自己的数据集 主要是用手机摄像头采集的实验室进行了一下简单的运行 可以成功运行 但是由于查看的相关程序的是死循环不能像运行官方数据集那样完整保
  • 1553B通信项目开发笔记(一)协议概述

    最近接了个项目 需要用1553B协议通信 仅作为RT端口进行通信 控制器采用ARM 使用芯片为国产的BU61580芯片 功能和引脚和DDC的61580完全一致 系统组成 MIL STD 1553B时分制指令 响应多路传输数据总线采用半双工传
  • Mybatis学习笔记2-配置文件解析

    在学习笔记1中大概学习了如何创建Mybatis框架的过程 其中有部分是编写核心配置文件 具体内容如下
  • 数据结构-双端队列

    定义 某种意义上 是栈和队列的结合 具体排序原则取决于使用者 实现 双端队列是元素的有序集合任何一端都允许添加移除元素 Deque 创建一个空的双端队列 无需参数 返回一个空的双端队列 addFront item 无返回值 addRear
  • python自动化测试添加日志_Python自动化测试之日志记录

    前言 在任何一个软件开发过程中 日志记录都是一个必须要做的事 记录日志 有助于问题排查 后续的大数据统计也要需要使用日志提供原始数据 Python日志库 logging Python 的日志记录工具 这是Python官方提供的日志记录库 优
  • JSP数据交互(application、cookie)

    关于作用域的对比 page
  • AWS SAA C003 S3 Type

    A solutions architect is using Amazon S3 to design the storage architecture of a new digital media application The media
  • cicd 04--构建自动化发布流程

    cicd 04 构建自动化发布流程 1 简介 2 构建过程 2 1 功能说明 2 2 jenkins gitlab 配置 2 3 测试结果 3 注意事项 4 说明 1 简介 在实际项目中 为了提高开发人员的服务发布效率 避免用户手动buil