案例 | 如何以Sonar为例创建一个适用与所有企业的测试步骤
准备
-
一个公网可访问的 Sonar 服务。
-
一个用于测试的代码库,以 maven 项目为例,确保 pom 文件中引入了 sonar 插件:
1 2 3 4 5 6 7 8 9 10 11 | <build> <pluginManagement> <plugins> <plugin> <groupId>org.sonarsource.scanner.maven</groupId> <artifactId>sonar-maven-plugin</artifactId> <version>3.4.0.905</version> </plugin> </plugins> </pluginManagement> </build> |
本地开发
参照Flow cli搭建好开发环境,初始化一个步骤:
1 | flow step init sonar-qubeBash |
sona-qubeBash 目录下会有三个文件
Dockerfile 用于构建步骤镜像,Dockerfile 中的基础镜像为云效提供的基础镜像,里面已经内置了一些软件,尽量不要更改基础镜像,如需更改基础镜像,请确保新的基础镜像中安装了jq.
step.sh 为在步骤中执行的脚本
step.yaml 用户描述步骤信息
前端
1 2 3 4 5 6 7 8 9 10 | --- name: SonarQube(预发) sign: sonar-qube-staging description: SonarQube用于测试公开步骤 category: 静态扫描 image: registry.cn-beijing.aliyuncs.com/build-steps/sonar-qube-staging:1.0 items: - label: Sonar服务器地址 name: STEP_SONAR_HOST type: input |
name 用于定义步骤名称
sign 步骤唯一标识,全局唯一
category 步骤分类
image 步骤镜像地址,image 需要改成用户自己的镜像地址,且必须为公开pull权限
items: 步骤语言描述 请参考步骤语言Yaml描述。
校验 Yaml,在 sonar-qube 文件夹下执行:
1 | flow step valid |
没有任何输出表示校验通过。
后端
编辑Dockerfile
:
1 2 3 4 5 | FROM registry.cn-beijing.aliyuncs.com/rdc-builds/oracle-jdk:1.8 MAINTAINER jintang <yidong.dyd@alibaba-inc.com> COPY .step/*.sh /root/COPY sonar-qube/step.sh /root/step.sh RUN chmod +x /root/*.sh ENTRYPOINT [ "/root/entry.sh" ] |
请确保基础镜像中已经安装jq。
编辑sonar-qube
文件夹下面的step.sh
:
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 | #!/bin/bash set -e export SONAR_INFO=$WORK_SPACE/sonar_info.json # 系统提供参数,从流水线上下文获取 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 cd $PROJECT_DIR mvn install -DskipTests mvn sonar:sonar -Dsonar.host.url=$STEP_SONAR_HOST STEP_PROJECT_GROUP_ID=`mvn -q -Dexec.executable=echo -Dexec.args= '${project.groupId}' --non-recursive exec:exec 2>/dev/ null ` STEP_PROJECT_ARTIFACT_ID=`mvn -q -Dexec.executable=echo -Dexec.args= '${project.artifactId}' --non-recursive exec:exec 2>/dev/ null ` curl $STEP_SONAR_HOST/api/measures/search\?projectKeys\=$STEP_PROJECT_GROUP_ID%3A$STEP_PROJECT_ARTIFACT_ID\&metricKeys\=alert_status%2Cbugs%2Creliability_rating%2Cvulnerabilities%2Csecurity_rating%2Ccode_smells%2Csqale_rating%2Cduplicated_lines_density%2Ccoverage%2Cncloc%2Cncloc_language_distribution > $SONAR_INFO STEP_SONAR_BUGS=`jq -r '.measures[] | select(.metric == "bugs") | .value' $SONAR_INFO` STEP_SONAR_VULNERABILITIES=`jq -r '.measures[] | select(.metric == "vulnerabilities") | .value' $SONAR_INFO` STEP_SONAR_SMELLS=`jq -r '.measures[] | select(.metric == "code_smells") | .value' $SONAR_INFO` STEP_SONAR_COVERAGE=`jq -r '.measures[] | select(.metric == "coverage") | .value' $SONAR_INFO` redline Bugs:缺陷:$STEP_SONAR_BUGS:Error Vulnerabilities:漏洞:$STEP_SONAR_VULNERABILITIES:Warning Smells:坏味道:$STEP_SONAR_SMELLS:Warning Coverage:覆盖率:$STEP_SONAR_COVERAGE:Default Report:$STEP_SONAR_HOST/dashboard?id=$STEP_PROJECT_GROUP_ID%3A$STEP_PROJECT_ARTIFACT_ID |
-
set -e 表示运行过程中遇到任何错误步骤即错误退出,随机流水线也会中断运行
-
cd $PROJECT_DIR 表示进入代码库所在路径
-
mvn install -DskipTests 安装 maven 依赖
-
mvn sonar:sonar -Dsonar.host.url=$STEP_SONAR_HOST 执行 Sonar 扫描
-
redline ... 影响前端显示,最终会在日志里形成下列输出:
-
STATE_NAME_xxx: 字段名称
-
STATE_VALUE_xxx:字段值
-
STATE_STYLE_xxx:字段样式(Error: 红色,Warning: 橙色,Default: 灰色)
本地运行
1 | flow step runBash |
输入STEP_SONAR_HOST
,CHECK_REDLINES
和workspace
三个变量,步骤即可在本地运行。
CHECK_REDLINES 举例:
1 | [{\"identifier\":\"10_1581409320500__10_1581421770772__CHECK_REDLINES__0\",\"key\":\"Bugs\",\"type\":\"LE\",\"threshold\":0},{\"identifier\":\"10_1581409320500__10_1581421770772__CHECK_REDLINES__1\",\"key\":\"Vulnerabilities\",\"type\":\"GE\",\"threshold\":2}]Bash |
identifier 为步骤唯一标识,可以是随机字符串,key 为待校验字段,type 为枚举字段,分别标识:LE: 实际值小于等于期望值;GE: 实际值大于等于期望值;EQ 实际值等于期望值;thredshold 为期望值。
你可以通过日志输出观察运行情况以及在$WORK_SPACE/params
里是否得到预期的返回。
-
这个命令会执行 docker build, docker run 两个命令以在本地运行步骤。
-
输入的参数会换存到
sonar-qube/params.env
文件内,无需每次输出。 -
多次运行 maven 依赖会缓存到本地
~/.m2
。 -
运行时输入的 workspace 对应到本地的一个绝对路径,会被 mount 到容器中 /root/workspace/code 路径下,这个路径在流水线运行时为可变路径,可以在 step.sh 中使用 $PROJECT_DIR 变量获得
企业内使用
在sonar-qube
文件夹下执行:
1 | flow step publishBash |
该命令会执行 docker build, docker push 两个命令以发布步骤镜像,同时将步骤信息(yaml)同步到企业下的步骤列表。执行以下命令查看列表
1 | flow step lsPlain Text |
同时进入企业流水线编辑页面,可以在添加步骤->自定义步骤
中看到 SonarQube 这个步骤。
这个步骤可以和系统提供的其他步骤一样使用:
跨企业共享步骤
开放步骤给所有 Flow 的企业,在sonar-cube所在目录下执行:
1 | flow step public sonar-qubeflow step lsPlain Text |
可以看到sonar-cube步骤的状态变为了PORCESSING,这个时候需要等待云效的工作人员进行人工审核,一段时间后步骤状态再次变为PRIVATE,使用命令flow step search可以查看到一个sonar-qube-<regionId>的步骤说明步骤被成功公开,如果审核不通过,会在 云效 页面右上角的通知栏里告知审核未通过原因。
步骤公开成功后得到两个步骤,一个为企业内可见的自定义步骤,sign 为sonar-qube,一个为公开步骤,sign 为sonar-qube-<regionId>,如果想要更新线上步骤,需要再执行一次flow step public,所有步骤历史版本都会保留,通过通过flow step version <sign>可以查看步骤版本,flow step get <sign> -v <version>可以查看该步骤历史版本详细信息。
sonar-qube显示在步骤编辑页中自定义步骤栏,sonar-qube-<regionId>显示类别位置由step.yaml中的 category 字段决定:
关于我们
更多关于云效DevOps的干货及云效动态,可微信搜索关注【云效】公众号~
彩蛋:公众号后台回复【指南】,可获得《阿里巴巴DevOps实践指南》&《10倍研发效能提升案例集》~
看完觉得对您有所帮助别忘记点赞、收藏和关注呦~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了