初探 Google 云原生的CICD - CloudBuild

大纲

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/bbbc89fac0ca442589ebbdfafed26d5f.png

Google Cloud Build 简介

Google Cloud Build(谷歌云构建)是谷歌云平台(Google Cloud Platform,GCP)提供的一项服务,可帮助开发人员以一致和自动化的方式构建、测试和部署应用程序或构件。它为构建和部署应用程序提供了一个完全托管、可扩展和灵活的环境。

使用Cloud Build,开发人员可以使用配置文件(如YAML或JSON)定义构建流水线,指定构建过程中要执行的步骤和操作。可以根据事件(如代码库提交或更改)自动触发这些流水线,也可以由开发人员手动触发。

Cloud Build支持各种构建工具和编程语言,允许开发人员使用他们喜欢的工具和框架。它与其他GCP服务(如Cloud Storage、Container Registry和Cloud Run)无缝集成,实现了平滑的部署和发布工作流程。

Cloud Build的主要功能包括并行构建以加快执行速度、可定制的构建步骤、缓存以提高构建性能以及与版本控制系统的集成,便于源代码管理。

总之,Cloud Build简化了构建和部署过程,促进了自动化和协作,并帮助开发人员在谷歌云平台上优化软件开发生命周期。




与Jenkins 对比的优缺点

可以认为Cloud build 就是jenkins 的简单替代品, 比起jenkins, cloud build 有如下的优缺点

优点1:
Cloud build是完全云原生和serverless 的, 而jenkins 需要额外部署, 单这一点,足以让部分人选择它。

优点2:
Cloud build的配置简单, 学习成本低
对比起Jenkins 那复杂的一堆配置。。。
Cloudbuild 的部署步骤用yaml 编写, 跟Ansible 类似, 而Jenkins 的groovy script 学习曲线相对更陡峭

缺点1:
只适用于部署GCP的服务, 对于on-prem service 的部署比较吃力

缺点2:
配置简单, 但是没有jenkins 部署那么灵活, groovy script 功能更加强大

缺点3:
由于cloud build 的每个step 都在一个单独的容器内完成, 导致一些文件共享的问题
例如 如果有两个步骤, 第1个步骤 , mvn test 下载了1堆依赖
下1个步骤 mvn package 还是要下载同样的依赖。。。

总之
Cloudbuild 适合POC 场景下的部署, 快速简单.
Jenkins 更适合复杂场景的部署, 例如如果你的部署pipeline 需要包含 代码漏洞扫描, approval 流程系统集成 等其他步骤, 还是Jenkins 更方便




clould build yaml - 定义部署的步骤

用1个简单的例子:
我有1个简单的springboot service
https://github.com/nvd11/demo_cloud_user

想部署到google 的cloud run平台中。
步骤无非就是

  1. 编译 并 执行Junit cases - command: mvn test
  2. 打包成jar package - command: mvn package
  3. 打包成 docker image - command: docker build
  4. push docker image 到 Google Artifact Repository (google 镜像仓库)- command : docker pull 《image-path》
  5. 把镜像deploy 到 google cloud run 平台 - command: gcloud run deploy 《service name》–image=《image-path》。。

而上面提到, 其实每1个步骤就是1个命令
其中 步骤1和2执行的是mvn 的命令, 所以步骤1和2我们需要引入 mvn 的docker 镜像
步骤3和4是docker 命令, 需要引入包含docker/kaniko 的docker 镜像
步骤5 是gcloud 命令, 则需要 google sdk的docker 镜像

所以我们需要在springboot service 的项目主目录下新建1个cloudbuild.yaml (如果需要docker部署, dockerfile也还是需要的)
cloudbuild.yaml

steps:
  - id: check maven and jdk version
    name: maven:3.9-sapmachine-21 # https://hub.docker.com/_/maven
    entrypoint: mvn
    args: ['--version']

  - id: run maven test
    name: maven:3.9-sapmachine-21 # https://hub.docker.com/_/maven
    entrypoint: mvn
    args: ['test']

  - id: run maven package
    name: maven:3.9-sapmachine-21 # https://hub.docker.com/_/maven
    entrypoint: mvn
    args: ['package', '-Dmaven.test.skip=true']

  # https://cloud.google.com/build/docs/configuring-builds/substitute-variable-values
  - id: build docker image
    name: 'gcr.io/cloud-builders/docker'
    args: ['build', '-t', 'europe-west2-docker.pkg.dev/$PROJECT_ID/my-docker-repo/demo-cloud-user', '.']

  - id: upload docker image to GAR
    name: 'gcr.io/cloud-builders/docker'
    args: [ 'push', 'europe-west2-docker.pkg.dev/$PROJECT_ID/my-docker-repo/demo-cloud-user']

  # deploy to Cloud run
  - id: deploy image to cloud run
    name: 'gcr.io/cloud-builders/gcloud'
    args: ['run', 'deploy', 'demo-cloud-user',
           '--image=europe-west2-docker.pkg.dev/$PROJECT_ID/my-docker-repo/demo-cloud-user',
           '--port=8080',
           '--platform=managed',
           '--region=europe-west2',
           '--no-allow-unauthenticated',
           '--service-account=vm-common@jason-hsbc.iam.gserviceaccount.com',
           '--key=projects/$PROJECT_ID/locations/europe-west2/keyRings/mykeyring/cryptoKeys/mycmek']
# https://stackoverflow.com/questions/68779751/error-publishing-source-code-from-cloud-build-to-a-bucket-using-triggers
logsBucket: gs://jason-hsbc_cloudbuild/logs/
options: # https://cloud.google.com/cloud-build/docs/build-config#options
  logging: GCS_ONLY # or CLOUD_LOGGING_ONLY https://cloud.google.com/cloud-build/docs/build-co

十分简单易懂:
其中Google 已经允许在Cloudbuild 使用built-in的默认参数, 例如$PROJECT_ID 代替真实的gcp project id

参考:
https://cloud.google.com/build/docs/configuring-builds/substitute-variable-values

值得注意的是options- logging 如果配置了CLOUD_LOGGING_ONLY则cloud build 日志会发送到google 日子平台

日志格式:
在这里插入图片描述

如果是选择GCS_ONLY 则需要配置logsBucket
日志格式:在这里插入图片描述
个人更喜欢更简介的第2种。



用Cloud build trigger 触发部署

当写好cloudbuild.yaml写好后, 有两种方法出发部署
第一种是使用cloud build trigger

所谓cloud build trigger 就是让你的代码仓库的更新事件(commit/pull request) 去触发一个部署

而目前代码仓库只支持github 和 bitbucket, 置于国内的gitee, coding之类或者gitlab 私有化部署的代码仓库不支持

新建1个trigger 的详细步骤

1.打开trigger 的google console 页面, 点击新建trigger button

在这里插入图片描述



填写trigger 参数

有几个关键参数
region: 建议和您的其他resource 的region保持一致,减少网络传输距离
Name: cloudbuild的名字, 必填
Repository: 就是你的代码仓库, 第一次使用,需要配置google cloud 到github Oauth2 授权
在这里插入图片描述
branch: 就是制定某个branch的时间, 可以用.*代替全部branch, 建议只写某几个release branch
Event:有3个选项, 这里不解释了
1.push to a new branch
2.push new tag
3.pull request

Cloud Build configuration file location:
默认是 /cloudbuild.yaml 当然可以改成其他的, 让1个项目可以多种部署参数。
Service account: 部署所以用的service account, 如果不填, 则用cloud build 本身的agent service account 去部署, 权限问题是个坑。

注意上面的步骤也可以用terraform管理



触发Trigger

有两种方式, 1就是真的去修改代码, 利用commit/pull request/tag 事件出发
2是在ui上按run
在这里插入图片描述



查看build 状态和历史

部署历史的dashboard 能在UI上查看
在这里插入图片描述
点进去某个item 就能看详细的日志
在这里插入图片描述

当然用命令行也是可以的, 但是不太方便, 主要是查看具体日志的部分, 暂时我只能基于bucket 里的日志来查看:

Service URL: https://demo-cloud-user-7hq3m4pdya-nw.a.run.app
[gateman@manjaro-x13 demo_cloud_user]$ gcloud builds list --region=europe-west2
ID                                    CREATE_TIME                DURATION  SOURCE  IMAGES  STATUS
499f567c-10c9-4ae3-9456-d29bbc02168a  2024-05-01T18:21:10+00:00  3M21S     -       -       SUCCESS
6eec19d7-d7dc-4b51-8c5a-57a00879f044  2024-05-01T18:00:28+00:00  3M16S     -       -       SUCCESS
678554d2-b56b-4c5b-a81a-61addde1bc46  2024-05-01T15:03:33+00:00  3M19S     -       -       SUCCESS
d9ef5b26-52c6-4278-b1b1-e42ec5d456ad  2024-04-23T15:31:07+00:00  2M46S     -       -       SUCCESS
85946729-b839-4d42-9fda-e610f4333ba2  2024-04-23T15:02:02+00:00  2M37S     -       -       FAILURE
d636308d-2c19-4c59-9943-6371b185a022  2024-04-22T19:16:26+00:00  2M35S     -       -       SUCCESS
114660c2-6c23-410e-8bf9-76877dcd3bb0  2024-04-22T19:02:52+00:00  17S       -       -       SUCCESS
8d21277c-51c5-4f59-8a00-6db5d1dbd837  2024-04-22T18:34:56+00:00  35S       -       -       FAILURE
b3221243-5ada-4ccb-958e-c06ce127e788  2024-04-22T18:28:51+00:00  -         -       -       FAILURE
e1fde2bf-b7a1-47aa-9629-b3561c2dcca0  2023-11-04T20:54:29+00:00  1M38S     -       -       SUCCESS
[gateman@manjaro-x13 demo_cloud_user]$ gsutil cat gs://jason-hsbc_cloudbuild/logs/log-499f567c-10c9-4ae3-9456-d29bbc02168a-step-5.txt
Already have image (with digest): gcr.io/cloud-builders/gcloud
Deploying container to Cloud Run service [demo-cloud-user] in project [jason-hsbc] region [europe-west2]
Deploying...
Setting IAM Policy.............done
Creating Revision..........................................................................................................................................................................................................done
Routing traffic.....done
Done.
Service [demo-cloud-user] revision [demo-cloud-user-00006-v9c] has been deployed and is serving 100 percent of traffic.
Service URL: https://demo-cloud-user-7hq3m4pdya-nw.a.run.app




用google SDK 命令行去触发

这种方法无需配置trigger, 只需要在local 本地或者安装有google sdk 的环境下
进入代码项目的folder
执行

gcloud builds submit --config=path/to/custom-build-config.yaml

config 参数可以不写, 默认的config 位置就是./cloudbuild.yaml

这种trigger 方式还有这些好处

  1. 无需关心git remote 的地址, 支持任何项目, 甚至没有交给git管理的项目
  2. 无需commit 代码就可以触发build, 随改随部署

例子:

[gateman@manjaro-x13 demo_cloud_user]$ gcloud builds submit
Creating temporary tarball archive of 24 file(s) totalling 108.2 KiB before compression.
Some files were not included in the source upload.

Check the gcloud log [/home/gateman/.config/gcloud/logs/2024.05.02/03.17.04.250214.log] to see which files and the contents of the
default gcloudignore file used (see `$ gcloud topic gcloudignore` to learn
more).

Uploading tarball of [.] to [gs://jason-hsbc_cloudbuild/source/1714591025.18917-5d48d906138b4c9d906c9ceb47c62898.tgz]
Created [https://cloudbuild.googleapis.com/v1/projects/jason-hsbc/locations/global/builds/8bf33682-33a3-452c-9653-5966a35e1611].
Logs are available at [ https://console.cloud.google.com/cloud-build/builds/8bf33682-33a3-452c-9653-5966a35e1611?project=912156613264 ].
ID                                    CREATE_TIME                DURATION  SOURCE                                                                                   IMAGES  STATUS
8bf33682-33a3-452c-9653-5966a35e1611  2024-05-01T19:16:48+00:00  2M57S     gs://jason-hsbc_cloudbuild/source/1714591025.18917-5d48d906138b4c9d906c9ceb47c62898.tgz  -       SUCCESS

至于具体日志,还是建议去console 上查看




cloud build 的一些坑

1. gcloud SDK 执行的cloud build 的region 是global (non-region)

这个是google 暂时的limitation
导致两个问题:
1. 在gcp console 上我们必须用global region 去filter google sdk出发的cloudbuild 历史和看日志, 这代表 用trigger 出发和google sdk出发的cloudbuild 历史不在同1页上
2. gcloud builds submit command 默认下会尝试在 us region(人类希望的大本营) 创建bucket, 如果你的gcp project 所在的organization policy限制了us region的权限, 则你会遇到这个错误:

ERROR: (gcloud.builds.submit) HTTPError 412: 'us' violates constraint 'constraints/gcp.resourceLocations'	

原因: cloud build 无法在us region 创建staging folder
https://cloud.google.com/sdk/gcloud/reference/builds/submit#–gcs-source-staging-dir
解决方法1:

    ERROR: (gcloud.builds.submit) HTTPError 412: 'us' violates constraint 'constraints/gcp.resourceLocations'

解决方法2:
创建bucket gs://_cloudbuild/ bucket

我采用了第二种




glcoud builds build 所以的service account 是cloud build 默认的agent account

即使你用admin account 执行 gcloud build 命令, 默认下它用的是 cloud build 的agent account
最好预先分配好权限, 否则部署cloud run/ GKE 时很可能会失败
当然用下面页面分配也是可以的
在这里插入图片描述

还有一种方法,
可以用 glcoud builds build --account=emailaddr 来强制使用某个service account来部署, 前提是这个service account 已经在当前环境用gcloud auth 登陆

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

B树:原理、操作及应用

B树:原理、操作及应用 一、引言二、B树概述1. 定义与性质2. B树与磁盘I/O 三、B树的基本操作1. 搜索(B-TREE-SEARCH)2. 插入(B-TREE-INSERT)3. 删除(B-TREE-DELETE) 四、B树的C代码实现示例五、…

基于 Wireshark 分析 IP 协议

一、IP 协议 IP(Internet Protocol)协议是一种网络层协议,它用于在计算机网络中实现数据包的传输和路由。 IP协议的主要功能有: 1. 数据报格式:IP协议将待传输的数据分割成一个个数据包,每个数据包包含有…

mac电脑关于ios端的appium真机自动化测试环境搭建

一、app store 下载xcode,需要登录apple id 再开始下载 二、安装homebrew 1、终端输入命令&#xff1a; curl -fsSL <https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh>如果不能直接安装&#xff0c;而是出现了很多内容&#xff0c;那么这个时候不要着急&…

06.Git远程仓库

Git远程仓库 #仓库种类&#xff0c;举例说明 github gitlab gitee #以这个仓库为例子操作登录码云 https://gitee.com/projects/new 创建仓库 选择ssh方式 需要配置ssh公钥 在系统上获取公钥输入命令&#xff1a;ssh-keygen 查看文件&#xff0c;复制公钥信息内…

【画图】读取无人机IMU数据并打印成log用matlab分析

一、修改IMU频率 原来的imu没有加速度信息&#xff0c;查看加速度信息的指令为&#xff1a; rostopic echo /mavros/imu/data 修改imu频率&#xff0c;分别修改的是 原始IMU数据话题 /mavros/imu/data_raw。飞控计算过后的IMU数据 /mavros/imu/data rosrun mavros mavcmd l…

Uniapp好看登录注册页面

个人介绍 hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的…

【Linux-点灯烧录-SD卡/USB烧写】

目录 1. 烧写方式2. 烧写之代码编译2.1 led.s->led.o2.2 led.o->led.elf2.3 led.elf->led.bin2.4 反汇编&#xff1a;led.elf->led.dis 3. 烧写之烧录到SD卡上&#xff1a;3.1 开启烧录软件权限&#xff1a;3.2 确定SD卡的格式&#xff1a;FAT323.3 烧录到SD卡上3.…

makefile中wildcard函数和patsubst用法

makefile中函数用法 makefile中函数的调用语法&#xff1a; $(<function> <arguments>) 或 ${<function> <arguments>}函数调用以$开头用{}或者()将函数名以及参数包含起来函数名和第一个参数之间以空格分隔参数之间使用逗号分隔 wildcard函数 wil…

python判断大图中包含小图并输出位置总结

python判断大图中包含小图并输出位置总结 没啥可说的&#xff0c;项目遇到了就直接上代码&#xff0c;可以减轻劳动力&#xff0c;花最少得时间实现应用功能。 import cv2 # 读取大图片和小图片的路径 img_big cv2.imread(big_image.png) img_small cv2.imread(small_image…

VScode+ubuntu配置ROS开发环境

VScodeubuntu配置ROS开发环境 写在前面 在vscode中先安装几个插件&#xff1a;中文语言包、Python插件、C插件、CMake插件、vscode-icons、ROS插件、Visual Studio IntelliCode、URDF、Markdown All in One 一、工作空间是什么 在ROS机器人开发中&#xff0c;我们针对机器人…

ue引擎游戏开发笔记(27)——解决角色移动及转动存在卡顿掉帧小技巧

1.需求分析&#xff1a; 随之游戏越来越大&#xff0c;难免出现部分时候移动出现卡顿&#xff0c;能否进行一定优化。 2.操作实现&#xff1a; 1.思路&#xff1a;采取捕获最后deltaseconds来逐帧进行旋转或移动&#xff0c;使动作显得不那么卡顿。 .2.首先在引擎中建立映射&a…

第一课 自动驾驶概述

1. contents 2. 什么是无人驾驶/自动驾驶 3 智慧出行大智慧 4. 无人驾驶的发展历程

24.5.2数据结构|顺序表实现

主要是记笔记&#xff0c;留着以后复习回来看的&#xff0c;有些内容解释的并不清晰。也就稍微可以借鉴借鉴。 一、如何定义结构&#xff1f; 应该有的部分用来约束的部分 二、看书搞清楚顺序表实现流程 1、准备工作&#xff1a;如何定义结构体&#xff1f;SeqList&#xf…

Acrobat Pro DC 2023:专业PDF编辑软件,引领高效办公新时代

Acrobat Pro DC 2023是一款专为Mac和Windows用户设计的专业PDF编辑软件&#xff0c;凭借其强大的功能和卓越的性能&#xff0c;成为现代职场人士不可或缺的得力助手。 这款软件拥有出色的PDF编辑能力。用户不仅可以轻松地对PDF文档中的文字、图片和布局进行编辑和调整&#xf…

【Vue】结合ElementUI实现简单数据请求和页面跳转功能

一、准备工作 1、创建一个Vue-cli程序 之前的博客有。各位看官姥爷&#xff0c;可以自查。 2、安装ElementUI 在创建Vue-cli程序的过程中&#xff0c;需要在控制台执行以下指令&#xff1a; #安装 element-ui npm i element-ui -S #安装 SASS 加载器 cnpm install sass-loa…

[实例] Unity Shader 利用顶点着色器模拟简单水波

我们都知道顶点着色器可以用来改变模型各个顶点的位置&#xff0c;那么本篇我们就利用顶点着色器来做一个模拟简单水波的应用。 1. 简谐运动 在进行模拟水波之前&#xff0c;我们需要了解简谐运动&#xff08;Simple Harmonic Motion&#xff09;公式&#xff1a; 其中&#…

【跟马少平老师学AI】-【神经网络是怎么实现的】(四)卷积神经网络

一句话归纳&#xff1a; 1&#xff09;用1个小粒度的模式&#xff0c;逐个与图像的局部区域进行运算&#xff0c;运算结果反映模式与区域的匹配程度。 2&#xff09;卷积神经网络与全连接神经网络的区别&#xff1a; 卷积神经网络的输出只与局部输入有连接。参数较少&#xff0…

使用jdbc方式操作ClickHouse

1、创建测试表&#xff0c;和插入测试数据 create table t_order01(id UInt32,sku_id String,total_amount Decimal(16,2),create_time Datetime ) engine MergeTreepartition by toYYYYMMDD(create_time)primary key (id)order by (id,sku_id);insert into t_order01 values …

jupyter notebook切换conda虚拟环境

首先&#xff0c;切换到某个虚拟环境&#xff0c;本人切换到了d2l环境&#xff1a; (d2l) C:\Users\10129>pip install ipykernel然后&#xff0c;如代码所示安装ipykernel包 最后&#xff0c;按下述代码执行&#xff1a; (d2l) C:\Users\10129>python -m ipykernel i…

SQL 基础 | UNION 用法介绍

在SQL中&#xff0c;UNION操作符用于合并两个或多个SELECT语句的结果集&#xff0c;形成一个新的结果集。 使用UNION时&#xff0c;合并的结果集列数必须相同&#xff0c;并且列的数据类型也需要兼容。 默认情况下&#xff0c;UNION会去除重复的行&#xff0c;只保留唯一的行。…
最新文章