1. 程式人生 > >Jenkins 實現.net專案一鍵部署

Jenkins 實現.net專案一鍵部署

一、下載安裝Jenkins  : 

官網地址 https://jenkins.io/index.html   安裝沒什麼特殊的 常規安裝即可。安裝後預設佔用8080埠。可通過瀏覽器訪問。

二、配置:

首次訪問,會提示安裝外掛,如果安裝Jenkins的伺服器可以聯網,選擇需要的安裝即可。但如果不能聯網,這裡不能選擇任何外掛安裝,否則會報錯(後面會自己下載外掛包通過上傳的方式進行安裝)。

然後就是註冊一個管理員賬號 即可登入進行配置了。

        離線安裝外掛:

外掛下載地址:http://updates.jenkins-ci.org/download/plugins/



               下載好對應的外掛(一般最新版就行,注意外掛的依賴關係,要下載整個依賴樹的所有下游外掛並從下往上安裝,否則會出錯,也可以根據出錯提示依次下載缺少的外掛)。

系統管理-->管理外掛-->高階-->上傳外掛-->選擇檔案-->選擇剛才下載的安裝包(一次只能選擇一個,一般為hpi格式),然後會自動進行安裝。如果安裝失敗,一般是由於缺少依賴外掛引起的  這時候點選檢視詳情 ,先安裝缺少的依賴外掛即可。


對於我們的部署.net專案 ,用到的主要外掛有 MSBuild (編譯.net專案),GitLab(從原始碼管理器上獲取程式碼並編譯),Publish Over FTP或FTP publisher(通過FTP把生成的專案檔案傳送到目標伺服器,但是需要目標伺服器的FTP支援,後面實際沒有采用這種方式),PowerShell(停止\開啟遠端伺服器服務、網站、拷貝檔案等用途),   Copy Artifact Plugin(把其他Job工作區的檔案拷貝到當前Job)。 除此之外  還有許多下游依賴外掛 如git 等  就不一一列出。

三、部分外掛的全域性設定:

        系統管理-->系統設定 中 


這個外掛是用FTP向遠端伺服器拷貝檔案/資料夾用的 (需要遠端伺服器開啟FTP服務),由於我後來使用的PowerShell 方式,所以這個方式暫時沒有用到,後期備用吧。

 四、專案配置:


其中 Credentials 是要用 SSH Username with private key 方式配置的,把本機的PRIVATE KEY填上即可 【其他方式暫時連不上,待研究】

配置GitLab Hook :

 通過GitLab Hook  鉤子  可以實現  有程式碼push到指定分支自動執行JOB的目的。

 需要安裝Jenkins的外掛有 

gitlab-hook  (依賴於ruby-runtime

安裝好後   需要分別在gitlab 和jenkins 上做相應的配置   

jenkins 觸發器中選擇gitlab hook    能看到回撥URL , 高階選項 生成 Token。     然後去gitlab 分別把 回撥URL 和Token 填入 webhooks設定介面  。

新增 然後測試 ,如果顯示藍色200  則配置成功!  具體步驟見下圖 







這裡沒什麼可說的 具體編譯的細節 引數都寫在 solution.msbuild 檔案裡了 ,注意這個檔案也要上傳到git 。 這檔案裡主要做了三件事

   刪除原生成目錄

   建立新生成目錄

   編譯生成專案 

   當然這個過程中的涉及的這些目錄 都是放在工作空間目錄中的。工作空間可以在這裡找到: Jenkins\workspace\JobName  Jenkins目錄 在全域性設定裡面可以設定)

----------------------------------20170703補充  msbuild 不呼叫指令碼,直接寫引數----------------------------------

msbuild 可以直接呼叫sln以及csproj檔案。所以如果是釋出web專案的時候,可以msbuild 後面直接跟要釋出web專案的csproj檔案。

如msbuild  Web.csproj   

關於後面的引數  例如:

/t:ResolveReferences;Compile
 /t:_CopyWebApplication 
 /p:Configuration=Release 
/p:WebProjectOutputDir=C:/Software/Jenkins/workspace/MESWebService/Publish
 /p:OutputPath=C:/Software/Jenkins/workspace/MESWebService/Publish/bin

這是釋出Web專案的 一般引數形式 把最後兩行  釋出地址換了即可

----------------------------------------------------------------------------------------------------------------------------------


    這步操作 是把生成的專案目錄存檔,以便下游Job呼叫。這裡用到了 Copy Artifact  外掛。

下面就是第二個Job了  :



  這兩個地方 是和上一個Job銜接的 當上一個JOB執行成功自動觸發,把生成成功的釋出目錄拷貝到當前工作空間


此處是另一個關鍵,利用PowerShell  先停止遠端網站, 把檔案覆蓋過去,再啟動網站,最後別忘了釋放登入Session .

*****************20170628補充 釋出專案前自動備份************************************************************************

思路是使用PowerShell指令碼  把當前的專案資料夾 整個拷貝到備份資料夾中 ,並以當前日期時間命名。

上圖中的Powershell命令做如下修改:

 Invoke-Command -Session $session -ScriptBlock{
 c:\windows\System32\inetsrv\appcmd stop site "WebService"
 E:\WebServiceBackUp\BackUpDir.ps1     #停掉網站後  執行備份指令碼(備份指令碼已寫好  放置在網站部署伺服器上)
}

備份指令碼內容如下:

#源目錄
$pathFrom = "E:\WebService";  
#目標目錄
$pathTo = "E:\WebServiceBackUp\bak"+(Get-Date -Format 'yyyyMMddHHmmss');   
write-host("SourcePath is: " + $pathFrom);  
write-host("TargetPath is: " + $pathTo);  
#建立目標目錄 
mkdir -Pa $pathTo;   
if (!(Test-path -path $pathFrom)){  
  write-host("SourcePath is not exist!");  
  exit -1;  
}  
  
$pathCopyTo = "";  
$pathFromLen = $pathFrom.Length;  
$LenGap = 0;  
$LenGap2 = 0;  
  
ls -r $pathFrom  | Foreach-Object{  
    $lenGap = $_.FullName.Length - $pathFromLen - $_.Name.Length - 1;  
    $pathCopyTo =  $PathTo + $_.FullName.Substring($pathFromLen, $lenGap);  
  
    write-host("Copy " + $_.FullName + " to " + $pathCopyTo);  
    if(!(Test-path -path $pathCopyTo)){ 
        mkdir -Pa $pathCopyTo;  
    }  
    copy-item $_.FullName $pathCopyTo -Force;  
}  
exit 0;  

使用的時候 只需要根據實際情況把源目錄和目標目錄修改了就好(也可以寫成引數的形式在呼叫指令碼的時候傳進目錄)

注:部署專案的伺服器 初次執行ps1指令碼的時候 出現“無法載入檔案 ******.ps1,因為在此係統中禁止執行指令碼” 的錯誤 ,原因是預設設定是禁止執行

指令碼的,需要手動開啟 ,方法是在PowerShell  中 輸入命令  set-executionpolicy remotesigned  然後再按提示輸入Y 即可

********************************************20170629補充   一鍵還原到最近備份版本*************************************************************************

根據上一步操作 ,在釋出新版本前,已經把專案都備份好了 。下面的思路依然是利用Jenkins新建一個Job去直接呼叫伺服器上寫好的powershell指令碼。

 Jenkins配置:

$pass=ConvertTo-SecureString -String '密碼' -AsPlainText -Force
$cre=New-Object System.Management.Automation.PSCredential('使用者名稱', $pass)
$session=New-PSSession -ComputerName 伺服器IP -Credential $cre

 Invoke-Command -Session $session -ScriptBlock{
 c:\windows\System32\inetsrv\appcmd stop site "網站名"
 E:\WebServiceBackUp\RevertVersion.ps1  #要執行的關鍵指令碼
 c:\windows\System32\inetsrv\appcmd start site "網站名"
}
Remove-PSSession -Id $session.Id
PowerShell指令碼:
$pathFrom = "E:\WebServiceBackUp";  
$pathTo = "E:\WebService";  
#獲取最新的備份檔案目錄
$pathFrom= $pathFrom+"\"+(ls  "e:\WebServiceBackUp\" |?{$_.Mode -eq "d----"}|sort -Descending LastWriteTime)[0].Name; #通用
#$pathFrom= $pathFrom+"\"+(ls -dir -r $pathFrom | sort -Descending LastWriteTime)[0].Name;  #僅ps5支援 伺服器上版本太低。。
write-host("Source:"+$pathFrom);
write-host("To"+$pathTo);
#清空專案資料夾
Remove-Item ($pathTo+"\*") -recurse
write-host("Clear Finish!");
#拷貝檔案
$pathCopyTo = "";  
$pathFromLen = $pathFrom.Length;  
$LenGap = 0;  
 ls -r $pathfrom  | foreach-object{  
 $lengap = $_.fullname.length - $pathfromlen - $_.name.length - 1;  
 $pathcopyto =  $pathto + $_.fullname.substring($pathfromlen, $lengap); 
 if(!(test-path -path $pathcopyto)){ 
     mkdir -pa $pathcopyto;  
 }  
 copy-item $_.fullname $pathcopyto -force;  
 }  
 write-host("Revert Finish!");
 exit 0; 
以上指令碼  在備份資料夾中篩選備份的時候  是按修改時間篩選最近的資料夾 ,還有一個思路 ,可以按備份資料夾命名格式 用正則過濾出所有備份資料夾,再按資料夾

名字降序排列也能取出最近的資料夾名字。

*******************************************************************************************************************************************************************

至此 ,任務的配置基本完成。執行的時候 只需開啟第一個Job  點選立即構建,即可自動完成專案從GitLab上拉取指定分支的最新程式碼,編譯釋出,停網站,

拷貝覆蓋檔案,啟動網站等一系列動作,當然 ,後期如有需要 ,可以設定輪詢方式,在指定時間自動釋出專案,或者使用Hook 鉤子方式,當有程式碼提交自動

釋出專案。

  下面說一下.net專案的編譯環境、MSBuild環境配置、PowerShell的設定等檔案:

    MSBuild  命令的使用,要配置環境變數,把.net framework 的目錄(如C:\Windows\Microsoft.NET\Framework\v4.0.30319)寫進Path環境變數中。

    編譯要有環境,而一般伺服器是沒有開發環境的,這時候一般有兩個選擇,安裝Visual Studio (2012以上,建議這種後期麻煩可能會少一點),要不就

安裝 Windows SDK ,這裡面有編譯所依賴的東西。這時候 可以嘗試編譯了 ,一般測試編譯環境的時候在本地直接用msbuild 命令即可,不用上Jenkins.

這時候,可能會提示缺少各種檔案,根據錯誤提示,從開發機上拷貝過去即可,注意,上傳gitlab時  packages包,各種引用dll也要上傳,不然後面拉取程式碼到工作區編譯的時候

會少這些檔案.。

注意,編譯時候,報錯可能會跟C:\Program Files (x86)\MSBuild 目錄中的檔案有關,這時候根據提示,把相應的目錄從開發機拷貝過去,實在不行 把出錯目錄

刪除會有奇效,它會尋求其他目錄,其他目錄環境也許是完好的。

      我操作的環境是Windows Server 2008 R2   ,但是PowerShell的向遠端伺服器拷貝檔案的命令只能PowerShell5才支援,PowerShell5是

windows management framework5的一部分,WMF5又依賴於 Windows Server 2008 R2 SP1 和.net framework4.5,所以  都要安裝上。

都裝好後  開啟PowerShell   $PSVersionTable.PSVersion命令檢視版本  確認是不是5.

  使用PowerShell連線遠端機器 需要先新增信任列表 命令 

winrm set winrm/config/client  '@{TrustedHosts="xxx.xxx.xxx.xxx,xxx.xxx.xxx.xxx"}'

(注意是設定TrustedHosts不是新增,可以設定多個TrustedHosts,用逗號分開)好像是客戶端(源伺服器)用設定 服務端(目標伺服器)不用

  然後初始化配置 winrm quickconfig 根據提示 輸入一到兩次'yes' 即可。

[檢視已配置的TrustedHosts:Get-Item WSMan:\localhost\Client\TrustedHosts | Select-Object Value]

 最後 貼下 solution.msbuild檔案 【其實不用這個檔案 ,直接 編譯csproj 或sln檔案後面加引數也可以,只是這個檔案中增加了刪除\新建目錄等其他功能】

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"   DefaultTargets="Compile">
<ItemGroup>
 <BuildArtifactsDir Include="BuildArtifacts\" />
  <SolutionFile Include="trunk\MKCurtain.sln" /> 
</ItemGroup>

<PropertyGroup>
 <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
 <BuildPlatform Condition=" '$(BuildPlatform)' == '' ">Any CPU</BuildPlatform>
</PropertyGroup>

<Target Name="Compile" DependsOnTargets="Init">
 <MSBuild Projects="@(SolutionFile)" Targets="Rebuild"
          Properties="OutDir=%(BuildArtifactsDir.FullPath);Configuration=$(Configuration);Platform=$(BuildPlatform)" />
</Target>

<Target Name="Init"  DependsOnTargets="Clean">
 <MakeDir Directories="@(BuildArtifactsDir)" />
</Target>

<Target Name="Clean">
 <RemoveDir Directories="@(BuildArtifactsDir)" />
</Target>

</Project>

 參考文件:http://blog.csdn.net/dj0379/article/details/52389454

                     http://blog.csdn.net/wangmuming/article/details/22925671

                     http://www.cnblogs.com/scheshan/p/5849704.html

https://www.cnblogs.com/v5captain/articles/6480708.html  備份恢復

相關推薦

Jenkins 實現.net專案部署

一、下載安裝Jenkins  : 官網地址 https://jenkins.io/index.html   安裝沒什麼特殊的 常規安裝即可。安裝後預設佔用8080埠。可通過瀏覽器訪問。二、配置:首次訪問,會提示安裝外掛,如果安裝Jenkins的伺服器可以聯網,選擇需要的安裝即

基於Shell指令碼的Linux下Javaweb專案部署

剛買到伺服器的時候想把專案部署上去時,經常會用到各種scp、unzip之類一大堆的命令。雖然整個流程不是特別麻煩,不過學了一些Shell的命令知識之後我發現這個過程還是有優化的空間,於是大概花了幾個小時完成了這樣一個自動部署的指令碼。 首先要解決的問題是,命令如何在遠端伺服器上執行,因為之前每次

Git+Gitlab+Ansible劇本實現持續化部署--技術流ken

    前言   截止目前已經寫了《Ansible基礎認識及安裝使用詳解(一)--技術流ken》,《Ansible常用模組介紹及使用(二)--技術流ken》《Ansible劇本介紹及使用演示(三)--技術流ken》以及《Git介紹及常用操作演示(一)--技術流ken》,《

測試環境專案部署

git專案測試環境一鍵部署指令碼 #!/bash/sh pid=`ps -ef | grep 'user_demo.jar' |

publish over ssh 實現 Jenkins 遠端部署 / jenkins 遠端執行shell 遠端釋出 tomcat / jenkins分別釋出多個專案到多個遠端主機

1. 以下是本地Jenkins生成war包直接釋出本機。參照了(jenkins 遠端執行shell 一鍵遠端釋出 tomcat) BUILD_ID=DONTKILLME  (加這個原因是因為沒加之前用command startup tomcat一直啟動失敗而shutd

利用jenkins部署專案

思路:原生代碼提交到svn==>jenkins將svn的最新程式碼構建成應用,打成war包,上傳到to tomcat的webapps目錄下,然後重啟tomcat 1、安裝jenkins,本文安裝windos版 2、執行jenkins,關閉jenkins,修改主

Jenkins部署vue專案

1、外掛安裝 2、新建任務 3、專案描述 4、原始碼管理 5、構建環境 6、執行shell echo $PATH node -v npm -v #檢查編譯環境 npm install chromedriver --chromedriver_cd

SpringBoot + maven + Jenkins + docker 實現docker叢集自動化部署

整體可分為以下幾個步驟:1,建立springboot專案2,搭建docker私服庫3,build映象並上傳到私服庫4,搭建docker swarm叢集5,搭建jenkins並構建部署演示系統使用centos7,jdk1.81,建立Springboot專案:在eclipse上新

Jenkins實現測試環境到生產環境部署(Windows)

前言: 因為dotnet在釋出站點後,然後再上傳服務時,會因為各種的網速問題,導致站點瞬間掛掉!那麼通過一鍵部署,先在測試站點測試好的檔案,複製到正式站點上的一個緩衝區,進行預熱配置,之後再本機進行檔案替換,速度是相當的快,最終把影響降到最低。 所用到的外掛: 注意:此外掛很久沒有更新,一次只能是一個目錄

jenkins 引數化構建mven專案部署至tomcat

上一篇記錄了jenkins的安裝和常用配置,包括常用的外掛下載。那麼這裡來記錄以下Jenkins的引數化構建maven專案。 環境: centos7 jenkins2.107 maven-3.5.3 jdk-1.8_144 tomcat7 下面記錄過

Jenkins+SVN+Maven+Shell 實現專案釋出

Jenkins+SVN+Maven+Shell 實現專案一鍵釋出 一、前言 眾所周知,Jenkins預設情況下可以實現專案更新(通過SVN),和專案釋出,通過(MAVEN外掛),但是這種情況下發布到一些容器底下(如Tomcat)時,經過多次釋出後JVM會報OutOfMe

jenkins-整合git ssh maven spring-boot實現部署啟動

安裝好jenkins java maven git ssh 點選“系統管理”配置一下工具 配置jdk 配置git 配置maven 當然也可以自動安裝,點選apply並儲存 點選系統設定 配置一下發郵件的地址,構建失敗後能郵件通知 ctr

jenkins+svn+rsync+php_自動化部署可持續化整合伺服器叢集專案_支援回滾

此文的方案支援回滾,支援回滾,支援回滾,重要的事情說三遍!前言:此文的解決方案,只能解決釋放運維一半的工作量,為何一半?因為需要部署程式碼的伺服器叢集,都事先安裝配置好專案執行所需的環境,例如java專案需要tomcat,php專案需要nginx+php-fpm等。如果問有沒

jenkins-整合git ssh maven spring-boot實現部署啟動

安裝好jenkins java maven git ssh 點選“系統管理”配置一下工具 配置jdk 配置git 配置maven 當然也可以自動安裝,點選apply並儲存 點選系統設定 配置一下發郵件的地址,構建失敗後能郵件通知

Docker-Compose部署Ningx+.Net Core+Redis集群

ext 地址 error app應用 十分 鏡像 max blank 問題 在看該文章前,你需要對Docker有所了解。 1、創建WebApp應用程序 我使用的是.Net Core 1.0.1版本,創建一個MVC應用程序,並添加對Redis的引用。因為這些很基礎,也很簡單

部署rysnc實現全網備份

web服務器 管理工具 配置文件 server 客戶機 需要的工具:ansible 批量管理工具思路:實現一鍵自動化安裝好rysnc備份服務器,實現全網備份rysnc配置文件,是在管理機上,推送到我們的rysnc服務器上的,所以我們可以隨時可以在管理機修改我們的rysnc服務器上的配置文件

.netcore mvc docker環境jenkins部署(DevOps)

poi src .sh 推薦 systemctl 新建 AC -c packages 【前言】   DevOps方面的文章很早之前就想分享了,擠出一點時間把前段時間搭建的一些提高開發效率的東西給大家分享一下吧。   本文介紹了一個.netcore mvc web項目,從

腳本實現部署Nginx軟件(Web服務器):

repo oca disk 計算 failed 數字 參數 開啟 use 案例1:編寫一鍵部署軟件腳本 案例2:啟動腳本 案例3:編寫監控腳本 案例4:編寫安全檢測腳本 案例5:編寫進度顯示腳本 1 案例1:編寫一鍵部署軟件腳本1.1 問題 本案例要求編寫腳本實現一鍵部署N

部署Jenkins(Centos7.3)

步驟一、進入/root目錄 步驟二、在/root目錄下建立目錄【jenkins-installer】,命令如下: mkdir jenkins-installer 步驟三、下載Tomcat、jenkins、JDK的包到目錄 jenkins-installer下: tomcat下載

Git+Gitlab+Ansible劇本實現部署動態網站(二)--技術流ken

  專案前言   之前已經寫了一篇關於git和ansible的部落格《Git+Gitlab+Ansible劇本實現一鍵部署Nginx--技術流ken》。關於git,gitliab,ansible在我以往的部落格中都已經詳細介紹,這裡就不再贅述。 上一篇部署的nginx是一個靜態的網