华为云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.hqwc.cn/news/222732.html

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

相关文章

DGL中NN模块的构造函数

上图引用自&#xff1a;dgl用户文档第三章(nn模块编写&#xff09; """构造函数完成以下几个任务&#xff1a; 1、设置选项。 2、注册可学习的参数或者子模块。 3、初始化参数。""" import torch.nn as nn from dgl.utils import expand_as_pai…

优思学院|5S不只是清洁,但却离不开清洁!

很多说5S不止是清洁和搞卫生那么简单&#xff0c;相信有正规地学习过5S的人都应该深切了解。 不过&#xff0c;5S之中的确包括了清理、清洁的步骤&#xff0c;5S&#xff0c;也被称为“五常法则”或“五常法”&#xff0c;它包含了&#xff1a; 整理&#xff08;SEIRI&#x…

数据结构(超详细讲解!!)第二十五节 线索二叉树

1.线索二叉树的定义和结构 问题的提出&#xff1a; 通过遍历二叉树可得到结点的一个线性序列&#xff0c;在线性序列中&#xff0c;很容易求得某个结点的直接前驱和后继。但是在二叉树上只能找到结点的左孩子、右孩子&#xff0c;结点的前驱和后继只有在遍历过程中才能得到…

Python基础:字符串(String)详解

1. 字符串定义 在Python中&#xff0c;字符串是一种数据类型&#xff0c;用于表示文本数据。字符串是由字符组成的序列&#xff0c;可以包含字母、数字、符号和空格等字符。在Python中&#xff0c;你可以使用单引号&#xff08;&#xff09;或双引号&#xff08;"&#xf…

四、Lua循环

文章目录 一、while(循环条件)二、for&#xff08;一&#xff09;数值for&#xff08;二&#xff09;泛型for&#xff08;三&#xff09;repeat util 既然同为编程语言&#xff0c;那么控制逻辑里的循环就不能缺少&#xff0c;它可以帮助我们实现有规律的重复操作&#xff0c;而…

可移动框 弹窗 可拖拽的组件

电脑端: <template><divv-if"show"ref"infoBox"mousedown.stop"mouseDownHandler"class"info-box":style"styleObject"><slot></slot></div> </template> <script> export defa…

电脑如何定时关机?

电脑如何定时关机&#xff1f;我承认自己是个相当粗心的人&#xff0c;尤其是在急于离开时经常会忘记关闭电脑&#xff0c;结果就是电量耗尽&#xff0c;导致电脑自动关机。而且&#xff0c;在我使用电脑的时候&#xff0c;经常需要进行软件下载、更新等任务。如果我一直坐等任…

387. 字符串中的第一个唯一字符

这篇文章会收录到 :算法通关村第十二关-白银挑战字符串经典题目-CSDN博客 387. 字符串中的第一个唯一字符 描述 : 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;则返回 -1 。 题目 : 387. 字符串中的第一…

NFTScan | 11.20~11.26 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2023.11.20~ 2023.11.26 NFT Hot News 01/ OKX Ordinals 市场 API 完成升级 11 月 21 日&#xff0c;OKX Ordinals 市场 API 现已完成升级&#xff0c;新增支持按币种单价查询、排序&…

代码签名证书是如何保护软件?

随着互联网的普及和技术的发展&#xff0c;软件开发已经成为了一个非常重要的行业。然而&#xff0c;软件安全问题也日益凸显&#xff0c;恶意软件、病毒、木马等威胁着用户的数据安全和隐私。为了确保软件的安全和可靠性&#xff0c;开发者需要采取一系列措施来保护他们的产品…

西北大学计算机844考研-23年计网计算题详细解析

西北大学计算机844考研-23年计网计算题详细解析 1.计算无传输差错状态下停止—等待ARQ协议效率,电磁波传播速率为2*10^8m/s&#xff0c;链路长为2000m&#xff0c;帧长度为1000比特&#xff0c;计算传输速率10kbps及10Mbps时的协议效率&#xff08;即信道利用率&#xff09; …

什么是美颜sdk?视频直播美颜sdk技术深度剖析

美颜sdk可以通过实时处理图像&#xff0c;提升主播或用户在视频直播中的外观。通过美颜sdk接口调用可以轻松实现美颜效果。美颜sdk的核心目标是在保持图像真实性的同时&#xff0c;为用户创造出最理想的美化效果。 一、美颜sdk的技术实现 1.面部识别技术&#xff1a;美颜sdk…