對Jenkinsfile語法說不,開源項目Jenkins Json Build挺你
項目背景
我所在的組織項目數量衆多,使用的語言和框架也不少,好比Java、ReactNative、C# .NET、Android、iOS等,部署環境也是多種多樣好比Tomcat、K8S、IIS、客戶端應用是局域網內企業證書安裝等,咱們沒有專門的配置管理員或構建部署專員,都是開發人員本身在Jenkins中寫構建腳本,每一個項目都有本身的構建腳本(Scripted Pipelines),但類型相同的項目好比都是Java或都是.NET項目之間,構建腳本其實都很相似,都是靠幾個已存在的構建腳本改寫出來的,其實開發人員對編寫Jenkins構建腳本瞭解也很少,另外由於沒有規則和約束,更沒有代碼複用的機制,構建部署工做很混亂和難以管理。java
項目解決的問題
在上述狀況下咱們開發了Jenkins-Json-Build項目,該項目適合於有一些編程經驗的人員在不須要了解Jenkins構建腳本如何編寫的狀況下,經過簡單的配置Json文件,就能夠輕鬆完成一個項目的獲取源碼、單元測試、代碼檢查、編譯構建、部署等步驟,實現一個典型的CI過程,又由於此項目使用了Jenkins共享類庫(Shared Libraries)機制,構建腳本複用率獲得了大幅度提升,而且開發人員能夠方便的擴展更多的功能,知足不一樣構建部署場景的須要,此項目很是適合那些開發人員本身管理構建部署的團隊,經過Jenkins-Json-Build項目組織對構建部署過程進行了統一的管理和監督,又讓每一個項目有足夠的靈活性和自主權知足各自項目構建部署的特殊性。git
一個Java項目構建示例
構建服務器上須要安裝的軟件
構建服務器上須要安裝Java、Maven和Sonar-Scanner(此項可選)。github
構建須要依賴的Jenkins插件
- JUnit
- JaCoCo
Jenkinsfile文件內容
由於採用pipeline script from SCM構建方式,因此用Declarative Pipeline方式在Jenkinsfile中編寫構建腳本:編程
@Library('shared-library') _ pipeline { agent any parameters { //定義構建參數 choice choices: ['-'], description: '請選擇部署方式', name: 'deploy-choice' } stages { stage('初始化') { steps { script{ //加載源碼倉庫根目錄下的jenkins-project.json構建配置文件 runWrapper.loadJSON('/jenkins-project.json') runWrapper.runSteps('初始化') } } } stage('單元測試') { steps { script{ //執行單元測試步驟 runWrapper.runSteps('單元測試') } } } stage('代碼檢查') { steps { script{ //執行代碼檢查步驟,好比SonarQube runWrapper.runSteps('代碼檢查') } } } stage('編譯構建') { steps { script{ //執行編譯步驟 runWrapper.runSteps('編譯構建') } } } stage('部署') { steps { script{ //根據選擇的部署方式執行部署步驟 runWrapper.runStepForEnv('部署','deploy-choice') } } } } }
上述Jenkinsfile文件可用於全部類型的項目構建,實際使用的時候通常還會用到如下三個Jenkins插件:json
- Agent Server Parameter Plugin 用於選擇構建的Agent服務器
- Custom Checkbox Parameter Plugin 用於選擇子項目進行構建,多用於微服務項目
- Git Parameter 用於選擇分支構建
JSON配置文件內容
{ "初始化": { "檢查Java環境": { "Type": "COMMAND_STDOUT", "Success-IndexOf": "java version \"1.8.0_211\"", "Script": { "輸出Java版本": "java -version 2>&1" } }, "檢查Maven環境": { "Type": "COMMAND_STDOUT", "Success-IndexOf": "Apache Maven 3.6.3", "Script": { "輸出Maven版本": "mvn -v" } }, "檢查SonarScanner環境": { "Type": "COMMAND_STDOUT", "Success-IndexOf": "SonarScanner 4.4.0.2170", "Script": { "輸出SonarScanner版本": "sonar-scanner -v" } }, "綁定構建參數": { "Type": "BUILD_PARAMETER_DROP_DOWN_MENU", "StepsName": "部署", "ParamName": "deploy-choice" } }, "單元測試": { "執行Maven單元測試腳本": { "Type": "COMMAND_STATUS", "Script": { "Maven單元測試": "cd ${PROJECT_PATH};mvn clean test" } }, "執行JUnit插件": { "Type": "JUNIT_PLUG_IN", "JunitReportPath": "**/${PROJECT_DIR}/**/target/**/TEST-*.xml" }, "執行Jacoco插件": { "Type": "JACOCO_PLUG_IN", "classPattern":"${PROJECT_PATH}/target/classes", "InclusionPattern":"${PROJECT_PATH}/**", "LineCoverage":"95", "InstructionCoverage":"0", "MethodCoverage":"100", "BranchCoverage":"95", "ClassCoverage":"100", "ComplexityCoverage":"0" } }, "代碼檢查": { "執行SQ代碼掃描": { "Type": "SONAR_QUBE" } }, "編譯構建": { "執行Maven構建": { "Type": "COMMAND_STATUS", "Script": { "Maven構建": "cd ${PROJECT_PATH};mvn clean package -U -DskipTests" } } }, "部署": { "模擬部署腳本-1": { "Type": "COMMAND_STATUS", "Script": { "拷貝文件": "echo 模擬拷貝文件" } }, "模擬部署腳本-2": { "Type": "COMMAND_STATUS", "Script": { "HTTP傳輸文件": "echo HTTP傳輸文件" } } } }
配置說明:服務器
"檢查Java環境": { "Type": "COMMAND_STDOUT", "Success-IndexOf": "java version \"1.8.0_211\"", "Script": { "輸出Java版本": "java -version 2>&1" }
該類型的節點不是必須的(但看幾年前寫的配置文件時頗有用,對須要的構建環境一目瞭然),目的是檢查構建服務器是否具有須要的構建環境,在命令的標準輸出內未含有Success-IndexOf節點定義的字符串則執行失敗,對應的另外一個節點名稱是Fail-IndexOf,標準輸出若是含有Fail-IndexOf定義的字符串則執行失敗,二者選擇其一使用。app
"綁定構建參數": { "Type": "BUILD_PARAMETER_DROP_DOWN_MENU", "StepsName": "部署", "ParamName": "deploy-choice" }
將部署節點(Steps)內的具體構建步驟(Step)列表,綁定到名爲deploy-choice的下拉菜單構建參數上。框架
"執行JUnit插件": { "Type": "JUNIT_PLUG_IN", "JunitReportPath": "**/${PROJECT_DIR}/**/target/**/TEST-*.xml" }
使用Jenkins的JUnit插件生成Junit和TestNG的測試報告。微服務
"執行Jacoco插件": { "Type": "JACOCO_PLUG_IN", "classPattern":"${PROJECT_PATH}/target/classes", "InclusionPattern":"${PROJECT_PATH}/**", "LineCoverage":"95", "InstructionCoverage":"0", "MethodCoverage":"100", "BranchCoverage":"95", "ClassCoverage":"100", "ComplexityCoverage":"0" }
使用Jenkins的Jacoco插件檢查單元測試覆蓋度。單元測試
"代碼檢查": { "執行SQ代碼掃描": { "Type": "SONAR_QUBE" } }
執行SonarQube代碼檢查,須要在項目根目錄下要建立sonar-project.properties配置文件,以Java項目的配置文件爲例:
# must be unique in a given SonarQube instance sonar.projectKey=Jenkins:Test-Java-Build sonar.projectVersion=1.0 # Path is relative to the sonar-project.properties file. Defaults to . sonar.sources=src sonar.sourceEncoding=UTF-8 sonar.java.binaries=./target/classes
"執行Maven構建": { "Type": "COMMAND_STATUS", "Script": { "Maven構建": "cd ${PROJECT_PATH};mvn clean package -U -DskipTests" } }
該節點就是執行命令,這裏具體構建命令是用mvn clean package -U -DskipTests命令完成的。
通過上述配置文件的執行,咱們能夠很簡單的完成全部的構建步驟:
這裏篇幅有限,更多內容請到項目倉庫查看好比:
- 構建JS項目
- 構建ReactNative項目
- 構建Android項目
- 構建iOS項目
- 構建.NET項目
- 構建多個子項目
- 構建成功和失敗處理
- 在K8S內建立Pod進行構建
歡迎你們去關注、交流更多的關於Jenkins構建的問題和經驗
項目倉庫地址:Jenkins Json Build
使用此項目的方法
1.首先了解Jenkins如何配置共享類庫(https://www.jenkins.io/doc/book/pipeline/shared-libraries/)
2.將此項目的共享類庫代碼(三個文件夾)存儲在git倉庫中,並將此倉庫配置爲Jenkins共享類庫(https://gitee.com/beijing-guangyu-online/jenkins-json-build/tree/master/shared-library)
3.能夠參考項目倉庫提供說明文件編寫Jenkinsfile腳本進行項目構建工做(https://github.com/gyyx/jenkins-json-build)