华为云CDN刷新与查询余量的Go实现及在Jenkins中的部署

引言

在华为云上,对CDN缓存内容进行刷新是一个常见的需求,以确保最新的内容能尽快被用户访问到。通过使用Go语言,我们可以开发一个自动化的工具来实现这一需求,并将其集成到Jenkins中以实现持续部署。下面我们将分步骤讲解如何实现。

1. 实现CDN的刷新

要用Go实现华为云CDN的刷新工作,我们需要首先安装go-sdk,这是华为云为Go开发者提供的SDK,包含了操作华为云服务的API接口。

步骤1.1 安装华为云官方Go SDK

我们可以使用go get命令来安装SDK:

go get -u github.com/huaweicloud/huaweicloud-sdk-go-v3

步骤1.2 创建CDN刷新任务

使用华为云apiexplorer查看一下cdn的实例代码:
image.png
创建刷新缓存任务实例,有V1 V2版本区别,但是看了一眼,目测代码没有什么区别,这里就继续使用v1版本了:

package mainimport ("fmt""github.com/huaweicloud/huaweicloud-sdk-go-v3/core/auth/global"cdn "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/cdn/v1""github.com/huaweicloud/huaweicloud-sdk-go-v3/services/cdn/v1/model"region "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/cdn/v1/region"
)func main() {// The AK and SK used for authentication are hard-coded or stored in plaintext, which has great security risks. It is recommended that the AK and SK be stored in ciphertext in configuration files or environment variables and decrypted during use to ensure security.// In this example, AK and SK are stored in environment variables for authentication. Before running this example, set environment variables CLOUD_SDK_AK and CLOUD_SDK_SK in the local environmentak := os.Getenv("CLOUD_SDK_AK")sk := os.Getenv("CLOUD_SDK_SK")auth := global.NewCredentialsBuilder().WithAk(ak).WithSk(sk).Build()client := cdn.NewCdnClient(cdn.CdnClientBuilder().WithRegion(region.ValueOf("cn-north-1")).WithCredential(auth).Build())request := &model.CreateRefreshTasksRequest{}request.Body = &model.RefreshTaskRequest{}response, err := client.CreateRefreshTasks(request)if err == nil {fmt.Printf("%+v\n", response)} else {fmt.Println(err)}
}

根据上面的代码做一个简单的实例,演示如何使用华为云Go SDK创建CDN刷新任务:
域名使用 传入的方式,这里就直接使用了os.Args,传递参数:

package mainimport ("fmt""github.com/huaweicloud/huaweicloud-sdk-go-v3/core/auth/global""github.com/huaweicloud/huaweicloud-sdk-go-v3/core/config"cdn "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/cdn/v1""github.com/huaweicloud/huaweicloud-sdk-go-v3/services/cdn/v1/model""github.com/huaweicloud/huaweicloud-sdk-go-v3/services/cdn/v1/region""os"
)func main() {if len(os.Args) < 2 {fmt.Println("Usage: go run main.go <your-cdn-url>")return}cdnUrl := os.Args[1]ak := "YOUR_ACCESS_KEY"sk := "YOUR_SECRET_KEY"auth := global.NewCredentialsBuilder().WithAk(ak).WithSk(sk).Build()hcClient := cdn.NewCdnClient(cdn.CdnClientBuilder().WithRegion(region.ValueOf("cn-north-1")).WithCredential(auth).WithHttpConfig(config.DefaultHttpConfig()).Build())// Create CDN refresh taskcreateRefreshTask(hcClient, cdnUrl)
}func createRefreshTask(hcClient *cdn.CdnClient, cdnUrl string) {refreshTaskRequest := &model.CreateRefreshTasksRequest{}typeRefreshTask := model.GetRefreshTaskRequestBodyTypeEnum().DIRECTORYmodeRefreshTask := model.GetRefreshTaskRequestBodyModeEnum().DETECT_MODIFY_REFRESHzhUrlEncodeRefreshTask := falserefreshTaskbody := &model.RefreshTaskRequestBody{Type:        &typeRefreshTask,Mode:        &modeRefreshTask,ZhUrlEncode: &zhUrlEncodeRefreshTask,Urls:        []string{cdnUrl},}refreshTaskRequest.Body = &model.RefreshTaskRequest{RefreshTask: refreshTaskbody,}// Create the refresh taskresponse, err := hcClient.CreateRefreshTasks(refreshTaskRequest)if err != nil {fmt.Fprintf(os.Stderr, "Error creating CDN refresh task: %s\n", err)os.Exit(2)}fmt.Printf("CDN refresh task created successfully: %s\n", response)
}

在上述代码中,替换**YOUR_ACCESS_KEY****YOUR_SECRET_KEY**为你的华为云账号的密钥信息。
尝试运行脚本:

go run main.go https://xxx.xxx.com/

image.png
末尾以**/**单斜线结尾!
注:以上代码以刷新目录为例,且只刷新变更资源!具体参数或者其他需求可以参考:https://console.huaweicloud.com/apiexplorer/#/openapi/CDN/doc?version=v1&api=CreateRefreshTasks,文档中参数!

2. 查询file URL余量

在创建刷新任务后,我们可能还需要查询当前账户下的URL刷新余量,以确保后续操作不会受到次数限制的影响。

步骤2.1 查询CDN file URL余量

可以在上面的Go程序中继续添加以下查询余量的代码片段:
参照:https://console.huaweicloud.com/apiexplorer/#/openapi/CDN/debug?version=v1&api=ShowQuota
image.png
尝试调试,查看返回值数据结构,编写代码如下:

// 查询URL 目录余量
func queryCdnQuota(hcClient *cdn.CdnClient) {request := &model.ShowQuotaRequest{}response, err := hcClient.ShowQuota(request)if err != nil {fmt.Fprintf(os.Stderr, "Error querying CDN quota: %s\n", err)os.Exit(2)}// 请确保 response.Quotas 不是nil,否则可能会导致空指针异常if response.Quotas == nil {fmt.Fprintln(os.Stderr, "Error: received nil Quotas in response")os.Exit(2)}// 自定义类型名称的映射typeNameMap := map[string]string{"file_refresh": "缓存刷新剩余Url条数","dir_refresh":  "缓存刷新剩余目录数",}// Print out the customized quota informationfmt.Println("CDN quota information:")for _, quota := range *response.Quotas {// 检查quota.Type是否为我们关心的类型之一if customName, ok := typeNameMap[*quota.Type]; ok {remaining := *quota.QuotaLimit - *quota.Usedfmt.Printf("- %s: %d\n", customName, remaining)}}
}

在main函数中增加一下代码:

	queryCdnQuota(hcClient)

此片段會在创建CDN刷新任务之后调用ShowQuota接口,查询并打印出当前账户的URL以及目录刷新余量信息。typeNameMap部分是我想自定义一下输出打印的名称,增加可读性!
完成代码如下:

package mainimport ("fmt""github.com/huaweicloud/huaweicloud-sdk-go-v3/core/auth/global""github.com/huaweicloud/huaweicloud-sdk-go-v3/core/config"cdn "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/cdn/v1""github.com/huaweicloud/huaweicloud-sdk-go-v3/services/cdn/v1/model""github.com/huaweicloud/huaweicloud-sdk-go-v3/services/cdn/v1/region""os"
)func main() {if len(os.Args) < 2 {fmt.Println("Usage: go run main.go <your-cdn-url>")return}cdnUrl := os.Args[1]ak := "YOUR_ACCESS_KEY"sk := "YOUR_SECRET_KEY"auth := global.NewCredentialsBuilder().WithAk(ak).WithSk(sk).Build()hcClient := cdn.NewCdnClient(cdn.CdnClientBuilder().WithRegion(region.ValueOf("cn-north-1")).WithCredential(auth).WithHttpConfig(config.DefaultHttpConfig()).Build())// Create CDN refresh taskcreateRefreshTask(hcClient, cdnUrl)
}func createRefreshTask(hcClient *cdn.CdnClient, cdnUrl string) {refreshTaskRequest := &model.CreateRefreshTasksRequest{}typeRefreshTask := model.GetRefreshTaskRequestBodyTypeEnum().DIRECTORYmodeRefreshTask := model.GetRefreshTaskRequestBodyModeEnum().DETECT_MODIFY_REFRESHzhUrlEncodeRefreshTask := falserefreshTaskbody := &model.RefreshTaskRequestBody{Type:        &typeRefreshTask,Mode:        &modeRefreshTask,ZhUrlEncode: &zhUrlEncodeRefreshTask,Urls:        []string{cdnUrl},}refreshTaskRequest.Body = &model.RefreshTaskRequest{RefreshTask: refreshTaskbody,}// Create the refresh taskresponse, err := hcClient.CreateRefreshTasks(refreshTaskRequest)if err != nil {fmt.Fprintf(os.Stderr, "Error creating CDN refresh task: %s\n", err)os.Exit(2)}fmt.Printf("CDN refresh task created successfully: %s\n", response)
}

运行代码返回数据格式如下:

go run main.go https://xxx.xxx.com/

image.png

3. 在Jenkins节点上运行程序

一旦我们的Go程序可以正确执行CDN刷新和查询余量的操作,接下来的步骤就是在Jenkins中配置该程序的运行环境。

步骤3.1 创建一个新的Jenkins任务

在Jenkins中创建一个Freestyle项目或者Pipeline项目,此部分取决于你的工作流。为了简便说明,我们这里以Freestyle项目为例。

步骤3.2 配置构建步骤

首先添加一个参数化构建过程,传入参数:
image.png
限制一下可运行的节点:
image.png

在你的Jenkins任务配置页中,添加一个构建步骤,选择“Execute shell”(对于Linux系统)或“Execute Windows batch command”(对于Windows系统),并填入以下内容:
image.png

# 假设你的Go程序名为`main`,且已经编译到Jenkins的工作空间中
cd /home/flush-hw&&./main $dir

确保构建环境中已经安装了Go运行时,并且环境变量已经配置,这样main程序才可以在Jenkins节点上运行没有问题。
注:main要有可执行权限,复制过来要记得chmod +x main .

4. 使用Jenkins Credentials管理AK/SK密钥

为了避免在代码中硬编码敏感信息,如Access Key和Secret Key,推荐使用Jenkins的Credentials插件来管理这些密钥。

步骤4.1 添加Credentials

在Jenkins中进入Credentials管理页面,添加一个新的Credentials,选择“Secret text”,其中**Secret**字段填入AK:SK的格式。记住这里的**ID,**接下来绑定的时候会用到
image.png
image.png

步骤4.2 修改Go程序以获取Credentials

之后,你需要修改Go程序,让其从环境变量中读取AK和SK。例如:

package mainimport ("fmt""github.com/huaweicloud/huaweicloud-sdk-go-v3/core/auth/global""github.com/huaweicloud/huaweicloud-sdk-go-v3/core/config"cdn "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/cdn/v1""github.com/huaweicloud/huaweicloud-sdk-go-v3/services/cdn/v1/model""github.com/huaweicloud/huaweicloud-sdk-go-v3/services/cdn/v1/region""os""strings"
)func main() {if len(os.Args) < 2 {fmt.Println("Usage: go run main.go <your-cdn-url>")return}cdnUrl := os.Args[1]// 尝试从环境变量中获取ak和skcreds := os.Getenv("huaweiyun-hn-cdn")if creds == "" {fmt.Fprintln(os.Stderr, "Error: Credentials environment variable is not set.")os.Exit(1)}parts := strings.SplitN(creds, ":", 2)if len(parts) != 2 {fmt.Fprintln(os.Stderr, "Error: Invalid credential format. Expected 'AK:SK'.")os.Exit(1)}ak, sk := parts[0], parts[1]auth := global.NewCredentialsBuilder().WithAk(ak).WithSk(sk).Build()hcClient := cdn.NewCdnClient(cdn.CdnClientBuilder().WithRegion(region.ValueOf("cn-north-1")).WithCredential(auth).WithHttpConfig(config.DefaultHttpConfig()).Build())// Create CDN refresh taskcreateRefreshTask(hcClient, cdnUrl)// Query remaining refresh and preload quotaqueryCdnQuota(hcClient)
}func createRefreshTask(hcClient *cdn.CdnClient, cdnUrl string) {refreshTaskRequest := &model.CreateRefreshTasksRequest{}typeRefreshTask := model.GetRefreshTaskRequestBodyTypeEnum().DIRECTORYmodeRefreshTask := model.GetRefreshTaskRequestBodyModeEnum().DETECT_MODIFY_REFRESHzhUrlEncodeRefreshTask := falserefreshTaskbody := &model.RefreshTaskRequestBody{Type:        &typeRefreshTask,Mode:        &modeRefreshTask,ZhUrlEncode: &zhUrlEncodeRefreshTask,Urls:        []string{cdnUrl},}refreshTaskRequest.Body = &model.RefreshTaskRequest{RefreshTask: refreshTaskbody,}// Create the refresh taskresponse, err := hcClient.CreateRefreshTasks(refreshTaskRequest)if err != nil {fmt.Fprintf(os.Stderr, "Error creating CDN refresh task: %s\n", err)os.Exit(2)}fmt.Printf("CDN refresh task created successfully: %s\n", response)
}
func queryCdnQuota(hcClient *cdn.CdnClient) {request := &model.ShowQuotaRequest{}response, err := hcClient.ShowQuota(request)if err != nil {fmt.Fprintf(os.Stderr, "Error querying CDN quota: %s\n", err)os.Exit(2)}// 请确保 response.Quotas 不是nil,否则可能会导致空指针异常if response.Quotas == nil {fmt.Fprintln(os.Stderr, "Error: received nil Quotas in response")os.Exit(2)}// 自定义类型名称的映射typeNameMap := map[string]string{"file_refresh": "缓存刷新剩余Url条数","dir_refresh":  "缓存刷新剩余目录数",}// Print out the customized quota informationfmt.Println("CDN quota information:")for _, quota := range *response.Quotas {// 检查quota.Type是否为我们关心的类型之一if customName, ok := typeNameMap[*quota.Type]; ok {remaining := *quota.QuotaLimit - *quota.Usedfmt.Printf("- %s: %d\n", customName, remaining)}}
}

步骤4.3 配置Jenkins任务以传递Credentials

在Jenkins任务的构建环境配置中,使用Credentials Binding插件将新添加的Credentials绑定到相应的环境变量中。在“Build Environment”选择“Use secret text(s) or file(s)”,命名为xxx并绑定AK/SK到指定凭据:
image.png

步骤4.4 测试运行

最后,在Jenkins中运行配置好的任务,检查输出以确保CDN刷新和余量查询均运行顺利。
image.png
image.png

5. 其他的需求

1. 经常输入域名的时候忘记/单斜线,是否可以自动补全?

2. 设置改阈值?剩余量到20可以自动报警?邮件or短信

3. 优雅的pipeline?

结语

通过上述步骤,我们成功地实现了通过Go语言操作华为云CDN刷新服务的功能,并将其集成到Jenkins任务中,同时安全地管理了敏感的AK/SK凭证。这样的自动化工具对于管理大量的CDN资源来说非常有用,可以大大提高工作效率。
注:以上大纲chatgpt生成代码结构也是,代码基本也是chatgpt生成,貌似中间就有几个&指针数据格式有问题修改了一下

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

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

相关文章

Bypass open_basedir的方法

文章目录 open_basedir概念绕过方法命令执行绕过symlink 绕过 &#xff08;软连接&#xff09;利用chdir()与ini_set()组合绕过 例题 [suctf 2019]easyweb open_basedir概念 open_basedir是php.ini的设置 在open_basedir设置路径的话 那么网站访问的时候 无法访问除了设置以外的…

KaiwuDB 亮相中国 5G + 工业互联网大会,助力新型工业化

11月19-21日&#xff0c;由各相关政府部门共同主办的“2023 中国 5G工业互联网大会”在湖北武汉盛大举行。作为我国“5G工业互联网”领域的国家级顶会&#xff0c;本届大会以“数实融合&#xff0c;大力推进新型工业化”为主题&#xff0c;聚焦新型基础设施、产业转型升级、技术…

笔记62:注意力汇聚 --- Nadaraya_Watson 核回归

本地笔记地址&#xff1a;D:\work_file\&#xff08;4&#xff09;DeepLearning_Learning\03_个人笔记\3.循环神经网络\第10章&#xff1a;动手学深度学习~注意力机制 a a a a a a a a a a a a a a a a

【一维数组】交换数组

题目 将数组A中的内容和数组B中的内容进行交换。&#xff08;数组一样大&#xff09; 解题方式通过函数封装可以实现任意类型的数组元素交换 思路来源&#xff1a;qsort函数的模拟实现 void Change_arr2(void* ch1, void* ch2, size_t num, size_t sz) {for (int i 0; i < …

Docker配置Halo搭建个人博客-快速入门

Docker配置Halo搭建个人博客-快速入门 1 官方文档2 安装Halo2.1 创建Halo主目录2.2 远程下载配置文件2.3 编辑配置文件2.4 拉取最新镜像2.6 查看容器2.7 开放服务器的防火墙 3 运行3.1 运行项目3.2 停止项目 4 常见问题4.1 没有权限4.2 ommand netstart not found, did you mea…

8.0 泛型

通过之前的学习&#xff0c;读者可以了解到&#xff0c;把一个对象存入集合后&#xff0c;再次取出该对象时&#xff0c;该对象的编译类型就变成了Object类型&#xff08;尽管其在运行时类型没有改变&#xff09;。集合设计成这样&#xff0c;提高了它的通用性&#xff0c;但是…

Git的原理与使用(一):Git的基本操作(包含:版本回退)

Git原理与使用一 一.Git的初识与安装1.什么是Git2.如何安装Git1.git命令与git help(Git下的"man手册")2.centos下安装Git3.ubantu下安装Git 二.Git的前置操作与前置知识1.创建Git本地仓库2.配置Git3.理解Git的分区1.工作区2.暂存区3.版本库4.分区关系总结 三.添加文件…

springboot启动Table ‘xxx‘ already exists

jpa.generate-ddl和jpa.hibernate.ddl-auto都可以控制是否执行datasource.schema脚本&#xff0c;来初始化数据库结构&#xff0c;只要有一个为可执行状态就会执行&#xff0c;比如jpa.generate-ddl:true或jpa.generate-ddl:update&#xff0c;并没有相互制约上下级的关系。 要…

Android修行手册 - 使用ViewPager2实现画廊效果

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

小航助学题库蓝桥杯题库stem选拔赛(22年3月)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSD…

解决ansible批量加入新IP涉及known_hosts报错的问题

我们把一批新的IP加入到ansible的hosts文件&#xff0c;比如/etc/ansible/hosts&#xff0c;往往会有这样的提示&#xff0c; 因为本机的~/.ssh/known_hosts文件中并有fingerprint key串&#xff0c;使用ssh连接目标主机时&#xff0c;一般会提示是否将key字符串加入到~/.ssh/…

如何使用内网穿透将Tomcat网页发布到公共互联网上【内网穿透】

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 前言 Tomcat作为一个轻量级的服务器&#xff0c;不仅名字很有趣&#xff0…

中国北斗:守护萨雷兹湖一方安澜

中国北斗&#xff1a;守护萨雷兹湖一方安澜 在第三届“一带一路”国际合作高峰论坛数字经济高级别论坛上&#xff0c;由中国经济信息社、国家发展改革委高技术司、国家数据局联合编制的《数字“慧”就发展之路》中英文图文集正式发布&#xff0c;展现了中国与共建“一带一路”国…

PHP中关于func_get_args()方法

首先呢这个函数出现的是比较早的,大致应该是PHP4出现的, func_get_args — 返回一个包含函数参数列表的数组 说明 func_get_args(): array 获取函数参数列表的数组。 该函数可以配合 func_get_arg() 和 func_num_args() 一起使用&#xff0c;从而使得用户自定义函数可以接…

如何将mobi、awz3、epub格式转化为pdf

偶然之间有个需求就是网上下载了一些书籍的格式没法打开看&#xff0c;或者是想把kindle的书籍转换成pdf 那么经过一番折腾找到了两个可以用的工具站分享给大家&#xff0c;有需要的可是尝试下&#xff0c;小编这边测试了可以用&#xff0c;就是下载的时候慢的一匹。。。 第一…

PHP 双门双向门禁控制板实时监控源码

本示例使用设备&#xff1a; 实时网络双门双向门禁控制板可二次编程控制网络继电器远程开关-淘宝网 (taobao.com) <?PHPheader("content-type:text/html;charsetGBK");$ThisIpget_local_ip(); //获取电脑IP地址 $server udp://.$ThisIp.:39192; $sock…

MATLAB中fft与fftshift的区别

两者的区别在于&#xff1a; fft函数将时域信号转换为频域信号&#xff0c;即将信号从时间域转换为频率域。fftshift函数用于对fft计算结果进行移位操作&#xff0c;将频域信号的零频率分量移到频谱的中心&#xff0c;方便观察和处理。fftshift函数将fft计 算结果沿着中心点进…

MySQL--InnoDB引擎

InnoDB引擎 逻辑存储引擎 表空间→段→区→页→行 Tablespace 表空间&#xff08;ibd文件&#xff09;&#xff1a;一个mysql实例可以对应多个表空间&#xff0c;用于存储记录、索引等数据Segment 段&#xff1a;段分为数据段、索引段、回滚段&#xff0c;InnoDB是索引组织表…

【Unity程序技巧】加入缓存池存储地图资源,节省资源,避免多次CG

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

Python语言学习笔记之二(基础语法)

本课程对于有其它语言基础的开发人员可以参考和学习&#xff0c;同时也是记录下来&#xff0c;为个人学习使用&#xff0c;文档中有此不当之处&#xff0c;请谅解。 Python几种字符串的表示&#xff1a; 在Python中&#xff0c;字符串是一种基本的数据类型&#xff0c;可以使…