持续交付/持续部署流水线介绍(CD)
目录
一、概述
二、典型操作流程
2.1 CI/CD典型操作流
2.2 CI/CD操作流程说明
2.3 总结
三、基于GitHub+Docker的持续交付/持续部署流水线(公有云)
3.1 基于GitHub+Docker的持续交付/持续部署操作流程示意图
3.2 GitHub+Docker持续交付/持续部署流水线技术实现原理
3.2.1 添加Action模板
3.2.2 构建Workflow流程
四、基于Jenkins+Docker+K8s的持续交付/持续部署流水线
4.1 Jenkins+Docker+K8s持续部署流程示意图
4.2 Jenkins+Docker+K8s持续部署流水线技术实现原理
4.2.1 安装KubeOperator
4.2.2 Jenkins配置
4.2.2.1 安装Jenkins K8s插件
4.2.2.2 配置K8s凭据
4.2.2.3 配置K8s集群连接
4.2.2.4 Jenkinsfile 文件编写
4.2.3 总结
一、概述
在实际工作中,CI/CD通常是在一起的。但是为了详细地向大家讲述其中涉及的技术要求将其拆分,分别向大家讲述持续交付、持续部署与持续集成的流程,方便大家理解自动化流程是如何从测试环境向生产环境变化过渡的,下面就从这些变化点,结合前文的CI流程,来介绍CD操作流程和使用场景。并介绍公有云基于GitHub+Docker的持续交付/持续部署流水线方案和私有云基于Jenkins+Docker+K8s的持续交付/持续部署流水线方案。
二、典型操作流程
2.1 CI/CD典型操作流
无论是中小型企业还是大型互联网企业,当企业DevSecOps能力完成CD全流程覆盖时,通常选择容器技术来构建,其典型操作流程和使用场景大体如下图所示:

2.2 CI/CD操作流程说明
上图操作流程主要步骤如下:
- 开发人员提交代码到GitHub代码仓库。
- 版本控制系统发起更新通知,触发CI自动构建动作。
- CI完成持续集成构建后,最终生成可用于部署的Docker镜像。
- 推送Docker镜像到容器注册表。
- CD同步K8s更新配置,触发部署服务。
- K8s集群管理通过容器注册表和配置信息,拉取Docker镜像。
- 完成容器实例创建,并运作。
在这些步骤中,读者可以看出步骤4)及之前是前文CI持续集成流程中所讲述的内容;步骤4)之后,是文本所讲述的内容。在整个流程中,黄金管道的流水线能力仍是流程的核心,通过流水线对流程的代码化,完成镜像打包到镜像管理、镜像注册、应用发布、应用更新等多个使用场景的自动化。使用者通过脚本或代码,依托流水线能力的调度,贯穿部署、更新流程,降低因手工操作带来的出错率,同时将重复性的、枯燥的工作代码化,将人力资源释放出来做更有价值的事,提升了整体的工作效率。
2.3 总结
在企业内部,构建持续交付、持续部署的平台能力时,和持续集成能力的构建一样,可以选择依托公有云厂商的能力来建设,也可以在企业内部私有云的基础上自行建设。在构建时选择哪种方式主要依赖于其企业的基础设施资产是什么形态的,如果是公有云上的资产为主,建议依托云厂商能力来构建。反之,则建议企业自建。在企业自建的过程中,目前主要是以容器化技术去构建应用级持续交付及持续部署能力。
三、基于GitHub+Docker的持续交付/持续部署流水线(公有云)
3.1 基于GitHub+Docker的持续交付/持续部署操作流程示意图
这里继续使用GitHub平台的GitHub Actions功能,在原有流程上添加持续交付/持续部署的流程,其中步骤变化点有:代码构建完成后添加容器镜像构建、镜像文件上传/注册、服务器部署等,最终形成的流程示意图如下图所示:

在这个方案里,CI/CD流水线使用GitHub Actions,容器镜像管理使用阿里云ACR,配置管理使用GitHub Actions,K8s集群环境管理使用阿里云ACK。下面就跟大家一起来看看整个流程的具体实现。
3.2 GitHub+Docker持续交付/持续部署流水线技术实现原理
3.2.1 添加Action模板
在前文中已经对GitHub Actions的使用和相关语法做了详细的介绍,当需要持续交付/持续部署能力时,只需要调整YAML文件,定义CD流程中的各个操作即可。编写此文件时,可以在GitHub手工添加Action模板,如下图所示:

3.2.2 构建Workflow流程
添加完毕后,将得到文件名为alibabacloud.yml的模板文件,如下图所示,再基于此定制化修改为自己想要的Workflow流程即可。
当以Java SpringBoot应用程序为例,仅需调整文件中的环境变量和代码构建部分内容即可,如下即为需要修改的:



当上述配置完成后,GitHub Actions被触发时,自动执行部署流程。大家可以在GitHub上对流程进行跟踪,也可以通过阿里云的ACK跟踪流程执行结果。
四、基于Jenkins+Docker+K8s的持续交付/持续部署流水线
除了使用GitHub+Docker构建持续交付/持续部署流水线外,私有化平台建设的场景下,使用Jenkins+Docker+K8s作为技术栈也是比较常见的。在这一小节中,将为大家讲述基于Jenkins+Docker+K8s的持续交付/持续部署流水线实现。
4.1 Jenkins+Docker+K8s持续部署流程示意图
当选择私有化方案替代上节的GitHub Actions时,在流程上并没有大的变化,变化更多的是在技术实现上,如代码管理使用GitLab、CI/CD调度使用Jenkins、镜像管理使用Harbor、容器集群管理使用K8s等。最终形成的流程示意图如下图所示:

4.2 Jenkins+Docker+K8s持续部署流水线技术实现原理
基于这个方案,一起来看看整个流程的具体技术实现。
4.2.1 安装KubeOperator
已经安装过K8s的读者,想必对K8s复杂的安装过程较为熟悉,如果对K8s不熟悉也没关系,它不是本节的重点。想学习的读者,推荐安装开源产品KubeOperator,如下图所示:

KubeOperator是飞致云开源的轻量级Kubernetes发行版,它的安装非常简单,在满足基本配置的基础上,执行一键安装脚本即可。同时KubeOperator采用Terraform自动创建虚机,采用Ansible作为自动化部署工具,这也是和本书基础设施安全相关章节的内容一致。
4.2.2 Jenkins配置
4.2.2.1 安装Jenkins K8s插件
使用Jenkins管理K8s,首先需要安装Jenkins K8s插件。登录Jenkins后,依次选择【系统管理】→【插件管理】,在搜索框中搜索kubernetes,选择Kubernetes,单击【安装】按钮,完成后重启Jenkins即可,如下图所示:

4.2.2.2 配置K8s凭据
等插件安装完成重启Jenkins后,接着需要配置K8s凭据。登录系统,依次选择【用户】→【凭据】→【全局凭据】,添加凭据类型,推荐选择X.509 Client Certificate,如下图所示:

这里需要注意的是以下3项内容,均来源于.kube/config文件,需要登录K8s集群查看后填写,如下:
- Client Key,即.kube/config文件中client-key值对应的文件。
- Client Certificate,即. kube/config文件中client-certificate值对应的文件,格式为crt或pem。
- Server CA Certificate,即. kube/config文件中certificate-authority值对应的文件,格式同上。
4.2.2.3 配置K8s集群连接
凭据配置完成后,接下来即可配置K8s集群连接了。依次选择【系统管理】→【管理节点与云】→【云配置】,开始配置集群,如下图所示:

这里,K8s集群相关配置内容比较多,单击上图中的第二个输入框【Kubernetes Cloud details...】,详细输入如下图所示内容:

图中的各输入项含义如下:
- Kubernetes地址,即Kubernetes服务地址,一般填写Master节点IP地址加端口。
- Kubernetes服务证书key,即前文提及的kube-ca.crt文件内容。
- Kubernetes命名空间,即前文提及的kube-ca.crt文件内容。
- JNLP Docker Registry,即自定义JNLP容器镜像地址,用于Jenkins工作节点容器化,如使用K8s插件,Jenkins通过Job动态生成工作节点(Pod),并在结束后销毁容器。
- 凭据,即前文创建的certificate凭据。
除了上述参数之外,还有Jenkins和Pod相关配置参数项,如下图所示:

除了Jenkins地址需要填写Jenkins Master地址之外,其他的值可以默认。配置完成后,即可以编写Jenkinsfile来操作Pipline。需要注意的是,Jenkins调用Pod管理的ServiceAccount需要先在K8s集群上创建好。
4.2.2.4 Jenkinsfile 文件编写
Jenkinsfile的编写比较简单,为了便于读者的理解,这里以Jenkinsfile伪码的形式展示其基本结构,其包含的操作步骤如下:
- 拉取代码。
- 编译+单元测试。
- 构建镜像文件。
- 上传镜像仓库。
- 发布到K8s集群。
此时,Jenkinsfile伪码内容如下所示(重点关注加粗部分的内容):


当K8s的发布环境区分测试环境、准生产环境、生产环境时,可以通过此方式完成不同环境的部署发布及回滚设置,以满足灰度发布、蓝绿发布、滚动发布等发布要求。
4.2.3 总结
通过上述内容的介绍,大家基本理解Jenkins+Docker+K8s持续部署流水线技术实现原理及其关键步骤,但Docker、K8s、Jenkins等技术细节涉及的内容比较繁杂,仍需要大家进一步学习其他资料,以便在此基础上,深入理解云原生技术与DevSecOps自动化实现的关系。后续有时间,我会再整理发布跟个部署构建相关教程文档吧,回头再说。。。。。。。
好了,本次内容就分享到这,欢迎大家关注《DevSecOps》专栏,后续会继续输出相关内容文章。如果有帮助到大家,欢迎大家点赞+关注+收藏,有疑问也欢迎大家评论留言!
相关文章:
持续交付/持续部署流水线介绍(CD)
目录 一、概述 二、典型操作流程 2.1 CI/CD典型操作流 2.2 CI/CD操作流程说明 2.3 总结 三、基于GitHubDocker的持续交付/持续部署流水线(公有云) 3.1 基于GitHubDocker的持续交付/持续部署操作流程示意图 3.2 GitHubDocker持续交付/持续部署流水…...
第四百三十八回
文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 们在上一章回中介绍了"不同平台上换行的问题"相关的内容,本章回中将介绍如何在页面上显示蒙板层.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们…...
Python学习:面相对象
面向对象 面向对象技术简介 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。方法:类中定义的函数。类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实…...
SSM学习——Spring AOP与AspectJ
Spring AOP与AspectJ 概念 AOP的全称为Aspect-Oriented Programming,即面向切面编程。 想象你是汉堡店的厨师,每一份汉堡都有好几层,这每一层都可以视作一个切面。现在有一位顾客想要品尝到不同风味肉馅的汉堡,如果按照传统的方…...
Android 使用LeakCanary检测内存泄漏,分析原因
内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏。 平时我们在使用app时,少量的内存泄漏我们是发现不了的,但是当内存泄漏达到一定数量时&…...
Linux部署Kafka2.8.1
安装Jdk 首先确保你的机器上安装了Jdk,Kafka需要Java运行环境,低版本的Kafka还需要Zookeeper,我此次要安装的Kafka版本为2.8.1,已经内置了一个Zookeeper环境,所以我们可以不部署Zookeeper直接使用。 1、解压Jdk包 t…...
【pytest、playwright】allure报告生成视频和图片
目录 1、修改插件pytest_playwright 2、conftest.py配置 3、修改pytest.ini文件 4、运行case 5、注意事项 1、修改插件pytest_playwright pytest_playwright.py内容如下: # Copyright (c) Microsoft Corporation. # # Licensed under the Apache License, Ver…...
浅谈iOS开发中的自动引用计数ARC
1.ARC是什么 我们知道,在C语言中,创建对象时必须手动分配和释放适量的内存。然而,在 Swift 中,当不再需要类实例时,ARC 会自动释放这些实例的内存。 Swift 使用 ARC 来跟踪和管理应用程序的内存,其主要是由…...
Spring IoCDI(2)
IoC详解 通过上面的案例, 我们已经知道了IoC和DI的基本操作, 接下来我们来系统地学习Spring IoC和DI的操作. 前面我们提到的IoC控制反转, 就是将对象的控制权交给Spring的IoC容器, 由IoC容器创建及管理对象. (也就是Bean的存储). Bean的存储 我们之前只讲到了Component注解…...
30. UE5 RPG GamplayAbility的配置项
在上一篇文章,我们介绍了如何将GA应用到角色身上的,接下来这篇文章,将主要介绍一下GA的相关配置项。 在这之前,再多一嘴,你要能激活技能,首先要先应用到ASC上面,才能够被激活。 标签 之前介绍…...
提升自己最快的方式是什么?
提升自己最快的方式通常涉及到个人成长的各个方面,包括心理、情感、技能和知识等。根据查阅到的资料,以下是一些具体的方法和步骤,帮助你快速提升自己: 1. 培养屏蔽力 荷兰畅销书作家罗伊马丁纳提到,屏蔽力是个人成长…...
题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。 There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence…...
《HelloGitHub》第 96 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 https://github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 …...
C++tuple类型
tuple 类型 tuple是类似pair的模板。 每个pair的成员类型都不相同,但每个pair都恰好有两个成员。不同tuple类型的成员类型也不相同,但一个tuple可以有任意数量的成员。 每个确定的tuple类型的成员数目是固定的,但一个tuple类型的成员数目可…...
亚远景科技-浅谈ASPICE标准和ASPICE认证/评估
ASPICE(Automotive SPICE)是一种针对汽车行业的软件开发过程的评估模型,它旨在帮助汽车制造商和供应商提高软件开发过程的能力和质量,从而提升产品的质量、安全性和效率。 ASPICE标准涵盖了软件开发的各个阶段和活动,…...
PHP性能提升方案
一、背景与介绍 PHP语言开发效率高,特别应用于适合中小型项目,对于创业初期敏捷开发验证项目可行性或者Demo演示绝对占据优势。 但是随着现在Web应用的复杂性,针对项目要适应高并发、高流量的访问特性,PHP确实在性能方面相对Go、J…...
关系(二)利用python绘制热图
关系(二)利用python绘制热图 热图 (Heatmap)简介 热图适用于显示多个变量之间的差异,通过颜色判断彼此之间是否存在相关性。 快速绘制 基于seaborn import seaborn as sns import pandas as pd import numpy as np i…...
P8597 [蓝桥杯 2013 省 B] 翻硬币
# [蓝桥杯 2013 省 B] 翻硬币 ## 题目背景 小明正在玩一个“翻硬币”的游戏。 ## 题目描述 桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零),比如可能情形是 **oo***oooo&#x…...
主流公链 - Fantom
Fantom:高性能的区块链协议 Fantom是一种开创性的区块链协议,旨在革新去中心化应用和数字金融领域 技术特点 共识机制 Lachesis协议:Fantom使用了Lachesis协议作为其共识算法。Lachesis是一种 异步拜占庭容错(ABFT)共…...
vue-quill-editor 富文本编辑器(可上传视频图片),组件挂载的方式实现
1.安装 npm install vue-quill-editor --save npm install quill-image-drop-module --save npm install quill-image-resize-module --save2.在组件下面新增组件 QlEditor (1)index.vue <template><div><div idquillEditorQiniu><!-- 基于element…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
