ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

案例 | 如何以Sonar为例创建一个适用与所有企业的测试步骤

2021-10-09 17:34:43  阅读:178  来源: 互联网

标签:INFO 为例 步骤 测试步骤 step SONAR STEP Sonar sonar


云效Flow中一个流水线运行的镜像被称为一个“步骤”,步骤是有一段描述 yaml 和一个 docker 镜像组成的一个最小运行单元,云效流水线 Flow中CLI 工具作为自定义步骤的进阶,以 Sonar 为例创建一个用于测试/扫描的步骤,并开放给所有企业。  

准备

  • 一个公网可访问的 Sonar 服务。
  • 一个用于测试的代码库,以 maven 项目为例,确保 pom 文件中引入了 sonar 插件:
<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搭建好开发环境,初始化一个步骤:

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 <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

 

#!/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 这个方法主要作用是将输入结构简单化,并会自动解析红线。以空格为分隔,每段字符包含<key>:<name>:<value>:<style> ,报告格式为: Report:<url>。   如果想上传本地文件生成报告链接,可以在自定义步骤后追加“报告上传”步骤。  

本地运行

步骤的本质是一个容器镜像,因此可以在本地运行,flow cli 帮助在本地模拟一个和流水线上运行相似的环境,包括挂载代码路径、缓存以及一些流水线上下文环境变量。在sonar-qube文件夹下执行:
flow step runBash

  

输入STEP_SONAR_HOSTCHECK_REDLINESworkspace三个变量,步骤即可在本地运行。

CHECK_REDLINES 举例:

[{\"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文件夹下执行:

flow step publishBash

该命令会执行 docker build, docker push 两个命令以发布步骤镜像,同时将步骤信息(yaml)同步到企业下的步骤列表。执行以下命令查看列表

 
flow step lsPlain Text

 

同时进入企业流水线编辑页面,可以在添加步骤->自定义步骤中看到 SonarQube 这个步骤。

 

 

 

 这个步骤可以和系统提供的其他步骤一样使用:

 

 

跨企业共享步骤

开放步骤给所有 Flow 的企业,在sonar-cube所在目录下执行:

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 字段决定:

 

 

云效流水线 Flow中CLI 工具作为自定义步骤的进阶,以 Sonar 为例创建一个用于测试/扫描的步骤,并开放给所有企业。云效Flow企业级持续集成和持续交付工具,通过构建自动化、集成自动化、验证自动化、部署自动化,完成从开发到上线CICD过程。通过持续向团队提供及时反馈,让交付过程高效顺畅。

  

标签:INFO,为例,步骤,测试步骤,step,SONAR,STEP,Sonar,sonar
来源: https://www.cnblogs.com/yyds114/p/15386834.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有