CI/CD(七)镜像全球分发

简介: 云原生发布,镜像全球分发

背景

解决跨区网络稳定性较差,尤其往海外推送

代码托管:gitlab
CI:tekton
pipline/task: 阿里云 serverless容器(spot实例按秒计费)
任务管理:redis
镜像分发工具:crane

效果

screenshot-20250222-111950.png

核心实现

func Sync(src, dest string) error {
   
    // 创建使用 docker 配置的 keychain
    kc, err := NewDockerConfigKeychain()
    if err != nil {
   
        return err
    }

    // 使用 docker 配置进行认证
    err = crane.Copy(src, dest,
        crane.WithNoClobber(false),
        crane.WithAuthFromKeychain(kc))
    return err
}
type TaskProcessor struct {
   
    store      *store.RedisStore
    workerPool chan struct{
   } // 用于限制并发数的信号量
    wg         sync.WaitGroup
}

// NewTaskProcessor 创建一个新的任务处理器
// maxWorkers 指定最大并发任务数
func NewTaskProcessor(store *store.RedisStore, maxWorkers int) *TaskProcessor {
   
    return &TaskProcessor{
   
        store:      store,
        workerPool: make(chan struct{
   }, maxWorkers),
    }
}

// ProcessTask 处理单个任务
func (p *TaskProcessor) ProcessTask(task *types.ImageTask) {
   
    p.wg.Add(1)
    go func() {
   
        defer p.wg.Done()

        // 获取worker槽位
        p.workerPool <- struct{
   }{
   }
        defer func() {
   
            // 释放worker槽位
            <-p.workerPool
        }()

        ctx := context.Background()

        // 更新状态为运行中
        task.Status = types.TaskStatusRunning
        if err := p.store.SaveTask(ctx, task); err != nil {
   
            log.Printf("Failed to update task status: %v", err)
            return
        }

        // 执行同步
        err := imageDist.Sync(task.Src, task.Dest)

        // 更新最终状态
        if err != nil {
   
            task.Status = types.TaskStatusFailed
            task.Error = err.Error()
        } else {
   
            task.Status = types.TaskStatusComplete
        }

        if err := p.store.SaveTask(ctx, task); err != nil {
   
            log.Printf("Failed to update final task status: %v", err)
        }
    }()
}

// Wait 等待所有任务完成
func (p *TaskProcessor) Wait() {
   
    p.wg.Wait()
}

// Shutdown 优雅关闭任务处理器
func (p *TaskProcessor) Shutdown(ctx context.Context) {
   
    done := make(chan struct{
   })
    go func() {
   
        p.wg.Wait()
        close(done)
    }()

    select {
   
    case <-ctx.Done():
        log.Println("Shutdown timeout, some tasks may still be running")
    case <-done:
        log.Println("All tasks completed successfully")
    }
}
目录
相关文章
|
Kubernetes Cloud Native 安全
ArgoCD + KubeVela:以开发者为中心的 GitOps
在这篇博文中,我们将分享基于阿里云的用例,使用 Argo CD 和 KubeVela 构建以开发者为中心的持续应用交付流水线的经验。
ArgoCD + KubeVela:以开发者为中心的 GitOps
|
6月前
|
运维 Kubernetes 监控
CI/CD(六)模型训练发布-追数场景
训练的场景比较特殊,在没有自动化之前是人工部署、依赖运维调整机器配置、凭记忆不定时去查看日志和监控确认训练进度,训练完成后再联系运维释放机器,现通过全自助选择训练规格、自动化部署、每日自动提醒、一键结束训练并回收资源
143 19
|
6月前
|
Kubernetes Java 开发工具
CI/CD(五)Flink 应用部署
Flink 应用需要解决的是任务的灵活增加(通常以 maven module 的方式存在同一个git仓库中),不能依赖手工注册应用或.polaris-ci.yml自动注册
172 2
|
8月前
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
针对本地存储和 PVC 这两种容器存储使用方式,我们对 ACK 的容器存储监控功能进行了全新升级。此次更新完善了对集群中不同存储类型的监控能力,不仅对之前已有的监控大盘进行了优化,还针对不同的云存储类型,上线了全新的监控大盘,确保用户能够更好地理解和管理容器业务应用的存储资源。
542 265
|
8月前
|
编解码 运维 Kubernetes
政采云业务网关实践:使用 Higress 统一替代 APISIX/Kong/Istio Ingress
政采云基础架构团队技术专家朱海峰介绍了业务网关项目的背景和解决方案。
431 87
|
8月前
|
消息中间件 人工智能 监控
从传统家电到智能生活,海尔智家的服务治理实践
海尔与阿里云的合作不仅推动了自身的技术革新和服务升级,更为整个智能家居行业树立了典范。在未来的发展道路上,双方将继续携手共进,共同迎接 AI 时代的到来,为全球用户创造更加美好的智慧生活。
682 100
|
7月前
|
人工智能 Cloud Native Serverless
阿里云爸爸发福利!DeepSeek-R1满血版深度体验,4种部署攻略+隐藏羊毛大公开💎
本文介绍了四种部署DeepSeek-R1模型的方式:基于百炼调用满血版API、基于PAI部署、基于函数计算部署和基于GPU云服务器部署。每种方式各有优劣,适合不同需求的用户。其中,基于百炼调用满血版API无需部署,提供满血版模型和100万免费Token,适合快速体验;基于PAI部署适合需要微调模型的用户;基于函数计算部署提供WEB交互界面;基于GPU云服务器部署则适合技术能力强、有硬件资源的用户。方案还提供了免费试用入口和实践体验总结,帮助开发者更好地理解和使用DeepSeek-R1模型。
391 62
|
7月前
|
机器学习/深度学习 数据可视化 算法
Python与机器学习:使用Scikit-learn进行数据建模
本文介绍如何使用Python和Scikit-learn进行机器学习数据建模。首先,通过鸢尾花数据集演示数据准备、可视化和预处理步骤。接着,构建并评估K近邻(KNN)模型,展示超参数调优方法。最后,比较KNN、随机森林和支持向量机(SVM)等模型的性能,帮助读者掌握基础的机器学习建模技巧,并展望未来结合深度学习框架的发展方向。
Python与机器学习:使用Scikit-learn进行数据建模
|
7月前
|
芯片 内存技术
STM32 Customer BootLoader 刷新项目 (二) 方案介绍
本项目设计了一款基于STM32的二级BootLoader,旨在为客户自定义启动过程提供软件更新和操作后门。BootLoader架构分为三层:ST自带Boot(SB)、客户定制化Boot(CB)和应用层(APP)。CB通过USART与MCU通信,支持多种指令如版本查询、擦除扇区、写入数据等,实现灵活的软件管理和更新功能。Flash空间分配为Sector 0-1用于CB,Sector 2-11用于APP。整个方案详细介绍了内存布局、跳转逻辑及支持的指令集,确保系统稳定运行并支持未来的扩展需求。
 STM32 Customer BootLoader 刷新项目 (二) 方案介绍
|
7月前
|
供应链 数据库连接 PHP
反向海淘商业模式案例:Pandabuy VS Hoobuy VS CSSBUY 无货源淘宝微店代购系统搭建攻略
反向海淘是全球化下新兴的电商模式,满足海外消费者对中国高性价比商品的需求。Pandabuy、Hoobuy 和 CSSBUY 等平台整合供应链和物流资源,实现中国商品高效流通。本文分析这些平台商业模式,提供无货源代购系统搭建攻略及PHP代码示例,涵盖数据库连接、订单处理和商品查询等功能。随着市场需求增长、供应链优势、技术支持和政策利好,反向海淘前景广阔。

热门文章

最新文章