自動化構建、測試、部署、代碼檢測越來越重要。主要有一下幾點原因
1. 企業做大,項目變多,多端支持(web,h5,小程序等)
2. 微服務提倡高內聚低耦合,項目因拆分變多
3. DevOps自動化運維流行
4. 集群化,高可用部署方案
5. 避免人工操作出現的錯誤
6. 集成管理系統,實現提交發布、發布審批、發布等UI可視化操作
等等原因,學習使用jenkins實現自動化作業非常有必要。這是我學習過程中整理的資料,分享給大家。
歡迎向我推薦更好的資料和討論關於jenkins的問題。
目錄
本節介紹jenkins常見設置,如中文、job變量使用、查看job歷史執行變量、定時構建、清理歷史構建等
本節介紹:git、腳本(shell、bat、powershell),xcopy、7zip等工具
本節介紹jenkins安全設置,用戶權限管理
本節介紹:jenkins master 高可用設計方案、jenkins配置備份、配置變更歷史、站點應用備份回滾、監控方案
本節介紹:多服務器之間傳輸文件的方式,如:第三方rsync同步工具,publish over ssh插件,publish over ftp插件,copyArtifact插件,Copy DataTo Workspace插件等
本節介紹:多環境配置插件、參數化擴展、通知(email,釘釘)、job文件夾組織插件(floders plugins)等
案例包含:dotnet,dotnet core、docker,ios\android app、nodejs項目(webpack)
Jenkins 是基於Java開發的一種可視化持續集成工具,將流水式的操作實現自動化。常用於自動化構建、自動化集成、自動化測試、自動化交付等
官方下載:https://jenkins.io/download/
Jenkins在url中關閉和重啟(exit,restart,reload)
主題美化
1)Jenkins安裝插件因網絡問題報錯處理方案(卡在setupWizard)
Jenkins鏡像地址改為國內鏡像地址:系統管理>>管理插件>>高級 菜單下將'升級站點'中的URL設為http://mirror.xmission.com/jenkins/updates/current/update-center.json 保存並且重啟jenkins服務
linux:進入到Jenkins的工作目錄/var/lib/jenkins/修改hudson.model.UpdateCenter.xml文件。將http://updates.jenkins-ci.org/update-center.json修改為http://mirror.xmission.com/jenkins/updates/update-center.json,再重啟jenkins
2)如何將Jenkins集成到其他系統
Jenkins常見REST API(將Jenkins集成到其他系統)
使用shell腳本curl調用jenkins進行構建並判斷是否構建成功
在windows bat中可執行的命令 curl -X POST http://IP:8080/job/auto-publish-folder/job/job-name/buildWithParameters --user admin:admin -d p_app_key=Api
二、 常見設置
Jenkins 中文亂碼
環境變量、腳本變量使用
Jenkins可用環境變量列表以及環境變量的使用(Shell/Command/Maven/Ant)
[Jenkins]傳遞自定義變量:job內部步驟傳遞& job之間傳遞
Jenkins 環境變量管理(全局環境變量< Slave 配置環境變量< Job 參數< Job injected 環境變量)
Environment Injector 插件(EnvInject):添加的環境變量,只有這個job的構建過程中可見,其他jobs的構建不可見
系統環境:系統環境變量變了后,jenkins腳本工具無法立刻加載最新的。比如powershell 使用 dir env: 命令可以打印當前加載到的系統環境變量,不是最新的可以重啟jenkins
查看job執行時的歷史環境變量方法:當前job執行記錄 – 控制台輸出 - Environment Variables
定時構建
Jenkins修改Job工作空間、修改日志路徑(比如git下載到指定目錄)
三、 常用工具cli
1) git
Failed to connect to repository:Error performing command:git.exe ls-remote-h
jenkins 同時拉取多個git倉庫(插件:multiple-scms)
jenkins選擇分支構建(插件:git Parameters)
2) 腳本
a)shell
( 一般以.sh為文件后綴,腳本開頭必須是 #!/bin/bash )
b)windows bat
bat中errorlevel與%errorlevel%的區別
iis7 appcmd命令:操作站點start|stop,操作應用程序池start|stop|recycle(回收)
c)powershell
powershell 中是不區分大小寫的(但是linux區分,所以區分大小寫是好習慣)
微軟宣布PowerShell 7 Linux/macOS/Windows全平台兼容
跨平台PowerShell如何遠程管理Linux/Mac/Windows?
語法
傳遞枚舉的案例:$_.Split(' ',[System.StringSplitOptions]::RemoveEmptyEntries)
jenkins 控制台輸出powershell執行代碼行(Set-PSDebug -Trace 1)
JSON
發布
利用PowerShell+Jenkins,實現項目的自動化部署
Powershell遠程管理Windows Server(WinRM)相關安全配置,否則服務器會拒絕遠程管理
其他
Sample all PowerShell Console Colors
PowerShell中使用Test-Path命令檢查文件或文件夾路徑是否存在示例
異常
1) try…catch…
2) echo $LASTEXITCODE。一般命令正確執行返回0,失敗返回非0值。
3) xcopy
eg:xcopy D:\Source D:\Dest /e/i/y/d
/D:m-d-y 復制在指定日期或指定日期以后改變的文件。如果沒有提供日期,只復制那些源時間比目標時間新的文件。
4) 7zip(7z)
四、 安全設置
用戶權限管理
Jenkins權限控制插件Role-based Authorization Strategy
五、 Dotnet 程序編譯發布
1)環境准備
使用vs安裝包,安裝組件:roslyn、msbuild、webdeploy、對應版本的.net framework、nuget等
這樣安裝后,編譯時依然可能出現環境問題。比如:dll不存在等等
解決辦法:打包開發環境msbuild目錄拷貝到服務器上。( eg:打包 C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild 目錄)
2)Msbuild插件 + webdeploy
3)使用msbuild命令行
vs2017案例(自行下載vs2017的msbuild,每個版本的msbuild支持的參數有差異)
windows bat 命令:
"***\2017\Professional\MSBuild\15.0\Bin\msbuild.exe" /toolsversion:15.0 /t:Rebuild /p:DeployOnBuild=true /p:Configuration=Release /p:DebugType=none /p:ExcludeGeneratedDebugSymbol=true /p:PublishProfile=D:\DevOps\jenkins_ex\Common\Config\jenkins_profile.pubxml /p:publishUrl=D:\DevOps\jenkins_ex\Build\Prod\***\Attach\File /p:VisualStudioVersion=15.0 /p:TargetFrameworkVersion=v4.6.1 D:\DevOps\jenkins_ex\Source\Prod\***\Attach.csproj
powershell 命令:
$msbuild_tool = "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Professional\\MSBuild\\15.0\\Bin\\msbuild.exe" $ms_project_path = "***\\Lks.Git.P\\Web\\Lks.Platform\\Lks.Platform.csproj" $ms_args_solution_dir = "/p:SolutionDir=***\\c-publish-pull-code\\" $ms_args_publish_profile = "/p:PublishProfile=C:\\jenkins-ex\\common\\config\\build\\jenkins_profile.pubxml" $ms_args_publish_dir = "/p:publishUrl=C:\\jenkins-ex\\publish\\build\\LKS.4.0\\Platform\\File\\" &$msbuild_tool $ms_project_path /toolsversion:15.0 /t:Rebuild /p:DeployOnBuild=true /p:Configuration=Release /p:DebugType=none /p:ExcludeGeneratedDebugSymbol=true /p:VisualStudioVersion=15.0 /p:TargetFrameworkVersion=v4.6.1 $ms_args_publish_profile $ms_args_publish_dir $ms_args_solution_dir
jenkins_profile.pubxml內容如下
<PropertyGroup>
<WebPublishMethod>FileSystem</WebPublishMethod>
<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
<LastUsedPlatform>Any CPU</LastUsedPlatform>
<SiteUrlToLaunchAfterPublish />
<LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
<ExcludeApp_Data>False</ExcludeApp_Data>
<DeleteExistingFiles>True</DeleteExistingFiles>
</PropertyGroup>
Rebuild |
重新生成並生成到OutputPath |
OutputPath |
不結合Web Deploy工具,編譯輸出的dll路徑 |
WebProjectOutputDir |
不結合Web Deploy工具,web文件(js,css,cshtml等)的輸出目錄 |
toolsversion |
根據.csproj里面的值進行設置。15.0對應vs2017的msbuild |
DeployOnBuild
|
true表示啟用編譯並發布 |
Configuration |
發布模式Debug 和 Release |
DebugType |
none,表示當前項目不生成pdb文件 |
ExcludeGeneratedDebugSymbol |
true,表示當前項目和引用項目都不生成pdb文件 |
PublishProfile |
結合Web Deploy工具進行發布。 |
publishUrl |
指定發布文件生成的目錄 |
VisualStudioVersion |
Vs版本 15.0 對應vs2017 |
TargetFrameworkVersion |
Vs中右鍵.csproj,查看項目屬性里的.NET版本 |
3)dotnet core 發布命令
dotnet restore
dotnet publish
jenkins:job配置信息變更歷史記錄(Job Configuration History 插件)
jenkins配置備份、還原
手動備份、還原
備份JENKINS_HOME下的所有文件和文件夾,恢復的時候先停止jenkins服務。
(JENKINS_HOME 是jenkins > 系統管理 > 系統配置> 主目錄的值)
使用SCM Sync configuration 插件備份到github上
站點應用備份
Jenkins實現生產環境部署文件的回滾操作(Windows)
jenkins master 高可用設計方案
Jenkins Pipeline 高可用設計方法(值得深入研究)
七、 文件傳輸
1) Rsync同步工具
Rsync 是一個通過檢查文件的時間戳和大小,來跨計算機系統高效地“差異”傳輸和同步文件的工具
第一次同步時rsync 會復制全部內容(首次復制時沒有壓縮包快),但在下一次只傳輸“修改過”的文件。
-u, --update 僅僅進行更新,即跳過所有DST中更加新的文件
權限問題
(1) rsync客戶端下載文件,文件權限會加入運行 rsync客戶端命令 的賬戶
(2) 上傳文件到rsync服務端,文件權限會加入運行 rsync服務端服務 的賬戶
服務端密碼文件權限問題:rsync4.10 自帶的(chmod.exe+chown.exe)
windows下批量修改文件(或文件夾)權限或所有者(icacls命令)
路徑問題:
Cygpath命令可以實現windows平台和Linux的目錄名轉換。
例:cygpath –u C:\\windows
/cygdrive/c/windows
安裝:安裝Cygwin時,會一起安裝Cygpath工具
2) Publish over SSH 插件
3) Publish Over FTP 插件
Jenkins的FTP上傳插件Publish Over FTP Plugin設置支持中文路徑
4) CopyArtifact插件
5) Copy Data To Workspace插件
其他
八、 分布式構建
1)master-slave
(提示:規划好從slave節點遠程工作目錄,比如目錄名為:jenkins_slave)
Slave配置節點中沒有Launch agent via Java Web Start?
(勾選Java Web Start Agent Protocol/4 (TLS 加密)。安裝和舊協議步驟一樣。新版本這樣操作后依然沒有Java Web Start。那么直接使用 "Launch agent by connecting it to the master")
安裝slave-agent.jnlp時,在安裝為windows服務時出現"Access Denied"權限問題,解決方案傳送門。
運行slave-agent.jnlp需安裝java jre1.81或以上版本,下載傳送門。
jenkins 的節點怎么使用變量(插件:Node and label parameter)--動態節點
linux jenkins master上管理windows jenkins slave
2)多job串行、並行
Jenkins上下游jobs設置(並行、串行)-- multijob 插件
(使用multijob 插件:master 和 slave 節點 的“執行者數量”設置多些,否則子job過多,就沒法並發而互相卡死)
3)pipeline
Jenkins Pipeline 純腳本,效率高。相對jenkins UI,入門門檻高,配置可讀性差,維護難。使用multijob插件,可視化UI配置更加簡單易用。Multijob 中包含的獨立job,不能是pipe類型
Jenkins pipeline:pipeline 使用之語法詳解
Jenkins2 插件 Pipeline+BlueOcean 實現持續交付的初次演練
4)觸發JENKINS遠程構建
方式一:插件Parameterized Remote Trigger
2. Credentials Authentication方案
(設置了”系統憑證”觸發不了遠程job。那么改為”全局憑證”)
(優化:單獨設置一個執行遠程job的賬戶,權限可控性高,日志里能查執行者)
方式二:HTTP URL 觸發JENKINS遠程構建
5)ssh方式
九、 自動化測試
Jenkins之插件Publish HTML reports的使用
Postman+Newman+jenkins實現API自動化測試
sonarqube與dotnetcore
SonarQube系列二、分析dotnet core/C#代碼
SonarQube系列三、Jenkins集成SonarQube(dotnetcore篇)
十、 優化設置
1)設置友好的構建記錄名字、構建描述內容
使用user build vars 插件獲取jenkins用戶相關變量
(注意需要勾選"Set jenkins user build variables.")
自定義build name (build-name-setter + user build vars)
#${BUILD_NUMBER}-${ENV,var="BUILD_USER"}
直接使用 ${BUILD_USER} 也可以取到名字,但是會提示Unrecognized macro 'BUILD_USER',可以忽略
使用description setter 插件設置構建描述(eg:重要參數顯示、APP二維碼等)
2)視圖管理、執行大屏顯示、任務執行狀態顏色控制
1、Jenkins 利用Dashboard View插件管理任務視圖
2、jenkins視圖插件build monitor view
3、插件名:Green Balls。使用綠色代替默認的藍色表示任務運行成功的狀態
3)日志大小的問題
Avoid large log Jenkins file (and stop build if needed)
(安裝 Logfilesizechecker 插件和 build timeout 插件並在系統設置里面設置閾值)
4)job並發構建
十一、 其他插件
提示:不使用的插件可以自行卸載掉,因為插件多了經常會提示你更新
多環境多配置插件(舊名:multi-configuration)
job參數化擴展:extended choice parameter (單選,多選,讀取文件中的選項)
jenkins插件build timeout和build timestamp
Email通知功能
jenkins配置自動發送郵件(插件:Email Extension)
提示:將模板文件放到$JENKINS_HOME/email-templates目錄下,如果沒有這個目錄,自己創建該目錄。
釘釘通知
Folders Plugin插件:允許將job組織成有層次的文件夾(支持權限管理)
jenkins 的 folders plugin 是做什么用的?
organize jobs in hierarchical folders
十二、 解決方案與案例
Dotnet應用
Centos7+Docker+Jenkins+ASP.NET Core 2.0自動化發布與部署的實現
IOS\Android APP應用
使用Jenkins搭建iOS/Android持續集成打包平台
nodejs項目(webpack打包)
Docker
Jenkins 結合 Docker 為 .NET Core 項目實現低配版的 CI&CD
Jenkins X 相關文章:
Jenkins X 是一個高度集成化的CI/CD平台,基於Jenkins和Kubernetes實現,旨在解決微服務體系架構下的雲原生應用的持續交付的問題,簡化整個雲原生應用的開發、運行和部署過程。
Jenkins X實踐系列(2) —— 基於jx的DevOps實踐
CICD 架構實踐
===================================================
over。資料很多,足夠你從入門到放棄。
歡迎向我推薦更好的資料和討論關於jenkins的問題。