案例 | 如何以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: 灰色)
本地執行
步驟的本質是一個容器映象,因此可以在本地執行,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過程。通過持續向團隊提供及時反饋,讓交付過程高效順暢。