示例文件参考
前言
遵循 Infrastructure as Code思想,流水线配置文件(英文名为 CIFile)以 yaml 形式声明阶段与任务。您可以通过本文给出的示例 CIFile 文件了解基本概念,了解如何编写此文件用于自己的流水线项目中。
CIFile
CIFile 的文件设计兼顾简单易用和强扩展性,利于持续集成系统的高效执行。在流水线中选择对应的 CIFile 文件便能够使用在文件中所定义的流程配置,推荐以 .coding-ci.yml
名称命名 CIFile 文件,完整示例格式如下:
version: 2.0 # CIFile版本号,请不要修改
worker:
label: my_label # 任务执行的集群,当为 PUBLIC 或不设置 label 属性时,将使用公共节点执行
docker: # 可单独指定执行环境的 Docker 镜像,如不设置 docker 配置,将使用内置执行环境,详见编译环境章节
registry: my_custom_registry
image: my_custom_image
username: $DOCKER_USER
password: $DOCKER_PWD
# 用户自定义环境变量
env:
USERNAME: myname
PASSWD:
secret: xxxxyyyzz # 加密字符串,在执行时 持续集成引擎会将字符串解密
TESTREADONLY: # 复杂环境变量结构,详见环境变量章节
value: my_value
desc: test readonly atrribute
readonly: true
MYREPO: ${QCI_WORKSPACE}/git # 支持环境变量的引用嵌套
# 定义任务在启动前需要执行哪些初始化动作
setup:
- yum install php
- pip3 install requests
# 定义任务的提交触发方式
trigger:
branches:
include: # 定义哪些分支的变更会触发任务,不填或 '*' 代表所有分支都会触发此任务
- master
- release/*
exclude: # 定义哪些分支的变更不会触发任务,不填代表没有分支会被忽略
- release/old*
- release/bak*
tags:
include: # 定义哪些 tag 的推送会触发任务,不填或 '*' 代表所有分支都会触发此任务
- master
- release/*
exclude: # 定义哪些 tag 的推送会触发任务,不填代表没有 tag 会被忽略
- release/old*
- release/bak*
paths:
include: # 支持定义分支下的哪些目录变更后才触发任务,不填或 '*' 代表所有文件变更都会触发此任务
- src/*
exclude: # 支持定义分支下的哪些目录变更后不触发任务,不填代表没有文件变更会被忽略
- release
- build
# 定义任务的 MR 触发方式
mr:
branches:
include: # 定义哪些分支的变更会触发任务,不填或 '*' 代表所有分支都会触发此任务
- master
- release/*
exclude: # 定义哪些分支的变更不会触发任务,不填代表没有分支会被忽略
- release/old*
- release/bak*
paths:
include: # 支持定义分支下的哪些目录变更后才触发任务,不填或 '*' 代表所有文件变更都会触发此任务
- src/*
exclude: # 支持定义分支下的哪些目录变更后不触发任务,不填代表没有文件变更会被忽略
- release/*
- .gitignore
is_local_mr: 0 # 是否在任务执行前尝试在编译机上模拟一次合入
is_block_mr: 0 # 在流水线执行中或执行失败时,是否拦截 MR 的合入
# 定义流水线执行内容
stages:
- stage: install # 一个 stage 下如果只有一个 task,支持简写
cmds:
- pip install -r requirements.txt
- stage: build
if: $QCI_REPO_BRANCH = master # 支持条件执行
cmds:
- make clean
- make build
artifacts: # 收集在任务执行完成时的制品
- dist/*.apk
- stage: test
worker:
label: PUBLIC
language: python
tasks: # 一个 stage 下的多个 task 会在直接节点上并发执行
- task: unittest
if: $QCI_REPO_BRANCH = master
cmds:
- make test -unittest
temps: # 任务内缓存,将传递到后续 stages,任务完成后销毁
- ./result/*
- task: ui-automation
output_timeout: 20
cmds:
- make test -qta
- task: lint code
output_timeout: 20
ignore: true # 该任务可以忽略错误,即任务失败后也可继续往后执行
cmds:
- codedog -o ./build/codedog.json
status: ./build/codedog.json # 支持主动声明任务执行结果及报告链接
- prompt: # 人工确认阶段,在确认阶段,系统将不会继续执行直到确认完成
- msg: Should go on?
detail: "[click to detail](http://coding.net)"
env:
TAPD:
value: ""
desc: "tapd链接"
to: someone_A
timeout: 1440
- msg: another message
to: [someone_A, someone_B]
- stage: deploy
cmds:
- plugin: zhiyun_simple_submit
params:
product: ${ZHIYUN_PRODUCT}
name: ${ZHIYUN_NAME}
description: ${ZHIYUN_DESC}
tarball: ${ZHIYUN_TARBALL}
finally: # 任务结束前的清理动作,支持 success(仅成功时执行),failure(仅失败时执行) 和 all(全部执行)
failure:
cmds:
- echo "CI fails!"
- email --title "Your CI Fails!" --to hensonwang@tencent.com
cache: # 任务间缓存,设置任务间缓存
- ${HOME}/.gradle/
- ./node_modules/
# 定义通知
notifications:
- name: "通知" # QCI前端页面展示用
channel: "EMAIL;ENWECHAT" # 通知渠道。EMAIL;ENWECHAT;SMS;ENWECHAT_GROUP;WECHAT
group: "QCI_JOB_ADMIN;QCI_JOB_NOTIFY_USER" # 通知组(QCI内置的管理员成员等,如:QCI_JOB_MEMBER;QCI_JOB_ADMIN;QCI_JOB_NOTIFY_USER;QCI_TRIGGER)
enwechat_group: "" # 企业微信群id
user: "andrewjiang;" # 指定人
template: "" # 通知内容模版
on_success: change # 成功发送(change或者always或者never)
on_failure: always # 失败发送(change或者always或者never)
- name: "通知2"
channel: EMAIL
group: QCI_JOB_ADMIN
user: ""
template: ""
on_success: change
on_failure: never
# 当前任务数允许的最大执行并发数
maximum_builds: 3
# 是否清理工作空间,默认清理。1:不清理,0:清理
is_no_revert: 1
# 是否自动取消排队中的任务,默认不取消。1:取消,0:不取消
is_auto_cancel: 1
CIFile文件格式包含下面的配置声明:
构建资源
参数名:worker
构建资源是运行流水线的底层计算资源,包含云主机、集群与自定义构建节点三种类型。在 CIFile 中的参数名称为 worker
。
参数名:label
指的是为云主机 / 集群 / 自定义构建节点所指代的标签,由用户在接入构建资源时进行指代,用于构建资源的分组。
参数名:docker
此参数用于定义流水线的构建环境,支持从任意 Docker 镜像仓库(例如 CODING 制品库、DockerHub、腾讯云容器服务等)拉取镜像并执行流水线任务。若不指定此参数,系统将使用官方环境执行流水线。
参数名:env
此参数用于指定流水线使用自定义的环境变量。参考此文档接入自定义环境后,在 CIFile 中进行指定。
参数名:secret
用于引用需在流水线中使用的敏感数据密文,在流水线的运行阶段将自动将这些参数转换为明文。可以通过desc
指定环境变量的描述,readonly
指定环境变量在界面上的只读属性,更多属性可参见环境变量的使用
setup
在每个 stage 前都会执行的初始化动作,若一条流水线在单个节点执行则只会在第一个 stage 初始化;若一条流水线会在多个节点执行,则会在每个节点都进行初始化,查看流水线定义详细说明trigger
配置 PUSH 和 TAG 触发条件,查看触发条件mr
配置 mr 触发条件,查看触发条件
阶段与任务
stages
定义流水线的阶段。一个集成任务可以定义多个阶段,各个阶段按照顺序依次执行。当所有阶段依次执行成功后,整个流水线才会判断为执行成功。task
:定义流水线阶段中的任务。一个阶段里可以定义多个任务,各个任务并行执行。当一个阶段中所有任务执行成功后才视为阶段运行成功。如果阶段里只有一个任务,可以省略tasks
字段,将task
的参数直接写到stage
里。cmds
:在任务中执行命令行参数。在 Linux 下是 shell 命令,在 Windows 下是 dos 命令。 一个 task 可指定多行 cmd,多行 cmd 按照顺序执行。运行命令后如果返回 0 则表示成功,非 0 表示失败。所有命令执行成功后,整个任务才视为执行成功。前一个命令行执行失败后不再继续执行命令行。当所有命令行都执行成功时则返回成功,否则返回为失败信息。
多条命令行之间可以继承上下文环境,例如这样定义多条命令行:
cmds:
- a = 1
- cd ./bin/
- echo $a;sh start.sh
if
: 可以在stage
和task
上设置,表示执行该stage
或task
执行的条件。output_time
: 可以在stage
和task
上设置,表示任务在运行过程中,多少时间没有输出会置为超时,单位为分钟
,详细信息请参看超时时间ignore
: 可以在stage
和task
上设置,表示该stage
和task
的执行结果不影响整个任务的结果,请参看忽略节点的执行结果status
: 除依据 cmds 的返回值判断任务是否成功外,持续集成引擎还支持通过status
字段显式指定 task 的结果,并提供展示更丰富的任务结果信息的能力,查看status字段说明。status 字段指向一个 json 文件,该文件包含下面几个字段:status
: 必选,可以是”success”, “failure”, “error”。description
: 可选,status 的描述,支持 markdown 格式。url
: 可选,指向一个外部的 url 链接。title
: 可选,配合 url 在 web 端展示,尽量简明。report_dir
:可选,指向要上传到文件服务器的路径report_html
:可选,指定 report_dir 时,链接的首页文件artifacts
: 指定集成任务产出文件或目录(如构建产出、测试报告等),在 web 界面上提供下载。如果脚本中需要获取 artifacts 的下载链接, 可以使用如下方式拼接:
http://${TEAM_GK}.coding.net/api/qci/rest-api/totalresult/${QCI_BUILD_ID}/artifacts/${FILENAME}
如果所使用的编译环境是 windows 环境,那么在拼接下载链接的时候需要将 Windows 的分隔符转换为 Linux 系统的分隔符。例如在使用 Windows 系统下载或上传 artifacts 时需填写为 test\myFile.apk
,那么拼接文件时需要使用的链接是:
http://${TEAM_GK}.coding.net/api/qci/rest-api/totalresult/${QCI_BUILD_ID}/artifacts/test/myFile.apk`
temps
: 指定任务内缓存。temps 指定文件会被保存,并传递给下游的 stage。prompt
:表示需要人工确认的节点。当执行到了 prompt 节点后,会通知处理人进行相应的操作,处理人可以选择继续执行还是中止任务,有关于参数的说明请参考此文档。finally
:最后执行的节点,且无论前面的节点是否成功。finally
包含success
,failue
,all
三个条件,分别表示成功、失败、或是无论如何都需要执行的命令,有关于参数的说明请参考此文档。cache
: 指定任务间缓存。cache 的内容会在下次持续集成的时候利用,从而达到集成任务加速效果。可以用来缓存一些比较耗时的操作,例如依赖包的下载安装、依赖库的编译产出。
在阅读中是否遇到以下问题?*
您希望我们如何改进?*
如果您希望得到回复,请留下您的邮箱地址。