阿里云云效创建企业自定义步骤,增强个性化需求。
云效飞流作为新一代的持续交付流水线平台,内置了很多好用的步骤组件。可是,每年都有很多新的工具和框架涌现出来,飞流不可能内置所有这些框架和工具的支持。这个时候,作为企业用户的我们该怎么办呢? 幸运的是,飞流在设计时考虑到了这个问题,提供了非常方便好用的flow cli工具。
demo:https://github.com/GeekSRE/ali-flow-step-robotframework.git
安装
在flow cli的帮助页面有提供各个平台的flow工具下载,根据你的系统情况选择对应的链接下载即可。笔者在mac上进行开发,所以下载的是darwin/amd64的版本。下载下来之后,建议将其重命名为flow,并放到系统PATH里面,比如/usr/local/bin。
创建
在创建具体的step之前,建议先执行flow login进行用户权限认证。 认证通过后,执行flow step init <步骤名>创建一个新的step,如:
1 | flow step init robotframework |
配置step.yaml
首先,我们来配置step.yaml文件,这里只列出需要关注的字段。
- name: 步骤名称,显示在飞流界面上
- **sign: **唯一的step签名,一般不用修改
- **image: **根据step的Dockerfile构建的镜像名,要求能够被public地docker pull,而且必须要有tag
- **items: **步骤的配置项,可以配置多个
- 普通配置项
- label: 配置项的标签名
- name: 变量名,会被export为环境变量
- type: 为shell、input、password、textarea、shell、select、text_label、checkbox中的一个,参照步骤yaml描述语言。
- rules: 输入规则
- 红线配置
- 普通配置项
示例如下:
1 |
|
通常只需要关注datamap字段,这里的key是红线判断的字段,必须与step.sh里面redline的参数中的字段对应。
编写step.sh
具体的执行步骤在step.sh中定义,前半部分的变量定义不需要修改。
- 根据用户输入执行命令,robotframework这个例子中是“bash -c “$STEP_COMMAND””,这里的STEP_COMMAND在step.yaml里面定义
- 如果有红线配置,通过redline命令进行显示,其每个参数的格式为key:text:value:style。
示例如下:
1 |
|
编写Dockerfile
注意:基础镜像不能为alpine,同时要安装有bash和jq。 建议采用debian作为基础镜像,确保.step/*.sh被拷贝到/root/目录下,并且保持ENTRYPOINT为”/root/entry.sh”。
依赖安装
以Ubuntu/Debian Linux系统为例,需要安装:
- python3
- xvfb
- robotframework
- robotframework-selenium2library
- pyvirtualdisplay
- chromedriver和chrome浏览器
示例:
1 | FROM registry.cn-beijing.aliyuncs.com/rdc-builds/base:1.0 |
保存和显示结果报告
飞流提供了报告上传的步骤,在自定义步骤之后加上报告上传步骤即可上传和显示结果报告,非常方便,见下面使用部分。
本地调试
在robotframework目录下执行flow step run即可在本地进行运行调试。 按照提示设置WORK_SPACE和两个变量,这些会保存在robotframework目录下的params.env文件中,你也可以手动编辑该文件。 示例:
1 | STEP_COMMAND='robot -d robot_logs .' |
执行flow step run,如果最后的执行结果显示“SUCCESS”,则步骤执行成功。
发布
通过flow step publish即可将步骤发布到选择的企业中。 发布前,需要确保:
- 如果之前没有登录过或是长时间未登录,重新执行flow login
- 发布的过程会将docker镜像上传到step.yaml文件定义的地址,确保有对应docker仓库的上传权限
- 在飞流步骤中使用,该镜像要能被匿名下载访问,请配置正确的镜像访问权限
使用
- 编辑流水线,添加一个空白任务
- 添加自定义步骤,如“RobotFramework测试”,配置红线
- 添加上传报告步骤
- 保存,运行流水线
适用场景
自定义flow step适用于很多场景,常见的有:
- 支持特定语言的构建
当前飞流支持的语言有Java、Python、Go、Javascript等,如果企业使用其他的开发语言,则可以通过自定义flow step的方式创建自己的构建步骤。同时,还可以使用自己优化过的SDK、内部工具等提升效率。
- 支持特定的代码扫描工具,并进行红线卡点
代码扫描工具千差万别,无法全部支持,特别是企业会对工具进行二次开发,导致无法在飞流中使用。这种情况下,创建自己的flow step就可以非常好地解决这个问题。
- 支持特定的测试框架或工具
测试可能是创建自定义flow step最主要的一类需求,很多企业或团队有自己的测试工具和框架,很难用飞流现有的组件组装,同时,在红线上侧重点也不同。以单元测试覆盖率为例,有的团队关注行覆盖率,有的更看重条件覆盖率等等。此时,通过自定义flow step就可以满足各类团队的测试需求。
- 与企业自研系统对接
最常见的可能是发布部署的时候,很多企业有自己的发布流程管控系统,逻辑一般比较复杂,通过脚本很难处理和维护。而通过flow step就容易多了,可以在里面使用自研的工具和脚本,集成起来非常方便。
FAQ
- 在飞流上执行自定义步骤时遇到“jq: command not found” > 检查你的Dockerfile文件,确保基于Dockerfile构建的镜像中包含jq命令,如果没有的话,从jq官网下载适合的版本,在Dockerfile里面添加拷贝jq的步骤,如:
1 | COPY robotframework/jq /usr/bin/ |
“flow step publish”的时候出现“panic: invalid character ‘<’ looking for beginning of value”错误
可能是登录信息过期了,重新执行flow login,再执行flow step publish
“flow step run”的时候出现“redline: command not found”
查看step.sh的第一行,如果是“#!/bin/sh”,改成“#!/bin/bash”再试一下。 如果还有问题,在flow step目录的父目录再次执行flow step init,再重试。如flow step目录名为robotframework,就在它的父目录下执行flow init,再cd robotframework; flow step run
“flow step publish”的时候提示“Step sign 已被占用”
一个flow step只能publish到一个企业中,如果已经publish到A企业,再publish到B企业就会有这个问题。可以修改step.yaml文件里面的sign,再次尝试publish。
在飞流上执行自定义步骤时遇到“standard_init_linux.go:211: exec user process caused “no such file or directory””
Dockerfile里的基础镜像不能基于alpine,改为采用debian等作为基础镜像
在自定义步骤上配置了红线,但是无论是否满足红线,步骤总是成功
检查字段的数据必须是整数,如果是浮点数,会出现判断问题。 之后检查执行日志,在日志的最后看是否有类似:
[07:41:25] [10_1582788661882__10_1582788671425] REDLINE_ITEM_LINE: {"key":"PassRate","threshold":100,"checkVal":50.00,"type":"GE","checked":true,"checkResult":false}
这样的输出,有这个输出才表示进行了红线卡点。在飞流上执行自定义步骤时报“运行失败,请检查日志”
红线检查前的执行步骤必须是成功的,如果命令执行出错,则后面的步骤不会生效。如: robot atest 修改为 robot atest || echo “got error!”