云效Flow中一个流水线运行的镜像被称为一个“步骤”,步骤是有一段描述 yaml 和一个 docker 镜像组成的一个最小运行单元,云效流水线 Flow中CLI 工具作为自定义步骤的进阶,以 Sonar 为例创建一个用于测试/扫描的步骤,并开放给所有企业。
准备
一个公网可访问的 Sonar 服务。
一个用于测试的代码库,以 maven 项目为例,确保 pom 文件中引入了 sonar 插件:
org.sonarsource.scanner.maven
sonar-maven-plugin
3.4.0.905
本地开发
参照Flow cli搭建好开发环境,初始化一个步骤:
flow step init sonar-qubeBash
sona-qubeBash 目录下会有三个文件
Dockerfile 用于构建步骤镜像,Dockerfile 中的基础镜像为云效提供的基础镜像,里面已经内置了一些软件,尽量不要更改基础镜像,如需更改基础镜像,请确保新的基础镜像中安装了jq.
step.sh 为在步骤中执行的脚本
step.yaml 用户描述步骤信息
前端
编辑sonar-qube文件夹下面的step.yaml:
注意:image 需要改成用户自己的镜像地址,且必须为公开pull权限
---
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 文件夹下执行:
flow step valid
没有任何输出表示校验通过。
后端
编辑Dockerfile:
FROM registry.cn-beijing.aliyuncs.com/rdc-builds/oracle-jdk:1.8
MAINTAINER jintang
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:
#!/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: 灰色)
STATE_URL___REPORT为报告链接,在前端显示为报告按钮,点击调整到值对应的 Url。
redline 这个方法主要作用是将输入结构简单化,并会自动解析红线。以空格为分隔,每段字符包含