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
到Jenkins官网下载安装包,进行安装。安装完成后会自动打开一个页面。默认是网站是localhost:8080。若端口已被占用则须要修改为别的端口。
具体安装问题能够看这里浅谈.net jenkins svn下自动化集成环境安装 搭建 配置
主要是安装完后须要安装.net的环境的一些插件及svn(或git)等相关插件。c#
根据官网描述是须要安装java环境的windows
安装完后若是要在.net环境使用,在MSBuild插件安装完的前提下。配置msbuild.exe的路径。这样jenkins就能经过msbuild来编译.net项目了。具体配置能够能够参考《为 Jenkins 配置 .NET 持续集成环境》api
我本地的jenkins的全局配置配的MSBuild也为14.0bash
安装了不一样版本的VS的MSBuild版本可能不同。服务器
咱们经过VS先新建一个控制台项目.net framework4.5
的项目,项目名称叫作JenkinsTest
。在Program.cs中简单的输出hello world
svn
static void Main(string[] args) { Console.WriteLine("Hello World!"); }
程序目录以下
│ JenkinsTest.sln │ └─JenkinsTest │ App.config │ JenkinsTest.csproj │ Program.cs │ └─Properties AssemblyInfo.cs
编译经过后将项目上传到SVN上,我在我本地建了SVN的服务,并增长了用户名和密码分别为test。
建立一个名为test的自由风格软件项目。
我本地使用的是SVN,所以选择Subversion,输入SVN的路径。Local module directory
为SVN获取代码的路径。.
表示获取到jenkins的根目录下。
首次建立的时候须要建立SVN的登陆凭据,在Credentials项点击Add添加一个新的凭据,类型就选择Username with password
便可,id须要输入一个惟一凭据标识。
在Build Environment
下勾选Add timestamps to the Console Output
,这样能够显示时间戳。
在Build
选择MSBuild的版本,这个版本在全局配置设置过,在这里就能够显示出来。MSBuild Build File
输入须要编译的程序集文件名。在Command Line Arguments
输入编译的参数,咱们编译成Realse版本。完成后点击保存便可。具体MSBuild指令不作具体探究,有什么问题直接能够看官方文档
点击当即构建就会自动编译,完成就会显示一个结果
点击#1
便可调转到该次编译的详细信息中,在左侧点击Console Output
能够看到编译的过程日志。
先从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
调用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%%
编译完成,显示警告,错误和结果
... 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编译过程也是同样的。
上面咱们建立了一个最简单的项目,并经过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(); }
而后提交代码到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
文件内的依赖关系编译其余程序集。
生成启动时间为 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”,由于全部输出文件相对于输入文件而言都是最新的。
新建一个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,致使编译通不过。
由于控制台项目更新的时候会向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包
而后从Nuget本地nuget服务器上获取。
Program
的代码增长新的helloworld输出
class Program { static void Main(string[] args) { Console.WriteLine(HelloWolrdHelper.GetString()); Console.WriteLine(Jenkins.Core.HelloWolrdHelper.GetString()); Console.ReadKey(); } }
从新编译项目后上传代码到SVN后再次到Jenkins上构建项目。
能够看到构建失败了,去看下具体失败缘由。
正在将文件从“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包还原。如图拖动到编译以前。
根据咱们目录结构调用".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.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进行持续集成。总结起来以下:
经过以上步骤,基本就完成了自动编译的功能。可是光编译仍是不够的,最终还要完成自动跑单元测试,下一篇博客再进行研究。
本文地址:http://www.javashuo.com/article/p-qxaudbtc-em.html 做者博客:杰哥很忙 欢迎转载,请在明显位置给出出处及连接