共计 5187 个字符,预计需要花费 13 分钟才能阅读完成。
云效 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_HOST,CHECK_REDLINES 和 workspace 三个变量,步骤即可在本地运行。
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 过程。通过继续向团队提供及时反馈,让交付过程高效顺畅。