Argo Workflows
[
1]
是用于在Kubernetes上编排Job的开源的云原生工作流引擎。可以轻松自动化和管理 Kubernetes 上的复杂工作流程。适用于各种场景,包括定时任务、机器学习、ETL和数据分析、模型训练、数据流 pipline、CI/CD 等。
Kubernetes Jobs 只提供基础的任务执行,但是无法定义步骤依赖关系和顺序、缺乏工作流模版、没有可视化界面,也不支持工作流级别的错误处理等,对于批处理、数据处理、科学计算、持续集成等业务场景,Kubernetes Job 无法胜任。
Argo Workflows 作为 CNCF 的毕业项目,已被使用在多种场景,持续集成(CI)是其一个重要应用领域。
持续集成(CI)是软件开发生命周期重要组成部分,好的 CI 系统可以大幅提升您的交付效率。基于阿里云事件总线 EventBridge
[
2]
和 ACK One Serverless Argo 工作流集群
[
3]
(Argo Workflows)可以构建基于事件驱动的自动化 CI Pipeline,简单快速、高效、低成本地交付您的应用,实现代码提交即构建、交付。
事件总线 EventBridge 是阿里云提供的一款无服务器事件总线服务,支持阿里云服务、自定义应用、SaaS 应用以标准化、中心化的方式接入,并能够以标准化的 CloudEvents 1.0 协议在这些应用之间路由事件,帮助您轻松构建松耦合、分布式的事件驱动架构。使用 EventBridge 作为事件驱动引擎,有以下优势:
ACK One 全托管 Argo Workflows,提升了其性能、稳定性、可观测、运维能力等。本文将介绍如何基于 EventBridge 和 ACK One Serverless Argo 工作流集群构建事件驱动的自动化 CI Pipeline,实现基于 Git 事件驱动 CI 系统构建和推送 Docker Image 及运行构建前的测试等。
基于事件驱动的自动化 CI Pipeline,包含 2 部分:
1. 基于 Git 事件的事件驱动;
2. CI 系统构建 Docker Image 及运行构建前的测试等。
镜像构建成功后,可使用 CD 系统(如 ACK One GitOps
[
4]
)同步新 Image tag 到 K8s 集群中。
EventBridge 包含事件源、事件总线、事件规则和事件目标:
-
事件源:
将阿里云服务、自定义应用等应用程序产生的事件消息发布到事件总线。本文是对接 GitHub。
-
事件总线:
存储接收到的事件消息,并根据事件规则将事件消息路由到事件目标。
-
事件目标:
事件消费者。本文是 ACK One Serverless Argo 工作流集群。
基于工作流集群的 CI Pipeline
[
5]
主要包含 3 个步骤:Git 代码的 Clone 和切换分支、运行 Go 项目的测试用例、构建和推送镜像到 ACR EE。并且使用 BuildKit Cache
[
6]
来加速镜像构建。
1. 用户向 Git 仓库提交代码;
2. EventBridge 根据配置的规则,Git 事件触发其向 ACK One 工作流集群提交 CI 工作流;
3. 基于 ACK One 工作流集群的 CI 工作流
[
7]
来构建 Docker Image,并推送至镜像仓库(ACR EE)中。之后可通过 GitOps 自动同步相应镜像变化至 ACK 集群。
1. 创建工作流集群、ACR EE、NAS 文件系统。
2. 在工作流集群中准备 CI 工作流所需的 ACR EE 访问凭证和 NAS 存储卷,详情请参见下方基于工作流集群的 CI Pipeline 链接的步骤一和步骤二。(注意 namespace 需要和 Workflow 资源一致)。
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
Apps Code Repo 示例为 echo-server 项目
[
8]
,如您使用该示例代码,需要 Fork 到您自己 Git 仓库,若为私有仓库,则可参考 CI Pipeline 中 Clone 私有仓库
[
9]
来修改 WorkflowTemplate。
使用 EventBridge
实现 Git 事件驱动 CI Pipeline
下方是对 echo-server 项目的指定分支(release-v1)的 Git 事件驱动的 CI Pipeline 配置步骤。
https://help.aliyun.com/zh/eventbridge/getting-started/activate-eventbridge-and-grant-permissions-to-a-ram-user
2)创建自定义总线
https://help.aliyun.com/zh/eventbridge/user-guide/manage-custom-event-buses#section-sfl-pcs-6rh
3)集成 Github
https://help.aliyun.com/zh/eventbridge/use-cases/integrate-github
事件模式:如下设置为只触发来自于 release-v1 分支的变更。
{
"source": [
"github.event"
],
"data": {
"body": {
"ref": [
"refs/heads/release-v1"
]
}
}
}
5)事件目标:
{
"workflowName": "$.id"
}
6)模板:填入 Workflow CI CR
必须要设置 name 和 namespace,不可使用 generateName,要显示声明 default namespace。
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
name: ci-go-v1-eb-${workflowName}
namespace: default
labels:
workflows.argoproj.io/workflow-template: ackone-ci
spec:
arguments:
parameters:
- name: repo_url
value: https://github.com/ivan-cai/echo-server.git
- name: repo_name
value: echo-server
- name: target_branch
value: release-v1
- name: container_image
value: "test-registry.cn-hongkong.cr.aliyuncs.com/acs/echo-server"
- name: container_tag
value: "v1.0.0"
- name: dockerfile
value: ./Dockerfile
- name: enable_suffix_commitid
value: "true"
- name: enable_test
value: "true"
workflowTemplateRef:
name: ci-go-v1
clusterScope: true
1. 提交 github 代码,触发自动化流程(按上述配置,需修改 release-v1 分支代码方可触发)。
-
2. 在 ACK One 工作流集群中或者工作流控制台
[
10]
查看新建的 Workflow 的执行拓扑。
3. 可在 ACR EE 中查看已推送镜像。