Jenkins持續集成學習-Windows環境進行.Net開發1

Jenkins持續集成學習-Windows環境進行.Net開發


目錄

Jenkins持續集成學習-Windows環境進行.Net開發1
Jenkins持續集成學習-Windows環境進行.Net開發2
Jenkins持續集成學習-Windows環境進行.Net開發3
Jenkins持續集成學習-Windows環境進行.Net開發4
Jenkins持續集成學習-搭建jenkins問題彙總java

前言

本文探究在.net環境下的持續集成環境研究並使用。關於爲何使用Jenkins,能夠參考一下jenkins持續集成原理git

目標

學習jenkins的基本使用,完成如下2點任務。json

  1. 搭建jenkins任務完成自動編譯。
  2. 自動從nuget上獲取須要的包。

使用Jenkins

安裝

Jenkins官網下載安裝包,進行安裝。安裝完成後會自動打開一個頁面。默認是網站是localhost:8080。若端口已被佔用則須要修改爲別的端口。
具體安裝問題能夠看這裏淺談.net jenkins svn下自動化集成環境安裝 搭建 配置
主要是安裝完後須要安裝.net的環境的一些插件及svn(或git)等相關插件。c#

根據官網描述是須要安裝java環境的windows

添加.net環境配置

安裝完後若是要在.net環境使用,在MSBuild插件安裝完的前提下。配置msbuild.exe的路徑。這樣jenkins就能經過msbuild來編譯.net項目了。具體配置能夠能夠參考《爲 Jenkins 配置 .NET 持續集成環境》api

我本地的jenkins的全局配置配的MSBuild也爲14.0bash

安裝了不一樣版本的VS的MSBuild版本可能不同。服務器

2.png

部署

咱們經過VS先新建一個控制檯項目.net framework4.5的項目,項目名稱叫作JenkinsTest。在Program.cs中簡單的輸出hello worldsvn

static void Main(string[] args)
{
    Console.WriteLine("Hello World!");
}

程序目錄以下

│  JenkinsTest.sln
│
└─JenkinsTest
    │  App.config
    │  JenkinsTest.csproj
    │  Program.cs
    │
    └─Properties
            AssemblyInfo.cs

編譯經過後將項目上傳到SVN上,我在我本地建了SVN的服務,並增長了用戶名和密碼分別爲test。

1.png

新建項目

3.png
建立一個名爲test的自由風格軟件項目。
4.png
我本地使用的是SVN,所以選擇Subversion,輸入SVN的路徑。Local module directory爲SVN獲取代碼的路徑。.表示獲取到jenkins的根目錄下。
5.png
首次建立的時候須要建立SVN的登陸憑據,在Credentials項點擊Add添加一個新的憑據,類型就選擇Username with password便可,id須要輸入一個惟一憑據標識。
6.png
Build Environment下勾選Add timestamps to the Console Output,這樣能夠顯示時間戳。
7.png
Build選擇MSBuild的版本,這個版本在全局配置設置過,在這裏就能夠顯示出來。MSBuild Build File輸入須要編譯的程序集文件名。在Command Line Arguments輸入編譯的參數,咱們編譯成Realse版本。完成後點擊保存便可。具體MSBuild指令不作具體探究,有什麼問題直接能夠看官方文檔
點擊當即構建就會自動編譯,完成就會顯示一個結果
8.png
9.png
點擊#1便可調轉到該次編譯的詳細信息中,在左側點擊Console Output能夠看到編譯的過程日誌。
10.png

構建過程分析
  1. 先從SVN獲取代碼

    16:21:55 由用戶 jake 啓動
    16:21:55 構建中 在工做空間 D:\Program Files (x86)\Jenkins\workspace\test 中
    16:21:55 Updating https://jakepc/svn/JenkinsTest/trunk/JenkinsTest at revision '2019-01-18T16:21:55.792 +0800' --quiet
    16:21:55 Using sole credentials test/****** (本地svn服務器) in realm ‘<https://jakepc:443> VisualSVN Server’
    16:21:55 At revision 3
  2. 調用MSBuild命令進行編譯,這裏會查找咱們全局配置的MSBuild.exe執行咱們在建立時輸入的Command Line Arguments指令。

    16:21:56 Path To MSBuild.exe: C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe
    16:21:56 Executing the command cmd.exe /C " "C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" /t:Build /p:Configuration=Release JenkinsTest.csproj " && exit %%ERRORLEVEL%% from D:\Program Files (x86)\Jenkins\workspace\test
    16:21:56 [test] $ cmd.exe /C " "C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" /t:Build /p:Configuration=Release JenkinsTest.csproj " && exit %%ERRORLEVEL%%
  3. 編譯完成,顯示警告,錯誤和結果

    ...
    16:21:57 _CopyAppConfigFile:
    16:21:57   正在將文件從「App.config」複製到「bin\Release\JenkinsTest.exe.config」。
    16:21:57 CopyFilesToOutputDirectory:
    16:21:57   正在將文件從「obj\Release\JenkinsTest.exe」複製到「bin\Release\JenkinsTest.exe」。
    16:21:57   JenkinsTest -> D:\Program Files (x86)\Jenkins\workspace\test\bin\Release\JenkinsTest.exe
    16:21:57   正在將文件從「obj\Release\JenkinsTest.pdb」複製到「bin\Release\JenkinsTest.pdb」。
    16:21:57 已完成生成項目「D:\Program Files (x86)\Jenkins\workspace\test\JenkinsTest.csproj」(Build 個目標)的操做。
    16:21:57 
    16:21:57 已成功生成。
    16:21:57     0 個警告
    16:21:57     0 個錯誤
    16:21:57 
    16:21:57 已用時間 00:00:01.22
    16:21:59 Finished: SUCCESS

經過以上三步驟,實際和咱們本身使用VS編譯過程也是同樣的。

增長依賴dll

上面咱們建立了一個最簡單的項目,並經過jenkins獲取並編譯成功了,下面咱們增長項目複雜性,增長其餘依賴項。

新建一個jenkins.Common的類庫。咱們把HelloWorld的字符串經過該類庫獲取到,而後主項目進行輸出。
增長HelloWolrdHelper類獲取字符串

public class HelloWolrdHelper
{
    public static string GetString()
    {
        return "Hello World!";
    }
}

修改原項目

static void Main(string[] args)
{
    Console.WriteLine(HelloWolrdHelper.GetString());
    Console.ReadKey();
}

11.png

而後提交代碼到SVN後在jenkins再次構建,結構以下。

│  JenkinsTest.sln
│
├─Jenkins.Common
│  │  HelloWolrdHelper.cs
│  │  Jenkins.Common.csproj
│  │
│  └─Properties
│          AssemblyInfo.cs
│
└─JenkinsTest
    │  App.config
    │  JenkinsTest.csproj
    │  Program.cs
    │
    └─Properties
            AssemblyInfo.cs

構建一下,編譯成功了,MSBuild會根據csproj文件內的依賴關係編譯其餘程序集。
15.png

生成啓動時間爲 2019/1/18 17:16:03。
17:16:03 項目「D:\Program Files (x86)\Jenkins\workspace\test\JenkinsTest\JenkinsTest.csproj」在節點 1 上(Build 個目標)。
17:16:03 PrepareForBuild:
17:16:03   正在建立目錄「bin\Release\」。
17:16:03   正在建立目錄「obj\Release\」。
17:16:03 項目「D:\Program Files (x86)\Jenkins\workspace\test\JenkinsTest\JenkinsTest.csproj」(1)正在節點 1 上生成「D:\Program Files (x86)\Jenkins\workspace\test\Jenkins.Common\Jenkins.Common.csproj」(2) (默認目標)。
17:16:03 PrepareForBuild:
17:16:03   正在建立目錄「bin\Release\」。
17:16:03   正在建立目錄「obj\Release\」。
17:16:03 GenerateTargetFrameworkMonikerAttribute:
17:16:03 正在跳過目標「GenerateTargetFrameworkMonikerAttribute」,由於全部輸出文件相對於輸入文件而言都是最新的。

增長Nuget依賴

新建一個Jenkins.Core項目,並生成Nuget包上傳到Nuget服務器上。

關於Nuget如何打包能夠看我以前的博客NuGet的使用、部署、搭建私有服務,這裏不作討論。

爲了簡單起見,建立一個和Jenkins.Common程序集同樣的輸出HelloWorld的方法,可是爲了做爲區分,分別略做修改。
Jenkins.Common的代碼

public class HelloWolrdHelper
{
    public static string GetString()
    {
        return "Hello World! Jenkins.Common";
    }
}

Jenkins.Core的代碼

public class HelloWolrdHelper
{
    public static string GetString()
    {
        return "Hello World! Jenkins.Core";
    }
}

程序結構以下

│  JenkinsTest.sln
│
├─.nuget
│      NuGet.Config
│      NuGet.exe
│      NuGet.targets
│
├─Jenkins.Common
│  │  HelloWolrdHelper.cs
│  │  Jenkins.Common.csproj
│  │
│  └─Properties
│          AssemblyInfo.cs
│
├─Jenkins.Core
│  │  HelloWorldHelper.cs
│  │  Jenkins.Core.csproj
│  │  Jenkins.Core.sln
│  │
│  └─Properties
│          AssemblyInfo.cs
│
└─JenkinsTest
   │  App.config
   │  JenkinsTest.csproj
   │  packages.config
   │  Program.cs
   │
   └─Properties
           AssemblyInfo.cs

注意:Jenkins.Core我放到一個單獨的項目中打包的。本來我是放到原項目一塊兒。可是Nuget彷佛有個bug,致使編譯通不過。

20.png

由於控制檯項目更新的時候會向JenkinsTest.csproj文件寫入nuget包還原的指令

<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
  </Target>

而中解決方案的目錄是在上一層目錄<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>,最終編譯的時候會校驗pacakges是否存在已下載的包。經過路徑$(SolutionDir)\packages\下查找,即..\\packages\。多了一個\致使存在包仍然報錯查找不到,最終編譯不過。

上傳nuget包

17.png

而後從Nuget本地nuget服務器上獲取。

18.png

Program的代碼增長新的helloworld輸出

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(HelloWolrdHelper.GetString());
        Console.WriteLine(Jenkins.Core.HelloWolrdHelper.GetString());
        Console.ReadKey();
    }
}

從新編譯項目後上傳代碼到SVN後再次到Jenkins上構建項目。

19.png

能夠看到構建失敗了,去看下具體失敗緣由。

正在將文件從「obj\Release\Jenkins.Common.pdb」複製到「bin\Release\Jenkins.Common.pdb」。
12:51:14 已完成生成項目「D:\Program Files (x86)\Jenkins\workspace\test\Jenkins.Common\Jenkins.Common.csproj」(默認目標)的操做。
12:51:14 ResolveAssemblyReferences:
12:51:14   主引用「Jenkins.Core, Version=0.2.0.0, Culture=neutral, processorArchitecture=MSIL」。
12:51:14 C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1820,5): warning MSB3245: 未能解析此引用。未能找到程序集「Jenkins.Core, Version=0.2.0.0, Culture=neutral, processorArchitecture=MSIL」。請檢查磁盤上是否存在該程序集。 若是您的代碼須要此引用,則可能出現編譯錯誤。 [D:\Program Files (x86)\Jenkins\workspace\test\JenkinsTest\JenkinsTest.csproj]
12:51:14           用於 SearchPath「{HintPathFromItem}」。
12:51:14           已考慮使用「..\packages\Jenkins.Core.0.2.0\lib\net45\Jenkins.Core.dll」,但它不存在。
12:51:14           用於 SearchPath「{TargetFrameworkDirectory}」。
12:51:14           已考慮使用「C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\Jenkins.Core.winmd」,但它不存在。
12:51:14           已考慮使用「C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\Jenkins.Core.dll」,但它不存在
...
12:51:14 Program.cs(15,22): error CS0234: The type or namespace name 'Core' does not exist in the namespace 'Jenkins' (are you missing an assembly reference?) [D:\Program Files (x86)\Jenkins\workspace\test\JenkinsTest\JenkinsTest.csproj]
12:51:14 已完成生成項目「D:\Program Files (x86)\Jenkins\workspace\test\JenkinsTest\JenkinsTest.csproj」(Build 個目標)的操做 - 失敗。
12:51:15 
12:51:15 生成失敗。
12:51:15 
12:51:15 「D:\Program Files (x86)\Jenkins\workspace\test\JenkinsTest\JenkinsTest.csproj」(Build 目標) (1) ->
12:51:15 (ResolveAssemblyReferences 目標) -> 
12:51:15   C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1820,5): warning MSB3245: 未能解析此引用。未能找到程序集「Jenkins.Core, Version=0.2.0.0, Culture=neutral, processorArchitecture=MSIL」。請檢查磁盤上是否存在該程序集。 若是您的代碼須要此引用,則可能出現編譯錯誤。 [D:\Program Files (x86)\Jenkins\workspace\test\JenkinsTest\JenkinsTest.csproj]
12:51:15 
12:51:15 
12:51:15 「D:\Program Files (x86)\Jenkins\workspace\test\JenkinsTest\JenkinsTest.csproj」(Build 目標) (1) ->
12:51:15 (CoreCompile 目標) -> 
12:51:15   Program.cs(15,22): error CS0234: The type or namespace name 'Core' does not exist in the namespace 'Jenkins' (are you missing an assembly reference?) [D:\Program Files (x86)\Jenkins\workspace\test\JenkinsTest\JenkinsTest.csproj]
12:51:15 
12:51:15     1 個警告
12:51:15     1 個錯誤
12:51:15 
12:51:15 已用時間 00:00:01.43
12:51:15 Build step 'Build a Visual Studio project or solution using MSBuild' marked build as failure
12:51:16 Finished: FAILURE

一開始會去..\packages\Jenkins.Core.0.2.0\lib\net45\Jenkins.Core.dll獲取,可是由於沒有包,後面就去遍歷其餘目錄獲取,最終都沒有找到包致使編譯失敗。所以咱們須要使用nuget,在MSBuild編譯以前將包下載下來。

爲了方便我將nuget一同上傳到SVN上,SVN的程序目錄以下

│  JenkinsTest.sln
│
├─.nuget
│      NuGet.Config
│      NuGet.exe
│      NuGet.targets
│
├─Jenkins.Common
│  │  HelloWolrdHelper.cs
│  │  Jenkins.Common.csproj
│  │
│  └─Properties
│          AssemblyInfo.cs
│
└─JenkinsTest
   │  App.config
   │  JenkinsTest.csproj
   │  packages.config
   │  Program.cs
   └─Properties
           AssemblyInfo.cs

因爲Jenkins.Core能夠理解爲第三方依賴,不是和JenkinsTest放一塊兒。

在Build配置中新增一項批處理命令,執行nuget包還原。如圖拖動到編譯以前。
21.png

根據咱們目錄結構調用".nuget/nuget.exe" restore JenkinsTest.sln命令使用nuget進行包還原。

因爲.nuget目錄帶有.所以須要用雙引號引發來執行。

再次編譯仍然失敗了。能夠經過日誌看到已經在編譯前已經執行了腳本,可是沒有從咱們想要的地方獲取包。

13:26:47 No changes for https://jakepc/svn/JenkinsTest/trunk/JenkinsTest since the previous build
13:26:47 [test] $ cmd /c call C:\WINDOWS\TEMP\jenkins8156278399083484284.bat
13:26:47 
13:26:47 D:\Program Files (x86)\Jenkins\workspace\test>".nuget/nuget.exe" restore JenkinsTest.sln 
13:26:47 MSBuild auto-detection: using msbuild version '15.9.21.664' from 'D:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\bin'.
13:26:48 Restoring NuGet package Jenkins.Core.0.2.0.
13:26:49   GET https://api.nuget.org/v3-flatcontainer/jenkins.core/0.2.0/jenkins.core.0.2.0.nupkg
13:26:49   NotFound https://api.nuget.org/v3-flatcontainer/jenkins.core/0.2.0/jenkins.core.0.2.0.nupkg 191ms
13:26:49 警告: Unable to find version '0.2.0' of package 'Jenkins.Core'.
13:26:49   C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\: Package 'Jenkins.Core.0.2.0' is not found on source 'C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\'.
13:26:49   https://api.nuget.org/v3/index.json: Package 'Jenkins.Core.0.2.0' is not found on source 'https://api.nuget.org/v3/index.json'.
13:26:49 
13:26:49 警告: Unable to find version '0.2.0' of package 'Jenkins.Core'.
13:26:49   C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\: Package 'Jenkins.Core.0.2.0' is not found on source 'C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\'.
13:26:49   https://api.nuget.org/v3/index.json: Package 'Jenkins.Core.0.2.0' is not found on source 'https://api.nuget.org/v3/index.json'.
13:26:49 
13:26:49 
13:26:49 Errors in packages.config projects
13:26:49     Unable to find version '0.2.0' of package 'Jenkins.Core'.
13:26:49       C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\: Package 'Jenkins.Core.0.2.0' is not found on source 'C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\'.
13:26:49       https://api.nuget.org/v3/index.json: Package 'Jenkins.Core.0.2.0' is not found on source 'https://api.nuget.org/v3/index.json'.
13:26:49 
13:26:49 NuGet Config files used:
13:26:49     D:\Program Files (x86)\Jenkins\workspace\test\.nuget\NuGet.Config
13:26:49     C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\NuGet\NuGet.Config
13:26:49     C:\Program Files (x86)\NuGet\Config\Microsoft.VisualStudio.Offline.config
13:26:49 
13:26:49 Feeds used:
13:26:49     https://api.nuget.org/v3/index.json
13:26:49     C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\
13:26:49 
13:26:49 D:\Program Files (x86)\Jenkins\workspace\test>exit 1 
13:26:49 Build step '執行 Windows 批處理命令' marked build as failure
13:26:50 Finished: FAILURE
指定nuget包下載源地址。

找到Nuget.exe的配置Nuget.Config,在configuration節點內增長packageSources節點。

<packageSources>
    <add key="Jake Package source" value="http://127.0.0.1:10080/nuget" />
  </packageSources>

再次編譯,終於編譯成功了,日誌以下。

13:38:08 No changes for https://jakepc/svn/JenkinsTest/trunk/JenkinsTest since the previous build
13:38:08 [test] $ cmd /c call C:\WINDOWS\TEMP\jenkins5326599668058283263.bat
13:38:08 
13:38:08 D:\Program Files (x86)\Jenkins\workspace\test>".nuget/nuget.exe" restore JenkinsTest.sln 
13:38:08 MSBuild auto-detection: using msbuild version '15.9.21.664' from 'D:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\bin'.
13:38:09 Restoring NuGet package Jenkins.Core.0.2.0.
13:38:09 Adding package 'Jenkins.Core.0.2.0' to folder 'D:\Program Files (x86)\Jenkins\workspace\test\packages'
13:38:09 Added package 'Jenkins.Core.0.2.0' to folder 'D:\Program Files (x86)\Jenkins\workspace\test\packages'
13:38:09 
13:38:09 NuGet Config files used:
13:38:09     D:\Program Files (x86)\Jenkins\workspace\test\.nuget\NuGet.Config
13:38:09     C:\WINDOWS\system32\config\systemprofile\AppData\Roaming\NuGet\NuGet.Config
13:38:09     C:\Program Files (x86)\NuGet\Config\Microsoft.VisualStudio.Offline.config
13:38:09 
13:38:09 Feeds used:
13:38:09     C:\WINDOWS\system32\config\systemprofile\.nuget\packages\
13:38:09     http://127.0.0.1:10080/nuget
13:38:09     https://api.nuget.org/v3/index.json
13:38:09     C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\
13:38:09 
13:38:09 Installed:
13:38:09     1 package(s) to packages.config projects
13:38:09 
13:38:09 D:\Program Files (x86)\Jenkins\workspace\test>exit 0 
13:38:09 Path To MSBuild.exe: C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe
13:38:09 Executing the command cmd.exe /C " "C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" /t:Build /p:Configuration=Release JenkinsTest/JenkinsTest.csproj " && exit %%ERRORLEVEL%% from D:\Program Files (x86)\Jenkins\workspace\test
13:38:09 [test] $ cmd.exe /C " "C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" /t:Build /p:Configuration=Release JenkinsTest/JenkinsTest.csproj " && exit %%ERRORLEVEL%%

結語

經過N次嘗試,最終完成了.Net開發下Jenkins進行持續集成。總結起來以下:

  1. 安裝Java環境,因爲我本地已有java環境,所以該步驟跳過。
  2. 安裝MSBuild,因爲我本地已安裝過VS,所以該步驟跳過。
  3. 下載Nuget,因爲我本地已安裝VS,同時已安裝過Nuget,所以該步驟跳過。
  4. 安裝Jenkins,並安裝MSbuild插件。
  5. 修改Jenkins的MSBuild插件的配置。
  6. 新建一個工程,修改配置
    • 選擇源碼管理,我本地是SVN,所以選擇SVN(增長登陸憑據)
    • 增長windows批處理腳本用於Nuget下載庫包。(在Nuget.Config中增長本身的包服務地址)
    • 增長MSBuild編譯VS的項目

經過以上步驟,基本就完成了自動編譯的功能。可是光編譯仍是不夠的,最終還要完成自動跑單元測試,下一篇博客再進行研究。

參考文檔

  1. Jenkins部署.net自動化構建
  2. 爲 Jenkins 配置 .NET 持續集成環境
  3. 淺談.net jenkins svn下自動化集成環境安裝 搭建 配置
  4. jenkins持續集成原理
  5. Jenkins結合.net平臺工具之Nuget
  6. Make Jenkins aware of custom NuGet Package Source

本文地址:http://www.javashuo.com/article/p-qxaudbtc-em.html 做者博客:傑哥很忙 歡迎轉載,請在明顯位置給出出處及連接

相關文章
相關標籤/搜索