Jenkins持续集成学习-Windows环境进行.Net开发2


目录

Jenkins持续集成学习-Windows环境进行.Net开发1

Jenkins持续集成学习-Windows环境进行.Net开发2

Jenkins持续集成学习-Windows环境进行.Net开发3

Jenkins持续集成学习-Windows环境进行.Net开发4

Jenkins持续集成学习-搭建jenkins问题汇总

前言

Jenkins持续集成学习-Windows环境进行.Net开发一文中介绍了如何持续集成部署在SVN上的VS项目。

本文将继续深入探究在.net环境下的持续集成环境。

目标

在掌握持续集成基本配置和jenkins的使用后,完成以下2点任务。

  1. 持续自动编译通过后自动执行单元测试。
  2. 单元测试执行通过后自动生成Nuget包并上传到指定的库服务地址。

使用 .Net Stardard

在Jenkins.Core项目增加一个单元测试项目。

在TestClass新增一个测试方法


[TestFixture]
public class TestClass
{
[Test]
public void TestHelloWorld()
{
Assert.Pass(HelloWolrdHelper.GetString());
}
}

现在Jenkins.Core项目结构如下

│  Jenkins.Core.sln
├─.nuget
│ NuGet.Config
│ NuGet.exe
│ NuGet.targets

├─Jenkins.Core
│ │ HelloWorldHelper.cs
│ │ Jenkins.Core.csproj
│ │ Jenkins.Core.csproj.user
│ │
│ └─Properties
│ AssemblyInfo.cs

└─Jenkins.Core.Test
│ Jenkins.Core.Test.csproj
│ packages.config
│ TestClass.cs

└─Properties
AssemblyInfo.cs

上一章我们提到引用了其他nuget包后,若这个项目的其他程序集编译的时候会错误。

这个项目在编译Jenkins.Core程序集的时候可以编译通过,但是在编译Jenkins.Core.Test会报错,如下图所示。

可以看出圈出来的路径是有问题的。没有找到解决方法,若有人知道的话麻烦说一下。

后面尝试把项目升级到 .Net Stardard。由于上一篇文章我们只添加了JenkinsTest项目到Jenkins中,因此我们需要将Jenkins.Core项目也添加到Jenkins中,并添加自动单元测试的功能,完成后上传到SVN。

SVN目前项目结构如下

创建项目的过程和上一篇一样,只是由于我们的项目是VS2017创建的 .Net Standard项目。因此需要使用15.0的MSBuild编译。

在全局新增15.0的MSBuild。若装了VS2017,可以在VS2017的安装目录找到,我的在D盘,因此在D:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\MSBuild.exe

创建一个新项目取名为unittest。

为了简单起见,暂时只编译Jenkins.Core.csproj。



设置完成后尝试构建,但是报错了

错误提示没有obj\project.assets.json文件。

project.assets.json文件是 .Net Startard 新的包还原方式产生的文件,里面包含了依赖,引用nuget包地址,程序集目标框架等配置。.Net Framework的项目使用nuget进行包还原,会在项目中添加packages文件夹和package.config配置。而 .Net Startard使用PackageReference的方式进行包引用。具体引用原可以可以看官方的文档说明。对于project.assets.json文件的介绍可以看Slim SDK-Style project

由于使用了 .Net Stardard项目我们的.csproj项目非常的简洁,这一下这些配置是我们开发时主要关心的项。SDK-Style probject将其他内容部署相关的配置全部放到了project.assets.json文件中,留下的为开发相关配置。

Jenkins.Core.csproj项目如下,非常简洁。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
<TargetFramework>net45</TargetFramework>
<Version>0.3.0</Version>
<AssemblyVersion>0.3.0.0</AssemblyVersion>
<FileVersion>0.3.0.0</FileVersion>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
</PropertyGroup>
</Project>

Jenkins.Core.Test.csproj项目如下,除了引用关系再无其他乱七八糟的东西了。


<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup>
<TargetFramework>net45</TargetFramework>
</PropertyGroup> <ItemGroup>
<ProjectReference Include="..\Jenkins.Core\Jenkins.Core.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="NUnit" Version="3.11.0" />
</ItemGroup> </Project>

根据PackageReference包引用方式我们将项目中无用的文件可以都删除掉。整个项目结构如下


│ Jenkins.Core.sln

├─Jenkins.Core
│ │ HelloWorldHelper.cs
│ │ Jenkins.Core.csproj
│ │
│ └─obj
│ └──project.assets.json

└─Jenkins.Core.Test
│ Jenkins.Core.Test.csproj
│ Jenkins.Core.Test.csproj.user
│ TestClass.cs

└─obj
└──project.assets.json

上传到SVN后再次构建就成功了。

实际这里需要做的是在创建前先重置包,在重置的时候会自动创建文件。

这里对于PackageReference理解有误,实际上project.assets.json文件为使用PackageReference方式进行包管理时,Nuget包还原时创建的项目依赖及部署依赖的配置文件。在Jenkins持续集成学习-非开发环境搭建jenkins问题汇总一文会提到PackageReference包引用的一些问题。

日志如下


15:47:23 对来自后列目录的编译器使用共享编译: D:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\Roslyn
15:47:24 CopyFilesToOutputDirectory:
15:47:24 正在将文件从“obj\Release\net45\Jenkins.Core.dll”复制到“bin\Release\net45\Jenkins.Core.dll”。
15:47:24 Jenkins.Core -> D:\Program Files (x86)\Jenkins\workspace\unittest\Jenkins.Core\bin\Release\net45\Jenkins.Core.dll
15:47:24 正在将文件从“obj\Release\net45\Jenkins.Core.pdb”复制到“bin\Release\net45\Jenkins.Core.pdb”。
15:47:24 GenerateNuspec:
15:47:24 Successfully created package 'D:\Program Files (x86)\Jenkins\workspace\unittest\Jenkins.Core\bin\Release\Jenkins.Core.0.3.0.nupkg'.
15:47:24 已完成生成项目“D:\Program Files (x86)\Jenkins\workspace\unittest\Jenkins.Core\Jenkins.Core.csproj”(Build 个目标)的操作。
15:47:24

可以看到MSBuild 15使用Roslyn编译器。同时编译完成后自动生成了Nuget包。

单元测试

流程

我们希望的流程如下

graph LR

编译程序集 --> |通过| 创建nuget包
编译程序集 --> |不通过| 失败
创建nuget包 --> 编译单元测试程序集
编译单元测试程序集 --> |通过| 执行单元测试
编译单元测试程序集 --> |不通过| 失败
执行单元测试 --> |通过| 上传nuget包
执行单元测试 --> |不通过| 失败

手动执行单元测试

nunit提供了命令执行单元测试的功能,到nunit官网下载,下载zip的即可,下载后解压。

直接输入nunit3-console会输出参数说明。

E:\开发工具\VS开发工具\NUnit.Console-3.9.0>nunit3-console.exe
NUnit Console Runner 3.9.0
Copyright (c) 2018 Charlie Poole, Rob Prouse NUNIT3-CONSOLE [inputfiles] [options] Runs a set of NUnit tests from the console. InputFiles:
One or more assemblies or test projects of a recognized type. Options:
--test=NAMES Comma-separated list of NAMES of tests to run or
explore. This option may be repeated.
--testlist=PATH File PATH containing a list of tests to run, one
per line. This option may be repeated.
--where=EXPRESSION Test selection EXPRESSION indicating what tests
will be run. See description below.
--params, -p=VALUE Define a test parameter.
--timeout=MILLISECONDS Set timeout for each test case in MILLISECONDS.
--seed=SEED Set the random SEED used to generate test cases.
--workers=NUMBER Specify the NUMBER of worker threads to be used
in running tests. If not specified, defaults to
2 or the number of processors, whichever is
...

nunit3-console后面加上单元测试的dll名就可以进行单元测试,单元测试完成会生成单元测试的结果。默认结果会保存到nunit3-console的目录下,我们需要手动修改目录为我们自己的单元测试项目dll同一级目录。

通过一下命令执行单元测试

nunit3-console.exe dll完整路径名 --work 保存的测试结果路径

我本地执行的单元测试如下

E:\开发工具\VS开发工具\NUnit.Console-3.9.0>nunit3-console.exe F:\Study\Demo\JenkinsTest\JenkinsTest.Core\Jenkins.Core.Test\bin\Debug\net45\Jenkins.Core.Test.dll  --work F:\Study\Demo\JenkinsTest\JenkinsTest.Core\Jenkins.Core.Test\bin\Debug\net45
NUnit Console Runner 3.9.0
Copyright (c) 2018 Charlie Poole, Rob Prouse Runtime Environment
OS Version: Microsoft Windows NT 10.0.17134.0
CLR Version: 4.0.30319.42000 Test Files
F:\Study\Demo\JenkinsTest\JenkinsTest.Core\Jenkins.Core.Test\bin\Debug\net45\Jenkins.Core.Test.dll Run Settings
DisposeRunners: True
WorkDirectory: F:\Study\Demo\JenkinsTest\JenkinsTest.Core\Jenkins.Core.Test\bin\Debug\net45
ImageRuntimeVersion: 4.0.30319
ImageTargetFrameworkName: .NETFramework,Version=v4.5
ImageRequiresX86: False
ImageRequiresDefaultAppDomainAssemblyResolver: False
NumberOfTestWorkers: 4 Test Run Summary
Overall result: Passed
Test Count: 1, Passed: 1, Failed: 0, Warnings: 0, Inconclusive: 0, Skipped: 0
Start time: 2019-01-23 08:30:03Z
End time: 2019-01-23 08:30:04Z
Duration: 1.114 seconds Results (nunit3) saved as TestResult.xml

可以看到测试通过并保存了TestResutlt.xml的测试结果文件。

自动执行单元测试

现在我们希望单元测试的Jenkins.Core.TestJenkins.Core编译完成后能自动编译并执行。

我们在配置中新增一个编译项。

接下里我们就需要在Jenkins中配置单元测试了

Jenkins.Core.Test编译成功后,我们需要执行单元测试,在Build后新增一个批处理脚本,执行我们上面的语句(路径需要换一下)。

E:\开发工具\VS开发工具\NUnit.Console-3.9.0\nunit3-console.exe Jenkins.Core.Test\bin\Release\net45\Jenkins.Core.Test.dll --work Jenkins.Core.Test\bin\Release\net45\

配置如下



保存后再次构建。

17:10:18 用于 .NET Framework 的 Microsoft (R) 生成引擎版本 15.9.21+g9802d43bc3
17:10:18 版权所有(C) Microsoft Corporation。保留所有权利。
17:10:18
17:10:18 生成启动时间为 2019/1/23 17:10:18。
17:10:18 项目“D:\Program Files (x86)\Jenkins\workspace\unittest\Jenkins.Core\Jenkins.Core.csproj”在节点 1 上(Build 个目标)。 ... 17:10:19 已完成生成项目“D:\Program Files (x86)\Jenkins\workspace\unittest\Jenkins.Core\Jenkins.Core.csproj”(Build 个目标)的操作。
17:10:19
17:10:19 已成功生成。
17:10:19 0 个警告
17:10:19 0 个错误
17:10:19
17:10:19 已用时间 00:00:00.82
17:10:19 Path To MSBuild.exe: D:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\MSBuild.exe
17:10:19 Executing the command cmd.exe /C " "D:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\MSBuild.exe" /t:Build /p:Configuration=Release Jenkins.Core.Test/Jenkins.Core.Test.csproj " && exit %%ERRORLEVEL%% from D:\Program Files (x86)\Jenkins\workspace\unittest ...
17:10:20 Jenkins.Core.Test -> D:\Program Files (x86)\Jenkins\workspace\unittest\Jenkins.Core.Test\bin\Release\net45\Jenkins.Core.Test.dll
17:10:20 已完成生成项目“D:\Program Files (x86)\Jenkins\workspace\unittest\Jenkins.Core.Test\Jenkins.Core.Test.csproj”(Build 个目标)的操作。
17:10:20
17:10:20 已成功生成。
17:10:20 0 个警告
17:10:20 0 个错误
17:10:20
17:10:20 已用时间 00:00:01.11
17:10:20 [unittest] $ cmd /c call C:\WINDOWS\TEMP\jenkins6967806742281641251.bat
17:10:20
17:10:20 D:\Program Files (x86)\Jenkins\workspace\unittest>E:\开发工具\VS开发工具\NUnit.Console-3.9.0\nunit3-console.exe Jenkins.Core.Test\bin\Release\net45\Jenkins.Core.Test.dll --work Jenkins.Core.Test\bin\Release\net45\
17:10:21 NUnit Console Runner 3.9.0
...
17:10:22 Test Run Summary
17:10:22 Overall result: Passed
17:10:22 Test Count: 1, Passed: 1, Failed: 0, Warnings: 0, Inconclusive: 0, Skipped: 0
17:10:22 Start time: 2019-01-23 09:10:21Z
17:10:22 End time: 2019-01-23 09:10:22Z
17:10:22 Duration: 1.105 seconds
17:10:22
17:10:22 Results (nunit3) saved as TestResult.xml
17:10:22
17:10:22 D:\Program Files (x86)\Jenkins\workspace\unittest>exit 0
17:10:23 Finished: SUCCESS

通过上面日志可以看到,执行了我们3个编译步骤并且都成功了。

单元测试报告

很多时候我们希望能更直观的看到测试的结果,这时候就需要有一个工具能够解析Nunit测试完成生成的测试结果文件。

在插件管理中查找nunit插件,并安装,然后重启jenkins。

到项目中修改配置,在Post-build Actions中,添加单元测试报告

我们也可以将单元测试报告放到Build的单元测试之后。但是经过测试,由于在Build单元测试失败时会阻止测试报告的统计执行,会造成单元测试失败不会执行测试统计,因此我们将测试报告放到Post-build Actions,这样就不影响了,因为测试失败我们依然要统计失败的数量等。

然后我们在构建一次,在左侧菜单会多处一项测试结果。点进去可以看到测试的图形化界面。

现在我们已经完成单元测试的自动执行,现在我们在项目中多添加几条的单元测试,3条成功,1条失败。

public class TestClass
{
[Test]
public void TestHelloWorld()
{
Assert.Pass(HelloWolrdHelper.GetString());
}
[Test]
public void TestSucceeded()
{
Assert.IsTrue(true);
}
[Test]
public void TestSucceeded2()
{
Assert.IsTrue(true);
}
[Test]
public void TestFailed()
{
Assert.IsFalse(true);
}
}

界面会会显示单元测试的结果趋势

同时本次测试结果会显示详细结果

...
21:33:54 Test Run Summary
21:33:54 Overall result: Failed
21:33:54 Test Count: 4, Passed: 3, Failed: 1, Warnings: 0, Inconclusive: 0, Skipped: 0
21:33:54 Failed Tests - Failures: 1, Errors: 0, Invalid: 0
21:33:54 Start time: 2019-01-23 13:33:53Z
21:33:54 End time: 2019-01-23 13:33:54Z
21:33:54 Duration: 1.162 seconds
21:33:54
21:33:54 Results (nunit3) saved as TestResult.xml
21:33:54
21:33:54 D:\Program Files (x86)\Jenkins\workspace\unittest>exit 1
21:33:54 Build step '执行 Windows 批处理命令' marked build as failure
21:33:55 Recording NUnit tests results
21:33:55 Finished: FAILURE

测试通过后我们希望将nuget包上传到我们的库包服务器上。

上传Nuget包

Publish NUnit test result report后面添加一个Publish Nuget packages

若没有配置过会提示,需要配置



根据库包服务的地址和密码配置完后保存

注意这个配置要到系统设置里配置,而不是全局工具配置。



通过nuget.exe打包的nuget包会产生Jenkins.Core.0.2.0.symbols.nupkg,而通过Net Stardard是不会有这个文件,而这个文件是不能直接上传,只需要上传Jenkins.Core.0.2.0.nupkg即可。因此我们需要把*.symbols.nupkg文件排除掉。

配置完后再次编译,可以看到有一个nuget的包上传符号。

...
09:55:51 Test Run Summary
09:55:51 Overall result: Passed
09:55:51 Test Count: 3, Passed: 3, Failed: 0, Warnings: 0, Inconclusive: 0, Skipped: 0
09:55:51 Start time: 2019-01-24 01:55:50Z
09:55:51 End time: 2019-01-24 01:55:51Z
09:55:51 Duration: 1.045 seconds
09:55:51
09:55:51 Results (nunit3) saved as TestResult.xml
09:55:51
09:55:51 D:\Program Files (x86)\Jenkins\workspace\unittest>exit 0
09:55:52 Recording NUnit tests results
09:55:52 Starting Publish Nuget packages publication
09:55:52 [unittest] $ E:\开发工具\VS开发工具\VS插件\NuGet.exe push Jenkins.Core\bin\Release\Jenkins.Core.0.2.0.nupkg ******** -Source http://127.0.0.1:10080/nuget -NonInteractive
09:55:53 Pushing Jenkins.Core.0.2.0.nupkg to 'http://127.0.0.1:10080/nuget'...
09:55:53 PUT http://127.0.0.1:10080/nuget/
09:55:53 Created http://127.0.0.1:10080/nuget/ 46ms
09:55:53 Your package was pushed.
09:55:53 [unittest] $ E:\开发工具\VS开发工具\VS插件\NuGet.exe push Jenkins.Core\bin\Release\Jenkins.Core.0.3.0.nupkg ******** -Source http://127.0.0.1:10080/nuget -NonInteractive
09:55:54 Pushing Jenkins.Core.0.3.0.nupkg to 'http://127.0.0.1:10080/nuget'...
09:55:54 PUT http://127.0.0.1:10080/nuget/
09:55:54 Created http://127.0.0.1:10080/nuget/ 55ms
09:55:54 Your package was pushed.
09:55:54 Ended Publish Nuget packages publication
09:55:54 Finished: SUCCESS

通过上面的日志可以看到自动上传成功了。

需要注意的是由于我们每次编译完,生成的nuget包都是在同一个目录,因此自动上传会将所有包进行上传,而原来的包我们肯定之前上传过,若我们的nuget的服务器配置不允许重复上传覆盖,<add key="allowOverrideExistingPackageOnPush" value="false" />则原来上传过的包再次上传会上传失败,此时jenkins报上传就会认为是失败的。因此要么我们将设置<add key="allowOverrideExistingPackageOnPush" value="true" />,可以避免这个问题,但是每次都要重复上传包,包越来越多也会影响效率。

因此我们上传成功后就把本地的包删除掉,避免每次编译重复上传包,同时我们需要遵循每次代码修改后的版本号都需要变更,比如我们遵循语义化版本2.0

我们添加一个脚本,处理完成后把bin下面的都删除。



设置一下目录或这文件名。

日志如下,上传完就会执行Deleting project workspace

...
15:16:02 Test Run Summary
15:16:02 Overall result: Passed
15:16:02 Test Count: 3, Passed: 3, Failed: 0, Warnings: 0, Inconclusive: 0, Skipped: 0
15:16:02 Start time: 2019-01-24 07:16:00Z
15:16:02 End time: 2019-01-24 07:16:02Z
15:16:02 Duration: 1.877 seconds
15:16:02
15:16:02 Results (nunit3) saved as TestResult.xml
15:16:02
15:16:02 D:\Program Files (x86)\Jenkins\workspace\unittest>exit 0
15:16:03 Recording NUnit tests results
15:16:03 Starting Publish Nuget packages publication
15:16:03 [unittest] $ E:\开发工具\VS开发工具\VS插件\NuGet.exe push Jenkins.Core\bin\Release\Jenkins.Core.0.3.0.nupkg ******** -Source http://127.0.0.1:10080/nuget -NonInteractive
15:16:04 Pushing Jenkins.Core.0.3.0.nupkg to 'http://127.0.0.1:10080/nuget'...
15:16:04 PUT http://127.0.0.1:10080/nuget/
15:16:04 Created http://127.0.0.1:10080/nuget/ 73ms
15:16:04 Your package was pushed.
15:16:04 Ended Publish Nuget packages publication
15:16:04 [WS-CLEANUP] Deleting project workspace...
15:16:04 [WS-CLEANUP] done
15:16:04 Finished: SUCCESS

目录中bin目录确实已经被删除。

同时Nuget服务器上也可以看到上传的包

优化流程

通过以上配置我们就完成了持续集成的所有主要步骤。但是还是有一个问题,由于Jenkins的Nuget上传插件只能在Post-Build Action步骤配置,若单元测试失败,仍然会自动上传nuget包,这肯定不是我们希望的。当单元测试失败时我们需要将自动生成的Nuget包删除掉,避免自动上传到Nuget服务器。

在单元测试后面我们添加一个条件步骤,当编译必须为成功的时候我们才上传nuget包,因此不满足条件的时候我们需要把生成的nuget包删除掉。

由于Build每个步骤异常(单元测试失败)默认都会设置状态为失败,会造成Build后续不执行。我们可以手动设置为不稳定等状态,让后续步骤继续执行,同时根据状态决定后续步骤是否需要执行。

当单元测试失败我希望执行脚本del Jenkins.Core\bin\Release\*.nupkg把nuget包删除,防止自动上传到nuget服务器。

再次构建日志如下

16:52:47 Test Run Summary
16:52:47 Overall result: Failed
16:52:47 Test Count: 4, Passed: 3, Failed: 1, Warnings: 0, Inconclusive: 0, Skipped: 0
16:52:47 Failed Tests - Failures: 1, Errors: 0, Invalid: 0
16:52:47 Start time: 2019-01-24 08:52:46Z
16:52:47 End time: 2019-01-24 08:52:47Z
16:52:47 Duration: 1.191 seconds
16:52:47
16:52:47 Results (nunit3) saved as TestResult.xml
16:52:47
16:52:47 D:\Program Files (x86)\Jenkins\workspace\unittest>exit 1
16:52:47 Build step '执行 Windows 批处理命令' changed build result to UNSTABLE
16:52:47 [Current build status] check if current [UNSTABLE] is worse or equals then [ABORTED] and better or equals then [UNSTABLE]
16:52:47 Run condition [Current build status] enabling perform for step [执行 Windows 批处理命令]
16:52:47 [unittest] $ cmd /c call C:\WINDOWS\TEMP\jenkins6872476809579074167.bat
16:52:47
16:52:47 D:\Program Files (x86)\Jenkins\workspace\unittest>del Jenkins.Core\bin\Release\*.nupkg
16:52:47
16:52:47 D:\Program Files (x86)\Jenkins\workspace\unittest>exit 0
16:52:49 Recording NUnit tests results
16:52:49 Starting Publish Nuget packages publication
16:52:49 Ended Publish Nuget packages publication
16:52:49 [WS-CLEANUP] Deleting project workspace...
16:52:49 [WS-CLEANUP] done
16:52:49 Finished: UNSTABLE

可以看到单元测试失败将状态设置为UNSTABLE,然后触发了删除nuget文件的脚本。

同时图标会变为黄色,表示编译通过但是不稳定。

结语

最终我们的完整流程图如下图所示

graph LR

编译程序集 --> |通过| 创建nuget包
编译程序集 --> |不通过| 失败
创建nuget包 --> 编译单元测试程序集
编译单元测试程序集 --> |通过| 执行单元测试
编译单元测试程序集 --> |不通过| 失败
执行单元测试 --> |通过| 上传nuget包
执行单元测试 --> |不通过| 删除nuget包
删除nuget包 --> 清理编译文件夹
上传nuget包 --> 清理编译文件夹
失败 --> 清理编译文件夹

  1. SVN获取代码
  2. 编译程序集,编译失败,则失败。
  3. 编译成功创建nuget包。
  4. 执行单元测试
    • 单元测试通过,上传nuget包。
    • 单元测试不通过,删除buget包。
  5. 统计单元测试结果。
  6. 清理bin文件夹。

整个持续集成流程已经完成了,但是还是遗留了几个问题后续在研究。

  1. 每次都需要人工手动构建,这并不够自动。
  2. 自动在代码提交时构建万一出现多个人同时提交会不会有并发问题?
  3. 编译不通过或单元测试执行不通过自动提醒。

参考文档

  1. SDK-Style project and project.assets.json
  2. How can I use msbuild without project.assets.json or nuget restore?
  3. 项目文件中的包引用 (PackageReference)
  4. jenkin 不必要的Execute shell执行失败,导致jenkins都失败的解决



微信扫一扫二维码关注订阅号杰哥技术分享

本文地址:https://www.cnblogs.com/Jack-Blog/p/10316116.html

作者博客:杰哥很忙

欢迎转载,请在明显位置给出出处及链接

Jenkins持续集成学习-Windows环境进行.Net开发2的更多相关文章

  1. Jenkins持续集成学习-Windows环境进行.Net开发1

    目录 Jenkins持续集成学习-Windows环境进行.Net开发 目录 前言 目标 使用Jenkins 安装 添加.net环境配置 部署 结语 参考文档 Jenkins持续集成学习-Windows ...

  2. Jenkins持续集成学习-Windows环境进行.Net开发3

    目录 Jenkins持续集成学习-Windows环境进行.Net开发3 目录 前言 目标 优化nuget包生成流程 自动触发构建 Jenkins定时轮询触发 SVN客户端钩子触发 SVN服务器钩子触发 ...

  3. Jenkins持续集成学习-Windows环境进行.Net开发4

    目录 Jenkins持续集成学习-Windows环境进行.Net开发4 目录 前言 目标 Github持续集成 提交代码到Github 从Github更新代码 git上显示构建状态 自动触发构建 Gi ...

  4. Jenkins持续集成学习-搭建jenkins问题汇总

    目录 Jenkins持续集成学习5-搭建jenkins问题汇总 目录 前言 问题列表 nuget还原包问题 编译问题 SVN更新问题 参考文档 Jenkins持续集成学习5-搭建jenkins问题汇总 ...

  5. Windows系统的Jenkins持续集成环境

    Windows系统的Jenkins持续集成环境 如题:本文将介绍如何在Windows环境下运用Jenkins部署持续集成环境.之所以写本文,是因为在最近工作当中,学习使用Jenkins时,确实遇到了一 ...

  6. windows部署jenkins持续集成maven测试项目不能访问测试报告

    买了一台阿里云的服务器用于练习maven test项目,系统版本wiondows server 2012,将jenkins war包部署在Tomcat服务器上,项目构建后,生成的报告在C:\Windo ...

  7. windows系统下构建Jenkins持续集成

    环境准备 windows10+tomcat+python3.x(安装方法自行百度) 安装Jenkins 从https://jenkins.io/download/ 下载war包 将war包放到tomc ...

  8. Jenkins持续集成(上)-Windows下安装Jenkins

    环境:Windows 2008 R2.Jenkins2.235.1: 概要 前面写过一篇文章,<自动发布-asp.net自动发布.IIS站点自动发布(集成SLB.配置管理.Jenkins)> ...

  9. Docker+Jenkins持续集成环境(4):使用etcd+confd实现容器服务注册与发现

    前面我们已经通过jenkins+docker搭建了基本的持续集成环境,实现了服务的自动构建和部署,但是,我们遇到一个问题,jenkins构建出来的镜像部署后,需要通过ip:port去访问,有什么更好的 ...

随机推荐

  1. Python:每日一题006

    题目:斐波那契数列. 程序分析:斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.…… 个人思路及代码: # 方 ...

  2. 《C#从现象到本质》读书笔记(四)第4章C#和面向对象

    <C#从现象到本质>读书笔记第4章C#和面向对象 面向对象程序设计OOP 面向对象的三大特性是: 1)封装:类可以将它的成员私有化,只暴露它认为应当暴露给外界的成员.通过私有化成员,外界不 ...

  3. ----关于posotion的sticky与fixed的区别----

    sticky 出现在正常流当中,不能设置定位,随页面滚动 (sticky = relative + fixed) fixed 不出现在正常流当中,能设置定位,随页面滚动 eg: html: <p ...

  4. 安装及使用virtualenv

    安装tensorflow之virtualenv 在安装之前首先保证ubuntu.python,以及一些相应的包安装成功. 1.安装virtualenv#(1) pip $ sudo apt-get i ...

  5. Effective C++ 笔记:条款 31 将编译关系降至最低

    31 : Minimize compilation dependencies between files 1 这关乎C++的类(或说都是类惹的祸) 1.1 C++类定义式的问题 C++类定义式不只叙述 ...

  6. 20175316盛茂淞 2018-2019-2 《Java程序设计》第5周学习总结

    20175316盛茂淞 2018-2019-2 <Java程序设计>第5周学习总结 教材学习内容总结 第六章 接口与实现. 何谓接口 接口:书上没有明确地给出接口的定义,我理解的接口就是一 ...

  7. ABP框架系列之十八:(Data-Transfer-Objects-数据转换对象)

    Data Transfer Objects are used to transfer data between Application Layer and Presentation Layer. 数据 ...

  8. unigui 调用js

    //引用单元uniguiapplicationUniSession.AddJS('alert(unigui调用了JS方法)');

  9. 项目中使用同一dll的不同版本

    在一个项目中,因为使用了一些插件,这些插件使用了不同版本的log4net,有1.2版本,有2.0版本的.当运行的时候发生冲突. 解决办法:在config中加入如下的配置 <dependentAs ...

  10. InstallShield 创建 visual studio 工程的时候 指向 任意 visual studio 版本 方法 (修改 计算机 默认 visual studio shell 版本)

    这需要 修改 计算机 默认 visual studio shell 版本 注册表 HKEY_CLASSES_ROOT VisualStudio.DTE 配置节点 描述的是 默认的 visual stu ...