Zadig 自定义工作流 vs. 其他 CI/CD 流水线

时间:2023-01-13 10:10:17

Zadig 工作流有别于其他 CI/CD 的流水线,它主要面向微服务架构设计的产品级工作流,可以支持并行构建、并行部署、并行自动化测试和分发。自 Zadig v1.13.0 推出了更为强大的自定义工作流,迄今已迭代 3 个大版本,很多小伙伴相继用上了。今天我们就来介绍一下它!

为什么设计新的工作流?

根据社区小伙伴的反馈,当前工作流在交付多个微服务能力已经能满足 90% 的能力,但仍然有一些场景无法支持,出于以下因素,设计了自定义工作流:

  1. 满足复杂场景下任务顺序*编排能力,诸如审核、多任务组装

  2. 通过工作流更灵活的释放 Zadig 环境管理能力,比如多环境协同、多角色协作

  3. 提供更强的开放性和系统扩展性,广泛的链接云原生合作伙伴和企业内部系统

同时保留产品工作流类型,它仍然作为较为易用的方式,让企业和开发者低门槛的走向云原生交付之路。

自定义工作流核心概念

自定义工作流依旧采用 K8s 任务 类型资源为底层设计,以 工作流 阶段 任务的组织结构,包含以下核心概念: 

  • 工作流: 一组有序的 阶段

  • 阶段: 一组有序的任务 ,可以配置 任务 并行执行或者串行执行。

  • 任务:表示执行命令的一系列有序的步骤,最小单位的完整执行单元(比如 构建,测试,部署...),每个 任务 由一个容器实际执行。

Zadig 自定义工作流 vs. 其他 CI/CD 流水线

最终用户呈现层支持 GUI 和 YAML 两种开发模式,着重在自定义任务的步骤设计。

Zadig 自定义工作流 vs. 其他 CI/CD 流水线

Zadig 自定义工作流 vs. 其他 CI/CD 流水线

可以为谁所用?

自定义工作流主要提供软件交付链条上的流程编排能力,可以面向企业各种场景、高度自主地开发自定义模块和服务,同时拥抱更多合作伙伴和工程师可以参与进来,在整个云原生软件交付生命周期中编排任何有益迭代高质量产品的服务和价值。

 

企业开发者可以用它

  • 研发过程工具的集成:项目管理工具诸如 Jira、Trello、Redmine、Ones 等,配置管理系统诸如 Apollo,Nacos 等,数据库变更平台诸如 MySQL,DMS,TiDB,IM 通知系统诸如飞书、钉钉、企业微信等。

  • 内部平台系统的串接:测试平台诸如 Apipost、Apifox,安全平台诸如 sonar 、火线 IAST,工单系统等。

 

合作伙伴可以用它

  • 如果你的客户也在用 Zadig ,可以通过自定义任务融合到 Zadig 工作流,一起为开发者服务。

  • 如果想让 Zadig 用户也成为你的用户,可以编排到 Zadig 工作流,让更多人认识你。

 

个人开发者/高校学生可以用它

  • 向 Zadig 社区贡献任务,有机会采纳为官方任务,让数百企业客户用上你的代码。

 

从 0 开发自定义任务

下面以打印输出 Hello Zadig 为例说明如何完成自定义任务的开发。

第一步编码实现自定义任务的逻辑并保存,本例的源码 main.go 内容如下:

不限制语言和实现方式,根据自己擅长的技术栈实现想要的功能即可。

package main

import (
    "fmt"
    "github.com/spf13/viper"
)

const WhoAmI = "WHO_AM_I"

func main() {
    viper.AutomaticEnv()

    who_am_i := viper.GetString(WhoAmI)
    fmt.Printf("Hello %s", who_am_i)
}

第二步编译源代码,构建出镜像并 push 到镜像仓库中,相关命令及 Dockerfile 参考如下:

编译源码命令:

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -v -o greeting-bot main.go

Dockerfile 内容:

FROM alpine/git:v2.30.2

# https://wiki.alpinelinux.org/wiki/Setting_the_timezone
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && apk add tzdata && \
    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo Asia/Shanghai  > /etc/timezone && apk del tzdata

WORKDIR /app
ADD greeting-bot .
ENTRYPOINT ["/app/greeting-bot"]

镜像构建及 push 命令:

docker build -f Dockerfile --tag koderover.tencentcloudcr.com/koderover-public/jira-updater:v0.0.1-amd64
docker push koderover.tencentcloudcr.com/koderover-public/greeting-bot:amd64

第三步编写 YAML 格式的任务配置文件,并将该 YAML 文件提交到代码库中。本例的 YAML 配置文件如下如下:

name: "输出 Hello 问候信息"           # 任务名称
version: "v0.0.1"                   # 任务版本
description: "和指定用户 say Hello"   # 任务描述
image: koderover.tencentcloudcr.com/koderover-public/greeting-bot:amd64 # 上一步中构建出来的镜像

inputs:                        # 配置在 Zadig 中可填写的变量
  - name: who_am_i             # 变量名称
    description: "who am i"    # 变量描述
    type: string               # 变量类型,支持 string(单行文本)和 text(多行文本)两种类型
    default: "Zadig"           # 变量的默认值

envs:                          # 环境变量,启动上述镜像容器时会自动注入为环境变量,除了 envs,还支持使用 cmds 和 args
  - name: WHO_AM_I             # 环境变量名称
    value: $(inputs.who_am_i)  # 环境变量的值,使用 $(inputs.who_am_i) 形式表示使用 Zadig 中的输入

代码库中目录结构组织满足如下形式:

path/to/your/repo         # 代码库根目录
├── greeting-bot          # 任务目录,有多个任务时,组织在单独的目录中
│   └── v0.0.1            # 版本号
│       └── bot.yaml      # 任务的 YAML 文件

至此,一个完整的自定义工作流任务开发完毕,接下来我们看如何使用该任务。

使用自定义任务

首先在系统中集成代码源和镜像仓库,配置工作流任务来源:

1. 集成代码源访问 系统设置 -> 系统集成 -> 代码源集成,将上述代码源在 Zadig 中集成。

Zadig 自定义工作流 vs. 其他 CI/CD 流水线

2. 集成镜像仓库访问 系统设置 -> 基础设施 -> 镜像仓库,将构建镜像对应的镜像仓库在 Zadig 中集成。

Zadig 自定义工作流 vs. 其他 CI/CD 流水线

3. 配置工作流任务来源访问 系统设置 -> 工作流任务,添加工作流任务来源(即:YAML 配置文件所在的代码库)。

Zadig 自定义工作流 vs. 其他 CI/CD 流水线

配置完毕后便可在自定义工作流中使用该任务:新建自定义工作流 -> 添加任务 -> 选择任务 -> 按需填写参数后保存。

Zadig 自定义工作流 vs. 其他 CI/CD 流水线

Zadig 自定义工作流 vs. 其他 CI/CD 流水线

Zadig 自定义工作流 vs. 其他 CI/CD 流水线

填写任务中变量的值后启动工作流即可。

Zadig 自定义工作流 vs. 其他 CI/CD 流水线

Zadig 自定义工作流 vs. 其他 CI/CD 流水线

更多进阶功能可参考 自定义工作流|Zadig 文档[1]

 

有哪些已经开发好的自定义任务?

  • Jira Issue 状态变更:结合 Zadig 工作流阶段来变更 Jira Issue 状态,打通与项目管理的联动,源码位置 jira-updater[2]

  • 执行 Jenkins Job:传入 Jenkins 构建参数,触发指定的 Jenkins Job 执行,源码位置 jenkins-runner[3]

  • MySQL 数据库变更:对 MySQL 数据库执行 SQL 语句,实现数据和代码变更联动变更,源码位置 mysql-runner[4]

 

如何贡献官方?

官方开放了工作流任务共享代码库:koderover/zadig-jobs[5],其中包含若干 demo 实现和场景描述,供开发者使用和参考。

 

参考链接:

[1]https://docs.koderover.com/zadig/v1.14.0/project/common-workflow/

[2]https://github.com/koderover/zadig/tree/release-1.14.0/pkg/microservice/aslan/core/workflow/service/workflow/plugins/jira-updater

[3]https://github.com/koderover/zadig/tree/release-1.14.0/pkg/microservice/aslan/core/workflow/service/workflow/plugins/jenkins-runner

[4]https://github.com/koderover/zadig/tree/release-1.14.0/pkg/microservice/aslan/core/workflow/service/workflow/plugins/mysql-runner

[5]https://github.com/koderover/zadig-jobs

Zadig,让工程师更专注创造!