0%

Flow cli 扩展云效测试自动化能力--robotframework web UI

阿里云云效创建企业自定义步骤,增强个性化需求。

云效飞流作为新一代的持续交付流水线平台,内置了很多好用的步骤组件。可是,每年都有很多新的工具和框架涌现出来,飞流不可能内置所有这些框架和工具的支持。这个时候,作为企业用户的我们该怎么办呢? 幸运的是,飞流在设计时考虑到了这个问题,提供了非常方便好用的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
2
3
4
flow step init robotframework
ls -la # 可以看到多出了.step和robotframework目录
cd robotframework # 我们自定义step的工作区就在这个目录,之后run和publish的操作都要在这个目录下执行
ls -la # 可以看到里面包含Dockerfile、step.sh和step.yaml几个文件

配置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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
---
name: vcg-robotframework
sign: vcg-robotframework
description: vcg-robotframework
image: registry.cn-beijing.aliyuncs.com/vcg-open/robotframework:1.0
items:
- label: 执行命令
name: STEP_COMMAND
type: shell
value: |
# NOTE: output directory should be robot_logs
robot -L Trace -d robot_logs .
- label: 红线信息
name: CHECK_REDLINES
type: addable_group
rules:
- require: false
add_button:
type: icon
icon: plus
text: 增加红线
tip:
icon: question-circle
description: 红线校验失败步骤标记为失败
template:
items:
- name: redline
label: 红线
position: flat
type: custom_redline_dropdown
datamap: '[{"key": "PassRate", "type":"GE"}]'
rules:
-requires: false

通常只需要关注datamap字段,这里的key是红线判断的字段,必须与step.sh里面redline的参数中的字段对应。

编写step.sh

具体的执行步骤在step.sh中定义,前半部分的变量定义不需要修改。

  1. 根据用户输入执行命令,robotframework这个例子中是“bash -c “$STEP_COMMAND””,这里的STEP_COMMAND在step.yaml里面定义
  2. 如果有红线配置,通过redline命令进行显示,其每个参数的格式为key:text:value:style。

示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/bash
set -e

# 系统提供参数,从流水线上下文获取
echo [INFO] PIPELINE_ID=$PIPELINE_ID # 流水线ID
echo [INFO] PIPELINE_NAME=$PIPELINE_NAME # 流水线名称
echo [INFO] BUILD_NUMBER=$BUILD_NUMBER # 流水线运行实例编号
echo [INFO] EMPLOYEE_ID=$EMPLOYEE_ID # 触发流水线用户ID
echo [INFO] WORK_SPACE=$WORK_SPACE # /root/workspace容器中目录
echo [INFO] PROJECT_DIR=$PROJECT_DIR # 代码库根路径,默认为/root/workspace/code
echo [INFO] PLUGIN_DIR=$PLUGIN_DIR # 插件路径,默认为/root/workspace/plugins
echo [INFO] BUILD_JOB_ID=$BUILD_JOB_ID # build-service 任务ID

# custom variable
OUTPUT_DIR="$PROJECT_DIR/robot_logs"
OUTPUT_XML="$OUTPUT_DIR/output.xml"
echo [INFO] OUTPUT_XML=$OUTPUT_XML

cd $PROJECT_DIR

# sh -ex $WORK_SPACE/user_command.sh
bash -c "$STEP_COMMAND"

output=`python3 /root/parse_output.py $OUTPUT_XML`

STEP_ROBOT_PASS=`echo $output | awk -F, '{print $1}'`
STEP_ROBOT_FAILED=`echo $output | awk -F, '{print $2}'`
STEP_ROBOT_PASSRATE=`echo $output | awk -F, '{print $3}'`

redline Passed:成功:$STEP_ROBOT_PASS:Success Failed:失败:$STEP_ROBOT_FAILED:Error PassRate:成功率:$STEP_ROBOT_PASSRATE:Default

编写Dockerfile

注意:基础镜像不能为alpine,同时要安装有bash和jq。 建议采用debian作为基础镜像,确保.step/*.sh被拷贝到/root/目录下,并且保持ENTRYPOINT为”/root/entry.sh”。

依赖安装

以Ubuntu/Debian Linux系统为例,需要安装:

  • python3
  • xvfb
  • robotframework
  • robotframework-selenium2library
  • pyvirtualdisplay
  • chromedriver和chrome浏览器

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
FROM registry.cn-beijing.aliyuncs.com/rdc-builds/base:1.0
#FROM ubuntu:18.04

COPY .step/*.sh /root/
COPY robotframework/step.sh /root/step.sh
COPY robotframework/parse_output.py /root/parse_output.py
COPY robotframework/jq /usr/bin/

RUN sed -i -E 's/[a-z]+.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list &&\
apt-get update && apt-get install -y python3 xvfb python3 python3-pip xvfb unzip wget &&\
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb &&\
apt-get install ./google-chrome-stable_current_amd64.deb -y && rm -f google-chrome-stable_current_amd64.deb &&\
wget http://npm.taobao.org/mirrors/chromedriver/87.0.4280.88/chromedriver_linux64.zip && unzip chromedriver_linux64.zip && mv chromedriver /usr/bin && rm -f chromedriver_linux64.zip &&\
pip3 install -i https://pypi.douban.com/simple --no-cache-dir robotframework robotframework-selenium2library pyvirtualdisplay
RUN apt-get install -y curl language-pack-zh-hans fonts-droid-fallback ttf-wqy-zenhei ttf-wqy-microhei fonts-arphic-ukai fonts-arphic-uming && \
echo "LANG=\"zh_CN.UTF-8\"" >> /etc/environment && \
echo "LANGUAGE=\"zh_CN:zh:en_US:en\"" >> /etc/environment && \
echo "en_US.UTF-8 UTF-8" >> /var/lib/locales/supported.d/local && \
echo "zh_CN.UTF-8 UTF-8" >> /var/lib/locales/supported.d/local && \
echo "zh_CN.GBK GBK" >> /var/lib/locales/supported.d/local && \
echo "zh_CN GB2312" >> /var/lib/locales/supported.d/local

RUN locale-gen && echo "export LANG=C.UTF-8" >> /etc/profile
RUN chmod +x /root/*.sh

ENTRYPOINT [ "/root/entry.sh"]

保存和显示结果报告

飞流提供了报告上传的步骤,在自定义步骤之后加上报告上传步骤即可上传和显示结果报告,非常方便,见下面使用部分。

本地调试

在robotframework目录下执行flow step run即可在本地进行运行调试。 按照提示设置WORK_SPACE和两个变量,这些会保存在robotframework目录下的params.env文件中,你也可以手动编辑该文件。 示例:

1
2
3
STEP_COMMAND='robot -d robot_logs .'
CHECK_REDLINES='[{\"identifier\":\"10_1581409320500__10_1581421770772__CHECK_REDLINES__0\",\"key\":\"PassRate\",\"type\:\"GE\"}]'
WORK_SPACE='/Users/zhaohongye/yunxiao/robotframework' # 根据自己实际路径填写

执行flow step run,如果最后的执行结果显示“SUCCESS”,则步骤执行成功。

发布

通过flow step publish即可将步骤发布到选择的企业中。 发布前,需要确保:

  1. 如果之前没有登录过或是长时间未登录,重新执行flow login
  2. 发布的过程会将docker镜像上传到step.yaml文件定义的地址,确保有对应docker仓库的上传权限
  3. 在飞流步骤中使用,该镜像要能被匿名下载访问,请配置正确的镜像访问权限

使用

  1. 编辑流水线,添加一个空白任务

  1. 添加自定义步骤,如“RobotFramework测试”,配置红线

  1. 添加上传报告步骤

  1. 保存,运行流水线

create step 4

适用场景

自定义flow step适用于很多场景,常见的有:

  1. 支持特定语言的构建

当前飞流支持的语言有Java、Python、Go、Javascript等,如果企业使用其他的开发语言,则可以通过自定义flow step的方式创建自己的构建步骤。同时,还可以使用自己优化过的SDK、内部工具等提升效率。

  1. 支持特定的代码扫描工具,并进行红线卡点

代码扫描工具千差万别,无法全部支持,特别是企业会对工具进行二次开发,导致无法在飞流中使用。这种情况下,创建自己的flow step就可以非常好地解决这个问题。

  1. 支持特定的测试框架或工具

测试可能是创建自定义flow step最主要的一类需求,很多企业或团队有自己的测试工具和框架,很难用飞流现有的组件组装,同时,在红线上侧重点也不同。以单元测试覆盖率为例,有的团队关注行覆盖率,有的更看重条件覆盖率等等。此时,通过自定义flow step就可以满足各类团队的测试需求。

  1. 与企业自研系统对接

最常见的可能是发布部署的时候,很多企业有自己的发布流程管控系统,逻辑一般比较复杂,通过脚本很难处理和维护。而通过flow step就容易多了,可以在里面使用自研的工具和脚本,集成起来非常方便。

FAQ

  1. 在飞流上执行自定义步骤时遇到“jq: command not found” > 检查你的Dockerfile文件,确保基于Dockerfile构建的镜像中包含jq命令,如果没有的话,从jq官网下载适合的版本,在Dockerfile里面添加拷贝jq的步骤,如:
1
COPY robotframework/jq /usr/bin/
  1. “flow step publish”的时候出现“panic: invalid character ‘<’ looking for beginning of value”错误

    可能是登录信息过期了,重新执行flow login,再执行flow step publish

  2. “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

  3. “flow step publish”的时候提示“Step sign 已被占用”

    一个flow step只能publish到一个企业中,如果已经publish到A企业,再publish到B企业就会有这个问题。可以修改step.yaml文件里面的sign,再次尝试publish。

  4. 在飞流上执行自定义步骤时遇到“standard_init_linux.go:211: exec user process caused “no such file or directory””

    Dockerfile里的基础镜像不能基于alpine,改为采用debian等作为基础镜像

  5. 在自定义步骤上配置了红线,但是无论是否满足红线,步骤总是成功

    检查字段的数据必须是整数,如果是浮点数,会出现判断问题。 之后检查执行日志,在日志的最后看是否有类似: [07:41:25] [10_1582788661882__10_1582788671425] REDLINE_ITEM_LINE: {"key":"PassRate","threshold":100,"checkVal":50.00,"type":"GE","checked":true,"checkResult":false} 这样的输出,有这个输出才表示进行了红线卡点。

  6. 在飞流上执行自定义步骤时报“运行失败,请检查日志”

    红线检查前的执行步骤必须是成功的,如果命令执行出错,则后面的步骤不会生效。如: robot atest 修改为 robot atest || echo “got error!”