1. 程式人生 > 其它 >案例 | 如何以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 <[email protected]>
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過程。通過持續向團隊提供及時反饋,讓交付過程高效順暢。