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
|
8月前
|
运维 Kubernetes 监控
CI/CD(六)模型训练发布-追数场景
训练的场景比较特殊,在没有自动化之前是人工部署、依赖运维调整机器配置、凭记忆不定时去查看日志和监控确认训练进度,训练完成后再联系运维释放机器,现通过全自助选择训练规格、自动化部署、每日自动提醒、一键结束训练并回收资源
183 19
|
8月前
|
Kubernetes Java 开发工具
CI/CD(五)Flink 应用部署
Flink 应用需要解决的是任务的灵活增加(通常以 maven module 的方式存在同一个git仓库中),不能依赖手工注册应用或.polaris-ci.yml自动注册
226 1
|
容器 Docker 数据安全/隐私保护
阿里云开源 image-syncer 工具,容器镜像迁移同步的终极利器
为什么要做这个工具? 由于阿里云上的容器服务 ACK 在使用成本、运维成本、方便性、长期稳定性上大大超过公司自建自维护 Kubernets 集群,有不少公司纷纷想把之前自己维护 Kubernetes 负载迁移到阿里云 ACK 服务上。
|
10月前
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
针对本地存储和 PVC 这两种容器存储使用方式,我们对 ACK 的容器存储监控功能进行了全新升级。此次更新完善了对集群中不同存储类型的监控能力,不仅对之前已有的监控大盘进行了优化,还针对不同的云存储类型,上线了全新的监控大盘,确保用户能够更好地理解和管理容器业务应用的存储资源。
626 276
|
9月前
|
Linux Shell
Linux 将所有文件和目录名重命名为小写
Linux 将所有文件和目录名重命名为小写
|
存储 Java Apache
开发指南061-nexus权限管理
平台后台服务的核心是组件,管理组件的软件有
|
9月前
|
Kubernetes 持续交付 开发工具
阿里云协同万兴科技落地ACK One GitOps方案,全球多机房应用自动化发布,效率提升50%
阿里云协同万兴科技落地ACK One GitOps方案,全球多机房应用自动化发布,效率提升50%
313 2
|
10月前
|
运维 Cloud Native 开发工具
智能运维:云原生大规模集群GitOps实践
智能运维:云原生大规模集群GitOps实践,由阿里云运维专家钟炯恩分享。内容涵盖云原生运维挑战、管理实践、GitOps实践及智能运维体系。通过OAM模型和GitOps优化方案,解决大规模集群的发布效率与稳定性问题,推动智能运维工程演进。适用于云原生环境下的高效运维管理。
343 8