zoukankan      html  css  js  c++  java
  • Jenkins持续集成学习-Windows环境进行.Net开发2

    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项目增加一个单元测试项目。

    1.png

    在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会报错,如下图所示。
    5.png

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

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

    SVN目前项目结构如下
    3.png

    创建项目的过程和上一篇一样,只是由于我们的项目是VS2017创建的 .Net Standard项目。因此需要使用15.0的MSBuild编译。
    在全局新增15.0的MSBuild。若装了VS2017,可以在VS2017的安装目录找到,我的在D盘,因此在D:Program Files (x86)Microsoft Visual Studio2017EnterpriseMSBuild15.0BinMSBuild.exe

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

    为了简单起见,暂时只编译Jenkins.Core.csproj。
    7.png
    设置完成后尝试构建,但是报错了

    6.png

    错误提示没有objproject.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.CoreJenkins.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 Studio2017EnterpriseMSBuild15.0BinRoslyn
    15:47:24 CopyFilesToOutputDirectory:
    15:47:24   正在将文件从“objRelease
    et45Jenkins.Core.dll”复制到“binRelease
    et45Jenkins.Core.dll”。
    15:47:24   Jenkins.Core -> D:Program Files (x86)JenkinsworkspaceunittestJenkins.CoreinRelease
    et45Jenkins.Core.dll
    15:47:24   正在将文件从“objRelease
    et45Jenkins.Core.pdb”复制到“binRelease
    et45Jenkins.Core.pdb”。
    15:47:24 GenerateNuspec:
    15:47:24   Successfully created package 'D:Program Files (x86)JenkinsworkspaceunittestJenkins.CoreinReleaseJenkins.Core.0.3.0.nupkg'.
    15:47:24 已完成生成项目“D:Program Files (x86)JenkinsworkspaceunittestJenkins.CoreJenkins.Core.csproj”(Build 个目标)的操作。
    15:47:24 
    

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

    单元测试

    流程

    我们希望的流程如下

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

    31.png

    手动执行单元测试

    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:StudyDemoJenkinsTestJenkinsTest.CoreJenkins.Core.TestinDebug
    et45Jenkins.Core.Test.dll  --work F:StudyDemoJenkinsTestJenkinsTest.CoreJenkins.Core.TestinDebug
    et45
    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:StudyDemoJenkinsTestJenkinsTest.CoreJenkins.Core.TestinDebug
    et45Jenkins.Core.Test.dll
    
    
    Run Settings
        DisposeRunners: True
        WorkDirectory: F:StudyDemoJenkinsTestJenkinsTest.CoreJenkins.Core.TestinDebug
    et45
        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的测试结果文件。

    9.png

    自动执行单元测试

    现在我们希望单元测试的Jenkins.Core.TestJenkins.Core编译完成后能自动编译并执行。
    我们在配置中新增一个编译项。

    8.png

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

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

    E:开发工具VS开发工具NUnit.Console-3.9.0 unit3-console.exe Jenkins.Core.TestinRelease et45Jenkins.Core.Test.dll --work Jenkins.Core.TestinRelease et45
    配置如下
    10.png
    保存后再次构建。

    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)JenkinsworkspaceunittestJenkins.CoreJenkins.Core.csproj”在节点 1 上(Build 个目标)。
    
    ...
    
    17:10:19 已完成生成项目“D:Program Files (x86)JenkinsworkspaceunittestJenkins.CoreJenkins.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 Studio2017EnterpriseMSBuild15.0BinMSBuild.exe
    17:10:19 Executing the command cmd.exe /C " "D:Program Files (x86)Microsoft Visual Studio2017EnterpriseMSBuild15.0BinMSBuild.exe" /t:Build /p:Configuration=Release Jenkins.Core.Test/Jenkins.Core.Test.csproj " && exit %%ERRORLEVEL%% from D:Program Files (x86)Jenkinsworkspaceunittest
    
    ...
    17:10:20   Jenkins.Core.Test -> D:Program Files (x86)JenkinsworkspaceunittestJenkins.Core.TestinRelease
    et45Jenkins.Core.Test.dll
    17:10:20 已完成生成项目“D:Program Files (x86)JenkinsworkspaceunittestJenkins.Core.TestJenkins.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:WINDOWSTEMPjenkins6967806742281641251.bat
    17:10:20 
    17:10:20 D:Program Files (x86)Jenkinsworkspaceunittest>E:开发工具VS开发工具NUnit.Console-3.9.0
    unit3-console.exe Jenkins.Core.TestinRelease
    et45Jenkins.Core.Test.dll  --work Jenkins.Core.TestinRelease
    et45 
    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)Jenkinsworkspaceunittest>exit 0 
    17:10:23 Finished: SUCCESS
    
    

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

    单元测试报告

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

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

    11.png

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

    16.png

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

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

    现在我们已经完成单元测试的自动执行,现在我们在项目中多添加几条的单元测试,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);
        }
    }
    
    

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

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

    18.png

    ...
    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)Jenkinsworkspaceunittest>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

    若没有配置过会提示,需要配置
    19.png
    根据库包服务的地址和密码配置完后保存

    20.png

    注意这个配置要到系统设置里配置,而不是全局工具配置。
    21.png
    通过nuget.exe打包的nuget包会产生Jenkins.Core.0.2.0.symbols.nupkg,而通过Net Stardard是不会有这个文件,而这个文件是不能直接上传,只需要上传Jenkins.Core.0.2.0.nupkg即可。因此我们需要把*.symbols.nupkg文件排除掉。

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

    ...
    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)Jenkinsworkspaceunittest>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.CoreinReleaseJenkins.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.CoreinReleaseJenkins.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下面的都删除。
    28.png
    设置一下目录或这文件名。
    23.png

    日志如下,上传完就会执行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)Jenkinsworkspaceunittest>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.CoreinReleaseJenkins.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目录确实已经被删除。
    24.png

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

    优化流程

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

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

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

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

    再次构建日志如下

    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)Jenkinsworkspaceunittest>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:WINDOWSTEMPjenkins6872476809579074167.bat
    16:52:47 
    16:52:47 D:Program Files (x86)Jenkinsworkspaceunittest>del Jenkins.CoreinRelease*.nupkg 
    16:52:47 
    16:52:47 D:Program Files (x86)Jenkinsworkspaceunittest>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文件的脚本。

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

    结语

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

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

    30.png

    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都失败的解决

    20191127212134.png
    微信扫一扫二维码关注订阅号杰哥技术分享
    本文地址:https://www.cnblogs.com/Jack-Blog/p/10316116.html
    作者博客:杰哥很忙
    欢迎转载,请在明显位置给出出处及链接

  • 相关阅读:
    变量系列教材 (一)- Java中 什么是变量
    HelloWorld系列(七)- 各种软件、工具版本兼容说明
    HelloWorld系列(六)- eclipse常见的使用技巧
    HelloWorld系列(四)- 使用ecipse创建第一个 java project
    HelloWorld系列(二)- 用命令行中编写第一个 java 程序
    HelloWorld系列(一)- 手把手教你做JDK环境变量配置
    面向对象(三)- Java类的方法
    [LeetCode] 69. Sqrt(x)
    [LeetCode] 258. Add Digits
    [LeetCode] 187. Repeated DNA Sequences
  • 原文地址:https://www.cnblogs.com/Jack-Blog/p/10316116.html
Copyright © 2011-2022 走看看