编排流水线任务
任务是流水线上可管理的最小执行单元,可以在流水线阶段中进行纳管和串并行编排。
编排流水线任务
- 访问CodeArts Pipeline首页。
- 在流水线列表页搜索目标流水线,单击操作列,选择“编辑”。
- 进入流水线“任务编排”页面,单击阶段下“新建任务”,弹出“新建任务”侧滑框。
- 单击任务下方的,可以添加一个和该任务串行编排的任务,即按顺序执行,如:构建任务和部署任务应该按顺序先后执行。
- 单击“并行任务”,可以添加一个和已有任务并行编排的任务,即同时执行,如:代码检查任务和构建任务可以同时执行。
- 为任务配置插件及任务信息,操作说明如下:
表1 配置任务 操作项
说明
添加插件
流水线插件分为构建插件、代码检查插件、部署插件、测试插件和通用插件5种类型,可以根据不同类型进行过滤或搜索,插件来源请参考管理流水线扩展插件。
将鼠标移动到插件卡片,单击“添加”,即可将插件添加到任务中,请根据需要配置插件相关信息:
- 填写插件名称。
- 选择需要调用的任务,如果找不到合适的任务,请根据界面提示新建任务。
- 如果调用的任务有参数,参数也会显示出来,请根据需要配置相应参数。
- 插件名称后有对应标记,单个任务中最多只能添加一个带“任务”标记的插件;带“草稿”标记的插件表示当前用户发布为草稿的自定义插件。
- “挂起流水线”插件只能添加在不含并行任务的阶段中。
删除插件
将鼠标移动到已经添加的插件卡片,单击,选择“删除”,可以删除当前插件。
更换插件
将鼠标移动到已经添加的插件卡片,单击,选择“更换”,或者单击插件上方“更换插件”,可以返回插件列表,更换当前插件。
排序插件
单击插件卡片不松开,可以移动插件调整插件顺序。
任务配置
配置任务ID、执行主机和执行条件。
- 任务ID:。流水线阶段任务的ID,同一条流水线上的任务ID不能重复。支持大小写英文字母、数字、“-”、“_”,长度范围为1~128个字符。
- 执行主机:包括内置执行机和自定义执行机。
- 内置执行机:服务提供的执行主机,用户无需配置开箱即用。
- 自定义执行机:支持用户自行配置工具和运行环境,以满足不同任务的需求。选择自定义执行机需提前在资源池添加代理资源池,详细操作请参见资源池管理。
说明:执行主机仅针对非任务级插件。
- 任务选择
- 必须选择:必须执行,执行流水线时该任务默认勾选且无法修改。
- 禁止选择:禁止执行,执行流水线时该任务禁止勾选。
- 默认选择:执行流水线时该任务默认勾选但可按需修改。
- 默认不选择:执行流水线时该任务默认不勾选但可按需修改。
- 执行条件:即流水线阶段任务执行时需要满足的前提条件,通过配置执行条件,可以控制阶段任务是否执行。
- 前置任务未选择仍执行:上一个任务状态执行成功或未选择,都继续执行当前任务。
- 前置任务成功时执行:上一个任务执行成功才执行当前任务。
- 前置任务失败时执行:上一个任务执行失败才执行当前任务。
- 始终执行:始终执行当前任务,上一个任务状态是失败、成功、中止或忽略执行,都继续执行当前任务。
- 表达式:当前置任务到达终态,包括:成功(COMPLETED)、失败(FAILED)、中止(CANCELED)、忽略执行(IGNORED),且表达式结果为“true”时,执行当前任务,否则不执行。表达式形式为“${{ }}”,由流水线上下文、操作符、函数或常量任意组合而成。表达式编写请参考流水线执行条件表达式。
示例:
如需在执行条件中指定不管前置任务(任务ID为“job_1”)运行成功或失败,均执行当前任务,则表达式语法如下。
${{ jobs.job_1.status == 'COMPLETED' || jobs.job_1.status == 'FAILED' }}
- 配置完任务,单击“确定”,完成任务添加,可根据实际需要编辑、复制、删除、移动任务。
表2 管理任务 操作项
说明
编辑任务
单击任务卡片,可以编辑当前任务。
复制任务
将鼠标移动到任务卡片,单击,可以复制一个和该任务串行编排的任务。
删除任务
将鼠标移动到任务卡片,单击,根据删除提示确定是否删除任务。
排序任务
单击任务卡片不松开,可以移动任务调整任务顺序。
说明:任务并行执行时不支持调整顺序。
- 任务编排完成后,保存流水线。
流水线执行条件表达式
表达式由流水线上下文、操作符、函数或常量任意组合而成,通常用于流水线阶段任务的执行条件中,以限制任务执行。表达式以编程的方式访问流水线上下文,实现将流水线中运行的实例、变量、任务等信息在流水线之间互相传递。
- 流水线上下文
流水线上下文存储了流水线运行的实例、变量、任务等信息,每个上下文都是一个包含各种属性的对象。流水线上下文主要包括以下四类:
表3 流水线上下文 上下文
类型
说明
pipeline
object
流水线运行相关的信息。
sources
object
流水线运行的源相关的信息。
env
object
流水线运行的自定义参数相关的信息。
jobs
object
流水线运行的已执行完成的任务相关的信息。
- 流水线上下文引用形式
${{ <context>.<attribute_name> }}
其中,context表示流水线上下文,attribute_name表示属性。
- 流水线上下文使用场景
大部分上下文可在流水线任意任务和步骤中使用。
- 在任务的执行条件中引用上下文,来指定某个任务的执行条件。
- 在任务的输入框中引用上下文获取信息。
图1 引用流水线上下文
示例1:如下使用表示获取流水线运行的所有信息。${{ pipeline }}
示例2:如下使用表示获取流水线运行的触发方式。${{ pipeline.trigger_type }}
- 流水线上下文属性介绍
表4 流水线上下文属性 上下文
属性
类型
说明
示例
pipeline context
pipeline
object
流水线运行相关的所有信息,此对象包含的属性包括:project_id、pipeline_id、run_number、timestamp、trigger_type和run_id。
- 内容示例
如下示例为一次手动运行的流水线包含的pipeline context信息。
{ "project_id": "6428c2e2b4b64affa14ec80896695c49", "pipeline_id": "f9981060660249a3856f46c2c402f244", "run_number": "168", "timestamp": "20231016000004", "trigger_type": "Manual", "run_id": "c2f507f93510459190b543e47f6c9bec" }
- 使用示例
如需在某个任务的输入中获取本次流水线运行的触发方式,可使用如下语法来获取。
${{ pipeline.trigger_type }}
pipeline.project_id
string
当前流水线所属项目ID,同现有流水线系统预定义参数PROJECT_ID。
pipeline.pipeline_id
string
当前流水线ID,同现有流水线系统预定义参数PIPELINE_ID。
pipeline.run_number
string
流水线执行编号,同现有流水线系统预定义参数PIPELINE_NUMBER。
pipeline.timestamp
string
流水线执行时间戳,同现有流水线系统预定义参数TIMESTAMP,格式为yyyyMMddHHmmss。如:20211222124301。
pipeline.trigger_type
string
流水线触发类型,同现有流水线系统预定义参数PIPELINE_TRIGGER_TYPE。
pipeline.run_id
string
流水线执行ID,同现有流水线系统预定义参数PIPELINE_RUN_ID。
sources context
sources
object
流水线运行的源相关的所有信息,此对象包含的属性包括:alias、repo_name、commit_id、commit_id_short、commit_message、repo_url、repo_type、repo_name、ssh_repo_url、tag、merge_id、source_branch和target_branch。
- 内容示例
如下示例为单代码源的流水线一次手动运行所包含的sources context信息,其中代码源别名为“my_repo”。
{ "my_repo": { "commit_id": "dedb73bb9abfdaab7d810f2616bae9d2b6632ecc", "commit_id_short": "dedb73bb", "commit_message": "maven0529 更新 pipeline0615.yml", "repo_url": "https://example.com/clsyz00001/maven0529.git", "repo_type": "codehub", "repo_name": "maven0529", "ssh_repo_url": "git@example.com:clsyz00001/maven0529.git", "target_branch": "master" } }
- 使用示例
如需在某个任务的输入中获取本次流水线运行的运行分支,可使用如下语法来获取。
${{ sources.my_repo.target_branch }}
sources.<alias>
object
别名为alias对应的流水线源的所有信息,当流水线源定义别名时存在。
sources.<repo_name>
object
代码仓名称为repo_name的流水线代码源的所有信息,当代码源未定义别名时存在,包含属性同alias。
sources.<alias>.commit_id
string
流水线执行前最后一次代码提交的CommitID,同现有流水线系统预定义参数COMMIT_ID。
sources.<alias>.commit_id_short
string
流水线执行前最后一次代码提交的CommitID的前8位,同现有流水线系统预定义参数COMMIT_ID_SHORT。
sources.<alias>.commit_message
string
流水线执行前最后一次代码提交的提交信息。
sources.<alias>.repo_url
string
代码仓地址(HTTPS),同现有流水线系统预定义参数REPO_URL。
sources.<alias>.repo_type
string
代码仓类型。如:codehub、gitlab、github、gitee、general_git。
sources.<alias>.repo_name
string
代码仓名称。
sources.<alias>.ssh_repo_url
string
代码仓地址(SSH)。
sources.<alias>.tag
string
标签触发时的标签名称。
sources.<alias>.merge_id
string
合并请求触发时的合并请求ID。
sources.<alias>.source_branch
string
合并请求触发时的源分支名称。
sources.<alias>.target_branch
string
MR时代表目标分支名称,否则代表运行分支名称。
env context
name
string
自定义参数名称。
value
string
自定义参数值。
jobs context
jobs
object
流水线运行的任务相关的信息,此对象包含的属性包括: job_id、status、outputs、output_name、metrics、metric_name。
- 内容示例
如下示例为流水线一次运行对应的jobs context信息,包含两个执行成功的任务,ID为“check_job”的任务的输出为两项指标,ID为“demo_job”的任务的输出为两项一般输出。
{ "check_job": { "status": "COMPLETED", "metrics": { "critical": "0", "major": "0" } }, "demo_job": { "status": "COMPLETED", "outputs": { "output1": "val1", "output2": "val2" } } }
- 使用示例
如需要在后续任务的输入中获取本次运行的“demo_job”的输出“output1”的值,可使用如下语法来获取。
${{ jobs.demo_job.outputs.output1 }}
jobs.<job_id>
object
ID为job_id的任务包含的所有信息。
jobs.<job_id>.status
string
任务的运行结果,取值结果为:INIT(初始化)、QUEUED(排队中)、RUNNING(运行中)、CANCELED(已中止)、COMPLETED(成功)、FAILED(失败)、PAUSED(暂停)、IGNORED(忽略)、SUSPEND(挂起)或UNSELECTED(未选择)。
jobs.<job_id>.outputs
object
任务的运行一般输出,即键值对形式的数据输出。
jobs.<job_id>.outputs.<output_name>
string
任务的运行一般输出的数据名称。
jobs.<job_id>.metrics
object
任务的运行指标输出。如:代码检查问题数、测试通过率等指标项。
jobs.<job_id>.metrics.<metric_name>
string
任务的运行指标输出的名称。
- 内容示例
- 流水线上下文引用形式
- 操作符
表达式中可以使用如下操作符:
表5 表达式操作符 操作符
说明
.
属性引用。如:${{ pipeline.trigger_type }},表示获取流水线的触发类型。
!
非。如:${{ !startsWith(sources.my_repo.target_branch, 'release') }},表示判断流水线代码源的分支是否不以release开头。
==
等于。如:${{ pipeline.trigger_type == 'Manual' }},表示判断流水线的触发方式是否为手动触发。
!=
不等于。如:${{ pipeline.trigger_type != 'Manual' }},表示判断流水线的触发方式是否不为手动触发。
&&
且。如:${{ pipeline.trigger_type == 'Manual' && sources.my_repo.target_branch == 'master' }},表示判断流水线的触发方式为手动触发并且流水线代码源的分支为master。
||
或。如:${{ pipeline.trigger_type == 'Manual' || sources.my_repo.target_branch == 'master' }},表示判断流水线的触发方式为手动触发或者流水线代码源的分支为master。
- 函数
表达式中可使用如下内置函数:
表6 表达式内置函数 函数
说明
contains
startsWith
endsWith
对象筛选器
使用“*”语法应用筛选器并选择集合中的匹配项。
示例:如下是流水线某次运行的jobs上下文
{ "check_job": { "status": "COMPLETED", "metrics": { "critical": "0", "major": "0" } }, "demo_job": { "status": "FAILED" } }
- 示例1:“jobs.*.status”,表示所有任务的状态,所以返回“[ 'COMPLETED', 'FAILED' ]”。
- 示例2:结合contains函数一起使用,如:contains(jobs.*.status, 'FAILED'),“jobs.*.status”中包含“FAILED”,所以返回“true”。