更新时间:2024-10-15 GMT+08:00

编排流水线任务

任务是流水线上可管理的最小执行单元,可以在流水线阶段中进行纳管和串并行编排。

编排流水线任务

  1. 访问CodeArts Pipeline首页
  2. 在流水线列表页搜索目标流水线,单击操作列,选择“编辑”。
  3. 进入流水线“任务编排”页面,单击阶段下“新建任务”,弹出“新建任务”侧滑框。

    • 单击任务下方的,可以添加一个和该任务串行编排的任务,即按顺序执行,如:构建任务和部署任务应该按顺序先后执行。
    • 单击“并行任务”,可以添加一个和已有任务并行编排的任务,即同时执行,如:代码检查任务和构建任务可以同时执行。

  4. 为任务配置插件及任务信息,操作说明如下:

    表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' }}

  5. 配置完任务,单击“确定”,完成任务添加,可根据实际需要编辑、复制、删除、移动任务。

    表2 管理任务

    操作项

    说明

    编辑任务

    单击任务卡片,可以编辑当前任务。

    复制任务

    将鼠标移动到任务卡片,单击,可以复制一个和该任务串行编排的任务。

    删除任务

    将鼠标移动到任务卡片,单击,根据删除提示确定是否删除任务。

    排序任务

    单击任务卡片不松开,可以移动任务调整任务顺序。

    说明:

    任务并行执行时不支持调整顺序。

  6. 任务编排完成后,保存流水线。

流水线执行条件表达式

表达式由流水线上下文、操作符、函数或常量任意组合而成,通常用于流水线阶段任务的执行条件中,以限制任务执行。表达式以编程的方式访问流水线上下文,实现将流水线中运行的实例、变量、任务等信息在流水线之间互相传递。

  • 流水线上下文

    流水线上下文存储了流水线运行的实例、变量、任务等信息,每个上下文都是一个包含各种属性的对象。流水线上下文主要包括以下四类:

    表3 流水线上下文

    上下文

    类型

    说明

    pipeline

    object

    流水线运行相关的信息。

    sources

    object

    流水线运行的源相关的信息。

    env

    object

    流水线运行的自定义参数相关的信息。

    jobs

    object

    流水线运行的已执行完成的任务相关的信息。

    • 流水线上下文引用形式
      ${{ <context>.<attribute_name> }}

      其中,context表示流水线上下文,attribute_name表示属性。

    • 流水线上下文使用场景

      大部分上下文可在流水线任意任务和步骤中使用。

      • 在任务的执行条件中引用上下文,来指定某个任务的执行条件。
        示例:如下使用表示任务在指定代码源的运行分支为“master”时才运行。
        ${{ sources.my_repo.target_branch == 'master' }}
      • 在任务的输入框中引用上下文获取信息。
        图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

      自定义参数名称。

      • 内容示例

        如下示例为流水线一次运行包含的env context信息,包含了两个自定义参数。

        {
            "var_1": "val1",
            "var_2": "val2"
        }
      • 使用示例

        如需要在某个任务的输入中获取本次流水线运行的自定义参数“var_1”的值,可使用如下语法来获取。

        ${{ env.var_1 }}

      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

    • 格式

      contains(search, item)

    • 含义

      如果“search”包含“item”,则函数返回“true”。

      • 如果“search”是一个数组,那么如果“item”是数组中的一个元素,则此函数返回“true”。
      • 如果“search”是一个字符串,那么如果“item”是“search”的子字符串,则函数返回“true”。
    • 示例

      contains('abc', 'bc') ,函数将返回“true”。

    startsWith

    • 格式

      startsWith(searchString, searchValue)

    • 含义

      如果“searchString ”以“searchValue”开始,则函数返回“true ”。

    • 示例

      startsWith('abc', 'ab'),函数将返回“true”。

    endsWith

    • 格式

      endsWith(searchString, searchValue)

    • 含义

      如果“searchString”以“searchValue”结束,则函数返回“true”。

    • 示例

      endsWith('abc', 'bc'),函数将返回“true”。

    对象筛选器

    使用“*”语法应用筛选器并选择集合中的匹配项。

    示例:如下是流水线某次运行的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”。