新服务入驻生产环境 CICD 全流程、自动化脚本教程

news2024/12/25 22:43:25

文章目录

    • 背景
      • CICD
        • 百花齐放
      • “四部曲”实现
        • 优势
        • 涉及文件
        • 核心流程
          • ci.yml
          • Makefile
          • package.sh
          • noah_control
      • 小结

背景

新服务功能完成测试后,将会进行生产环境的入住,对外提供产品、功能支持。那么如何规范的、安全的、自动化的把本地服务移植到生产环境呢/?

这里简单介绍一下,本地服务入住生产环境规范且安全的过程。
在这里插入图片描述

CICD

为进行服务价值可持续、高效的敏捷交付,组织往往会引入 CICD 的执行方式。进行 自动化、安全、规范、且高效的服务移植。

CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。 CI/CD 的核心概念是持续集成、持续交付和持续部署。

百花齐放

CICD 的实现、执行方式并不唯一,可以说是 more and more 。组织往往会根据自身的研发体系氛围、文化,选择最契合的方式。这里将介绍一个相对规范、稍微复杂的实现方式。

熟悉的同学可通读,感兴趣的可以精度。

“四部曲”实现

“四部曲” 将整个 CICD 过程拆分为 编译、部署两个大阶段,通过四个文件串联起整个流程。
在这里插入图片描述

优势
  1. 支持本地代码分支自动化触发
  2. 支持不同的环境构建:devtestdiy…等
  3. 支持多依赖、跨语言,复杂服务场景: Go 调用 C 动态库 …等
  4. 支持 纯净的生产环境,代码无外漏风险,安全有保障
涉及文件
  • ci.yml:所属编译阶段,连接 代码库 的桥梁,分支 PUSH 通过执行 ci.yml 触发后续编译流程
    • 根目录:XXX/ci.yml
  • Makefile:所属编译阶段,ci.yml 调用文件,执行指定运行命令,编译服务
    • 根目录:XXX/Makefile
  • package.sh:所属部署阶段,对依赖配置文件、动态库进行打包
    • 根目录:XXX/package.sh
  • noah_control:所属部署阶段,设置运行环境变量、执行指定运行命令,启动、中止、重启服务
    • bin 目录:XXX/bin/noah_control
核心流程
  • 代码库 -> ci.yml -> Makefile -> package.sh -> noah_control

在这里插入图片描述

ci.yml

参数由 代码库配置 指定,支持多种编译、打包协议。

Global:
  tool : build_submitter

Default:
  profile : [build]

Profiles:
  - profile:
    name : build
    env : XXX
    command : make -f Makefile
    release : True
  - profile:
    name: test
    env: XXX
    command: make -f Makefile test-package conf_dir=test
    release: True
Makefile

设置依赖包拉取环境、对服务进行编译。

#初始化项目目录变量
HOMEDIR := $(shell pwd)
OUTDIR  := $(HOMEDIR)/output
APPNAME = $(shell basename `pwd`)

#初始化命令变量
GOROOT  := $(GO_1_19_HOME)
GO      := $(GOROOT)/bin/go
GOPATH  := $(shell $(GO) env GOPATH)
GOMOD   := $(GO) mod
GOBUILD := $(GO) build

#执行编译,可使用命令 make 或 make all 执行, 顺序执行 prepare -> compile -> test -> package 几个阶段
all: set-build-env prepare compile package

prepare: prepare-dep
prepare-dep:
	git config --global XXX

set-build-env:
	$(GO) env -w CC=XXX/gcc-4.8.2/bin/gcc
	$(GO) env -w CXX=XXX/gcc-4.8.2/bin/g++

set-env:
	$(GO) env -w GONOPROXY=\*\*.XXX\*\*
	$(GO) env -w GOPROXY=http://goproxy.XXX
	$(GO) env -w GONOSUMDB=\*
	$(GO) env -w GO111MODULE=on
	$(GO) env
#complile阶段,执行编译命令,可单独执行命令: make compile
compile:build
build: set-env
	$(GOMOD)  download 
	$(GOBUILD)  -o $(HOMEDIR)/bin

#test阶段,进行单元测试, 可单独执行命令: make test
test: test-case
test-case: set-env
	rm -rf $(OUTDIR)/test
	mkdir -p $(OUTDIR)/test
	
package: package-bin
package-bin:
	sh package.sh $(OUTDIR) online

test-package: set-build-env compile test-package-bin
test-package-bin:
	sh package.sh $(OUTDIR) $(conf_dir)

#clean阶段,清除过程中的输出, 可单独执行命令: make clean
clean:
	rm -rf $(OUTDIR)
package.sh
  • 依据服务 ci.yml 配置所属环境变量,进行打包。
#! /usr/bin/env sh

set -e
OUTDIR=$1
CONFNAME=$2
echo "Build Env: " + $2
echo "Output Dir: " + $1

package_online() {
   # 删除重建输除目录
  echo "clear $OUTDIR"
  rm -rf "$OUTDIR"
  mkdir -p "$OUTDIR/output"

   # [重要]拷贝执行文件和 「线上」 环境的配置
  cp -a bin "$OUTDIR/output/bin"
  cp -a conf "$OUTDIR/output/conf"

  cd "$OUTDIR/output" && tar -zcvf "$OUTDIR/output.tar.gz" ./*
  cd ../../

  # 执行过程copy的内容清理, 最终产物是 $OUTDIR/output.tar.gz
  rm -rf "$OUTDIR/output"
}

case "${2}" in
    "online")
        echo "build online package"
        package_online
        echo "build online package done"
    ;;
    *)
        echo "build ${2} package"
        package_test
        echo "build ${2} package done"
    ;;
esac
noah_control
  • 通过 nohup 进行服务启动、停止、重启,等服务状态控制。
......可私信博主或关注后续博文

在这里插入图片描述

小结

CICD 在实际应用中虽然实现方式,千差万别,但核心功能是同一的。
这里建议在组织中引入 “方便、快捷” 的方式。上述的方式虽然整体可行,在各阶段落地、调试成本、和人智成本相对较高,不建议个人或小规模状态下使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1113500.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp无感刷新token实现过程

路漫漫其修远兮,前端道路逐渐迷茫,时隔好久好久终于想起了我还有一个小博客,最近在一直在弄uniapp,属实有被恶心到,但也至少会用了,最近实现了一个比较通用的功能,就是无感刷新token&#xff0c…

如何下载和安装 Linux Red Hat 9.0安装包

【微|信|公|众|号:厦门微思网络】 官网: www.xmws.cn 【限时优惠】RHCE9.0培训考证-红帽官方授权中心-CSDN博客通过这门课程,您将能够更好的理解企业级需求和解决方案,提升您的战略思 维和决策能力并助力您为企业升级使用新的技…

【C++】引用之带你“消除”C语言版数据结构教材的一些困惑(虽然是C++的内容,但是强烈建议正在学习数据结构的同学点进来看看)

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 引用的概念 引用的特性 引用的使用场…

Django实现音乐网站 ⒇

使用Python Django框架做一个音乐网站, 本篇音乐播放器-添加播放音乐功能实现。 目录 创建播放器数据表 设置表结构 执行创建表 命令 执行 数据表结构 添加单个歌曲 创建路由 加入播放器视图 模板处理 基类方法 子页面调用 优化弹窗 加入layui文件 基…

DPDK收发包流程分析

一、 前言 DPDK是intel工程师开发的一款用来快速处理数据包的框架,最初的目的是为了证明传统网络数据包处理性能低不是intel处理器导致的,而是传统数据的处理流程导致,后来随着dpdk的开源及其生态的快速发展,dpdk成为了高性能网络数据处理的优秀框架。本篇文章主要介绍DPDK…

游戏动态库缺失

缺哪个动态库就搜哪个,再下载下来。 百度网盘:链接:https://pan.baidu.com/s/1TlxLtL3hg_iCCvtCzT7bXw 提取码:8888 文件下载完之后要放到指定的位置 C:\Windows\System32

怎么在爬虫中使用ip代理服务器,爬虫代理IP的好处有哪些?

随着互联网的快速发展,网络爬虫已经成为数据采集、分析和整理的重要工具。然而,随着网络技术的不断发展,许多网站都会采取反爬虫措施,以避免数据被恶意获取。在这种情况下,代理IP服务器就成为了爬虫们的必本备文工将具…

Flink学习---15、FlinkCDC(CDC介绍、案例实操)

星光下的赶路人star的个人主页 未来总是藏在迷雾中让人胆怯,但当你踏入其中,便会云开雾散 文章目录 1、CDC简介1.1 什么是CDC1.2 CDC的种类1.3 Flink-CDC 2、FlinkCDC案例实操2.1 开启MySQL Binlog并重启MySQL2.2 FlinkSQL方式的应用2.2.1 导入依赖2.2.2…

jadx的使用

这篇文章主要介绍下jadx的使用。 1:下载安装 开源地址如下: https://github.com/skylot/jadx 当前最新的版本是1.4.7: https://github.com/skylot/jadx/releases/tag/v1.4.7 2:使用jadx mac/linux 使用jadx-gui.windows使用…

2023年中国光模块行业研究报告

第一章 行业概况 1.1 行业简介 光模块行业是光纤通信技术发展的重要组成部分,作为连接光纤通信网络的基础设备,光模块为数据传输提供了必要的硬件支持。光模块是光纤通信系统核心器件之一,它包括多种模块类别,例如光接收模块、光…

Random与random的区别

Random与random的区别 前言一、Rondom二、rondom三、使用Rondom的好处 前言 Rondom和raodom都可以表示随机数,下面是详细讲解 提示:以下是本篇文章正文内容,下面案例可供参考 一、Rondom Rondom是Java中的一个类,若需要生成随机…

在URP管线中添加ShaderMaterial自定义GUI的方法

编写GUI面板 1. 新建GUI子面板 using UnityEngine; using UnityEngine.Rendering;namespace UnityEditor.Rendering.Universal.ShaderGUI {internal class CP_XXXOutLineGUI{public static class Styles{}public struct LitProperties{public LitProperties(MaterialProperty…

速卖通,国际站测评补单用什么环境,买家账号不会被风控,F号

我们做自养号测评、补单首先要解决的就是安全性的问题,如果安全性解决的不了的话,其他的都不要再提了。目前我们的成号率可以稳定在9.8成以上,基本上0砍单封号 市面上的环境有: 1.虚拟机V2;三四年前的环境方案了&…

6. 加载栅格(raster)图层

文章目录 前言加载栅格(raster)图层gdalGeoTiffQGis导入tif代码添加 GeoPackageQGis导入代码导入 wms在线高德影像地图QGis添加在线高德影像代码添加 离线高德影像地图瓦片原理服务描述XML文件QGis导入离线地图代码导入 前言 本章讲述使用qgis c Api加载栅格地图数据并显示。 …

卡通人像制作就是这么简单

1、打开提示词生成器。 Prompt Generatorhttps://remaker.ai/userspace/prompt-generator/2、按下面截图设置。 3、复制英文提示。 4、打开画图链接。 https://poe.com/chat/https://poe.com/chat/ 5、输入提示词,按回车。 female,wide eyes,lipstick,fox ears,b…

解决一则诡异的javascript函数不执行的问题

有个vue 音乐播放器项目,由于之前腾讯的搜索接口没法用了,于是改成了别家的搜索接口。 但是由于返回数据结构不一样,代码重构的工作量还是挺大的:包括数据请求,数据处理,dom渲染,处理逻辑都进行…

C++算法:二叉树的序列化与反序列化

#题目 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。 请设计一个算法来实现二叉树的序列化与反序列化。…

golang的json转pb验证

基于这篇文章的最后一个代码进行验证。 https://blog.csdn.net/mijichui2153/article/details/133894403?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22133894403%22%2C%22source%22%3A%22mijichui2153%22%7D 1、准备 &…

gs_moment

ps:仅共学习,自用。

OpenGL —— 2.7、绘制多个自旋转的贴图正方体(附源码,glfw+glad)

源码效果 C源码 纹理图片 需下载stb_image.h这个解码图片的库,该库只有一个头文件。 具体代码: vertexShader.glsl #version 330 corelayout(location 0) in vec3 aPos; layout(location 1) in vec2 aUV;out vec2 outUV;uniform mat4 _modelMatrix; …