.Net CI/CD 之 Cake FAQ

54 阅读1分钟

Cake参数传递

在build.cake中定义参数,然后在命令行中通过 "--参数名 参数值" 的方式调用

  • 定义参数

        var target = Argument<string>("target", "Default");
        var config =  Argument<string>("configuration", "Release");
    
  • 调用

        .\build.ps1 --target test --configuration Debug
    
  • 参数别名

    • 参数可以通过别名调用,Cake 定义参数调用: "--参数名 参数",powershell 别名调用: "-别名 参数"
    • build.ps1 设置使用 AliasAttribute 标签在参数定义上设置别名
       # 给参数 "Configuration" 设置别名 "c":[Alias("c")]
       [CmdletBinding()]
       Param(
          [string]$Script,
          [string]$Target,
          [Alias("c")] 
          [ValidateSet("Release", "Debug")]
          [string]$Configuration,
          [Parameter(Position=0,Mandatory=$false,ValueFromRemainingArguments=$true)]
          [string[]]$ScriptArgs
      )
      
      # Cake 参数调用
      .\build.ps1 --Configuration Debug
      
      # Powershell 别名参数调用
      .\build.ps1 -c Debug
    

文件CRUD

  • 查找文件

        // 使用 "-" 排除不需要的文件
        var projects = GetFiles("./test/**/*.csproj")
        - GetFiles("./test/**/*.Microbench.csproj")
        - GetFiles("./test/**/*.Performance.csproj");
    
  • 清理文件夹

        // 同时清理多个文件夹
        CleanDirectories(new DirectoryPath[] {output, outputBinaries, outputPackages});
        // 通过模糊匹配清理文件夹
        CleanDirectories("./**/bin/");
    
  • 拷贝文件/目录

        CopyFiles("./build/dist/*.pdb", "./build/pdb/");
        CopyDirectory("./build/pdb/", "./build/pdb2");
    
  • 删除文件

        DeleteFiles("./build/*.pdb");
    

调用其他程序

  • StartProcess
      // 调用 powershell 命令行
      StartProcess("PowerShell", new ProcessSettings() { Arguments = "git fetch origin --tags --prune" }); 
      // 调用 nsis
        StartProcess("C:/Program Files (x86)/NSIS/makensis.exe", new ProcessSettings { Arguments = $"./setup.nsi" });
    
    

版本控制

  • 修改AssemblyInfo.cs

  • .csproj 或者 Directory.Build.props 中添加版本信息

          // Cake 生成 AssemblyInfo.cs
          CreateAssemblyInfo("src/shared/SharedAssemblyInfo.cs", new AssemblyInfoSettings {
          Product = "DotNetty",
          Company = "Microsoft",
          Version = version, // 版本信息
          FileVersion = version, // 版本信息
          Copyright = string.Format("(c) Microsoft 2015 - {0}", DateTime.Now.Year)
      });
      
       // TODO 修改 .csproj/Directory.Build.props
    

msbuild

  • 使用 msbuild/dotnet 命令编译 .Net 程序
        // msbuild 设置
        var settings = new MSBuildSettings 
        {
            Restore = true, // nuget package 是否restore
            Verbosity = Verbosity.Minimal, // Quiet, Minimal, Normal, Verbose, Diagnostic
            Configuration = "Release", // Release, Debug
            PlatformTarget = PlatformTarget.x64, // x64, x86
            HandleExitCode = _=> false, // 异常时是否结束整个Task
            ToolVersion = MSBuildToolVersion.VS2022, // msbuild 路径
            // ToolPath = @"C:\Program Files\Microsoft Visual Studio\2022\Professional\MSBuild\Current\Bin\MSBuild.exe"
        };
        // msbuild 输出log配置        
        var buildLoggerPath = "./out/msbuild.log";
        var logger = new MSBuildFileLogger()
        {
            AppendToLogFile = true,
            Encoding = "UTF-8",
            LogFile = new FilePath(buildLoggerPath),
            MSBuildFileLoggerOutput = MSBuildFileLoggerOutput.All, // All, ErrorsOnly, WarningsOnly
            Verbosity = Verbosity.Normal
        };
        settings.AddFileLogger(logger);
        
        // msbuild 编译 .Net 工程(.csproj/.sln)
        MSBuild("./DotNetty.sln", settings);
        
        ////////////////////////////////////////////////////////////////////
        // dotnet 编译 .Net 工程(.csproj/.sln)
        int result = StartProcess("dotnet", new ProcessSettings { Arguments = "msbuild DotNetty.sln /p:Configuration=" + configuration } );
        if (result != 0)
        {
          throw new CakeException($"Compilation failed.");
        }
    

Unit Test

  • MSTest/xUnit
      // 获取所有单元测试的 csproj 文件
      var csProjectFiles = GetFiles("./src/test/**/*.Test.*.csproj");
      // 编译单元测试工程(csproj)
      foreach(var csPoject in csPprojectFiles)
      { 
        var argument = $"msbuild {csPoject.FullPath} /p:Configuration={configuration}"
        StartProcess("dotnet", new ProcessSettings { Arguments = argument } ); 
      }
      
      // 执行单元测试
      var testSettings = new DotNetCoreTestSettings ()
      { 
        HandleExitCode = _=> true,
        ArgumentCustomization = args=> args.Append("/logger:html;LogFileName=TestResults.html").Append("/logger:trx;LogFileName=TestResults.trx") 
      };
    
      DotNetCoreTest($"./src/test/**/bin/**/Debug/**/*.Test.*.dll", testSettings);