云原生时代:从 Jenkins 到 Argo Workflows,构建高效 CI Pipeline

作者:蔡靖

Argo Workflows

Argo Workflows [ 1] 是用于在 Kubernetes 上编排 Job 的开源的云原生工作流引擎。可以轻松自动化和管理 Kubernetes 上的复杂工作流程。适用于各种场景,包括定时任务、机器学习、ETL 和数据分析、模型训练、数据流 pipline、CI/CD 等。

Kubernetes Jobs 只提供基础的任务执行,但是无法定义步骤依赖关系和顺序、缺乏工作流模版、没有可视化界面,也不支持工作流级别的错误处理等,对于批处理、数据处理、科学计算、持续集成等业务场景,Kubernetes Job 无法胜任。

Argo Workflows 作为 CNCF 的毕业项目,已被使用在多种场景,持续集成(CI)是其一个重要应用领域。

CI 与 Jenkins

持续集成和持续部署(CI/CD)是软件开发生命周期中的重要部分,它允许团队以敏捷流程开发应用并提高所构建应用程序的质量。持续集成(CI)是面向开发者的自动化流程,经测试、构建等步骤,有助于更频繁、可靠地将代码变更提交到主分支。

Jenkins 作为 CI/CD 领域最常见的解决方案,其具有开源免费、插件丰富、社区成熟诸多优点,但它仍然存在一些问题,尤其是云原生大背景的当下:

  • 非 kubernetes 原生;
  • 随着 pipeline 和插件的增加,Jenkins 会面临性能瓶颈;
  • 自动扩展能力不足,并发不足,运行时间长,空闲计算浪费成本;
  • 维护成本方面,虽然 Jenkins 的插件生态系统丰富,但这也可能导致插件版本不兼容、更新不及时或安全漏洞等问题,管理插件更新和权限是一个持续的挑战;
  • 项目隔离/权限分配方案的缺陷等。

Argo Workflows 与 Jenkins 的对比

相比于 Jenkins,Argo Workflows 有诸多优势。Argo Workflows 构建在 Kubernetes 之上,使其具有 Kubernetes 经过时间考验的优势,其 Autoscaling 和并发等能力,使得 Argo Workflows 可以处理大规模的 pipelins,具有更快的运行速度,和更低的费用/使用成本,让开发者更加聚焦业务功能和为客户提供、传播价值;并且与 Argo 生态的 Argo CD、Argo Rollout、Argo Event 的无缝集成,为 CI 等场景提供更强大的能力。您可以基于 Argo Workflows 来构建更加云原生、大规模、高效率、低成本的 CI Pipeline。

对比如下:

基于 ACK One Serverless Argo 工作流的 CI Pipeline

ACK One Serverless Argo 工作流

ACK One Serverless Argo 工作流 [ 2] 作为一款完全遵循社区规范的全托管式 Argo Workflows 服务,致力于应对大规模计算密集型作业,通过集成阿里云 ECI 实现自动扩展和极致弹性、按需扩容以最小化成本,通过使用 spot ECI(抢占式 ECI 实例 [ 3] )可以降低 80% 成本。

CI Pipeline 概述

基于 ACK One Serverless Argo 工作流集群构建 CI Pipeline,主要使用 BuildKit [ 4] 实现容器镜像的构建和推送,并使用 BuildKit Cache [ 5] 加速镜像的构建,使用 NAS 来存储 Go mod cache 加速 go test 和 go build,最终大幅加速 CI Pipeline 流程。

我们将实现的 CI Pipeline 的 ClusterWorkflowTemplate 预置在工作流集群中(名为 ci-go-v1),其中主要包含 3 个步骤:

  1. Git Clone & Checkout:Clone Git 仓库,Checkout 到目标分支;并获取 commit id。

  2. Run Go Test:通过参数控制是否运行,使用 NAS 存储 Go mod cache 进行加速

  3. Build & Push Image:

    a. 使用 BuildKit 构建和推送容器镜像,并使用 BuildKit Cache 中 registry 类型 cache 来加速镜像构建;

    b. 镜像 tag 默认使用 {container_tag}-{commit_id} 格式,可在提交工作流时通过参数控制是否追加 commit id;

    c. 推送镜像的同时,也会推送覆盖其 latest 镜像。

您可执行以下步骤完成 CI Pipeline 的运行,详细步骤请参见最佳实践 [ 6]

  1. 在工作流集群中准备好 ACR EE 的凭据和 NAS 存储卷
  2. 基于预置模板启动工作流(workflow)运行 CI Pipeline

预置 CI Pipeline 模板

工作流集群中默认已经预置了名为 ci-go-v1 的工作流模板(ClusterWorkflowTemplate),yaml 如下所示,详细参数说明请参见最佳实践 [ 6]

apiVersion: argoproj.io/v1alpha1
kind: ClusterWorkflowTemplate
metadata:name: ci-go-v1
spec:entrypoint: mainvolumes:- name: run-testemptyDir: {}- name: workdirpersistentVolumeClaim:claimName: pvc-nas- name: docker-configsecret:secretName: docker-configarguments:parameters:- name: repo_urlvalue: ""- name: repo_namevalue: ""- name: target_branchvalue: "main"- name: container_imagevalue: ""- name: container_tagvalue: "v1.0.0"- name: dockerfilevalue: "./Dockerfile"- name: enable_suffix_commitidvalue: "true"- name: enable_testvalue: "true"templates:- name: maindag:tasks:- name: git-checkout-prinline:container:image: alpine:latestcommand:- sh- -c- |set -euapk --update add gitcd /workdirecho "Start to Clone "{{workflow.parameters.repo_url}}git -C "{{workflow.parameters.repo_name}}" pull || git clone {{workflow.parameters.repo_url}} cd {{workflow.parameters.repo_name}}echo "Start to Checkout target branch" {{workflow.parameters.target_branch}}git checkout {{workflow.parameters.target_branch}}echo "Get commit id" git rev-parse --short origin/{{workflow.parameters.target_branch}} > /workdir/{{workflow.parameters.repo_name}}-commitid.txtcommitId=$(cat /workdir/{{workflow.parameters.repo_name}}-commitid.txt)echo "Commit id is got: "$commitIdecho "Git Clone and Checkout Complete."volumeMounts:- name: "workdir"mountPath: /workdirresources:requests:memory: 1Gicpu: 1activeDeadlineSeconds: 1200- name: run-testwhen: "{{workflow.parameters.enable_test}} == true"inline: container:image: golang:1.22-alpinecommand:- sh- -c- |set -euif [ ! -d "/workdir/pkg/mod" ]; thenmkdir -p /workdir/pkg/modecho "GOMODCACHE Directory /pkg/mod is created"fiexport GOMODCACHE=/workdir/pkg/modcp -R /workdir/{{workflow.parameters.repo_name}} /test/{{workflow.parameters.repo_name}} echo "Start Go Test..."cd /test/{{workflow.parameters.repo_name}}go test -v ./...echo "Go Test Complete."volumeMounts:- name: "workdir"mountPath: /workdir- name: run-testmountPath: /testresources:requests:memory: 4Gicpu: 2activeDeadlineSeconds: 1200depends: git-checkout-pr    - name: build-push-imageinline: container:image: moby/buildkit:v0.13.0-rootlesscommand:- sh- -c- |         set -eutag={{workflow.parameters.container_tag}}if [ {{workflow.parameters.enable_suffix_commitid}} == "true" ]thencommitId=$(cat /workdir/{{workflow.parameters.repo_name}}-commitid.txt)tag={{workflow.parameters.container_tag}}-$commitIdfiecho "Image Tag is: "$tagecho "Start to Build And Push Container Image"cd /workdir/{{workflow.parameters.repo_name}}buildctl-daemonless.sh build \--frontend \dockerfile.v0 \--local \context=. \--local \dockerfile=. \--opt filename={{workflow.parameters.dockerfile}} \build-arg:GOPROXY=http://goproxy.cn,direct \--output \type=image,\"name={{workflow.parameters.container_image}}:${tag},{{workflow.parameters.container_image}}:latest\",push=true,registry.insecure=true \--export-cache mode=max,type=registry,ref={{workflow.parameters.container_image}}:buildcache \--import-cache type=registry,ref={{workflow.parameters.container_image}}:buildcacheecho "Build And Push Container Image {{workflow.parameters.container_image}}:${tag} and {{workflow.parameters.container_image}}:latest Complete."env:- name: BUILDKITD_FLAGSvalue: --oci-worker-no-process-sandbox- name: DOCKER_CONFIGvalue: /.dockervolumeMounts:- name: workdirmountPath: /workdir- name: docker-configmountPath: /.dockersecurityContext:seccompProfile:type: UnconfinedrunAsUser: 1000runAsGroup: 1000resources:requests:memory: 4Gicpu: 2activeDeadlineSeconds: 1200depends: run-test

在控制台运行 CI Pipeline

  1. 登录 ACK One 工作流集群控制台 [ 7]
  2. 基础信息,开启工作流控制台(Argo) ,并访问进入页面
  3. 左侧菜单栏 Cluster Workflow Templates,单击 ci-go-v1 预置模板进入详情页
  4. 单击+ SUBMIT,在右侧填入您的参数,单击下方+ SUBMIT

参数说明:

执行完以后,可在 Argo UI 的 workflow 详情页查看运行情况,如下所示:

总结

ACK One Serverless Argo 工作流作为全托管的 Argo 工作流服务,可以帮助您实现更大规模、具有更快的运行速度、及更低成本的 CI Pipeline,与 ACK One GitOps [ 8] (Argo CD)、Argo Event 等事件驱动架构可以构建完整的自动化 CI/CD Pipeline。

欢迎加入 ACK One 客户交流钉钉与我们一同交流。(钉钉群号:35688562

相关链接:

[1] Argo Workflows

https://argoproj.github.io/argo-workflows/

[2] ACK One Serverless Argo 工作流**

https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/overview-12

[3] 抢占式 ECI 实例

https://help.aliyun.com/zh/eci/use-cases/run-jobs-on-a-preemptible-instance?spm=a2c4g.11186623.0.i7

[4] BuildKit

https://github.com/moby/buildkit

[5] BuildKit Cache

https://github.com/moby/buildkit?tab=readme-ov-file#cache

[6] 最佳实践

https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/use-cases/building-a-ci-pipeline-of-golang-project-based-on-workflow-cluster

[7] ACK One 工作流集群控制台

https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Fcs.console.aliyun.com%2Fone%3Fspm%3Da2c4g.11186623.0.0.555018e1SiD2lC#/argowf/cluster/detail

[8] ACK One GitOps

https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/gitops-overview

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

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

相关文章

智慧城市的规划与实施:科技引领城市运行效率新飞跃

随着信息技术的飞速发展,智慧城市的构想正逐步成为现实。作为地理信息与遥感领域的研究者,我深知在这一转型过程中,技术的创新与应用是提升城市运行效率的关键。本文旨在探讨如何利用地理信息系统(GIS)、遥感技术、大数据、物联网(IoT)等前沿科技,推动智慧城市的规划与…

WebLogic启动报Could not get the server file lock

报错信息如下:解决: 方法一: 引用:https://blog.51cto.com/hifon/2796939 方法二: 1. 出现问题可能是上次没有正确关闭Weblogic,可到如下目录,执行stopWebLogic.cmd(Windows),或stopWebLogic.sh(Linux) C:\Weblogic14.1.1.0\user_projects\domains\staubli\bin

(数据科学学习手札161)高性能数据分析利器DuckDB在Python中的使用

本文完整代码及附件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes1 简介大家好我是费老师,就在几天前,经过六年多的持续开发迭代,著名的开源高性能分析型数据库DuckDB发布了其1.0.0正式版本。DuckDB具有极强的单机数据分析性能表现,功能丰富,…

ApsaraMQ Copilot for RocketMQ:消息数据集成链路的健康管家

为了帮助用户更高效地使用 RocketMQ,阿里云消息队列 ApsaraMQ 提供了一套名为 RocketMQ Copilot 的辅助工具集。它将专家的实践经验产品化,使得即便是缺乏经验的用户也能迅速掌握 RocketMQ 客户端的正确用法,利用云消息队列 RocketMQ 版的可观测性工具进行监控、并高效地排查…

无缝融合:使用 Python 和 PyFFmpeg 合并视频的完整指南

前言 在当今数字化时代,视频内容无处不在。从社交媒体到在线教育,视频已经成为我们生活中不可或缺的一部分。但是,有时候我们可能需要将多个视频片段合并成一个,创造出更丰富、更有吸引力的内容。而今天,我们将向您展示如何使用 Python 和 PyFFmpeg 工具实现这一目标。 准…

音频剪裁大师:使用 Python 和 ffmpeg 分割音频的完整指南

前言 在音频处理中,有时候我们需要对音频文件进行分割,提取其中的部分内容以满足特定需求。而 Python 提供了许多强大的工具和库来实现这一目标,其中 ffmpeg 是一个功能强大的工具,它不仅支持音频分割,还能进行音频转码、合并、提取等操作。本文将介绍如何使用 Python 和 …

正则 .*? 和 .* 的区别是什么

在正则表达式中,.* 和 .*? 的区别在于它们的贪婪程度: .* 是贪婪的,意味着它会尽可能多地匹配字符,直到没有更多字符可匹配。 .*? 是非贪婪的(或懒惰的),意味着它会尽可能少地匹配字符,一旦找到满足整体模式的最小匹配,就会停止。 举例说明: 对于字符串 123456 和模…

钉钉机器人远程重启系统服务

from flask import Flask, request import subprocessapp = Flask(__name__)@app.route(/send_message, methods=[GET]) def send_message():webhook_url = https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN    # YOUR_TOKEN是钉钉机器人的hookmessage = {&…

kalman fiter

卡尔曼滤波是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。由于观测数据中包括系统中的噪声和干扰的影响,所以最优估计也可看作是滤波过程。 组成以及步骤 1.预测状态方程 目的:由系统状态变量k-1时刻的最优值和系统输入计算出k时刻的…

计算机英文教材太难啃?Higress 和通义千问帮你!

本文将介绍基于 AI 大语言模型进行英文技术内容翻译,并基于又免费又好用的翻译软件进行内容呈现,帮助大家轻松学习计算机英文原版教材。作者:张添翼(澄潭) 计算机相关英文教材的中译本质量堪忧,对于计算机专业的学生来说,应该深有体会。因为大部分教材的译者本人可能未必…

合工大毕业论文LaTeX模板使用指南

本文是在笔者为班级同学编写的指南的基础上修改而来的。 前言 LaTeX 是目前主流的计算机排版系统之一。目前社区维护了一份合工大毕业论文的 LaTeX 模板(以下简称“模板”):https://github.com/HFUTTUG/HFUT_Thesis 考虑到大部分同学对 Word 都谈不上精通,使用 LaTeX 排版毕…

巧用pause,一次性画出多个系统的阶跃响应

num=1;den1=[0.5 1 2 4 6 8];hold; for i=1:6 step(tf(num,[den1(i), 1])); pause(2);endlegend(num2str(den1(1)),num2str(den1(2)),num2str(den1(3)),num2str(den1(4)),num2str(den1(5)),num2str(den1(6)))结果: 人就像是被蒙着眼推磨的驴子,生活就像一…