内置任务
功能简介
在每一个 Job 操作中,除了使用自定义的 script、插件任务 外,我们还扩展了一些比较常用的内置任务。
内置任务 与 其他任务 的区别:
- 运行环境不同: 内置任务运行在 Master 可信区域;其他运行在 Runner 用户空间,物理上是隔离的。
- 鉴权方式不同: 内置任务使用平台级票据,平台之间鉴权,用户无需提供票据;其他任务则为用户级票据,一般由被调方颁发。
- 信任关系不同: 内置任务涉及三方,信任关系为 B2B2C; 其他任务只涉及两方(调方和被调方),信任关系为 B2C。
- 调用方式不同: 内置任务只能声明式调用,其他任务则可以直接命令式调用。
使用方式
通过 Job 中 type 属性,指定内置任务类型。通过 options 或 optionsFrom 参数,指定内置任务的参数。
实例:
master:
push:
- stages:
- name: trigger
type: coding-ci:apply
options:
configFrom: ./test/.coding-ci.yml
event: api_trigger_test
内置任务列表
目前支持的内置任务有:
coding-ci:apply
在当前 Git 仓库,触发指定事件流水线。
适用事件
- push
- branch.create
- tag_push
- api_trigger
参数
config
- type:
String - required:
false
指定流水线配置内容。
configFrom
- type:
String - required:
false
指定一个 本地文件 或 Coding Git 文件作为配置文件。
按以下顺序依次取值,取到为止:
configconfigFrom- 当前仓库
.coding-ci.yml
event
- type:
String - required:
false - default:
api_trigger
要执行的自定义事件名,必须为 api_trigger 或以 api_trigger_ 开头。
env
- type:
Object - required:
false
指定触发目标仓库流水线时的环境变量。
默认值情况下,当前Job可见的环境内置任务,都会传递给新的流水线。
同时默认会有如下环境变量,用户无法覆盖:
-
API_TRIGGER_REPO_SLUG,含义同 CI 默认环境变量中的CODING_REPO_SLUG -
API_TRIGGER_REPO_ID,含义同 CI 默认环境变量中的CODING_REPO_ID -
API_TRIGGER_USER,含义同 CI 默认环境变量中的CODING_BUILD_USER -
API_TRIGGER_BRANCH,含义同 CI 默认环境变量中的CODING_BRANCH -
API_TRIGGER_COMMIT,含义同 CI 默认环境变量中的CODING_COMMIT -
API_TRIGGER_COMMIT_SHORT,含义同 CI 默认环境变量中的CODING_COMMIT_SHORT
sync
- type:
Boolean - required:
false - default:
false
是否等待本次 apply 流水线执行成功,再执行下一个任务。
continueOnBuildError
- type:
Boolean - required:
false - default:
false
sync:true下,触发的流水线构建失败时,是否继续执行下个任务。
ignoreGitStatus
- type:
Boolean - required:
false - default:
false
是否忽略设置 git status。
忽略后流水线将不会出现在 commit checks 中。
输出结果
{
"code": 0,
"success": true, // 是否成功触发构建
"message": "success",
"data": {
"sn": "coding-ci-60-1547175336738"
},
"buildSuccess": true, // 触发的构建是否成功,此key仅在同步模式下存在
"lastJobExports": {}, // 触发的流水线最后一个job导出的环境变量
}
示例:
master:
push:
- stages:
- name: trigger
type: coding-ci:apply
options:
config: |
master:
api_trigger_test:
- stages:
- name: test
script: echo test
event: api_trigger_test
master:
push:
- stages:
- name: trigger
type: coding-ci:apply
options:
configFrom: ./test/.coding-ci.yml
event: api_trigger_test
master:
push:
- stages:
- name: trigger
type: coding-ci:apply
options:
# 执行当前配置文件的其它事件
event: api_trigger_test
api_trigger_test:
- stages:
- name: test
script: echo test
coding-ci:trigger
在当前仓库中,触发另外一个仓库的自定义事件流水线。
适用事件
ALL
参数
token
- type:
String - required:
true
访问令牌。用于判断是否有目标仓库的权限。
slug
- type:
String - required:
true
目标仓库的完整路径,如:team/group/repo。
event
- type:
String - required:
true
触发的自定义事件名,必须是 api_trigger 或 以api_trigger_ 开头。
需要目标仓库配置了对应事件的流水线,才可以触发。
branch
- type:
String - required:
false
触发分支。默认为默认分支。
targetRef
- type:
String - required:
false
预合并分支。默认为空
env
- type:
Object - required:
false
指定触发目标仓库流水线时的环境变量。
同时默认会有如下环境变量,用户无法覆盖:
-
API_TRIGGER_REPO_SLUG,含义同 CI 默认环境变量中的CODING_REPO_SLUG -
API_TRIGGER_REPO_ID,含义同 CI 默认环境变量中的CODING_REPO_ID -
API_TRIGGER_USER,含义同 CI 默认环境变量中的CODING_BUILD_USER -
API_TRIGGER_BRANCH,含义同 CI 默认环境变量中的CODING_BRANCH -
API_TRIGGER_COMMIT,含义同 CI 默认环境变量中的CODING_COMMIT -
API_TRIGGER_COMMIT_SHORT,含义同 CI 默认环境变量中的CODING_COMMIT_SHORT
sync
- type:
Boolean - required:
false - default:
false
是否等待本次 apply 流水线执行成功,再执行下一个任务。
continueOnBuildError
- type:
Boolean - required:
false - default:
false
sync:true下,触发的流水线构建失败时,是否继续执行下个任务。
输出结果
{
"code": 0,
"success": true, // 是否成功触发构建
"message": "success",
"data": {
"sn": "coding-ci-60-1547175336738"
},
"buildSuccess": true, // 触发的构建是否成功,此key仅在同步模式下存在
"lastJobExports": {}, // 触发的流水线最后一个job导出的环境变量
}
配置示例
在当前仓库触发一个项目 master 分支的事件名为 api_trigger_test 的流水线。
该流水线配置文件使用项目 master 分支的 .coding-ci.yml 文件。
使用 $CODING_TOKEN 查询用户是否有项目权限。
master:
push:
- stages:
- name: trigger
type: coding-ci:trigger
imports: https://xxx/envs
options:
token: $CODING_TOKEN
slug: team/project/reop
branch: master
event: api_trigger_test
coding-ci:await & resolve
对应以下两个内置任务:
-
coding-ci:await -
coding-ci:resolve
用于将多个 pipeline 相互配合,以达到跨 pipeline 、跨机器、跨集群(pipeline.runner)构建的效果。
await 会等待 resolve 的执行,执行 resolve 的 pipeline 可以向匹配的 await pipeline 传递变量或文件。
TIP
await-resolve同apply、trigger的区别:
前者指一个 pipeline 触发新事件,开启新的构建。
后者指一个构建中某 pipeline 执行到 await 任务时等待对应 key 的 resolve 通知才会继续进行。
适用事件
ALL
await 参数
key
- type:
String - required:
true
配对 Key
resolve 参数
key
- type:
String - required:
true
配对 Key
dist
- type:
String - required:
false
要传递的文件目录。
相对工作区,该目录下的文件都会被传递。
比如:dist: /xxx/ 可以把 /xxx/** 下的文件做为传递对象。
data
- type:
Object - required:
false
指定要传递的变量
key:value 格式,支持多级。示例:
- name: resolve a json
type: coding-ci:resolve
options:
key: demo
data:
a: 1
b:
c: 2
await 任务的结果,是 resolve 声明的 data 对象。
可以通过 exports 访问这个对象,示例:
- name: await a json
type: coding-ci:await
options:
key: demo
exports:
a: VAR_A
b.c: VAR_B
- name: show var
script:
- echo ${VAR_A} # 1
- echo ${VAR_B} # 2
当然,也可以不传送任务内容,仅仅表示一个等待动作:
- name: ready
type: coding-ci:resolve
options:
key: i-am-ready
- name: ready
type: coding-ci:await
options:
key: i-am-ready
输出结果
{
// resolve 返回的 data 内容
"data":{}
}
使用限制
- 一个
resolve或await任务仅能关联一个key - 一个
key仅能关联一个resolve任务,但可以关联0或多个await任务
死锁检测
await 和 resolve 相互配合可以完成灵活的流程控制,但也会引入更复杂的边界情况,比如:
pipeline-1和pipeline-2相互await,即:死锁- 多条
pipeline间存在await环,即:间接死锁 await一个不存在的key,或者key没有关联resolve,即:无限等待resolve所在pipeline执行失败,对应的await陷入无限等待- 多个
resolve任务关联同一个key,即抛出异常 死锁检测机制会自动检测以上异常,结束await的等待状态,抛出dead lock found. 异常。
await 和 resolve 的在配置文件中顺序不影响运行结果,即最后 await 任务一定是会等待相应的 resolve 完成,这种情况不会被死锁检测机制终止。
配置样例
- 传送文件
master:
push:
- runner:
tags: amd64
stages:
- name: hello
script:
- echo hello
- mkdir ./files/
- touch ./files/file1
- touch ./files/file2
- name: resolve files
type: coding-ci:resolve
options:
key: you-nide-kuaidi
dist: files
- runner:
tags: arm
stages:
- name: hello
script: echo hello
- name: await the file
type: coding-ci:await
options:
key: you-nide-kuaidi
- name: show files
script: ls -l files
docker:cache
构建一个Docker镜像中,在未来的构建中重复使用。
可以避免网络资源如 依赖包 重复下载。
适用事件
ALL
参数
dockerfile
- type:
String - required:
true
用于构建缓存镜像的 Dockerfile 路径。
by
- type:
Array|String - required:
false
用来声明缓存构建过程中依赖的文件列表。
注意:未出现在 by 列表中的文件,除了 dockerfile,其他在构建缓存镜像过程中,都当不存在处理。
- 支持数组格式
- 支持字符串格式,多个文件用英文逗号分隔。
byFromFile
- type:
String - required:
false
从指定本地文件中读取列表,一行一个文件名,作用同 by。byFromFile 比 by 优先级更高。
versionBy
- type:
Array - required:
false
用来进行版本控制,未传入 versionBy,则默认取 by 或 byFromFile 的值进行版本控制。
versionBy 所指向的文件内容发生变化,我们就会认为是一个新的版本,具体的计算逻辑见这个表达式:md5(dockerfile + versionBy + buildArgs)
buildArgs
- type:
Object - required:
false
在 docker build 时插入额外的构建参数 (--build-arg $key=$value), value 值为 null 时只加入 key (--build-arg $key)
target
- type:
String - required:
false
对应 docker build 的--target参数, 用于将Dockerfile中某个镜像作为缓存。
sync
- type:
Boolean - required:
false - default:
true
同步模式,是否等待 docker push 成功后才继续。
ignoreBuildArgsInVersion
- type:
Boolean - required:
false - default:
false
版本计算是否忽略buildArgs。详见版本控制。
输出结果
{
// 缓存对应的 docker image name
"name":"docker-cache:xxx"
}
配置示例
master:
push:
- docker:
image: node:12
stages:
- name: build cache image
type: docker:cache
options:
dockerfile: cache.dockerfile
# by 支持以下两种形式:数组、字符串
by:
- package.json
- package-lock.json
# by: package.json,package-lock.json
versionBy:
- package-lock.json
exports:
name: DOCKER_CACHE_IMAGE_NAME
- name: use cache
image: $DOCKER_CACHE_IMAGE_NAME
commands:
- cp -r "$NODE_PATH" ./node_modules
- name: build with cache
script:
- npm run build
其中,cache.dockerfile 是一个用于构建缓存的 Dockerfile 。示例:
# 选择一个 Base 镜像
FROM node:12
# 设置工作目录
WORKDIR /space
# 将 by 中的文件列表 COPY 过来
COPY . .
# 根据 COPY 过来的文件进行依赖的安装
RUN npm ci
# 设置好需要的环境变量
ENV NODE_PATH=/space/node_modules
vscode:go
启动远程开发服务
适用事件
- branch.create
- api_trigger
参数
keepAliveTimeout
- type:
Number - required:
false - default:
300000
工作区 keepAlive 超时,单位毫秒。最大值不得超过 12 个小时。
输出结果
{
// 远程开发地址,如需在vscode:go任务前获取远程开发地址,可直接使用`VSCODE_WEB_URL`环境变量
"url":""
}
配置示例
使用 Dockerfile 自定义开发环境,并安装 code-server。
code-server 官方文档:
#.tide/Dockerfile
FROM node:14
# install code-server and vscode extension
RUN curl -fsSL https://code-server.dev/install.sh | sh &&\
code-server --install-extension redhat.vscode-yaml &&\
code-server --install-extension orta.vscode-jest &&\
code-server --install-extension dbaeumer.vscode-eslint &&\
code-server --install-extension eamodio.gitlens &&\
echo done
# 安装 zsh 并替换 sh(非必需,如有问题可去掉)
RUN apt-get update &&\
apt install -y zsh &&\
ln -sf /bin/zsh /bin/sh
# 指定字符集支持命令行输入中文(根据需要选择字符集)
ENV LC_ALL C.UTF-8
ENV LANG C.UTF-8
ENV LANGUAGE C.UTF-8
声明开发环境创建时机和其它准备工作:
#.coding-ci.yml
(**):
branch.create:
- name: vscode
services:
- vscode
docker:
build: .tide/Dockerfile
wework:
title: 远程开发
stages:
- name: ready
type: vscode:go
更多内容详见:
2023-02-21最近更新在阅读中是否遇到以下问题?*
您希望我们如何改进?*
如果您希望得到回复,请留下您的邮箱地址。