流水线关键概念解析

本文主要介绍云效流水线的关键概念和组件。了解如何使用云效流水线帮助你更有效地构建、测试和部署代码。

概述

image

image

  1. 配置不同的触发器,从而以不同的方式触发流水线。

  2. 流水线顶层结构是阶段,阶段之间默认顺序执行。

  3. 阶段内可以包含多个任务,任务默认并行执行(YAML模式下),可以配置Job间的依赖关系(可跨阶段)。

  4. 任务分为普通的顺序执行任务交互式执行任务,以及服务端任务。

    1. 通过步骤的扩展,顺序执行任务可以完成各种各样的工作,也包括对Kubernetes集群进行部署

    2. 有一些任务可能涉及到在执行完一些操作之后让用户进行选择下一步该做什么,此时可以使用交互式执行任务来实现。

    3. 服务端任务包含两种:人工卡点和主机部署,其中主机部署负责对主机组中的主机进行部署操作。

  5. 所有的任务都可以配置生命周期插件,可以在特定的生命周期节点执行通知类操作。

  6. 云效流水线提供了托管集群可以执行顺序执行任务交互式执行任务,同时你也可以将自己的主机通过Runner应用程序来托管到云效流水线,并将其关联到对应的私有构建集群(自托管集群),以便将任务调度到这些主机上进行执行。

流水线 pipeline

流水线是一套工作流程的定义,提供多层级的串并联能力,以及暂停,条件执行等,来帮助你自动化你的研发过程。

可以通过流水线提供的预置模板来创建流水线。你可以创建GUI类型的流水线,或者YAML类型的流水线。二者不可相互转换。其中YAML类型的流水线提供了相对GUI类型流水线更多的能力,比如创建流水线的OpenAPI,条件判断能力等等。

image

创建好流水线之后,可以进行流水线的编排,以及一些其他的设置,比如触发设置环境变量缓存等。

image

触发器 trigger

你可以手动在流水线页面上触发流水线。

image

同时也可以配置不同的触发器来自动触发流水线运行。包括:

  1. 代码源触发。当代码库有推送等事件发生时候触发流水线。

  2. Webhook 触发流水线。直接通过Restful方式调用固定的URL来触发流水线。

  3. ACR 触发。当阿里云ACR仓库发生推送等事件时,触发流水线。

  4. 定时触发。通过定时配置,可以周期性地自动触发流水线的执行。

  5. Flow流水线触发。当另一条流水线执行完毕时候触发流水线。

  6. Jenkins 触发。配置一个Jenkins任务执行完毕之后触发流水线。

阶段 stages

阶段通常表示研发过程中的不同环节,比如开发、测试、预发布、发布生产等。如下图就包含了测试构建部署三个阶段。

image

在YAML流水线中,使用stages关键字定义不同的阶段。

image

任务 jobs

一个阶段中通常可以包含多个可以并行执行的任务,比如多个不同类型的测试可以同时执行。

image

在 YAML 流水线中,使用stages.<stage_id>.jobs关键字定义不同的任务。

image

如果一条流水线仅含一个 stage,则无需显示指定stages,可直接定义 jobs

image

步骤 steps

一个步骤本质上是执行一些可以在某个构建集群上执行的一段命令的描述。比如进行Java构建、基于Java构建的产物进行镜像构建等。

image

在 YAML 流水线中,使用jobs.<job_id>.steps关键字定义不同的步骤。

image

如果一条流水线仅包含一个 job,则无需显示指定jobs,可直接定义 steps

image

云效内置了非常丰富的步骤,同时你也可以自定义一个步骤来满足你的特殊场景。

顺序执行任务

上述提到的Java构建,镜像构建等任务执行一段脚本就结束了,我们称之为顺序执行任务。

交互式任务

有一些场景,比如SAE的部署,在触发了发布之后,需要等待第一批发布结束,然后用户验证完毕之后,根据验证的结果选择继续发布,或者是回滚发布,这种带有交互的任务,我们称之为交互式任务,如下。

image

image

这种交互式的任务也是通过步骤来实现的,其特殊之处在于,步骤的第一次运行结束之后,会返回给服务端特定的数据结构告诉,接下来的Action有哪些,同时步骤的处理逻辑中包含处理各种Action的能力,于是服务端通过重复调用包含这个步骤的任务,并传入用户选择的那个Action就可以实现上述的交互式的效果。

服务连接管理

在步骤运行过程中,会涉及到一些密钥信息,比如代码克隆的账密、Jenkins的账密、Kubernetes的kubeconfig、用于访问阿里云API的临时token等等。云效流水线使用服务连接的概念来统一管理上述信息。

image

image

image

image

在 YAML流水线中,通过serviceConnection关键字指定。

image

在上图 「Java 镜像构建」步骤在运行时可以获取到对应的docker login的账密,并写入到~/.docker/config.json,以便后续的docker pulldocker push使用。

Kubernetes 部署

为了方便步骤和用户的 Kubernetes 集群之间的交互,云效流水线提供了 Kubernetes 集群管理的能力,并可以在步骤中引用,以便在运行时,让步骤获取到这个 Kubernetes 集群的 kubeconfig。

image

image

在 YAML 流水线中,通过kubernetesCluster指定集群ID连接。

image

云效流水线支持添加两种类型的 Kubernetes 集群:

  • 阿里云ACK。为了添加阿里云ACK集群,需要先添加一个服务连接,然后通过这个服务连接选择该服务连接下的ACK集群即可。流水线会在运行时,计算一个临时的kubeconfig供步骤使用。这种情况下用户的集群的ApiServer可以不开放公网。

image.png

  • 普通的Kubernetes集群,用户需要填写kubeconfig。这种情况,用户的Kubernetes的ApiServer需要公网可访问。

image.png

主机部署

云效流水线支持主机部署功能。为了使用该功能,需要先创建主机组,然后在主机部署的任务中选择主机组。

image

image

主机部署可以引用上游的制品产物,并按照你的配置将这个制品下载到每一台主机对应的目录。主机部署提供了分批发布的能力,并且支持第一批暂停和每批暂停的策略。

imageimageimage

在 YAML 流水线中,通过machineGroup指定主机组ID部署。

image

云效流水线支持以下几种方式接入主机:

  • 阿里云ECS。首先创建阿里云ECS类型的服务连接,然后通过这个服务连接选择该账号下的机器,绑定到主机组。云效流水线会通过云助手的通道在机器上安装Runner程序,作为和流水线服务端的通信的客户端。这种情况下阿里云ECS不需要有访问公网资源的能力,Runner程序会使用内网的endpoint连接到流水线服务端。

image

  • 阿里云托管实例。和阿里云ECS的接入方式相同,唯一的差别的是,由于托管主机不在阿里云的内网,因此无法通过内网endpoint连接到流水线服务端,所以需要该主机可以访问公网。

  • 通过标签的方式定义主机组。在运行时通过标签决定选择哪些主机进行部署。由于实际部署的主机是不确定的,因此在主机组定义时,不会在任何主机上安装Runner程序,而是在运行时通过云助手的命令通道直接进行命令下发,从而完成部署。

image

image

  • 任意可以访问公网的主机。需要粘贴安装Runner的命令到主机上执行,即可添加该主机到流水线。

image

私有构建集群

如果你的构建过程需要和你的内网资源进行交互,比如从内网clone代码,或者从内网的 maven 服务器上拉取依赖,可以使用私有构建集群来把你的内网主机托管到流水线。

image

构建集群中的主机同样是通过安装Runner程序的方式托管到流水线的,支持Linux、Windows、macOS主机的接入,并支持 amd64 和 arm64 两种芯片架构的接入。

image

流水线任务可以指定任务调度到对应的私有构建集群上。

image

在 YAML 流水线中,通过runsOn关键字指定任务构建集群。

image