From 4f7d5ac128e21e5c6f2c3d6bd2db1578a28c1847 Mon Sep 17 00:00:00 2001 From: Build Server Date: Wed, 1 Jan 2025 22:22:15 +0000 Subject: [PATCH] Deployed c777410d to develop with MkDocs 1.6.1 and mike 2.1.3 --- .../news/category/release-notes/page/2.png | Bin 0 -> 28275 bytes .../news/category/release-notes/page/3.png | Bin 0 -> 28275 bytes .../news/category/release-notes/page/4.png | Bin 0 -> 28275 bytes .../issue-providers/docfx/examples/index.html | 14 ++------------ .../inspectcode/examples/index.html | 18 ++---------------- .../markdownlint/examples/index.html | 14 ++------------ .../examples/azure-pipelines/index.html | 9 +-------- .../examples/pullrequest-id/index.html | 16 +++------------- .../repository-information/index.html | 16 +++------------- .../index.html | 9 +-------- develop/search/search_index.json | 2 +- 11 files changed, 15 insertions(+), 83 deletions(-) diff --git a/develop/assets/images/social/news/category/release-notes/page/2.png b/develop/assets/images/social/news/category/release-notes/page/2.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..9ea27754def098862d65f28456f56d96d8c74289 100644 GIT binary patch literal 28275 zcmeFZXIN8P7Y2xOuc(07k*)$F(v&VGSc!mufb=fXdxy|eKolv`rGq5&UIK)sAiW0& zC4}BWZvhDgW=HRxZ|0fbGe73J{K6Q{*=L`%*IMtp-nBlyP=eB)WjsqkK|w3`?1?G` z#b3n~6erzIp8}sKKk(9{psX&4#M{rTk#QVw&C~d`x0fS7pFe&6(W8y@YbG`(G}nqx%uaZzVC#2|N+R?5yR9@O zYL0vhJBN3kSh$;;_b{(j?gc(Zrj=+CF$EdJ8^^Wj~_ z6IcKI79#uR??1m~T=?&6U?=|Dkl*I;|EYycq(J`I;Aggz$hk5;&-~qEB?(oj`P&K0 zqqC2u*}t9q{r?4}9NnvH{Utuq3H?}1fS|7bW2F2FIv_Woyh0Q)q|RN35=tL4fGs^lm)qHk9**S|NG zg$<__Js8ClXH3&+?Dt(DpU`j9IriVsp=y*USctOQ;w`-jYcu=sBUkTdeg;g#?h_$a z_R$AIZOkV$xIB3AJkXy6f}C&6fzCuTrGM5D(%hR zs4$bY55Jmh0MC;>bnQ%*0Q%;*8~sHnb(Bw1mlL%~1Qt*vKP~=P#(;hL$KK1%5At=9L_A ztNhKvUMH?AZ$W8wqd#=uByqg-!!^z(+LQUBG^cflL=L}CsRFpf!9aoc6+Gx&jl-cD zG=qOFZ1czGlcDccjvgu)CQJ?QPX;d#KmT6lQu(L%p00#1>jFN`-Pcl6CQ|zRbw`rV zC%0Z~6x9=I$$Di!U>U0J2&J#MXfWgj^Liwsf5m!hCp?6M>o4-UzGTGpqQ$tVN=vb6 zx~vMsg*l9v9Oc-fQuKSeP>c9S$ELP=lGxKl%eWH$!VT6@mj%qyMcoVqn*wW-%E0zI z8-1y+JfTybBKd6^$7u))bpPIm3{$Ttl)K3zWjp2DL(K;XQ*>*dDG87K

2+$tGu1$?h*(MPq~bK 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

2+$tGu1$?h*(MPq~bK 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

2+$tGu1$?h*(MPq~bK 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 m2Examples

-
build.cake
#addin "Cake.DocFx" // (1)!
+
build.cake
#addin nuget:?package=Cake.DocFx&version=1.0.0
 #addin nuget:?package=Cake.Issues&version=5.0.1
 #addin nuget:?package=Cake.Issues.DocFx&version=5.0.1
 
-
    -
  1. -

    In production code this dependency should be pinned to a specific version to make sure builds are deterministic and - won't break due to updates.

    -

    See Reproducible Builds for details.

    -
  2. -

Note

In addition to the DocFx issue provider the Cake.Issues core addin needs to be added.

@@ -5477,15 +5470,12 @@

Examples

<ImplicitUsings>enable</ImplicitUsings> </PropertyGroup> <ItemGroup> - <PackageReference Include="Cake.DocFx" Version="1.0.0" /> // (1)! + <PackageReference Include="Cake.DocFx" Version="1.0.0" /> <PackageReference Include="Cake.Frosting" Version="5.0.0" /> <PackageReference Include="Cake.Frosting.Issues.DocFx" Version="5.0.1" /> </ItemGroup> </Project>
-
    -
  1. Replace 1.0.0 with the desired version.
  2. -
diff --git a/develop/documentation/issue-providers/inspectcode/examples/index.html b/develop/documentation/issue-providers/inspectcode/examples/index.html index 8523de5a4..d92534284 100644 --- a/develop/documentation/issue-providers/inspectcode/examples/index.html +++ b/develop/documentation/issue-providers/inspectcode/examples/index.html @@ -5481,7 +5481,7 @@

Examples

-
build.cake
#tool "nuget:?package=JetBrains.ReSharper.CommandLineTools" // (1)!
+
build.cake
#tool "nuget:?package=JetBrains.ReSharper.CommandLineTools&version=1.0.0"
 
 var logPath = @"c:\build\inspectcode.xml";
 var repoRootFolder = MakeAbsolute(Directory("./"));
@@ -5509,13 +5509,6 @@ 

Examples

Information("{0} issues are found.", issues.Count()); });
-
    -
  1. -

    In production code this dependency should be pinned to a specific version to make sure builds are deterministic and - won't break due to updates.

    -

    See Reproducible Builds for details.

    -
  2. -
Program.cs
using Cake.Common.Diagnostics;
@@ -5532,7 +5525,7 @@ 

Examples

.UseContext<BuildContext>() .InstallTool( new Uri( - "nuget:?package=JetBrains.ReSharper.CommandLineTools")) // (1)! + "nuget:?package=JetBrains.ReSharper.CommandLineTools&version=1.0.0")) .Run(args); } } @@ -5576,13 +5569,6 @@

Examples

} }
-
    -
  1. -

    In production code this dependency should be pinned to a specific version to make sure builds are deterministic and - won't break due to updates.

    -

    See Reproducible Builds for details.

    -
  2. -
diff --git a/develop/documentation/issue-providers/markdownlint/examples/index.html b/develop/documentation/issue-providers/markdownlint/examples/index.html index ac84ddd2a..438e7fd9c 100644 --- a/develop/documentation/issue-providers/markdownlint/examples/index.html +++ b/develop/documentation/issue-providers/markdownlint/examples/index.html @@ -5451,17 +5451,10 @@

Examples

-
build.cake
#addin "Cake.Markdownlint" // (1)!
+
build.cake
#addin nuget:?package=Cake.Markdownlint&version=1.0.0
 #addin nuget:?package=Cake.Issues&version=5.0.1
 #addin nuget:?package=Cake.Issues.Markdownlint&version=5.0.1
 
-
    -
  1. -

    In production code this dependency should be pinned to a specific version to make sure builds are deterministic and - won't break due to updates.

    -

    See Reproducible Builds for details.

    -
  2. -

Note

In addition to the markdownlint issue provider the Cake.Issues core addin needs to be added.

@@ -5476,15 +5469,12 @@

Examples

<ImplicitUsings>enable</ImplicitUsings> </PropertyGroup> <ItemGroup> - <PackageReference Include="Cake.Markdownlint" Version="1.0.0" /> // (1)! + <PackageReference Include="Cake.Markdownlint" Version="1.0.0" /> <PackageReference Include="Cake.Frosting" Version="5.0.0" /> <PackageReference Include="Cake.Frosting.Issues.Markdownlint" Version="5.0.1" /> </ItemGroup> </Project>
-
    -
  1. Replace 1.0.0 with the desired version.
  2. -
diff --git a/develop/documentation/pull-request-systems/azure-devops/examples/azure-pipelines/index.html b/develop/documentation/pull-request-systems/azure-devops/examples/azure-pipelines/index.html index 1dc40130f..c5f6162ce 100644 --- a/develop/documentation/pull-request-systems/azure-devops/examples/azure-pipelines/index.html +++ b/develop/documentation/pull-request-systems/azure-devops/examples/azure-pipelines/index.html @@ -5457,15 +5457,8 @@

Using With Azure Pipelines

#addin nuget:?package=Cake.Issues.InspectCode&version=5.0.1 #addin nuget:?package=Cake.Issues.PullRequests&version=5.0.1 #addin nuget:?package=Cake.Issues.PullRequests.AzureDevOps&version=5.0.1 -#addin "Cake.AzureDevOps" // (1)! +#addin nuget:?package=Cake.AzureDevOps&version=1.0.0
-
    -
  1. -

    In production code this dependency should be pinned to a specific version to make sure builds are deterministic and - won't break due to updates.

    -

    See Reproducible Builds for details.

    -
  2. -

Note

In addition to the Azure DevOps pull request system the Cake.Issues and Cake.Issues.PullRequests core addins diff --git a/develop/documentation/pull-request-systems/azure-devops/examples/pullrequest-id/index.html b/develop/documentation/pull-request-systems/azure-devops/examples/pullrequest-id/index.html index 1ba9b06cd..d1d110ea2 100644 --- a/develop/documentation/pull-request-systems/azure-devops/examples/pullrequest-id/index.html +++ b/develop/documentation/pull-request-systems/azure-devops/examples/pullrequest-id/index.html @@ -5454,20 +5454,13 @@

Using With Pull Request ID

-
build.cake
#addin "Cake.Git" // (1)!
+
build.cake
#addin nuget:?package=Cake.Git&version=1.0.0
 #addin nuget:?package=Cake.Issues&version=5.0.1
 #addin nuget:?package=Cake.Issues.InspectCode&version=5.0.1
 #addin nuget:?package=Cake.Issues.PullRequests&version=5.0.1
 #addin nuget:?package=Cake.Issues.PullRequests.AzureDevOps&version=5.0.1
-#addin "Cake.AzureDevOps" // (1)!
+#addin nuget:?package=Cake.AzureDevOps&version=1.0.0
 
-
    -
  1. -

    In production code this dependency should be pinned to a specific version to make sure builds are deterministic and - won't break due to updates.

    -

    See Reproducible Builds for details.

    -
  2. -

Note

In addition to the Azure DevOps pull request system the Cake.Issues and Cake.Issues.PullRequests core addins @@ -5484,15 +5477,12 @@

Using With Pull Request ID

</PropertyGroup> <ItemGroup> <PackageReference Include="Cake.Frosting" Version="5.0.0" /> - <PackageReference Include="Cake.Frosting.Git" Version="1.0.0" /> // (1)! + <PackageReference Include="Cake.Frosting.Git" Version="{{ cake_git }}" /> <PackageReference Include="Cake.Frosting.Issues.InspectCode" Version="5.0.1" /> <PackageReference Include="Cake.Frosting.Issues.PullRequests.AzureDevOps" Version="5.0.1" /> </ItemGroup> </Project>
-
    -
  1. Replace 1.0.0 with the desired version.
  2. -
diff --git a/develop/documentation/pull-request-systems/azure-devops/examples/repository-information/index.html b/develop/documentation/pull-request-systems/azure-devops/examples/repository-information/index.html index ea18179c1..d60f4b6df 100644 --- a/develop/documentation/pull-request-systems/azure-devops/examples/repository-information/index.html +++ b/develop/documentation/pull-request-systems/azure-devops/examples/repository-information/index.html @@ -5454,20 +5454,13 @@

Using With Repository Remote URL And Source Branch Name

-
build.cake
#addin "Cake.Git" // (1)!
+
build.cake
#addin nuget:?package=Cake.Git&version=1.0.0
 #addin nuget:?package=Cake.Issues&version=5.0.1
 #addin nuget:?package=Cake.Issues.InspectCode&version=5.0.1
 #addin nuget:?package=Cake.Issues.PullRequests&version=5.0.1
 #addin nuget:?package=Cake.Issues.PullRequests.AzureDevOps&version=5.0.1
-#addin "Cake.AzureDevOps" // (1)!
+#addin nuget:?package=Cake.AzureDevOps&version=1.0.0
 
-
    -
  1. -

    In production code this dependency should be pinned to a specific version to make sure builds are deterministic and - won't break due to updates.

    -

    See Reproducible Builds for details.

    -
  2. -

Note

In addition to the Azure DevOps pull request system the Cake.Issues and Cake.Issues.PullRequests core addins @@ -5484,15 +5477,12 @@

Using With Repository Remote URL And Source Branch Name

</PropertyGroup> <ItemGroup> <PackageReference Include="Cake.Frosting" Version="5.0.0" /> - <PackageReference Include="Cake.Frosting.Git" Version="1.0.0" /> // (1)! + <PackageReference Include="Cake.Frosting.Git" Version="1.0.0" /> <PackageReference Include="Cake.Frosting.Issues.InspectCode" Version="5.0.1" /> <PackageReference Include="Cake.Frosting.Issues.PullRequests.AzureDevOps" Version="5.0.1" /> </ItemGroup> </Project>
-
    -
  1. Replace 1.0.0 with the desired version.
  2. -
diff --git a/develop/documentation/usage/recipe/using-cake-frosting-issues-recipe/index.html b/develop/documentation/usage/recipe/using-cake-frosting-issues-recipe/index.html index f47b8b1dc..043de4743 100644 --- a/develop/documentation/usage/recipe/using-cake-frosting-issues-recipe/index.html +++ b/develop/documentation/usage/recipe/using-cake-frosting-issues-recipe/index.html @@ -5605,19 +5605,12 @@

Register Cake.Issues tasks .UseContext<BuildContext>() .InstallTool( new Uri( - "nuget:?package=JetBrains.ReSharper.CommandLineTools")) // (1) + "nuget:?package=JetBrains.ReSharper.CommandLineTools&version=1.0.0")) .AddAssembly(Assembly.GetAssembly(typeof(IssuesTask))) .Run(args); } }

-
    -
  1. -

    In production code this dependency should be pinned to a specific version to make sure builds are deterministic and - won't break due to updates.

    -

    See Reproducible Builds for details.

    -
  2. -

Create build context

Cake.Frosting.Issues.Recipe provides a build context from which you need to inherit your custom build context. The build context contains configuration parameters, but also the state of the current running build, diff --git a/develop/search/search_index.json b/develop/search/search_index.json index c60e21817..3001d83c1 100644 --- a/develop/search/search_index.json +++ b/develop/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"api/","title":"API","text":""},{"location":"api/#core-addins","title":"Core Addins","text":"

  • Cake.Issues
  • Cake.Issues.Reporting
  • Cake.Issues.PullRequests
"},{"location":"api/#issue-provider","title":"Issue Provider","text":"
  • Cake.Issues.DocFx
  • Cake.Issues.EsLint
  • Cake.Issues.GitRepository
  • Cake.Issues.InspectCode
  • Cake.Issues.Markdownlint
  • Cake.Issues.MsBuild
  • Cake.Issues.Sarif
  • Cake.Issues.Terraform
"},{"location":"api/#report-formats","title":"Report Formats","text":"
  • Cake.Issues.Reporting.Console
  • Cake.Issues.Reporting.Generic
  • Cake.Issues.Reporting.Sarif
"},{"location":"api/#pull-request-systems","title":"Pull Request Systems","text":"
  • Cake.Issues.PullRequests.AppVeyor
  • Cake.Issues.PullRequests.AzureDevOps
  • Cake.Issues.PullRequests.GitHubActions
"},{"location":"documentation/features/","title":"Features","text":""},{"location":"documentation/features/#ready-to-use-distributions","title":"Ready To Use Distributions","text":"
  • Cake Recipe Packages

    Cake Issues recipes provide build scripts, delivered as a NuGet package, which can be used inside your projects Cake build to add issue management.

    It handles all the parsing, integration with build and pull request systems for you, using the individual Cake Issues addins.

    Recipes

"},{"location":"documentation/features/#reading-creating-issues","title":"Reading & Creating Issues","text":"
  • Read issues provided by tools

    The ReadIssues aliases can be used for reading issues reported by a linter to tool using an issue provider.

    There are overloads for reading using a single or multiple issue provider.

    Aliases

  • Create issues in your build

    The NewIssue aliases can be used for creating issues in the build script.

    Aliases

  • Support for file links

    Support for creating links to file & location on source code hosting system (GitHub, Azure Repos, etc).

    Aliases

  • Issue serialization

    Support for serializing and deserializing created issues and issues read from tools.

    Aliases

  • Support for multiple message formats

    Support for reading issues in multiple formats (Plain text, Markdown, HTML) if supported by issue provider.

  • Support for run information

    Support for passing additional run information to identify specific runs.

"},{"location":"documentation/features/#breaking-builds","title":"Breaking builds","text":"
  • Fail builds on reported issues

    The BreakBuildOnIssues aliases can be used for failing builds if specific issues were reported.

    There are overloads for failing if issues of certain minimum priority or issue providers are found, or by passing any custom function.

    Aliases

"},{"location":"documentation/features/#reporting","title":"Reporting","text":"
  • Create reports

    The CreateIssueReport aliases can be used for creating reports in a supported reporting format.

    There are overloads for reading issues from a single or multiple issue provider or for passing an existing list of issues.

    Aliases

"},{"location":"documentation/features/#build-pull-request-system-integration","title":"Build & Pull Request System Integration","text":"
  • Add comments to pull requests

    The ReportIssuesToPullRequest aliases can be used for writing issues as comments to pull requests.

    There are overloads for reading issues from a single or multiple issue provider or for passing an existing list of issues.

    Aliases

  • Report issues to build runs

    The ReportIssuesToPullRequest aliases can be used for reporting issues to build runs.

    There are overloads for reading issues from a single or multiple issue provider or for passing an existing list of issues.

    Aliases

  • Issue filters

    Support for passing custom issue filter routines.

    Setting

  • Limit reported issues

    Advanced support to limit number of maximum issues per run, across multiple runs or per issue provider through settings.

    Settings

  • Automatic comment resolving

    If supported by the pull request system, comments for issues are automatic resolved if fixed in subsequent commits.

"},{"location":"documentation/how-cake-issues-works/","title":"How Cake Issues Works","text":"

The Cake Issues addins are built in a modular architecture, allowing to easily enhance it for supporting additional analyzers, linters, report formats and pull request systems.

"},{"location":"documentation/how-cake-issues-works/#cakeissues-addin","title":"Cake.Issues addin","text":"

The Cake.Issues addin provides aliases for creating issues or reading issues using one or more issue providers.

Support for different code analyzers and linters is provided through issue provider addins which cover a wide range of linters and tools.

The issues are read into IIssue objects which then can be passed to Cake.Issues.Reporting addin, Cake.Issues.PullRequests addin or further processed in the build script.

The use of issue provider addins, which contain the parsing logic for individual tool output formats, and the use of IIssue as common data structure, allows to abstract the tooling output from other concerns like integration with build systems, pull request workflow or the creation of reports.

"},{"location":"documentation/how-cake-issues-works/#cakeissuesreporting-addin","title":"Cake.Issues.Reporting addin","text":"

The Cake.Issues.Reporting addin provides aliases for creating reports for issues which are read or have been created using the Cake.Issues addin.

Support for different report formats is provided through report format addins.

"},{"location":"documentation/how-cake-issues-works/#cakeissuespullrequests-addin","title":"Cake.Issues.PullRequests addin","text":"

The Cake.Issues.PullRequests addin provides aliases for reporting issues which are read or have been created using the Cake.Issues addin as comments to pull requests or builds.

Support for different pull request systems is provided through pull request system addins.

"},{"location":"documentation/overview/","title":"Introduction","text":"

The Cake.Issues addins for the Cake build automation system offer an extensive and flexible solution for reading linting issues.

Cake.Issues redefines issue management within the Cake build system by offering a comprehensive, universal, and extensible solution. The unique capabilities of the addins empower development teams to enforce coding standards, generate insightful reports, seamlessly incorporate various linting tools, and streamlining the integration with pull requests. With its modular architecture and extensive set of aliases, Cake.Issues provides a future-proof infrastructure for issue management in Cake builds, fostering a more efficient and adaptable development process.

"},{"location":"documentation/overview/#unique-problem-solving","title":"Unique Problem Solving","text":"

Some examples how Cake.Issues can help development teams to improve code quality.

"},{"location":"documentation/overview/#break-build-on-linting-issues","title":"Break build on linting issues","text":"

Cake.Issues provides a seamless integration, allowing you to enforce coding standards by breaking builds when linting issues are detected.

Breaking builds

"},{"location":"documentation/overview/#pull-requests-integration","title":"Pull Requests integration","text":"

Ensure linting issues are promptly addressed by having them reported as comments on pull requests. Cake.Issues bridges the gap between linting tools and version control systems, fostering efficient collaboration during code reviews.

Integrate with pull request systems

"},{"location":"documentation/overview/#reports","title":"Reports","text":"

Craft detailed and visually appealing reports for linting issues directly within your Cake build. The addins facilitates easy identification and resolution of linting concerns, enhancing the overall code quality.

Creating Reports

"},{"location":"documentation/overview/#universal-compatibility","title":"Universal Compatibility","text":""},{"location":"documentation/overview/#diverse-linting-tool-support","title":"Diverse Linting Tool Support","text":"

Regardless of the linting tools you use, Cake.Issues ensures that you're not left out. Cake.Issues supports a variety of analyzers and linters, allowing you to incorporate new tools effortlessly while maintaining integration with existing ones.

Supported Tools

"},{"location":"documentation/overview/#build-system-agnosticism","title":"Build System Agnosticism","text":"

Embrace the freedom to choose the build system that best suit your needs. If your current build system lacks tasks for reporting issues in pull requests, Cake.Issues steps in to fill that void seamlessly. In the case of using multiple CI services, Cake.Issues guarantees a consistent feature set across all of them.

Supported Build and pull request systems

"},{"location":"documentation/overview/#unprecedented-extensibility","title":"Unprecedented Extensibility","text":""},{"location":"documentation/overview/#modular-architecture","title":"Modular Architecture","text":"

The Cake.Issues addin breaks away from the norm by offering a modular architecture. Comprising over 15 distinct addins, it presents a cohesive solution through more than 75 aliases for Cake builds, providing unparalleled flexibility.

Architecture

"},{"location":"documentation/overview/#extensible-infrastructure","title":"Extensible Infrastructure","text":"

Designed with extensibility in mind, Cake.Issues provides extension points for supporting additional analyzers, linters,report formats, and code review systems. This adaptability ensures that your build scripts can evolve with the ever-changing landscape of development tools.

Documentation

"},{"location":"documentation/supported-tools/","title":"Supported Tools","text":"

This pages lists tools known to be working with Cake Issues (1)

  1. If you have used Cake Issues with other we would like to hear from you. You can add it to this list by creating a pull request here.
"},{"location":"documentation/supported-tools/#net","title":".NET","text":"Tool Tool Version Format Issue Provider Supported Since dupFinder Cake.Issues.DupFinder 0.8.0 InspectCode xml Cake.Issues.InspectCode 0.1.0 InspectCode >= 2024.1 SARIF Cake.Issues.Sarif 4.2.0 MsBuild Binary Log 7 Cake.Issues.MsBuild 0.6.1 MsBuild Binary Log 8 Cake.Issues.MsBuild 0.8.0 MsBuild Binary Log 9 Cake.Issues.MsBuild 2.0.0 MsBuild Binary Log 16 Cake.Issues.MsBuild 3.0.0 MsBuild Binary Log 17 Cake.Issues.MsBuild 4.0.0 MsBuild Binary Log 18 Cake.Issues.MsBuild 4.1.0 MsBuild Binary Log 20 Cake.Issues.MsBuild 4.3.0 MsBuild Binary Log 21 Cake.Issues.MsBuild 4.7.0 MsBuild Binary Log 22 Cake.Issues.MsBuild 4.10.0 MsBuild Binary Log 23 Cake.Issues.MsBuild 4.11.0 MsBuild Binary Log 24 Cake.Issues.MsBuild 4.12.0 MsBuild XmlFileLogger Cake.Issues.MsBuild 0.1.0"},{"location":"documentation/supported-tools/#ansible","title":"Ansible","text":"Tool Tool Version Format Issue Provider Supported Since Ansible-lint SARIF Cake.Issues.Sarif 4.2.0 checkov SARIF Cake.Issues.Sarif 4.2.0 kics sarif Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#amazon-cloud-formation-templates","title":"Amazon Cloud Formation Templates","text":"Tool Tool Version Format Issue Provider Supported Since cfn-lint SARIF Cake.Issues.Sarif 4.2.0 checkov SARIF Cake.Issues.Sarif 4.2.0 kics sarif Cake.Issues.Sarif 4.2.0 Trivy SARIF Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#azure-resource-manager-arm","title":"Azure Resource Manager (ARM)","text":"Tool Tool Version Format Issue Provider Supported Since checkov SARIF Cake.Issues.Sarif 4.2.0 kics sarif Cake.Issues.Sarif 4.2.0 Trivy SARIF Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#bicep","title":"Bicep","text":"Tool Tool Version Format Issue Provider Supported Since checkov SARIF Cake.Issues.Sarif 4.2.0 kics sarif Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#dockerfile","title":"Dockerfile","text":"Tool Tool Version Format Issue Provider Supported Since checkov SARIF Cake.Issues.Sarif 4.2.0 Hadolint sarif Cake.Issues.Sarif 4.2.0 kics sarif Cake.Issues.Sarif 4.2.0 Trivy SARIF Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#github-actions","title":"GitHub Actions","text":"Tool Tool Version Format Issue Provider Supported Since actionlint SARIF Cake.Issues.Sarif 4.2.0 checkov SARIF Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#go","title":"Go","text":"Tool Tool Version Format Issue Provider Supported Since golangci-lint sarif Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#groovy","title":"Groovy","text":"Tool Tool Version Format Issue Provider Supported Since npm-groovy-lint sarif Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#helm-charts","title":"Helm charts","text":"Tool Tool Version Format Issue Provider Supported Since checkov SARIF Cake.Issues.Sarif 4.2.0 kics sarif Cake.Issues.Sarif 4.2.0 Trivy SARIF Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#java","title":"Java","text":"Tool Tool Version Format Issue Provider Supported Since checkstyle sarif Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#javascript","title":"JavaScript","text":"Tool Tool Version Format Issue Provider Supported Since ESLint Current json Cake.Issues.EsLint 0.1.0"},{"location":"documentation/supported-tools/#json","title":"JSON","text":"Tool Tool Version Format Issue Provider Supported Since eslint-plugin-json Cake.Issues.EsLint 0.1.0 eslint-plugin-jsonc Cake.Issues.EsLint 0.1.0"},{"location":"documentation/supported-tools/#jsx-tsx","title":"JSX & TSX","text":"Tool Tool Version Format Issue Provider Supported Since eslint-plugin-jsx-a11y Cake.Issues.EsLint 0.1.0 eslint-plugin-react Cake.Issues.EsLint 0.1.0"},{"location":"documentation/supported-tools/#kotlin","title":"Kotlin","text":"Tool Tool Version Format Issue Provider Supported Since detekt sarif Cake.Issues.Sarif 4.2.0 ktlint sarif Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#kubernetes","title":"Kubernetes","text":"Tool Tool Version Format Issue Provider Supported Since checkov SARIF Cake.Issues.Sarif 4.2.0 kics sarif Cake.Issues.Sarif 4.2.0 Trivy SARIF Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#markdown","title":"Markdown","text":"Tool Tool Version Format Issue Provider Supported Since DocFx Cake.Issues.DocFx 0.1.0 markdownlint resultVersion=1 Cake.Issues.Markdownlint 0.1.0 markdownlint-cli < 0.9.0 Default Cake.Issues.Markdownlint 0.2.0 markdownlint-cli >= 0.9.0 Default Cake.Issues.Markdownlint 0.3.0 markdownlint-cli >= 0.19.0 Default Cake.Issues.Markdownlint 0.8.1 markdownlint-cli >= 0.22.0 Default Cake.Issues.Markdownlint 0.8.2 markdownlint-cli json Cake.Issues.Markdownlint 1.1.0"},{"location":"documentation/supported-tools/#openapi","title":"OpenAPI","text":"Tool Tool Version Format Issue Provider Supported Since checkov SARIF Cake.Issues.Sarif 4.2.0 kics sarif Cake.Issues.Sarif 4.2.0 Spectral sarif Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#php","title":"PHP","text":"Tool Tool Version Format Issue Provider Supported Since Psalm results.sarif Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#protobuf","title":"Protobuf","text":"Tool Tool Version Format Issue Provider Supported Since protolint sarif Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#python","title":"Python","text":"Tool Tool Version Format Issue Provider Supported Since Bandit sarif Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#secrets","title":"Secrets","text":"Tool Tool Version Format Issue Provider Supported Since checkov SARIF Cake.Issues.Sarif 4.2.0 DevSkim sarif Cake.Issues.Sarif 4.2.0 gitleaks sarif Cake.Issues.Sarif 4.2.0 secretlint sarif Cake.Issues.Sarif 4.2.0 semgrep sarif Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#terraform","title":"Terraform","text":"Tool Tool Version Format Issue Provider Supported Since checkov SARIF Cake.Issues.Sarif 4.2.0 kics sarif Cake.Issues.Sarif 4.2.0 Terraform Validate Cake.Issues.Terraform 1.0.0 TFLint sarif Cake.Issues.Sarif 4.2.0 Trivy SARIF Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#typescript","title":"TypeScript","text":"Tool Tool Version Format Issue Provider Supported Since ESLint Current json Cake.Issues.EsLint 0.1.0"},{"location":"documentation/contributing/how-to-build/","title":"How to build addins","text":"

To build this a package we are using Cake.

On Windows PowerShell run:

./build\n

On OSX/Linux run:

./build.sh\n
"},{"location":"documentation/contributing/how-to-contribute/","title":"How to contribute","text":"

The repositories are using GitFlow with default configuration. Development is happening on develop branch.

To contribute:

  • Fork this repository.
  • Create a feature branch from develop.
  • Implement your changes.
  • Push your feature branch.
  • Create a pull request.

For getting started see issues marked with Up-for-grabs in the individual repositories.

"},{"location":"documentation/contributing/how-to-release/","title":"How to release addins","text":"

See Cake.Recipe documentation how to create a new release of this addin.

"},{"location":"documentation/extending/","title":"Extending","text":"

Cake Issues can easily be extended with additional Issue Provider, Report Formats and Pull Request System integrations.

"},{"location":"documentation/extending/testing/","title":"Testing","text":"

The Cake.Issues.Testing package provides different helper classes for writing test cases for issue provider, report format or pull request system addins.

API Documentation on fuget.org

"},{"location":"documentation/extending/issue-provider/categories/","title":"Alias categories","text":"

Issue provider aliases should use the IssuesAliasConstants.MainCakeAliasCategory and IssuesAliasConstants.IssueProviderCakeAliasCategory constants for defining their category:

[CakeAliasCategory(IssuesAliasConstants.MainCakeAliasCategory)]\npublic static class MyIssueProviderAliases\n{\n    [CakeMethodAlias]\n    [CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]\n    public static IIssueProvider MyIssueProvider(\n        this ICakeContext context)\n    {\n    }\n}\n
"},{"location":"documentation/extending/issue-provider/helper/","title":"Helper","text":"

The following helpers are provider by Cake.Issues for simplifying implementation of issue providers:

Helper Description StringPathExtensions Extensions for string for handling paths. ByteArrayExtensions Extensions for converting between strings an byte arrays."},{"location":"documentation/extending/issue-provider/helper/#file-linking","title":"File linking","text":"

Cake.Issues provides infrastructure to get links to files on source code hosts like GitHub or Azure Repos. This infrastructure can be used inside issue providers to generate file links which can be used inside the issue messages:

protected override IEnumerable<IIssue> InternalReadIssues()\n{\n    var result = new List<IIssue>();\n\n    var filePath = \"foo.cs\";\n    var line = 10;\n\n    var fileLink = \n        this.Settings.FileLinkSettings.GetFileLink(\n            IssueBuilder\n                .NewIssue(\"Issue for creating file link\", this)\n                .InFile(filePath, line)\n                .Create()\n        );\n\n    var htmlMessage =\n        $\"This is an issues in the file <a href=\\\"{fileLink}\\\">{filePath}</a>\";\n\n    var issue =\n        IssueBuilder\n            .NewIssue(\"MyMessage\", this)\n            .WithMessageInHtmlFormat(htmlMessage)\n            .InFile(filePath, line)\n            .Create();\n\n    return result;\n}\n
"},{"location":"documentation/extending/issue-provider/overview/","title":"Overview","text":"

Issue providers need to implement the IIssueProvider interface.

"},{"location":"documentation/extending/issue-provider/overview/#base-classes","title":"Base classes","text":"

For simplifying implementation there exists base classes from which concrete implementation can be inherited.

Base Class Use case Tutorial BaseIssueProvider Base class for a simple issue provider implementation. Simple provider BaseConfigurableIssueProvider Base class for a issue provider with issue provider specific settings. Provider settings BaseMultiFormatIssueProvider Base class for issue providers supporting multiple log formats. Multiple log file formats support"},{"location":"documentation/extending/issue-provider/tutorials/logfile-format/","title":"Multiple log file formats","text":"

A single issue provider might support reading issues from multiple different log file formats. For these cases the Cake.Issue addin provides the BaseMultiFormatIssueProvider, BaseMultiFormatIssueProviderSettings and BaseLogFileFormat classes for simplifying implementation in the issue provider addin.

"},{"location":"documentation/extending/issue-provider/tutorials/logfile-format/#implementing-issue-provider","title":"Implementing issue provider","text":"

A concrete class inheriting from BaseMultiFormatIssueProvider needs to be implemented defining the concrete types.

/// <summary>\n/// My issue provider.\n/// </summary>\npublic class MyIssuesProvider : BaseMultiFormatIssueProvider<MyIssuesSettings, MyIssuesProvider>\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"MyIssuesProvider\"/> class.\n    /// </summary>\n    /// <param name=\"log\">The Cake log context.</param>\n    /// <param name=\"settings\">Settings for reading the log file.</param>\n    public MyIssuesProvider(ICakeLog log, MyIssuesSettings settings)\n        : base(log, settings)\n    {\n    }\n\n    /// <inheritdoc />\n    public override string ProviderName => \"MyIssuesProvider\";\n}\n

Also a concrete class inheriting from BaseMultiFormatIssueProviderSettings needs to be implemented defining the concrete types. Based on the capabilities of the log file formats the appropriate constructors for reading from the file system or memory can be made public:

/// <summary>\n/// Settings for my issue provider.\n/// </summary>\npublic class MyIssuesSettings : BaseMultiFormatIssueProviderSettings<MyIssuesProvider, MyIssuesSettings>\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"MyIssuesSettings\"/> class\n    /// for reading a log file on disk.\n    /// </summary>\n    /// <param name=\"logFilePath\">Path to the log file.\n    /// The log file needs to be in the format as defined by the <paramref name=\"format\"/> parameter.</param>\n    /// <param name=\"format\">Format of the provided log file.</param>\n    public MyIssuesSettings(FilePath logFilePath, MyLogFileFormat format)\n        : base(logFilePath, format)\n    {\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"MyIssuesSettings\"/> class\n    /// for a log file content in memory.\n    /// </summary>\n    /// <param name=\"logFileContent\">Content of the log file.\n    /// The log file needs to be in the format as defined by the <paramref name=\"format\"/> parameter.</param>\n    /// <param name=\"format\">Format of the provided log file.</param>\n    public MyIssuesSettings(byte[] logFileContent, MyLogFileFormat format)\n        : base(logFileContent, format)\n    {\n    }\n}\n
"},{"location":"documentation/extending/issue-provider/tutorials/logfile-format/#implementing-log-file-format-infrastructure","title":"Implementing log file format infrastructure","text":"

An abstract class inheriting from BaseLogFileFormat needs to be implemented defining the concrete types for the issue provider:

/// <summary>\n/// Base class for all log file formats supported by my issue provider.\n/// </summary>\npublic abstract class MyLogFileFormat : BaseLogFileFormat<MyIssuesProvider, MyIssuesSettings>\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"MyLogFileFormat\"/> class.\n    /// </summary>\n    /// <param name=\"log\">The Cake log instance.</param>\n    protected MyLogFileFormat(ICakeLog log)\n        : base(log)\n    {\n    }\n}\n
"},{"location":"documentation/extending/issue-provider/tutorials/logfile-format/#implementing-log-file-format","title":"Implementing log file format","text":"

The different log file formats of an issue provider need to be inherited from the abstract log file format class:

/// <summary>\n/// Concrete log format.\n/// </summary>\ninternal class MyConcreteLogFileFormat : MyLogFileFormat\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"MyConcreteLogFileFormat\"/> class.\n    /// </summary>\n    /// <param name=\"log\">The Cake log instance.</param>\n    public MyConcreteLogFileFormat(ICakeLog log)\n        : base(log)\n    {\n    }\n\n    /// <inheritdoc/>\n    public override IEnumerable<IIssue> ReadIssues(\n        MyIssuesProvider issueProvider,\n        RepositorySettings repositorySettings,\n        MyIssuesSettings issueProviderSettings)\n    {\n        issueProvider.NotNull(nameof(issueProvider));\n        repositorySettings.NotNull(nameof(repositorySettings));\n        issueProviderSettings.NotNull(nameof(issueProviderSettings));\n\n        var result = new List<IIssue>();\n\n        // Implement log file format logic here.\n        result.Add(\n            IssueBuilder\n                .NewIssue(\"Some message\", issueProvider)\n                .WithPriority(IssuePriority.Warning)\n                .OfRule(\"My rule\")\n                .Create());\n\n        return result;\n    }\n}\n
"},{"location":"documentation/extending/issue-provider/tutorials/logfile-format/#aliases","title":"Aliases","text":"

For each concrete log file format a Cake property alias should be provided:

/// <summary>\n/// Gets an instance of the concrete log format.\n/// </summary>\n/// <param name=\"context\">The context.</param>\n/// <returns>Instance of the concrete log format.</returns>\n[CakePropertyAlias]\n[CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]\npublic static MyLogFileFormat MyConcreteLogFileFormat(\n    this ICakeContext context)\n{\n    context.NotNull(nameof(context));\n\n    return new MyConcreteLogFileFormat(context.Log);\n}\n

Additionally an alias for reading issues with a specific format should be provided:

/// <summary>\n/// Gets an instance of a provider for issues using specified settings\n/// </summary>\n/// <param name=\"context\">The context.</param>\n/// <param name=\"settings\">Settings for reading the log.</param>\n/// <returns>Instance of a provider for issues.</returns>\n/// <example>\n/// <para>Read issues using my concrete log file format:</para>\n/// <code>\n/// <![CDATA[\n///     var settings =\n///         new MyIssuesSettings(\n///             @\"c:\\build\\issues.xml\",\n///             MyConcreteLogFileFormat);\n///\n///     var issues =\n///         ReadIssues(\n///             MyIssues(settings),\n///             @\"c:\\repo\");\n/// ]]>\n/// </code>\n/// </example>\n[CakeMethodAlias]\n[CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]\npublic static IIssueProvider MyIssues(\n    this ICakeContext context,\n    MyIssuesSettings settings)\n{\n    context.NotNull(nameof(context));\n    settings.NotNull(nameof(settings));\n\n    return new MyIssuesProvider(context.Log, settings);\n}\n

For convenience of the user and based on the capabilities of the issue provider additional aliases for reading from the file system or from memory can be added:

/// <summary>\n/// Gets an instance of my issues provider for reading a log file from disk.\n/// </summary>\n/// <param name=\"context\">The context.</param>\n/// <param name=\"logFilePath\">Path to the log file.\n/// The log file needs to be in the format as defined by the <paramref name=\"format\"/> parameter.</param>\n/// <param name=\"format\">Format of the provided log file.</param>\n/// <returns>Instance of my issues provider.</returns>\n/// <example>\n/// <para>Read issues using my issues provider:</para>\n/// <code>\n/// <![CDATA[\n///     var issues =\n///         ReadIssues(\n///             MyIssuesFromFilePath(\n///                 @\"c:\\build\\issues.log\",\n///                 MyConcreteLogFileFormat));\n/// ]]>\n/// </code>\n/// </example>\n[CakeMethodAlias]\n[CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]\npublic static IIssueProvider MyIssuesFromFilePath(\n    this ICakeContext context,\n    FilePath logFilePath,\n    MyLogFileFormat format)\n{\n    context.NotNull(nameof(context));\n    logFilePath.NotNull(nameof(logFilePath));\n    format.NotNull(nameof(format));\n\n    return context.MyIssues(new MyIssuesSettings(logFilePath, format));\n}\n\n/// <summary>\n/// Gets an instance of my issues provider for reading a log file from memory.\n/// </summary>\n/// <param name=\"context\">The context.</param>\n/// <param name=\"logFileContent\">Content of the log file.\n/// The log content needs to be in the format as defined by the <paramref name=\"format\"/> parameter.</param>\n/// <param name=\"format\">Format of the provided log content.</param>\n/// <returns>Instance of my issues provider.</returns>\n/// <example>\n/// <para>Read issues using my issues provider:</para>\n/// <code>\n/// <![CDATA[\n///     var issues =\n///         ReadIssues(\n///             MyIssuesFromContent(\n///                 logFileContent,\n///                 MyConcreteLogFileFormat));\n/// ]]>\n/// </code>\n/// </example>\n[CakeMethodAlias]\n[CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]\npublic static IIssueProvider MyIssuesFromContent(\n    this ICakeContext context,\n    string logFileContent,\n    MyLogFileFormat format)\n{\n    context.NotNull(nameof(context));\n    logFileContent.NotNullOrWhiteSpace(nameof(logFileContent));\n    format.NotNull(nameof(format));\n\n    return context.MyIssues(new MyIssuesSettings(logFileContent.ToByteArray(), format));\n}\n

Finally an additional property alias for returning the provider type name should be defined:

/// <summary>\n/// Gets the name of my issue provider.\n/// This name can be used to identify issues based on the <see cref=\"IIssue.ProviderType\"/> property.\n/// </summary>\n/// <param name=\"context\">The context.</param>\n/// <returns>Name of my issue provider.</returns>\n[CakePropertyAlias]\n[CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]\npublic static string MyIssuesProviderTypeName(\n    this ICakeContext context)\n{\n    context.NotNull(nameof(context));\n\n    return typeof(MyIssuesProvider).FullName;\n}\n
"},{"location":"documentation/extending/issue-provider/tutorials/rule-url-resolving/","title":"Rule URL resolving","text":"

For cases where additional logic is required to determine the URL for a rule, the Cake.Issue addin provides the BaseRuleDescription and BaseRuleUrlResolver classes for simplifying implementation of providing URLs linking to site providing information about issues.

"},{"location":"documentation/extending/issue-provider/tutorials/rule-url-resolving/#implementing-ruleurlresolver","title":"Implementing RuleUrlResolver","text":"

In the issue provider a concrete class inheriting from BaseRuleDescription should be implemented containing all properties required to determine the URL to a rule. The following class adds two properties Category and RuleId to the description:

/// <summary>\n/// Class describing rules for my issue provider.\n/// </summary>\npublic class MyRuleDescription : BaseRuleDescription\n{\n    /// <summary>\n    /// Gets or sets the category of the rule.\n    /// </summary>\n    public string Category { get; set; }\n\n    /// <summary>\n    /// Gets or sets the identifier of the rule.\n    /// </summary>\n    public int RuleId { get; set; }\n}\n

Also a class inheriting from BaseRuleUrlResolver needs to be implemented containing an implementation of TryGetRuleDescription for parsing rule urls to the concrete BaseRuleDescription class.

/// <summary>\n/// Class for retrieving an URL linking to a site describing a rule.\n/// </summary>\ninternal class MyRuleUrlResolver : BaseUrlResolver<MyRuleDescription>\n{\n        /// <inheritdoc/>\n        protected override bool TryGetRuleDescription(string rule, MyRuleDescription ruleDescription)\n        {\n            ruleDescription.RuleId = rule.Substring(3, rule.Length - 3);\n            ruleDescription.Category = rule.Substring(0, 3);\n\n            return true;\n        }\n    }\n

To use the URL resolver the ResolveRuleUrl method needs to be called:

var resolver = new MyRuleUrlResolver();\nvar url = resolver.ResolveRuleUrl(rule)\n

Afterwards different resolvers can be registered which return the actual URL based on the rule description:

/// <summary>\n/// Class for retrieving an URL linking to a site describing a rule.\n/// </summary>\ninternal class MyRuleUrlResolver : BaseUrlResolver<MyRuleDescription>\n{\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"MyRuleUrlResolver\"/> class.\n        /// </summary>\n        private MyRuleUrlResolver()\n        {\n            // Add resolver for different issue categories.\n            this.AddUrlResolver(x =>\n                x.Category.ToUpperInvariant() == \"FOO\" ?\n                    new Uri(\"https://www.google.com/search?q=%22\" + x.Rule) :\n                    null);\n            this.AddUrlResolver(x =>\n                x.Category.ToUpperInvariant() == \"BAR\" ?\n                    new Uri(\"https://www.bing.com/search?q=%22\" + x.Rule) :\n                    null);\n        }\n    }\n
"},{"location":"documentation/extending/issue-provider/tutorials/rule-url-resolving/#support-custom-url-resolvers","title":"Support custom URL resolvers","text":"

The AddUrlResolver method can also be called from an Cake alias to allow users of the addin to register custom resolvers. For this the URL resolver class needs to be implemented as a singleton:

/// <summary>\n/// Class for retrieving an URL linking to a site describing a rule.\n/// </summary>\ninternal class MyRuleUrlResolver : BaseUrlResolver<MyRuleDescription>\n{\n    private static readonly Lazy<MyRuleUrlResolver> InstanceValue =\n        new Lazy<MyRuleUrlResolver>(() => new MyRuleUrlResolver());\n\n    /// <summary>\n    /// Gets the instance of the rule resolver.\n    /// </summary>\n    public static MyRuleUrlResolver Instance => InstanceValue.Value;\n}\n\n[CakeAliasCategory(IssuesAliasConstants.MainCakeAliasCategory)]\npublic static class MyIssueProviderAliases\n{\n    /// <summary>\n    /// Registers a new URL resolver with default priority of 0.\n    /// </summary>\n    /// <param name=\"context\">The context.</param>\n    /// <param name=\"resolver\">Resolver which returns an <see cref=\"Uri\"/> linking to a site\n    /// containing help for a specific <see cref=\"MyRuleDescription\"/>.</param>\n    [CakeMethodAlias]\n    [CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]\n    public static void MyIssueProviderAddRuleUrlResolver(\n        this ICakeContext context,\n        Func<MyRuleDescription, Uri> resolver)\n    {\n        context.NotNull(nameof(context));\n        resolver.NotNull(nameof(resolver));\n\n        MyRuleUrlResolver.Instance.AddUrlResolver(resolver);\n    }\n
"},{"location":"documentation/extending/issue-provider/tutorials/settings/","title":"Provider settings","text":"

Often issue providers require specific settings. For these cases the Cake.Issue addin provides the BaseConfigurableIssueProvider and IssueProviderSettings classes for simplifying implementation in the issue provider addin.

"},{"location":"documentation/extending/issue-provider/tutorials/settings/#implementing-issue-provider","title":"Implementing issue provider","text":"

A concrete class inheriting from BaseConfigurableIssueProvider needs to be implemented defining the concrete settings class to use:

/// <summary>\n/// My issue provider.\n/// </summary>\npublic class MyIssuesProvider : BaseConfigurableIssueProvider<MyIssuesSettings>\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"MyIssuesProvider\"/> class.\n    /// </summary>\n    /// <param name=\"log\">The Cake log context.</param>\n    /// <param name=\"settings\">Settings for reading the log file.</param>\n    public MyIssuesProvider(ICakeLog log, MyIssuesSettings settings)\n        : base(log, settings)\n    {\n    }\n\n    /// <inheritdoc />\n    public override string ProviderName => \"MyIssuesProvider\";\n\n    /// <inheritdoc />\n    protected override IEnumerable<IIssue> InternalReadIssues()\n    {\n        var result = new List<IIssue>();\n\n        // Implement issue provider logic here.\n        result.Add(\n            IssueBuilder\n                .NewIssue(\"Some message\", issueProvider)\n                .WithPriority(IssuePriority.Warning)\n                .OfRule(\"My rule\")\n                .Create());\n\n        return result;\n    }\n}\n

Also a concrete class inheriting from IssueProviderSettings needs to be implemented. Based on the capabilities of the issue provider the appropriate constructors for reading from the file system or memory can be made public:

/// <summary>\n/// Settings for my issue provider.\n/// </summary>\npublic class MyIssuesSettings : IssueProviderSettings\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"MyIssuesSettings\"/> class\n    /// for reading a log file on disk.\n    /// </summary>\n    /// <param name=\"logFilePath\">Path to the log file.</param>\n    public MyIssuesSettings(FilePath logFilePath)\n        : base(logFilePath)\n    {\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"MyIssuesSettings\"/> class\n    /// for a log file content in memory.\n    /// </summary>\n    /// <param name=\"logFileContent\">Content of the log file.</param>\n    public MyIssuesSettings(byte[] logFileContent)\n        : base(logFileContent)\n    {\n    }\n\n    // Add additional settings for the issue provider here.\n}\n
"},{"location":"documentation/extending/issue-provider/tutorials/settings/#aliases","title":"Aliases","text":"

An alias for reading issues with the provider should be provided:

/// <summary>\n/// Gets an instance of my issues provider using specified settings.\n/// </summary>\n/// <param name=\"context\">The context.</param>\n/// <param name=\"settings\">Settings for reading the log.</param>\n/// <returns>Instance of my issues provider.</returns>\n/// <example>\n/// <para>Read issues using my issues provider:</para>\n/// <code>\n/// <![CDATA[\n///     var settings =\n///         new MyIssuesSettings(@\"c:\\build\\issues.log\");\n///\n///     var issues =\n///         ReadIssues(\n///             MyIssues(settings));\n/// ]]>\n/// </code>\n/// </example>\n[CakeMethodAlias]\n[CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]\npublic static IIssueProvider MyIssues(\n    this ICakeContext context,\n    MyIssuesSettings settings)\n{\n    context.NotNull(nameof(context));\n    settings.NotNull(nameof(settings));\n\n    return new MyIssuesProvider(context.Log, settings);\n}\n

For convenience of the user and based on the capabilities of the issue provider additional aliases for reading from the file system or from memory can be added:

/// <summary>\n/// Gets an instance of my issues provider for reading a log file from disk.\n/// </summary>\n/// <param name=\"context\">The context.</param>\n/// <param name=\"logFilePath\">Path to the log file.</param>\n/// <returns>Instance of my issues provider.</returns>\n/// <example>\n/// <para>Read issues using my issues provider:</para>\n/// <code>\n/// <![CDATA[\n///     var issues =\n///         ReadIssues(\n///             MyIssuesFromFilePath(@\"c:\\build\\issues.log\"));\n/// ]]>\n/// </code>\n/// </example>\n[CakeMethodAlias]\n[CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]\npublic static IIssueProvider MyIssuesFromFilePath(\n    this ICakeContext context,\n    FilePath logFilePath)\n{\n    context.NotNull(nameof(context));\n    logFilePath.NotNull(nameof(logFilePath));\n\n    return context.MyIssues(new MyIssuesSettings(logFilePath));\n}\n\n/// <summary>\n/// Gets an instance of my issues provider for reading a log file from memory.\n/// </summary>\n/// <param name=\"context\">The context.</param>\n/// <param name=\"logFileContent\">Content of the log file.</param>\n/// <returns>Instance of my issues provider.</returns>\n/// <example>\n/// <para>Read issues using my issues provider:</para>\n/// <code>\n/// <![CDATA[\n///     var issues =\n///         ReadIssues(\n///             MyIssuesFromContent(logFileContent));\n/// ]]>\n/// </code>\n/// </example>\n[CakeMethodAlias]\n[CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]\npublic static IIssueProvider MyIssuesFromContent(\n    this ICakeContext context,\n    string logFileContent)\n{\n    context.NotNull(nameof(context));\n    logFileContent.NotNullOrWhiteSpace(nameof(logFileContent));\n\n    return context.MyIssues(new MyIssuesSettings(logFileContent.ToByteArray()));\n}\n

Finally an additional property alias for returning the provider type name should be defined:

/// <summary>\n/// Gets the name of my issue provider.\n/// This name can be used to identify issues based on the <see cref=\"IIssue.ProviderType\"/> property.\n/// </summary>\n/// <param name=\"context\">The context.</param>\n/// <returns>Name of my issue provider.</returns>\n[CakePropertyAlias]\n[CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]\npublic static string MyIssuesProviderTypeName(\n    this ICakeContext context)\n{\n    context.NotNull(nameof(context));\n\n    return typeof(MyIssuesProvider).FullName;\n}\n
"},{"location":"documentation/extending/issue-provider/tutorials/simple/","title":"Simple issue provider","text":"

This tutorial explains how to implement a simple issue provider using the BaseIssueProvider class from the Cake.Issue addin.

"},{"location":"documentation/extending/issue-provider/tutorials/simple/#implementing-issue-provider","title":"Implementing issue provider","text":"

A concrete class inheriting from BaseIssueProvider needs to be implemented:

/// <summary>\n/// My issue provider.\n/// </summary>\npublic class MyIssuesProvider : BaseIssueProvider\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"MyIssuesProvider\"/> class.\n    /// </summary>\n    /// <param name=\"log\">The Cake log context.</param>\n    public MyIssuesProvider(ICakeLog log)\n        : base(log, settings)\n    {\n    }\n\n    /// <inheritdoc />\n    public override string ProviderName => \"MyIssuesProvider\";\n\n    /// <inheritdoc />\n    protected override IEnumerable<IIssue> InternalReadIssues()\n    {\n        var result = new List<IIssue>();\n\n        // Implement issue provider logic here.\n        result.Add(\n            IssueBuilder\n                .NewIssue(\"Some message\", issueProvider)\n                .WithPriority(IssuePriority.Warning)\n                .OfRule(\"My rule\")\n                .Create());\n\n        return result;\n    }\n}\n
"},{"location":"documentation/extending/issue-provider/tutorials/simple/#aliases","title":"Aliases","text":"

An alias for reading issues with the provider should be provided:

/// <summary>\n/// Gets an instance of my issues provider using specified settings.\n/// </summary>\n/// <param name=\"context\">The context.</param>\n/// <returns>Instance of my issues provider.</returns>\n/// <example>\n/// <para>Read issues using my issues provider:</para>\n/// <code>\n/// <![CDATA[\n///     var issues =\n///         ReadIssues(\n///             MyIssues());\n/// ]]>\n/// </code>\n/// </example>\n[CakeMethodAlias]\n[CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]\npublic static IIssueProvider MyIssues(\n    this ICakeContext context)\n{\n    context.NotNull(nameof(context));\n\n    return new MyIssuesProvider(context.Log);\n}\n

Additionally a property alias for returning the provider type name should be defined:

/// <summary>\n/// Gets the name of my issue provider.\n/// This name can be used to identify issues based on the <see cref=\"IIssue.ProviderType\"/> property.\n/// </summary>\n/// <param name=\"context\">The context.</param>\n/// <returns>Name of my issue provider.</returns>\n[CakePropertyAlias]\n[CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]\npublic static string MyIssuesProviderTypeName(\n    this ICakeContext context)\n{\n    context.NotNull(nameof(context));\n\n    return typeof(MyIssuesProvider).FullName;\n}\n
"},{"location":"documentation/extending/pull-request-system/categories/","title":"Alias categories","text":"

Pull request system aliases should use the IssuesAliasConstants.MainCakeAliasCategory and PullRequestsAliasConstants.PullRequestSystemCakeAliasCategory constants for defining their category:

[CakeAliasCategory(IssuesAliasConstants.MainCakeAliasCategory)]\npublic static class MyPullRequestSystemAliases\n{\n    [CakeMethodAlias]\n    [CakeAliasCategory(PullRequestsAliasConstants.PullRequestSystemCakeAliasCategory)]\n    public static IPullRequestSystem MyPullRequestSystem(\n        this ICakeContext context)\n    {\n    }\n}\n
"},{"location":"documentation/extending/pull-request-system/overview/","title":"Overview","text":"

Pull Request Systems need to implement the IPullRequestSystem interface.

"},{"location":"documentation/extending/pull-request-system/overview/#baseclasses","title":"BaseClasses","text":"

For simplifying implementation there exists base classes from which concrete implementation can be inherited. BasePullRequestSystem is the main base class with the required functionality for a pull request system implementation. Additionally there exists several classes which can be implemented to support additional optional capabilities in a pull request system implementation.

Base Class Use case Tutorial BasePullRequestSystem Base class for all pull request system implementations. BaseCheckingCommitIdCapability Base class for capability to post issues only if pull request is for a specific commit. BaseDiscussionThreadsCapability Base class for capability to read, resolve and reopen discussion threads. BaseFilteringByModifiedFilesCapability Base class for capability to filter issues to only those affecting files modified in the pull request."},{"location":"documentation/extending/report-format/categories/","title":"Alias categories","text":"

Report format aliases should use the IssuesAliasConstants.MainCakeAliasCategory and ReportingAliasConstants.ReportingFormatCakeAliasCategory constants for defining their category:

[CakeAliasCategory(IssuesAliasConstants.MainCakeAliasCategory)]\npublic static class MyReportFormatAliases\n{\n    [CakeMethodAlias]\n    [CakeAliasCategory(ReportingAliasConstants.ReportingFormatCakeAliasCategory)]\n    public static IIssueReportFormat MyReportFormat(\n        this ICakeContext context)\n    {\n    }\n}\n
"},{"location":"documentation/extending/report-format/overview/","title":"Overview","text":"

Report formats need to implement the IIssueReportFormat interface. For simplifying implementation there exists an abstract IssueReportFormat base class from which concrete implementation can be inherited.

"},{"location":"documentation/issue-providers/","title":"Issue Providers","text":"

Issue provider addins are responsible for providing the output of an analyzer or linter to the Cake Issues addin.

  • DocFx \u2013 Issue provider for reading DocFx warnings
  • ESLint \u2013 Issue provider for reading ESLint issues
  • Git Repository \u2013 Issue provider for analyzing Git repositories
  • Inspect Code \u2013 Issue provider for reading JetBrains Inspect Code / ReSharper issues
  • Markdownlint \u2013 Issue provider for reading issues from markdownlint
  • MsBuild \u2013 Issue provider for reading MsBuild errors and warnings
  • Sarif \u2013 Issue provider for reading SARIF reports
  • Terraform \u2013 Issue provider for reading Terraform validation output

Tip

See How to implement issue providers for instruction on how to implement support for additional issue providers.

"},{"location":"documentation/issue-providers/docfx/","title":"DocFx","text":"

Support for reading warnings reported by DocFx is implemented in the Cake.Issues.DocFx addin.

  • Features
  • Examples
  • API
"},{"location":"documentation/issue-providers/docfx/examples/","title":"Examples","text":"

To call DocFx from a Cake script the Cake.DocFx addin can be used. To read issues from DocFx log files the DocFx issue provider needs to be imported:

Cake .NET ToolCake Frosting build.cake
#addin \"Cake.DocFx\" // (1)!\n#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.DocFx&version=5.0.1\n
  1. In production code this dependency should be pinned to a specific version to make sure builds are deterministic and won't break due to updates.

    See Reproducible Builds for details.

Note

In addition to the DocFx issue provider the Cake.Issues core addin needs to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.DocFx\" Version=\"1.0.0\" /> // (1)!\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.DocFx\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n
  1. Replace 1.0.0 with the desired version.

The following example contains a task which will build the DocFx project and write a log file and a task to read issues from the log file and write the number of warnings to the console:

Cake .NET ToolCake Frosting build.cake
var logPath = @\"c:\\build\\docfx.log\";\nvar repoRootFolder = MakeAbsolute(Directory(\"./\"));\nvar docRootPath = @\"docs\";\n\nTask(\"Build-Documentation\").Does(() =>\n{\n    // Run DocFx.\n    DocFxBuild(new DocFxBuildSettings()\n    {\n        LogPath = logPath\n    });\n});\n\nTask(\"Read-Issues\")\n    .IsDependentOn(\"Build-Documentation\")\n    .Does(() =>\n    {\n        // Read issues.\n        var issues =\n            ReadIssues(\n                DocFxIssuesFromFilePath(logPath, docRootPath),\n                repoRootPath);    \n\n        Information(\"{0} issues are found.\", issues.Count());\n    });\n
Program.cs
using Cake.Common.Diagnostics;\nusing Cake.Core.IO;\nusing Cake.Core;\nusing Cake.DocFx;\nusing Cake.DocFx.Build;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .UseContext<BuildContext>()\n            .Run(args);\n    }\n}\n\npublic class BuildContext(ICakeContext context) : FrostingContext(context)\n{\n    public FilePath LogPath { get; } = @\"c:\\build\\docfx.log\";\n    public DirectoryPath RepoRootPath { get; } =\n        context.MakeAbsolute(context.Directory(\"./\"));\n    public string DocRootPath { get; } = \"docs\";\n}\n\n[TaskName(\"Build-Documentation\")]\npublic sealed class BuildDocumentationTask : FrostingTask<BuildContext>\n{\n    public override void Run(BuildContext context)\n    {\n        // Run DocFx.\n        context.DocFxBuild(new DocFxBuildSettings()\n        {\n            LogPath = context.LogPath\n        });\n    }\n}\n\n[TaskName(\"Read-Issues\")]\n[IsDependentOn(typeof(BuildDocumentationTask))]\npublic sealed class ReadIssuesTask : FrostingTask<BuildContext>\n{\n    public override void Run(BuildContext context)\n    {\n        // Read issues.\n        var issues =\n            context.ReadIssues(\n                context.DocFxIssuesFromFilePath(\n                    context.LogPath,\n                    context.DocRootPath),\n                context.RepoRootPath);\n\n        context.Information(\"{0} issues are found.\", issues.Count());\n    }\n}\n
"},{"location":"documentation/issue-providers/docfx/features/","title":"Features","text":"

The Cake.Issues.DocFx addin provides the following features.

Tip: Running DocFx

DocFx can be run with Cake.DocFx addin.

"},{"location":"documentation/issue-providers/docfx/features/#basic-features","title":"Basic features","text":"
  • Reads warnings from DocFx log files.
"},{"location":"documentation/issue-providers/docfx/features/#supported-iissue-properties","title":"Supported IIssue properties","text":"
  • IIssue.ProviderType
  • IIssue.ProviderName
  • IIssue.Run (1)
  • IIssue.Identifier (2)
  • IIssue.ProjectName
  • IIssue.ProjectFileRelativePath
  • IIssue.AffectedFileRelativePath
  • IIssue.Line
  • IIssue.EndLine
  • IIssue.Column
  • IIssue.EndColumn
  • IIssue.FileLink (3)
  • IIssue.MessageText
  • IIssue.MessageHtml
  • IIssue.MessageMarkdown
  • IIssue.Priority
  • IIssue.PriorityName
  • IIssue.Rule
  • IIssue.RuleUrl
  1. Can be set while reading issues
  2. Set to IIssue.MessageText
  3. Can be set while reading issues
"},{"location":"documentation/issue-providers/eslint/","title":"ESLint","text":"

Support for reading issues reported by ESLint is implemented in the Cake.Issues.EsLint addin.

  • Features
  • API
"},{"location":"documentation/issue-providers/eslint/features/","title":"Features","text":"

The Cake.Issues.EsLint addin provides the following features.

Tip: Running ESLint

ESLint can be run with Cake.ESLint addin.

"},{"location":"documentation/issue-providers/eslint/features/#basic-features","title":"Basic features","text":"
  • Reads issues reported by ESLint.
  • Provides URLs for all issues.
  • Support for custom URL resolving using the EsLintAddRuleUrlResolver alias.
"},{"location":"documentation/issue-providers/eslint/features/#supported-log-file-formats","title":"Supported log file formats","text":"
  • EsLintJsonFormat alias for reading issues from log files created by ESLint json formatter.
"},{"location":"documentation/issue-providers/eslint/features/#supported-iissue-properties","title":"Supported IIssue properties","text":"
  • IIssue.ProviderType
  • IIssue.ProviderName
  • IIssue.Run (1)
  • IIssue.Identifier (2)
  • IIssue.ProjectName
  • IIssue.ProjectFileRelativePath
  • IIssue.AffectedFileRelativePath
  • IIssue.Line
  • IIssue.EndLine
  • IIssue.Column
  • IIssue.EndColumn
  • IIssue.FileLink (3)
  • IIssue.MessageText
  • IIssue.MessageHtml
  • IIssue.MessageMarkdown
  • IIssue.Priority
  • IIssue.PriorityName
  • IIssue.Rule
  • IIssue.RuleUrl (4)
  1. Can be set while reading issues
  2. Set to IIssue.MessageText
  3. Can be set while reading issues
  4. Support for custom rules can be added through a custom EsLintAddRuleUrlResolver
"},{"location":"documentation/issue-providers/gitrepository/","title":"Git Repository","text":"

Support for analyzing Git repositories is implemented in the Cake.Issues.GitRepository addin.

  • Features
  • Examples
  • Rules
  • API
"},{"location":"documentation/issue-providers/gitrepository/examples/","title":"Examples","text":"

To analyze Git repositories you need to import the Git repository issue provider:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.GitRepository&version=5.0.1\n

Note

In addition to the Git repository issue provider the Cake.Issues core addin needs to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.GitRepository\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

The following example prints the number of binary files which are not tracked by Git Large File Storage in a repository.

Warning

Checking binary files requires Git and Git Large File Storage available on the local machine.

Cake .NET ToolCake Frosting build.cake
Task(\"Analyze-Repo\")\n.Does(() =>\n{\n    // Read issues.\n    var repoRootPath = MakeAbsolute(Directory(\"./\"));\n    var settings =\n        new GitRepositoryIssuesSettings\n        {\n            CheckBinaryFilesTrackedByLfs = true\n        };    \n\n    var issues =\n        ReadIssues(\n            GitRepositoryIssues(settings),\n            repoRootPath);    \n\n    Information(\"{0} issues are found.\", issues.Count());\n});\n
Program.cs
using Cake.Common.Diagnostics;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"Analyze-Repo\")]\npublic sealed class AnalyzeRepoTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        // Read issues.\n        var repoRootPath = context.MakeAbsolute(context.Directory(\"./\"));\n        var settings =\n            new GitRepositoryIssuesSettings\n            {\n                CheckBinaryFilesTrackedByLfs = true\n            };    \n\n        var issues =\n            context.ReadIssues(\n                context.GitRepositoryIssues(settings),\n                repoRootPath);    \n\n        context.Information(\"{0} issues are found.\", issues.Count());\n    }\n}\n
"},{"location":"documentation/issue-providers/gitrepository/features/","title":"Features","text":"

The Cake.Issues.GitRepository addin provides the following features.

"},{"location":"documentation/issue-providers/gitrepository/features/#basic-features","title":"Basic features","text":"
  • Checks path length of files. See FilePathTooLong for details.
  • Checks if binary files are tracked by Git LFS. See BinaryFileNotTrackedByLfs for details.
"},{"location":"documentation/issue-providers/gitrepository/features/#supported-iissue-properties","title":"Supported IIssue properties","text":"
  • IIssue.ProviderType
  • IIssue.ProviderName
  • IIssue.Run (1)
  • IIssue.Identifier (2)
  • IIssue.ProjectName
  • IIssue.ProjectFileRelativePath
  • IIssue.AffectedFileRelativePath
  • IIssue.Line
  • IIssue.EndLine
  • IIssue.Column
  • IIssue.EndColumn
  • IIssue.FileLink (3)
  • IIssue.MessageText
  • IIssue.MessageHtml
  • IIssue.MessageMarkdown
  • IIssue.Priority
  • IIssue.PriorityName
  • IIssue.Rule
  • IIssue.RuleUrl
  1. Can be set while reading issues
  2. Set to IIssue.MessageText
  3. Can be set while reading issues
"},{"location":"documentation/issue-providers/gitrepository/rules/","title":"Rules","text":"
  • BinaryFileNotTrackedByLfs
  • FilePathTooLong
"},{"location":"documentation/issue-providers/gitrepository/rules/BinaryFileNotTrackedByLfs/","title":"BinaryFileNotTrackedByLfs","text":"Metadata Rule Id BinaryFileNotTrackedByLfs Priority Warning Available in 0.7.0 or higher"},{"location":"documentation/issue-providers/gitrepository/rules/BinaryFileNotTrackedByLfs/#cause","title":"Cause","text":"

A binary file in the repository is not tracked by Git Large File Storage.

"},{"location":"documentation/issue-providers/gitrepository/rules/BinaryFileNotTrackedByLfs/#rule-description","title":"Rule description","text":"

By its nature Git repositories cannot handle binary files well and will keep a full copy of that file in the repository every time a change to that file is committed. Considering that you always clone the full history of a repository, and not only the latest version, using binary files in a repository considerably slow downs the operation. Git Large File Storage replaces large files with small text pointers inside the Git repository, while storing the file contents on a remote server.

Info

The rule assumes that all files, which are not text files are binary files. This also includes for example empty files.

"},{"location":"documentation/issue-providers/gitrepository/rules/BinaryFileNotTrackedByLfs/#how-to-fix-violations","title":"How to fix violations","text":"

Track the file with Git Large File Storage.

"},{"location":"documentation/issue-providers/gitrepository/rules/FilePathTooLong/","title":"FilePathTooLong","text":"Metadata Rule Id FilePathTooLong Priority Warning Available in 0.7.3 or higher"},{"location":"documentation/issue-providers/gitrepository/rules/FilePathTooLong/#cause","title":"Cause","text":"

The path of a file in the repository is too long.

"},{"location":"documentation/issue-providers/gitrepository/rules/FilePathTooLong/#rule-description","title":"Rule description","text":"

Some operating systems and applications have a limitation of maximum path length which they can handle. To guarantee proper building this length should not be exceeded.

"},{"location":"documentation/issue-providers/gitrepository/rules/FilePathTooLong/#how-to-fix-violations","title":"How to fix violations","text":"

Rename the name of the file or shorten the path name.

"},{"location":"documentation/issue-providers/inspectcode/","title":"InspectCode","text":"

Support for reading issues reported by JetBrains Inspect Code is implemented in the Cake.Issues.InspectCode addin.

  • Features
  • Examples
  • API
"},{"location":"documentation/issue-providers/inspectcode/examples/","title":"Examples","text":"

To read issues from InspectCode log files the InspectCode issue provider needs to be imported:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.InspectCode&version=5.0.1\n

Note

In addition to the InspectCode issue provider the Cake.Issues core addin needs to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.InspectCode\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

The following example contains a task which will run JetBrains InspectCode and write a log file and a task to read issues from the log file and write the number of warnings to the console. JetBrains InspectCode is installed using JetBrains.ReSharper.CommandLineTools:

Cake .NET ToolCake Frosting build.cake
#tool \"nuget:?package=JetBrains.ReSharper.CommandLineTools\" // (1)!\n\nvar logPath = @\"c:\\build\\inspectcode.xml\";\nvar repoRootFolder = MakeAbsolute(Directory(\"./\"));\n\nTask(\"Analyze-Project\").Does(() =>\n{\n    // Run InspectCode.\n    var settings = new InspectCodeSettings() {\n        OutputFile = logPath\n    };\n\n    InspectCode(repoRootPath.CombineWithFilePath(\"MySolution.sln\"), settings);\n});\n\nTask(\"Read-Issues\")\n    .IsDependentOn(\"Analyze-Project\")\n    .Does(() =>\n    {\n        // Read issues.\n        var issues =\n            ReadIssues(\n                InspectCodeIssuesFromFilePath(logPath),\n                repoRootPath);\n\n        Information(\"{0} issues are found.\", issues.Count());\n});\n
  1. In production code this dependency should be pinned to a specific version to make sure builds are deterministic and won't break due to updates.

    See Reproducible Builds for details.

Program.cs
using Cake.Common.Diagnostics;\nusing Cake.Core.IO;\nusing Cake.Core;\nusing Cake.Frosting;\nusing Cake.Common.Tools.InspectCode;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .UseContext<BuildContext>()\n            .InstallTool(\n            new Uri(\n                \"nuget:?package=JetBrains.ReSharper.CommandLineTools\")) // (1)!\n            .Run(args);\n    }\n}\n\npublic class BuildContext(ICakeContext context) : FrostingContext(context)\n{\n    public FilePath LogPath { get; } = @\"c:\\build\\inspectcode.xml\";\n    public DirectoryPath RepoRootPath { get; } =\n        context.MakeAbsolute(context.Directory(\"./\"));\n}\n\n[TaskName(\"Analyze-Project\")]\npublic sealed class AnalyzeProjectTask : FrostingTask<BuildContext>\n{\n    public override void Run(BuildContext context)\n    {\n        // Run InspectCode.\n        var settings = new InspectCodeSettings() {\n            OutputFile = context.LogPath\n        };\n\n        context.InspectCode(\n            context.RepoRootPath.CombineWithFilePath(\"MySolution.sln\"),\n            settings);\n    }\n}\n\n[TaskName(\"Read-Issues\")]\n[IsDependentOn(typeof(AnalyzeProjectTask))]\npublic sealed class ReadIssuesTask : FrostingTask<BuildContext>\n{\n    public override void Run(BuildContext context)\n    {\n        // Read issues.\n        var issues =\n            context.ReadIssues(\n                context.InspectCodeIssuesFromFilePath(context.LogPath),\n                context.RepoRootPath);\n\n        context.Information(\"{0} issues are found.\", issues.Count());\n    }\n}\n
  1. In production code this dependency should be pinned to a specific version to make sure builds are deterministic and won't break due to updates.

    See Reproducible Builds for details.

"},{"location":"documentation/issue-providers/inspectcode/features/","title":"Features","text":"

The Cake.Issues.InspectCode addin provides the following features.

Tip: Running InspectCode

JetBrains InsepectCode can be run using the InspectCode alias.

"},{"location":"documentation/issue-providers/inspectcode/features/#basic-features","title":"Basic features","text":"
  • Reads warnings from JetBrains InsepectCode log files.
  • Provides URLs for issues containing a Wiki URL.
"},{"location":"documentation/issue-providers/inspectcode/features/#supported-iissue-properties","title":"Supported IIssue properties","text":"
  • IIssue.ProviderType
  • IIssue.ProviderName
  • IIssue.Run (1)
  • IIssue.Identifier (2)
  • IIssue.ProjectName
  • IIssue.ProjectFileRelativePath
  • IIssue.AffectedFileRelativePath
  • IIssue.Line
  • IIssue.EndLine
  • IIssue.Column
  • IIssue.EndColumn
  • IIssue.FileLink (3)
  • IIssue.MessageText
  • IIssue.MessageHtml
  • IIssue.MessageMarkdown
  • IIssue.Priority
  • IIssue.PriorityName
  • IIssue.Rule
  • IIssue.RuleUrl
  1. Can be set while reading issues
  2. Set to IIssue.MessageText
  3. Can be set while reading issues
"},{"location":"documentation/issue-providers/markdownlint/","title":"markdownlint","text":"

Support for reading issues reported by markdownlint is implemented in the Cake.Issues.Markdownlint addin.

  • Features
  • Examples
  • API
"},{"location":"documentation/issue-providers/markdownlint/examples/","title":"Examples","text":"

To call markdownlint-cli from a Cake script the Cake.Markdownlint addin can be used. To read issues from markdownlint-cli log files the markdownlint issue provider needs to be imported:

Cake .NET ToolCake Frosting build.cake
#addin \"Cake.Markdownlint\" // (1)!\n#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.Markdownlint&version=5.0.1\n
  1. In production code this dependency should be pinned to a specific version to make sure builds are deterministic and won't break due to updates.

    See Reproducible Builds for details.

Note

In addition to the markdownlint issue provider the Cake.Issues core addin needs to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Markdownlint\" Version=\"1.0.0\" /> // (1)!\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.Markdownlint\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n
  1. Replace 1.0.0 with the desired version.

The following example contains a task which will run markdownlint-cli and write a log file and a task to read issues from the log file and write the number of warnings to the console:

Cake .NET ToolCake Frosting build.cake
var logPath = @\"c:\\build\\markdownlint.log\";\nvar repoRootFolder = MakeAbsolute(Directory(\"./\"));\n\nTask(\"Lint-Documentation\").Does(() =>\n{\n    // Run markdownlint-cli.\n    var settings =\n        MarkdownlintNodeJsRunnerSettings.ForDirectory(\n            context.RepoRootPath.Combine(\"docs\"));\n    settings.OutputFile = logPath;\n    settings.ThrowOnIssue = false;\n    RunMarkdownlintNodeJs(settings);\n});\n\nTask(\"Read-Issues\")\n    .IsDependentOn(\"Lint-Documentation\")\n    .Does(() =>\n    {\n        // Read issues.\n        var issues =\n            ReadIssues(\n                MarkdownlintIssuesFromFilePath(\n                    logPath,\n                    MarkdownlintCliLogFileFormat),\n                repoRootPath);\n\n        Information(\"{0} issues are found.\", issues.Count());\n});\n
Program.cs
using Cake.Common.Diagnostics;\nusing Cake.Common.IO;\nusing Cake.Core;\nusing Cake.Core.IO;\nusing Cake.Frosting;\nusing Cake.Markdownlint;\nusing Cake.Markdownlint.NodeJs;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .UseContext<BuildContext>()\n            .Run(args);\n    }\n}\n\npublic class BuildContext(ICakeContext context) : FrostingContext(context)\n{\n    public FilePath LogPath { get; } = @\"c:\\build\\markdownlint.log\";\n    public DirectoryPath RepoRootPath { get; } =\n        context.MakeAbsolute(context.Directory(\"./\"));\n}\n\n[TaskName(\"Lint-Documentation\")]\npublic sealed class LintDocumentationTask : FrostingTask<BuildContext>\n{\n    public override void Run(BuildContext context)\n    {\n        // Run markdownlint-cli.\n        var settings =\n            MarkdownlintNodeJsRunnerSettings.ForDirectory(\n                context.RepoRootPath.Combine(\"docs\"));\n        settings.OutputFile = context.LogPath;\n        settings.ThrowOnIssue = false;\n        context.RunMarkdownlintNodeJs(settings);\n    }\n}\n\n[TaskName(\"Read-Issues\")]\n[IsDependentOn(typeof(LintDocumentationTask))]\npublic sealed class ReadIssuesTask : FrostingTask<BuildContext>\n{\n    public override void Run(BuildContext context)\n    {\n        // Read issues.\n        var issues =\n            context.ReadIssues(\n                context.MarkdownlintIssuesFromFilePath(\n                    context.LogPath,\n                    context.MarkdownlintCliLogFileFormat()),\n                context.RepoRootPath);\n\n        context.Information(\"{0} issues are found.\", issues.Count());\n    }\n}\n
"},{"location":"documentation/issue-providers/markdownlint/features/","title":"Features","text":"

The Cake.Issues.Markdownlint addin provides the following features.

Tip: Running markdownlint

markdownlint-cli can be run with the Cake.Markdownlint addin.

"},{"location":"documentation/issue-providers/markdownlint/features/#basic-features","title":"Basic features","text":"
  • Reads warnings from Markdownlint logfiles.
  • Provides URLs for all issues.
  • Support for custom URL resolving using the MarkdownlintAddRuleUrlResolver alias (except for MarkdownlintCliJsonLogFileFormat).
"},{"location":"documentation/issue-providers/markdownlint/features/#supported-log-file-formats","title":"Supported log file formats","text":"
  • MarkdownlintV1LogFileFormat alias for reading issues from Markdownlint output generated with options.resultVersion set to 1.
  • MarkdownlintCliLogFileFormat alias for reading issues from markdownlint-cli log files.
  • MarkdownlintCliJsonLogFileFormat alias for reading issues from markdownlint-cli log files created with the --json parameter.
"},{"location":"documentation/issue-providers/markdownlint/features/#supported-iissue-properties","title":"Supported IIssue properties","text":"
  • IIssue.ProviderType
  • IIssue.ProviderName
  • IIssue.Run (1)
  • IIssue.Identifier (2)
  • IIssue.ProjectName
  • IIssue.ProjectFileRelativePath
  • IIssue.AffectedFileRelativePath
  • IIssue.Line
  • IIssue.EndLine
  • IIssue.Column (3)
  • IIssue.EndColumn
  • IIssue.FileLink (4)
  • IIssue.MessageText
  • IIssue.MessageHtml
  • IIssue.MessageMarkdown
  • IIssue.Priority (5)
  • IIssue.PriorityName (6)
  • IIssue.Rule
  • IIssue.RuleUrl (7)
  1. Can be set while reading issues
  2. Set to IIssue.MessageText
  3. Only for MarkdownlintCliLogFileFormat
  4. Can be set while reading issues
  5. Always IssuePriority.Warning
  6. Always Warning
  7. Support for custom rules can be added through a custom MarkdownlintAddRuleUrlResolver except for MarkdownlintCliJsonLogFileFormat
"},{"location":"documentation/issue-providers/msbuild/","title":"MsBuild","text":"

Support for reading warnings reported by MsBuild is implemented in the Cake.Issues.MsBuild.

  • Features
  • Examples
  • API
"},{"location":"documentation/issue-providers/msbuild/examples/","title":"Examples","text":"

To read issues from MsBuild log files you need to import the MsBuild issue provider needs to be imported:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.MsBuild&version=5.0.1\n

Note

In addition to the MsBuild issue provider the Cake.Issues core addin needs to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.MsBuild\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

The following example contains a task which will call MsBuild to build the solution and write a binary log file and a task to read issues from the binary log file and write the number of warnings to the console:

Cake .NET ToolCake Frosting build.cake
var logPath = @\"c:\\build\\msbuild.xml\";\nvar repoRootPath = MakeAbsolute(Directory(\"./\"));\n\nTask(\"Build-Solution\").Does(() =>\n{\n    // Build solution.\n    var msBuildSettings =\n        new DotNetMSBuildSettings().WithLogger(\n            \"BinaryLogger,\" + Context.Tools.Resolve(\"Cake.Issues.MsBuild*/**/StructuredLogger.dll\"),\n            \"\",\n            logPath.FullPath);\n    DotNetBuild(\n        repoRootPath.CombineWithFilePath(\"MySolution.sln\").FullPath,\n        new DotNetBuildSettings{MSBuildSettings = msBuildSettings});\n});\n\nTask(\"Read-Issues\")\n    .IsDependentOn(\"Build-Solution\")\n    .Does(() =>\n    {\n        // Read issues.\n        var issues =\n            ReadIssues(\n                MsBuildIssuesFromFilePath(\n                    logPath,\n                    MsBuildBinaryLogFileFormat),\n                repoRootPath);\n\n        Information(\"{0} issues are found.\", issues.Count());\n});\n
Program.cs
using Cake.Common.Diagnostics;\nusing Cake.Common.IO;\nusing Cake.Common.Tools.DotNet;\nusing Cake.Common.Tools.DotNet.Build;\nusing Cake.Core;\nusing Cake.Core.IO;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .UseContext<BuildContext>()\n            .Run(args);\n    }\n}\n\npublic class BuildContext(ICakeContext context) : FrostingContext(context)\n{\n    public FilePath LogPath { get; } = @\"c:\\build\\msbuild.xml\";\n    public DirectoryPath RepoRootPath { get; } =\n        context.MakeAbsolute(context.Directory(\"./\"));\n}\n\n[TaskName(\"Build-Solution\")]\npublic sealed class BuildSolutionTask : FrostingTask<BuildContext>\n{\n    public override void Run(BuildContext context)\n    {\n        // Build solution.\n        var msBuildSettings =\n            new DotNetMSBuildSettings().WithLogger(\n                \"BinaryLogger,\" + context.Tools.Resolve(\"Cake.Issues.MsBuild*/**/StructuredLogger.dll\"),\n                \"\",\n                context.LogPath.FullPath);\n        context.DotNetBuild(\n            context.RepoRootPath.CombineWithFilePath(\"MySolution.sln\").FullPath,\n            new DotNetBuildSettings{MSBuildSettings = msBuildSettings});\n    }\n}\n\n[TaskName(\"Read-Issues\")]\n[IsDependentOn(typeof(BuildSolutionTask))]\npublic sealed class ReadIssuesTask : FrostingTask<BuildContext>\n{\n    public override void Run(BuildContext context)\n    {\n        // Read issues.\n        var issues =\n            context.ReadIssues(\n                context.MsBuildIssuesFromFilePath(\n                    context.LogPath,\n                    context.MsBuildBinaryLogFileFormat()),\n                context.RepoRootPath);\n\n        context.Information(\"{0} issues are found.\", issues.Count());\n    }\n}\n

Tip

When using MSBuildSettings.BinaryLogger property to write a binary log, the version of the binary log format written depends on the version of the .NET SDK.

To avoid the risk of breaking builds when the .NET SDK is updated and introduces a new binary log format, which is not supported in the used version of Cake.Issues.MsBuild, the binary logger instance shipped as part of Cake.Issues.MsBuild is used in the above example.

"},{"location":"documentation/issue-providers/msbuild/features/","title":"Features","text":"

The Cake.Issues.MsBuild addin provides the following features.

Tip: Running MSBuild

MSBuild can be run using the DotNet aliases or MsBuild aliases.

"},{"location":"documentation/issue-providers/msbuild/features/#basic-features","title":"Basic features","text":"
  • Reads errors and warnings from MSBuild log files.
  • Provides URLs for all code analysis (CA*) and StyleCop (SA*) warnings.
  • Support for custom URL resolving using the MsBuildAddRuleUrlResolver alias.
"},{"location":"documentation/issue-providers/msbuild/features/#supported-log-file-formats","title":"Supported log file formats","text":"
  • MsBuildBinaryLogFileFormat alias for reading issues from binary log files.
  • MsBuildXmlFileLoggerFormat alias for reading issues from log files created by MSBuild Extension Pack XmlFileLogger.
"},{"location":"documentation/issue-providers/msbuild/features/#supported-iissue-properties","title":"Supported IIssue properties","text":"
  • IIssue.ProviderType
  • IIssue.ProviderName
  • IIssue.Run (1)
  • IIssue.Identifier (2)
  • IIssue.ProjectName
  • IIssue.ProjectFileRelativePath
  • IIssue.AffectedFileRelativePath
  • IIssue.Line
  • IIssue.EndLine
  • IIssue.Column (3)
  • IIssue.EndColumn
  • IIssue.FileLink (4)
  • IIssue.MessageText
  • IIssue.MessageHtml
  • IIssue.MessageMarkdown
  • IIssue.Priority
  • IIssue.PriorityName
  • IIssue.Rule
  • IIssue.RuleUrl (5)
  1. Can be set while reading issues
  2. Set to IIssue.MessageText
  3. Only for MsBuildXmlFileLoggerFormat
  4. Can be set while reading issues
  5. For code analysis (CA*) and StyleCop (SA*) warnings. Support for additional rules can be added through a custom MsBuildAddRuleUrlResolver
"},{"location":"documentation/issue-providers/sarif/","title":"Sarif","text":"

Support for reading issues in SARIF format is implemented in the Cake.Issues.Sarif addin.

  • Features
  • API
"},{"location":"documentation/issue-providers/sarif/features/","title":"Features","text":"

The Cake.Issues.Sarif addin provides the following features.

"},{"location":"documentation/issue-providers/sarif/features/#basic-features","title":"Basic features","text":"
  • Reads issues from files in SARIF format.
"},{"location":"documentation/issue-providers/sarif/features/#supported-iissue-properties","title":"Supported IIssue properties","text":"
  • IIssue.ProviderType
  • IIssue.ProviderName
  • IIssue.Run (1)
  • IIssue.Identifier (2)
  • IIssue.ProjectName
  • IIssue.ProjectFileRelativePath
  • IIssue.AffectedFileRelativePath
  • IIssue.Line
  • IIssue.EndLine
  • IIssue.Column
  • IIssue.EndColumn
  • IIssue.FileLink (3)
  • IIssue.MessageText
  • IIssue.MessageHtml
  • IIssue.MessageMarkdown
  • IIssue.Priority
  • IIssue.PriorityName
  • IIssue.Rule
  • IIssue.RuleUrl
  1. Can be set while reading issues
  2. Set to IIssue.MessageText
  3. Can be set while reading issues
"},{"location":"documentation/issue-providers/terraform/","title":"Terraform","text":"

Support for reading issues reported by Terraform validate command is implemented in the Cake.Issues.Terraform addin.

  • Features
  • API
"},{"location":"documentation/issue-providers/terraform/features/","title":"Features","text":"

The Cake.Issues.Terraform addin provides the following features.

Tip: Running Terraform

Terraform can be run with Cake.Terraform addin.

"},{"location":"documentation/issue-providers/terraform/features/#basic-features","title":"Basic features","text":"
  • Reads warnings from Terraform validate command.
"},{"location":"documentation/issue-providers/terraform/features/#supported-iissue-properties","title":"Supported IIssue properties","text":"
  • IIssue.ProviderType
  • IIssue.ProviderName
  • IIssue.Run (1)
  • IIssue.Identifier (2)
  • IIssue.ProjectName
  • IIssue.ProjectFileRelativePath
  • IIssue.AffectedFileRelativePath
  • IIssue.Line
  • IIssue.EndLine
  • IIssue.Column
  • IIssue.EndColumn
  • IIssue.FileLink (3)
  • IIssue.MessageText
  • IIssue.MessageHtml
  • IIssue.MessageMarkdown
  • IIssue.Priority
  • IIssue.PriorityName
  • IIssue.Rule
  • IIssue.RuleUrl
  1. Can be set while reading issues
  2. Set to IIssue.MessageText
  3. Can be set while reading issues
"},{"location":"documentation/pull-request-systems/","title":"Pull Request Systems","text":"

Pull request addins implement specific Pull Request Systems and allow the Cake Issues addin to write found issues as comments to pull requests.

  • AppVeyor \u2013 Integration with AppVeyor builds
  • Azure DevOps \u2013 Integration with Azure DevOps pull requests
  • GitHub Actions \u2013 Integration with GitHub Actions

Tip

See How to implement pull request systems for instruction on how to implement support for additional pull request systems.

"},{"location":"documentation/pull-request-systems/appveyor/","title":"AppVeyor","text":"

Support for AppVeyor is implemented in the Cake.Issues.PullRequests.AppVeyor addin.

  • Features
  • Examples
  • API
"},{"location":"documentation/pull-request-systems/appveyor/features/","title":"Features","text":"

The Cake.Issues.PullRequests.AppVeyor addin reports issues as messages to AppVeyor builds.

Info

There's a demo repository available which you can fork and to which you can create pull requests to test the integration functionality.

"},{"location":"documentation/pull-request-systems/appveyor/features/#basic-features","title":"Basic features","text":"
  • Reports issues as messages to AppVeyor builds.
  • Messages can be written as comment to GitHub pull requests. See GitHub pull request integration for an example.
"},{"location":"documentation/pull-request-systems/appveyor/features/#supported-capabilities","title":"Supported capabilities","text":"

The Cake.Issues.PullRequests.AppVeyor addin doesn't support any additional capabilities.

  • Checking commit ID
  • Discussion threads
  • Filtering by modified files
"},{"location":"documentation/pull-request-systems/appveyor/examples/","title":"Examples","text":"
  • Writting Messages To AppVeyor
  • GitHub PullRequest Integration

Info

There's a demo repository available which you can fork and to which you can create pull requests to test the integration functionality.

"},{"location":"documentation/pull-request-systems/appveyor/examples/github-pullrequest-integration/","title":"GitHub pull request integration","text":"

This example shows how to write AppVeyor messages created by Cake.Issues to GitHub pull requests.

Issues reported as messages to AppVeyor builds can be written to a GitHub pull request using GitHub Pull Request Notification in your appveyor.yml file.

The following example will write a comment to the GitHub pull request containing all issues which were posted as message to the AppVeyor build:

notifications:\n- provider: GitHubPullRequest\n  template: \"{{#passed}}:white_check_mark:{{/passed}}{{#failed}}:x:{{/failed}} [Build {{&projectName}} {{buildVersion}} {{status}}]({{buildUrl}}) (commit {{commitUrl}} by @{{&commitAuthorUsername}})<p>Build messages:</p><ul>{{#jobs}}{{#messages}}<li>{{message}}<br/>{{details}}</li>{{/messages}}{{/jobs}}</ul>\"\n

The output will look similar to this:

"},{"location":"documentation/pull-request-systems/appveyor/examples/write-messages/","title":"Writing message to AppVeyor","text":"

To report issues as messages to an AppVeyor build, the AppVeyor addin needs to be imported. For this example the JetBrains InspectCode issue provider is additionally used for reading issues:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.InspectCode&version=5.0.1\n#addin nuget:?package=Cake.Issues.PullRequests&version=5.0.1\n#addin nuget:?package=Cake.Issues.PullRequests.AppVeyor&version=5.0.1\n

Note

In addition to the AppVeyor pull request system the Cake.Issues and Cake.Issues.PullRequests core addins need to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.InspectCode\" Version=\"5.0.1\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.PullRequests.AppVeyor\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

This example shows how to report issues as messages to an AppVeyor build using the AppVeyorBuilds alias:

Cake .NET ToolCake Frosting build.cake
Task(\"Report-IssuesToAppVeyor\").Does(() =>\n{\n    var repoRootPath = MakeAbsolute(Directory(\"./\"));\n\n    ReportIssuesToPullRequest(\n        InspectCodeIssuesFromFilePath(\n            @\"C:\\build\\inspectcode.log\"),\n        AppVeyorBuilds(),\n        repoRootPath);\n});\n
Program.cs
using Cake.Common.IO;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"Report-IssuesToAppVeyor\")]\npublic sealed class ReportIssuesToAppVeyorTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        var repoRootPath = context.MakeAbsolute(context.Directory(\"./\"));\n\n        context.ReportIssuesToPullRequest(\n            context.InspectCodeIssuesFromFilePath(\n                @\"C:\\build\\inspectcode.log\"),\n            context.AppVeyorBuilds(),\n            repoRootPath);\n    }\n}\n

The output will look similar to this:

"},{"location":"documentation/pull-request-systems/azure-devops/","title":"Azure DevOps","text":"

Support for Azure DevOps is implemented in the Cake.Issues.PullRequests.AzureDevOps addin.

  • Features
  • Setup
  • Examples
  • API
"},{"location":"documentation/pull-request-systems/azure-devops/features/","title":"Features","text":"

The Cake.Issues.PullRequests.AzureDevOps addin provides the following features.

Info

There's a demo repository available which you can fork and to which you can create pull requests to test the integration functionality.

"},{"location":"documentation/pull-request-systems/azure-devops/features/#basic-features","title":"Basic features","text":"
  • Writes issues as comments to Azure DevOps pull requests.
  • Identification of pull requests through source branch or pull request ID.
  • Comments written by the addin will be rendered with a specific icon corresponding to the state of the issue.
  • Adds rule number and, if provided by the issue provider, link to the rule description to the comment.
  • Support for issues messages formatted in Markdown format.
"},{"location":"documentation/pull-request-systems/azure-devops/features/#supported-capabilities","title":"Supported capabilities","text":"

The Cake.Issues.PullRequests.AzureDevOps addin supports the following capabilities.

  • Checking commit ID
  • Discussion threads
  • Filtering by modified files
"},{"location":"documentation/pull-request-systems/azure-devops/features/#supported-authentication-methods","title":"Supported authentication methods","text":"Azure DevOps Server Azure DevOps Service Authentication method NTLM Basic authentication Personal access token OAuth Azure Active Directory

For detailed instructions how to connect using the different methods see Setup instructions.

"},{"location":"documentation/pull-request-systems/azure-devops/setup/","title":"Setup","text":"

This page describes the different ways how the Cake.Issues.PullRequests.AzureDevOps addin can be setup.

"},{"location":"documentation/pull-request-systems/azure-devops/setup/#ntlm-authentication","title":"NTLM authentication","text":"

Info

NTLM authentication is only available for on-premise Azure DevOps Server.

To authenticate with NTLM you can use the AzureDevOpsAuthenticationNtlm alias from the Cake.AzureDevOps addin.

The user needs to have Contribute to pull requests permission for the specific repository to allow Cake.Issues.PullRequests.AzureDevOps addin to post issues as comments to pull requests.

"},{"location":"documentation/pull-request-systems/azure-devops/setup/#basic-authentication","title":"Basic authentication","text":"

Info

Basic authentication is only available for on-premise Azure DevOps Server.

To authenticate with basic authentication you can use the AzureDevOpsAuthenticationBasic alias from the Cake.AzureDevOps addin and need to Configure Azure DevOps Server to use Basic Authentication.

The user needs to have Contribute to pull requests permission for the specific repository to allow Cake.Issues.PullRequests.AzureDevOps addin to post issues as comments to pull requests.

"},{"location":"documentation/pull-request-systems/azure-devops/setup/#personal-access-token","title":"Personal access token","text":"

To authenticate with an personal access token you can use the AzureDevOpsAuthenticationPersonalAccessToken alias from the Cake.AzureDevOps addin.

If you want to use the Cake.Issues.PullRequests.AzureDevOps addin with an personal access token see Authenticate access with personal access tokens for Azure DevOps for instructions how to create a personal access token.

The access token needs to have the scope Code (read and write) set and the user needs to have Contribute to pull requests permission for the specific repository to allow Cake.Issues.PullRequests.AzureDevOps addin to post issues as comments to pull requests.

"},{"location":"documentation/pull-request-systems/azure-devops/setup/#oauth-authentication-from-azure-pipelines","title":"OAuth authentication from Azure Pipelines","text":"

Info

OAuth authentication is only available for Azure DevOps Service.

If you want to use the Cake.Issues.PullRequests.AzureDevOps addin from an Azure Pipelines you can authenticate using the OAuth token provided to the build. For this you need to enable the Allow scripts to access the OAuth token option on the build definition.

To authenticate you can use the AzureDevOpsAuthenticationOAuth alias from the Cake.AzureDevOps addin.

The user under which the build runs, named <projectName> Build Service (<organizationName>) (e.g. Cake.Issues-Demo Build Service (cake-contrib)), needs to have Contribute to pull requests permission for the specific repository to allow Cake.Issues.PullRequests.AzureDevOps addin to post issues as comments to pull requests.

"},{"location":"documentation/pull-request-systems/azure-devops/setup/#entra-authentication","title":"Entra authentication","text":"

Info

Entra authentication is only available for Azure DevOps Service.

To authenticate with Entra ID you can use the AzureDevOpsAuthenticationAzureActiveDirectory alias from the Cake.AzureDevOps addin.

The user needs to have Contribute to pull requests permission for the specific repository to allow Cake.Issues.PullRequests.AzureDevOps addin to post issues as comments to pull requests.

"},{"location":"documentation/pull-request-systems/azure-devops/examples/","title":"Examples","text":"
  • Using With Pull Request ID
  • Using With Repository Remote URL And Source Branch Name
  • Using With Azure Pipelines

Info

There's a demo repository available which you can fork and to which you can create pull requests to test the integration functionality.

"},{"location":"documentation/pull-request-systems/azure-devops/examples/azure-pipelines/","title":"Using with Azure Pipelines","text":"

To write issues as comments to Azure DevOps pull requests, the Azure DevOps addin needs to be imported. For this example the JetBrains InspectCode issue provider is additionally used for reading issues:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.InspectCode&version=5.0.1\n#addin nuget:?package=Cake.Issues.PullRequests&version=5.0.1\n#addin nuget:?package=Cake.Issues.PullRequests.AzureDevOps&version=5.0.1\n#addin \"Cake.AzureDevOps\" // (1)!\n
  1. In production code this dependency should be pinned to a specific version to make sure builds are deterministic and won't break due to updates.

    See Reproducible Builds for details.

Note

In addition to the Azure DevOps pull request system the Cake.Issues and Cake.Issues.PullRequests core addins and the Cake.AzureDevOps addin need to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.InspectCode\" Version=\"5.0.1\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.PullRequests.AzureDevOps\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

The following example shows a task which will call the AzureDevOpsPullRequests alias to connect to the pull request using the environment variables provided by Azure Pipelines.:

Cake .NET ToolCake Frosting build.cake
Task(\"Report-IssuesToPullRequest\").Does(() =>\n{\n    var repoRootFolder =\n        MakeAbsolute(Directory(\"./\"));\n\n    ReportIssuesToPullRequest(\n        InspectCodeIssuesFromFilePath(\n            @\"C:\\build\\inspectcode.log\"),\n        AzureDevOpsPullRequests(),\n        repoRootPath);\n});\n
Program.cs
using Cake.Common.IO;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"Report-IssuesToPullRequest\")]\npublic sealed class ReportIssuesToPullRequestTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        var repoRootPath =\n            context.MakeAbsolute(context.Directory(\"./\"));\n\n        context.ReportIssuesToPullRequest(\n            context.InspectCodeIssuesFromFilePath(\n                @\"C:\\build\\inspectcode.log\"),\n            context.AzureDevOpsPullRequests(),\n            repoRootPath);\n    }\n}\n

Info

Please note that you'll need to setup your Azure Pipelines build to Allow scripts to access the OAuth token and need to setup proper permissions.

See OAuth authentication from Azure Pipelines for details.

"},{"location":"documentation/pull-request-systems/azure-devops/examples/pullrequest-id/","title":"Using with pull request id","text":"

To write issues as comments to Azure DevOps pull requests, the Azure DevOps addin needs to be imported. To determine the remote repository URL the Cake.Git addin can be used. For this example the JetBrains InspectCode issue provider is additionally used for reading issues:

Cake .NET ToolCake Frosting build.cake
#addin \"Cake.Git\" // (1)!\n#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.InspectCode&version=5.0.1\n#addin nuget:?package=Cake.Issues.PullRequests&version=5.0.1\n#addin nuget:?package=Cake.Issues.PullRequests.AzureDevOps&version=5.0.1\n#addin \"Cake.AzureDevOps\" // (1)!\n
  1. In production code this dependency should be pinned to a specific version to make sure builds are deterministic and won't break due to updates.

    See Reproducible Builds for details.

Note

In addition to the Azure DevOps pull request system the Cake.Issues and Cake.Issues.PullRequests core addins and the Cake.AzureDevOps addin need to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Git\" Version=\"1.0.0\" /> // (1)!\n    <PackageReference Include=\"Cake.Frosting.Issues.InspectCode\" Version=\"5.0.1\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.PullRequests.AzureDevOps\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n
  1. Replace 1.0.0 with the desired version.

The following example shows a task which will first determine the remote repository URL and with this information call the AzureDevOpsPullRequests alias, which will authenticate through NTLM to an on-premise Azure DevOps Server instance:

Cake .NET ToolCake Frosting build.cake
Task(\"Report-IssuesToPullRequest\").Does(() =>\n{\n    var repoRootPath =\n        MakeAbsolute(Directory(\"./\"));\n    var currentBranch =\n        GitBranchCurrent(repoRootPath);\n    var repoRemoteUrl =\n        new Uri(currentBranch.Remotes.Single(x => x.Name == \"origin\").Url);\n    var pullRequestId = 123;\n\n    ReportIssuesToPullRequest(\n        InspectCodeIssuesFromFilePath(\n            @\"C:\\build\\inspectcode.log\"),\n        AzureDevOpsPullRequests(\n            repoRemoteUrl,\n            pullRequestId,\n            AzureDevOpsAuthenticationNtlm()),\n        repoRootPath);\n});\n
Program.cs
using Cake.Common.IO;\nusing Cake.Frosting;\nusing Cake.Git;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"Report-IssuesToPullRequest\")]\npublic sealed class ReportIssuesToPullRequestTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        var repoRootPath =\n            context.MakeAbsolute(context.Directory(\"./\"));\n        var currentBranch =\n            context.GitBranchCurrent(repoRootPath);\n        var repoRemoteUrl = \n            new Uri(currentBranch.Remotes.Single(x => x.Name == \"origin\").Url);\n        var pullRequestId = 123;\n\n        context.ReportIssuesToPullRequest(\n            context.InspectCodeIssuesFromFilePath(\n                @\"C:\\build\\inspectcode.log\"),\n            context.AzureDevOpsPullRequests(\n                repoRemoteUrl,\n                pullRequestId,\n                context.AzureDevOpsAuthenticationNtlm()),\n            repoRootPath);\n    }\n}\n
"},{"location":"documentation/pull-request-systems/azure-devops/examples/repository-information/","title":"Using with repository remote url and source branch name","text":"

To write issues as comments to Azure DevOps pull requests, the Azure DevOps addin needs to be imported. To determine the remote repository URL and source branch of the pull request the Cake.Git addin can be used. For this example the JetBrains InspectCode issue provider is additionally used for reading issues:

Cake .NET ToolCake Frosting build.cake
#addin \"Cake.Git\" // (1)!\n#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.InspectCode&version=5.0.1\n#addin nuget:?package=Cake.Issues.PullRequests&version=5.0.1\n#addin nuget:?package=Cake.Issues.PullRequests.AzureDevOps&version=5.0.1\n#addin \"Cake.AzureDevOps\" // (1)!\n
  1. In production code this dependency should be pinned to a specific version to make sure builds are deterministic and won't break due to updates.

    See Reproducible Builds for details.

Note

In addition to the Azure DevOps pull request system the Cake.Issues and Cake.Issues.PullRequests core addins and the Cake.AzureDevOps addin need to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Git\" Version=\"1.0.0\" /> // (1)!\n    <PackageReference Include=\"Cake.Frosting.Issues.InspectCode\" Version=\"5.0.1\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.PullRequests.AzureDevOps\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n
  1. Replace 1.0.0 with the desired version.

The following example shows a task which will first determine the remote repository URL and source branch of the pull request and with this information call the AzureDevOpsPullRequests alias, which will authenticate through NTLM to an on-premise Azure DevOps Server instance:

Cake .NET ToolCake Frosting build.cake
Task(\"Report-IssuesToPullRequest\").Does(() =>\n{\n    var repoRootFolder =\n        MakeAbsolute(Directory(\"./\"));\n    var currentBranch =\n        GitBranchCurrent(repoRootFolder);\n    var repoRemoteUrl =\n        new Uri(currentBranch.Remotes.Single(x => x.Name == \"origin\").Url);\n    var sourceBranchName = currentBranch.CanonicalName;\n\n    ReportIssuesToPullRequest(\n        InspectCodeIssuesFromFilePath(\n            @\"C:\\build\\inspectcode.log\"),\n        AzureDevOpsPullRequests(\n            repoRemoteUrl,\n            sourceBranchName,\n            AzureDevOpsAuthenticationNtlm()),\n        repoRootFolder);\n});\n
Program.cs
using Cake.Common.IO;\nusing Cake.Frosting;\nusing Cake.Git;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"Report-IssuesToPullRequest\")]\npublic sealed class ReportIssuesToPullRequestTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        var repoRootPath =\n            context.MakeAbsolute(context.Directory(\"./\"));\n        var currentBranch =\n            context.GitBranchCurrent(repoRootPath);\n        var repoRemoteUrl = \n            new Uri(currentBranch.Remotes.Single(x => x.Name == \"origin\").Url);\n        var sourceBranchName = currentBranch.CanonicalName;\n\n        context.ReportIssuesToPullRequest(\n            context.InspectCodeIssuesFromFilePath(\n                @\"C:\\build\\inspectcode.log\"),\n            context.AzureDevOpsPullRequests(\n                repoRemoteUrl,\n                sourceBranchName,\n                context.AzureDevOpsAuthenticationNtlm()),\n            repoRootPath);\n    }\n}\n
"},{"location":"documentation/pull-request-systems/github-actions/","title":"GitHub Actions","text":"

Support for GitHub Actions is implemented in the Cake.Issues.PullRequests.GitHubActions addin.

  • Features
  • Examples
  • API
"},{"location":"documentation/pull-request-systems/github-actions/features/","title":"Features","text":"

The Cake.Issues.PullRequests.GitHubActions addin creates annotations from issues when running on GitHub actions.

"},{"location":"documentation/pull-request-systems/github-actions/features/#basic-features","title":"Basic features","text":"
  • Reports issues as annotations to GitHub Actions builds.
  • Group issues in log output by provider and run information.
"},{"location":"documentation/pull-request-systems/github-actions/features/#supported-capabilities","title":"Supported capabilities","text":"

The Cake.Issues.PullRequests.GitHubActions addin doesn't support any additional capabilities.

  • Checking commit ID
  • Discussion threads
  • Filtering by modified files
"},{"location":"documentation/pull-request-systems/github-actions/examples/","title":"Examples","text":"
  • Create Annotations In GitHub Actions
"},{"location":"documentation/pull-request-systems/github-actions/examples/write-annotations/","title":"Create annotations in GitHub Actions","text":"

To report issues as annotations to a GitHub Actions build, the GitHub Actions addin needs to be imported. For this example the JetBrains InspectCode issue provider is additionally used for reading issues:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.InspectCode&version=5.0.1\n#addin nuget:?package=Cake.Issues.PullRequests&version=5.0.1\n#addin nuget:?package=Cake.Issues.PullRequests.GitHubActions&version=5.0.1\n

Note

In addition to the GitHub Actions pull request system the Cake.Issues and Cake.Issues.PullRequests core addins need to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.InspectCode\" Version=\"5.0.1\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.PullRequests.GitHubActions\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

This example shows how to report issues as annotations to GitHubActions build using the GitHubActionsBuilds alias:

Cake .NET ToolCake Frosting build.cake
Task(\"ReportIssuesToGitHubActions\").Does(() =>\n{\n    var repoRootPath = MakeAbsolute(Directory(\"./\"));\n\n    ReportIssuesToPullRequest(\n        InspectCodeIssuesFromFilePath(\n            @\"C:\\build\\inspectcode.log\"),\n        GitHubActionsBuilds(),\n        repoRootFolder);\n});\n
Program.cs
using Cake.Common.IO;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"Report-IssuesToAppVeyor\")]\npublic sealed class ReportIssuesToAppVeyorTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        var repoRootPath = context.MakeAbsolute(context.Directory(\"./\"));\n\n        context.ReportIssuesToPullRequest(\n            context.InspectCodeIssuesFromFilePath(\n                @\"C:\\build\\inspectcode.log\"),\n            context.GitHubActionsBuilds(),\n            repoRootPath);\n    }\n}\n

The output will show up in the build log grouped by issue provider / run:

Additionally the issues show up as annotations:

Having issues available as annotations also means that they will be shown in pull requests on the related file / position:

"},{"location":"documentation/recipe/","title":"Overview","text":"

Cake.Issues recipes provide build scripts, delivered as a NuGet package, which can be used inside your projects Cake build to add issue management.

Integration of code analyzing and linting tools into a build pipeline often looks the similar, and differentiates mainly on the used linters, build and pull request systems. Cake.Issues recipes contain code to do all the parsing, integration with build and pull request systems for you, using the individual Cake.Issues addins. They support different linters based on the linting log files you pass it and integrate automatically with different build and pull request systems.

There are two flavors available:

  • Cake.Issues.Recipe

    For Cake .NET Tool

  • Cake.Frosting.Issues.Recipe

    For Cake Frosting

"},{"location":"documentation/recipe/#supported-tools","title":"Supported tools","text":"

See supported tools for a list of supported linters, build servers and pull request systems.

"},{"location":"documentation/recipe/#bundled-addins","title":"Bundled addins","text":"

Cake.Issues recipes will add the following addins to your build:

Cake.Issues.RecipeCake.Frosting.Issues.Recipe Addin Version Remarks Cake.Git 5.0.1 Only used if RepositoryInfoProvider type is set to RepositoryInfoProviderType.CakeGit. See Git repository information configuration for details. Cake.Issues 5.0.1 Cake.Issues.MsBuild 5.0.1 Cake.Issues.InspectCode 5.0.1 Cake.Issues.Markdownlint 5.0.1 Cake.Issues.EsLint 5.0.1 Cake.Issues.Sarif 5.0.1 Cake.Issues.Reporting 5.0.1 Cake.Issues.Reporting.Generic 5.0.1 Cake.Issues.Reporting.Sarif 5.0.1 Cake.Issues.PullRequests 5.0.1 Cake.Issues.PullRequests.AppVeyor 5.0.1 Cake.Issues.PullRequests.AzureDevOps 5.0.1 Cake.Issues.PullRequests.GitHubActions 5.0.1 Cake.AzureDevOps 5.0.0 Addin Version Remarks Cake.Frosting.Git 5.0.1 Only used if RepositoryInfoProvider type is set to RepositoryInfoProviderType.CakeGit. See Git repository information configuration for details. Cake.Issues 5.0.1 Cake.Frosting.Issues.MsBuild 5.0.1 Cake.Frosting.Issues.InspectCode 5.0.1 Cake.Frosting.Issues.Markdownlint 5.0.1 Cake.Frosting.Issues.EsLint 5.0.1 Cake.Frosting.Issues.Sarif 5.0.1 Cake.Frosting.Issues.Reporting 5.0.1 Cake.Frosting.Issues.Reporting.Generic 5.0.1 Cake.Frosting.Issues.Reporting.Sarif 5.0.1 Cake.Frosting.Issues.PullRequests 5.0.1 Cake.Frosting.Issues.PullRequests.AppVeyor 5.0.1 Cake.Frosting.Issues.PullRequests.AzureDevOps 5.0.1 Cake.Frosting.Issues.PullRequests.GitHubActions 5.0.1 Cake.AzureDevOps 5.0.0"},{"location":"documentation/recipe/configuration/","title":"Configuration","text":"

This page lists configuration properties which can be used to define the functionality and behavior of Cake.Issues recipes.

"},{"location":"documentation/recipe/configuration/#git-repository-information","title":"Git repository information","text":"

Cake.Issues recipes require some information about current Git repository.

To define the Git provider in Cake.Issues.Recipe set the global variable RepositoryInfoProvider. To define the Git provider in Cake.Frosting.Issues.Recipe pass the value to the constructor of IssueContext.

The following providers are supported:

Provider Description RepositoryInfoProviderType.CakeGit Read repository information using Cake.Git addin. Requires system to be compatible with Cake.Git addin. RepositoryInfoProviderType.Cli Read repository information using Git CLI. Requires Git CLI to be available in path.

By default Cake.Git addin will be used.

"},{"location":"documentation/recipe/configuration/#general","title":"General","text":"Cake.Issues.RecipeCake.Frosting.Issues.Recipe IssuesParameters Property Default Value Description OutputDirectory BuildArtifacts Path to the output directory. A relative path will be relative to the current working directory. BuildIdentifier string.Empty Identifier for the build run. If set this identifier will be used to identify to artifacts provided by the build if building on multiple configurations. IssuesContext.Parameters Property Default Value Description OutputDirectory BuildArtifacts Path to the output directory. A relative path will be relative to the current working directory. BuildIdentifier string.Empty Identifier for the build run. If set this identifier will be used to identify to artifacts provided by the build if building on multiple configurations."},{"location":"documentation/recipe/configuration/#input-files","title":"Input files","text":"Cake.Issues.RecipeCake.Frosting.Issues.Recipe IssuesParameters.InputFiles Methods Description AddMsBuildXmlFileLoggerLogFilePath() Adds a path to a MSBuild log file created by XmlFileLogger. AddMsBuildXmlFileLoggerLogFileContent() Adds content of a MSBuild log file created by XmlFileLogger. AddMsBuildBinaryLogFilePath() Adds a path to a MSBuild binary log file. AddMsBuildBinaryLogFileContent() Adds content of a MSBuild binary log file. AddInspectCodeLogFilePath() Adds a path to a JetBrains InspectCode log file. AddInspectCodeLogFileContent() Adds content of a JetBrains InspectCode log file. AddMarkdownlintCliLogFilePath() Adds a path to a markdownlint-cli log file. AddMarkdownlintCliLogFileContent() Adds content of a markdownlint-cli log file. AddMarkdownlintCliJsonLogFilePath() Adds a path to a markdownlint-cli log file writting with --json. AddMarkdownlintCliJsonLogFileContent() Adds content of a markdownlint-cli log file writting with --json. AddMarkdownlintV1LogFilePath() Adds a path to a markdownlint log file in version 1. AddMarkdownlintV1LogFileContent() Adds content of a markdownlint log file in version 1. AddEsLintJsonLogFilePath() Adds a path to a ESLint log file generated by the ESLint json formatter. AddEsLintJsonLogFileContent() Adds content of a ESLint log file generated by the ESLint json formatter. AddSarifLogFilePath() Adds a path to a SARIF log file. AddSarifLogFileContent() Adds content of a SARIF log file. IssuesContext.Parameters.InputFiles Methods Description AddMsBuildXmlFileLoggerLogFilePath() Adds a path to a MSBuild log file created by XmlFileLogger. AddMsBuildXmlFileLoggerLogFileContent() Adds content of a MSBuild log file created by XmlFileLogger. AddMsBuildBinaryLogFilePath() Adds a path to a MSBuild binary log file. AddMsBuildBinaryLogFileContent() Adds content of a MSBuild binary log file. AddInspectCodeLogFilePath() Adds a path to a JetBrains InspectCode log file. AddInspectCodeLogFileContent() Adds content of a JetBrains InspectCode log file. AddMarkdownlintCliLogFilePath() Adds a path to a markdownlint-cli log file. AddMarkdownlintCliLogFileContent() Adds content of a markdownlint-cli log file. AddMarkdownlintCliJsonLogFilePath() Adds a path to a markdownlint-cli log file writting with --json. AddMarkdownlintCliJsonLogFileContent() Adds content of a markdownlint-cli log file writting with --json. AddMarkdownlintV1LogFilePath() Adds a path to a markdownlint log file in version 1. AddMarkdownlintV1LogFileContent() Adds content of a markdownlint log file in version 1. AddEsLintJsonLogFilePath() Adds a path to a ESLint log file generated by the ESLint json formatter. AddEsLintJsonLogFileContent() Adds content of a ESLint log file generated by the ESLint json formatter. AddSarifLogFilePath() Adds a path to a SARIF log file. AddSarifLogFileContent() Adds content of a SARIF log file."},{"location":"documentation/recipe/configuration/#report-creation","title":"Report creation","text":"Cake.Issues.RecipeCake.Frosting.Issues.Recipe IssuesParameters.Reporting Property Default Value Description ShouldCreateFullIssuesReport true Indicates whether full issues report should be created. FullIssuesReportSettings GenericIssueReportTemplate.HtmlDxDataGrid template with DevExtremeTheme.MaterialBlueLight theme. Settings for creating the full issues report. See Template Gallery for possible options. ShouldCreateSarifReport true Indicates whether a report in SARIF format should be created. ShouldReportIssuesToConsole false Indicates whether issues should be reported to the console. ReportToConsoleSettings Settings for reporting issues to the console. IssuesContext.Parameters.Reporting Property Default Value Description ShouldCreateFullIssuesReport true Indicates whether full issues report should be created. FullIssuesReportSettings GenericIssueReportTemplate.HtmlDxDataGrid template with DevExtremeTheme.MaterialBlueLight theme. Settings for creating the full issues report. See Template Gallery for possible options. ShouldCreateSarifReport true Indicates whether a report in SARIF format should be created. ShouldReportIssuesToConsole false Indicates whether issues should be reported to the console. ReportToConsoleSettings Settings for reporting issues to the console."},{"location":"documentation/recipe/configuration/#build-server-integration","title":"Build server integration","text":"Cake.Issues.RecipeCake.Frosting.Issues.Recipe IssuesParameters.BuildServer Property Default Value Description ShouldReportIssuesToBuildServer true Indicates whether issues should be reported to the build server. ShouldPublishFullIssuesReport true Indicates whether full issues report should be published as artifact to the build system. ShouldPublishSarifReport true Indicates whether report int SARIF format shoudl be published as artifact to the build system. ShouldCreateSummaryIssuesReport true Indicates whether summary issues report should be created. IssuesContext.Parameters.BuildServer Property Default Value Description ShouldReportIssuesToBuildServer true Indicates whether issues should be reported to the build server. ShouldPublishFullIssuesReport true Indicates whether full issues report should be published as artifact to the build system. ShouldPublishSarifReport true Indicates whether report int SARIF format shoudl be published as artifact to the build system. ShouldCreateSummaryIssuesReport true Indicates whether summary issues report should be created."},{"location":"documentation/recipe/configuration/#pull-request-integration","title":"Pull request integration","text":"Cake.Issues.RecipeCake.Frosting.Issues.Recipe IssuesParameters.PullRequestSystem Property Default Value Description ShouldReportIssuesToPullRequest true Indicates whether issues should be reported to the pull request system. MaxIssuesToPost null Global number of issues which should be posted at maximum over all issue provider. Issues are filtered by priority and issues with a file path are prioritized. null won't set a global limit. MaxIssuesToPostAcrossRuns null Global number of issues which should be posted at maximum over all issue providers and across multiple runs. Issues are filtered by priority and issues with a file path are prioritized. null won't set a limit across multiple runs. MaxIssuesToPostForEachIssueProvider 100 Number of issues which should be posted at maximum for each issue provider. Issues are filtered by priority and issues with a file path are prioritized. null won't limit issues per issue provider. ProviderIssueLimits Empty Issue limits for individual issue provider. The key must be the IIssue.ProviderType of a specific provider to which the limits should be applied to. IssueFilters Empty List of filter functions which should be applied before posting issues to pull requests. ShouldSetPullRequestStatus true Indicates whether a status on the pull request should be set if there are any issues found. ShouldSetSeparatePullRequestStatusForEachIssueProviderAndRun true Indicates whether a separate status should be set for issues of every issue provider and run. IssuesContext.Parameters.PullRequestSystem Property Default Value Description ShouldReportIssuesToPullRequest true Indicates whether issues should be reported to the pull request system. MaxIssuesToPost null Global number of issues which should be posted at maximum over all issue provider. Issues are filtered by priority and issues with a file path are prioritized. null won't set a global limit. MaxIssuesToPostAcrossRuns null Global number of issues which should be posted at maximum over all issue providers and across multiple runs. Issues are filtered by priority and issues with a file path are prioritized. null won't set a limit across multiple runs. MaxIssuesToPostForEachIssueProvider 100 Number of issues which should be posted at maximum for each issue provider. Issues are filtered by priority and issues with a file path are prioritized. null won't limit issues per issue provider. ProviderIssueLimits Empty Issue limits for individual issue provider. The key must be the IIssue.ProviderType of a specific provider to which the limits should be applied to. IssueFilters Empty List of filter functions which should be applied before posting issues to pull requests. ShouldSetPullRequestStatus true Indicates whether a status on the pull request should be set if there are any issues found. ShouldSetSeparatePullRequestStatusForEachIssueProviderAndRun true Indicates whether a separate status should be set for issues of every issue provider and run."},{"location":"documentation/recipe/demos/","title":"Demos","text":"

There are demo setups available for different combinations of build servers and repositories which you can fork and to which you can create pull requests to test the recipe functionality.

Recipe Build Server Repository Cake.Issues.Recipe Azure Pipelines Azure Repos"},{"location":"documentation/recipe/supported-tools/","title":"Supported tools","text":"

Cake.Issues recipes support reading issues from different tools and integrates with different build and pull request systems.

"},{"location":"documentation/recipe/supported-tools/#tools","title":"Tools","text":"

Cake.Issues recipes support reading issues from output of the following tools:

Cake.Issues.RecipeCake.Frosting.Issues.Recipe Tool Format IssuesParameters.InputFiles Method MsBuild MSBuild Extension Pack XmlFileLogger AddMsBuildXmlFileLoggerLogFile*() MsBuild Binary Log File AddMsBuildBinaryLogFile*() JetBrains InspectCode (ReSharper) xml AddInspectCodeLogFile*() markdownlint markdownlint-cli default format AddMarkdownlintCliLogFile*() markdownlint markdownlint-cli with --json AddMarkdownlintCliJsonLogFile*() markdownlint markdownlint version 1 AddMarkdownlintV1LogFile*() ESLint json formatter AddEsLintJsonLogFile*() Any SARIF compatible tool SARIF AddSarifLogFile*() Tool Format IssuesContext.Parameters.InputFiles Method MsBuild MSBuild Extension Pack XmlFileLogger AddMsBuildXmlFileLoggerLogFile*() MsBuild Binary Log File AddMsBuildBinaryLogFile*() JetBrains InspectCode (ReSharper) xml AddInspectCodeLogFile*() markdownlint markdownlint-cli default format AddMarkdownlintCliLogFile*() markdownlint markdownlint-cli with --json AddMarkdownlintCliJsonLogFile*() markdownlint markdownlint version 1 AddMarkdownlintV1LogFile*() ESLint json formatter AddEsLintJsonLogFile*() Any SARIF compatible tool SARIF AddSarifLogFile*()

Tip

See Supported tools for a list of tools supporting the SARIF format.

"},{"location":"documentation/recipe/supported-tools/#build-systems","title":"Build systems","text":"

Cake.Issues recipes integrates with the following build systems:

AppVeyorAzure PipelinesGitHub Actions
  • Write issues to build server
  • Issues summary
  • Full issues report
  • Write issues to build server (1)
  • Issues summary
  • Full issues report
  1. Only first 10
  • Write issues to build server
  • Issues summary
  • Full issues report
"},{"location":"documentation/recipe/supported-tools/#pull-request-systems","title":"Pull request systems","text":"

Cake.Issues recipes integrates with the following pull request systems:

Azure ReposGitHub
  • Write issues to pull requests
  • Set pull request status
  • Write issues to pull requests (1)
  • Set pull request status
  1. When build from GitHub Actions
"},{"location":"documentation/recipe/tasks/","title":"Tasks","text":"

Cake.Issues recipes provide the following tasks to your build script:

Cake.Issues.RecipeCake.Frosting.Issues.Recipe Task Description IssuesBuildTasks property Issues Main tasks for issue management integration. IssuesTask Read-Issues Reads issues from the provided log files. ReadIssuesTask Create-FullIssuesReport Creates issue report. CreateFullIssuesReportTask Publish-IssuesArtifacts Publish artifacts to build server. PublishIssuesArtifactsTask Report-IssuesToBuildServer Report issues to build server. ReportIssuesToBuildServerTask Create-SummaryIssuesReport Creates a summary issue report. CreateSummaryIssuesReportTask Report-IssuesToPullRequest Report issues to pull request. ReportIssuesToPullRequestTask Set-PullRequestIssuesState Set pull request status. SetPullRequestIssuesStateTask Report-IssuesToConsole Report issues to console. ReportIssuesToConsoleTask Task Description Task type Issues Main tasks for issue management integration. Cake.Frosting.Issues.Recipe. IssuesTask Read-Issues Reads issues from the provided log files. Cake.Frosting.Issues.Recipe. ReadIssuesTask Create-FullIssuesReport Creates issue report. Cake.Frosting.Issues.Recipe. CreateFullIssuesReportTask Publish-IssuesArtifacts Publish artifacts to build server. Cake.Frosting.Issues.Recipe. PublishIssuesArtifactsTask Report-IssuesToBuildServer Report issues to build server. Cake.Frosting.Issues.Recipe. ReportIssuesToBuildServerTask Create-SummaryIssuesReport Creates a summary issue report. Cake.Frosting.Issues.Recipe. CreateSummaryIssuesReportTask Report-IssuesToPullRequest Report issues to pull request. Cake.Frosting.Issues.Recipe. ReportIssuesToPullRequestTask Set-PullRequestIssuesState Set pull request status. Cake.Frosting.Issues.Recipe. SetPullRequestIssuesStateTask Report-IssuesToConsole Report issues to console. Cake.Frosting.Issues.Recipe. ReportIssuesToConsoleTask"},{"location":"documentation/report-formats/","title":"Report Formats","text":"

Report format addins implement specific report formats and allow the Cake Issues addin to create reports in the specific format.

  • Console \u2013 Support for reporting issues to the console
  • Generic \u2013 Support for creating reports in any text based format (HTML, Markdown, ...)
  • Sarif \u2013 Support for creating reports in SARIF format

Tip

See How to implement report format for instruction on how to implement support for additional report formats.

"},{"location":"documentation/report-formats/console/","title":"Console","text":"

Support for printing issues to the console is implemented in the a Cake.Issues.Reporting.Console addin.

  • Features
  • Examples
  • API
"},{"location":"documentation/report-formats/console/examples/","title":"Examples","text":"

To report issues to the console the Console report format needs to be imported. For this example the MsBuild issue provider is additionally used for reading issues:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.MsBuild&version=5.0.1\n#addin nuget:?package=Cake.Issues.Reporting&version=5.0.1\n#addin nuget:?package=Cake.Issues.Reporting.Console&version=5.0.1\n

Note

In addition to the Console report format the Cake.Issues and Cake.Issues.Reporting core addins need to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.MsBuild\" Version=\"5.0.1\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.Reporting.Console\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

The following example will print issues logged as warnings by MsBuild to the console.

Cake .NET ToolCake Frosting build.cake
Task(\"Create-IssueReport\").Does(() =>\n{\n    var repoRootPath = MakeAbsolute(Directory(\"./\"));\n\n    // Build MySolution.sln solution in the repository root folder and write a binary log.\n    FilePath msBuildLogFile = @\"c:\\build\\msbuild.log\";\n    var msBuildSettings =\n        new DotNetMSBuildSettings().WithLogger(\n            \"BinaryLogger,\" + Context.Tools.Resolve(\"Cake.Issues.MsBuild*/**/StructuredLogger.dll\"),\n            \"\",\n            msBuildLogFile.FullPath);\n    DotNetBuild(\n        repoRootPath.CombineWithFilePath(\"MySolution.sln\").FullPath,\n        new DotNetBuildSettings{MSBuildSettings = msBuildSettings});\n\n    // Write issues to console.\n    CreateIssueReport(\n        MsBuildIssuesFromFilePath(\n            msBuildLogFile,\n            MsBuildBinaryLogFileFormat),\n        ConsoleIssueReportFormat(\n            new ConsoleIssueReportFormatSettings\n            {\n                GroupByRule = true,\n                ShowProviderSummary = true,\n                ShowPrioritySummary = true\n            }),\n        repoRootPath,\n        string.Empty);\n});\n
Program.cs
using Cake.Common.IO;\nusing Cake.Common.Tools.DotNet;\nusing Cake.Common.Tools.DotNet.Build;\nusing Cake.Common.Tools.DotNet.MSBuild;\nusing Cake.Core.IO;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"Create-IssueReport\")]\npublic sealed class CreateIssueReportTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        var repoRootPath = context.MakeAbsolute(context.Directory(\"./\"));\n\n        // Build MySolution.sln solution in the repository root folder and write a binary log.\n        FilePath msBuildLogFile = @\"c:\\build\\msbuild.log\";\n        var msBuildSettings =\n            new DotNetMSBuildSettings().WithLogger(\n                \"BinaryLogger,\" + context.Tools.Resolve(\"Cake.Issues.MsBuild*/**/StructuredLogger.dll\"),\n                \"\",\n                msBuildLogFile.FullPath);\n        context.DotNetBuild(\n            repoRootPath.CombineWithFilePath(\"MySolution.sln\").FullPath,\n            new DotNetBuildSettings{MSBuildSettings = msBuildSettings});\n\n        // Write issues to console.\n        context.CreateIssueReport(\n            context.MsBuildIssuesFromFilePath(\n                msBuildLogFile,\n                context.MsBuildBinaryLogFileFormat()),\n            context.ConsoleIssueReportFormat(\n                new ConsoleIssueReportFormatSettings\n                {\n                    GroupByRule = true,\n                    ShowProviderSummary = true,\n                    ShowPrioritySummary = true\n                }),\n            repoRootPath,\n            string.Empty);\n    }\n}\n
"},{"location":"documentation/report-formats/console/features/","title":"Features","text":"

The Cake.Issues.Reporting.Console addin provides the following features:

  • Prints issues containing line and column information.
  • Group issues by rule

Reports:

  • Number of issues by provider
  • Number of issues by priority for every provider and run
"},{"location":"documentation/report-formats/generic/","title":"Generic","text":"

Support for creating reports in any text based format like HTML or Markdown is implemented in the Cake.Issues.Reporting.Generic addin.

  • Features
  • Examples
  • Template Gallery
  • API
"},{"location":"documentation/report-formats/generic/features/","title":"Features","text":"

The Cake.Issues.Reporting.Generic addin provides the following features:

  • Creates reports in any text based format like HTML or Markdown.
  • Provides out of the box templates
  • Possibility to use custom templates using Razor

Info

See Template Gallery for a list of available out of the box and 3rd party templates.

"},{"location":"documentation/report-formats/generic/examples/","title":"Examples","text":"
  • Embedded Default Template
  • Custom Template
"},{"location":"documentation/report-formats/generic/examples/custom-template/","title":"Custom template","text":"

Info

If you create a universally usable custom template we're happy to package it with the addin. To have it included in the addin please create a pull request with your contribution.

To create custom HTML reports the Generic report format needs to be imported. For this example the MsBuild issue provider is additionally used for reading issues:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.MsBuild&version=5.0.1\n#addin nuget:?package=Cake.Issues.Reporting&version=5.0.1\n#addin nuget:?package=Cake.Issues.Reporting.Generic&version=5.0.1\n

Note

In addition to the Generic report format the Cake.Issues and Cake.Issues.Reporting core addins need to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.MsBuild\" Version=\"5.0.1\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.Reporting.Generic\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

The following example will create a HTML report for issues logged as warnings by MsBuild using a custom template.

Cake .NET ToolCake Frosting build.cake
Task(\"Create-IssueReport\").Does(() =>\n{\n    var repoRootFolder = new DirectoryPath(@\"c:\\repo\");\n\n    // Build MySolution.sln solution in the repository root folder and write a binary log.\n    FilePath msBuildLogFile = @\"c:\\build\\msbuild.log\";\n    var msBuildSettings =\n        new MSBuildSettings().WithLogger(\n            \"BinaryLogger,\" + Context.Tools.Resolve(\"Cake.Issues.MsBuild*/**/StructuredLogger.dll\"),\n            \"\",\n            msBuildLogFile)\n    DotNetBuild(\n        repoRootPath.CombineWithFilePath(\"MySolution.sln\"),\n        new DotNetBuildSettings{MSBuildSettings = msBuildSettings});\n\n    // Create HTML report using Diagnostic template.\n    CreateIssueReport(\n        new List<IIssueProvider>\n        {\n            MsBuildIssuesFromFilePath(\n                msBuildLogFile,\n                MsBuildBinaryLogFileFormat)\n        },\n        GenericIssueReportFormatFromFilePath(@\"c:\\ReportTemplate.cshtml\"),\n        repoRootFolder,\n        @\"c:\\report.html\");\n});\n
Program.cs
using Cake.Common.IO;\nusing Cake.Common.Tools.DotNet;\nusing Cake.Common.Tools.DotNet.Build;\nusing Cake.Common.Tools.DotNet.MSBuild;\nusing Cake.Core.IO;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"Create-IssueReport\")]\npublic sealed class CreateIssueReportTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        var repoRootPath = context.MakeAbsolute(context.Directory(\"./\"));\n\n        // Build MySolution.sln solution in the repository root folder and write a binary log.\n        FilePath msBuildLogFile = @\"c:\\build\\msbuild.log\";\n        var msBuildSettings =\n            new DotNetMSBuildSettings().WithLogger(\n                \"BinaryLogger,\" + context.Tools.Resolve(\"Cake.Issues.MsBuild*/**/StructuredLogger.dll\"),\n                \"\",\n                msBuildLogFile.FullPath);\n        context.DotNetBuild(\n            repoRootPath.CombineWithFilePath(\"MySolution.sln\").FullPath,\n            new DotNetBuildSettings{MSBuildSettings = msBuildSettings});\n\n        // Write issues to console.\n        context.CreateIssueReport(\n            context.MsBuildIssuesFromFilePath(\n                msBuildLogFile,\n                context.MsBuildBinaryLogFileFormat()),\n            context.GenericIssueReportFormatFromFilePath(@\"c:\\ReportTemplate.cshtml\"),\n            repoRootPath,\n            @\"c:\\report.html\");\n    }\n}\n

The template looks like this:

ReportTemplate.cshtml
@model IEnumerable<Cake.Issues.IIssue>\n\n<!DOCTYPE html>\n\n<html lang=\"en\" xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n    <meta charset=\"utf-8\" />\n    <title></title>\n</head>\n<body>\n    <table>\n        <thead>\n            <tr>\n                <th scope=\"col\">AffectedFileRelativePath</th>\n                <th scope=\"col\">Line</th>\n                <th scope=\"col\">Message</th>\n                <th scope=\"col\">Priority</th>\n                <th scope=\"col\">Rule</th>\n                <th scope=\"col\">RuleUrl</th>\n                <th scope=\"col\">ProviderType</th>\n            </tr>\n        </thead>\n        <tbody>\n            @foreach (var issue in Model)\n            {\n                <tr>\n                    <td>@issue.AffectedFileRelativePath</td>\n                    <td>@issue.Line</td>\n                    <td>@issue.MessageText</td>\n                    <td>@issue.Priority</td>\n                    <td>@issue.RuleId</td>\n                    <td>@issue.RuleUrl</td>\n                    <td>@issue.ProviderType</td>\n                </tr>\n            }\n        </tbody>\n    </table>\n</body>\n</html>\n

The template retrieves an IEnumerable<Cake.Issues.IIssue> as model.

Info

In custom templates functionality from the following assemblies are available:

  • System.dll
  • System.Core.dll
  • netstandard.dll
  • Cake.Core.dll
  • Cake.Issues.dll
  • Cake.Issues.Reporting.Generic.dll
"},{"location":"documentation/report-formats/generic/examples/default-template/","title":"Embedded default template","text":"

To create HTML reports the Generic report format needs to be imported. For this example the MsBuild issue provider is additionally used for reading issues:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.MsBuild&version=5.0.1\n#addin nuget:?package=Cake.Issues.Reporting&version=5.0.1\n#addin nuget:?package=Cake.Issues.Reporting.Generic&version=5.0.1\n

Note

In addition to the Generic report format the Cake.Issues and Cake.Issues.Reporting core addins need to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.MsBuild\" Version=\"5.0.1\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.Reporting.Generic\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

The following example will create a HTML report for issues logged as warnings by MsBuild.

Cake .NET ToolCake Frosting build.cake
Task(\"Create-IssueReport\").Does(() =>\n{\n    var repoRootPath = MakeAbsolute(Directory(\"./\"));\n\n    // Build MySolution.sln solution in the repository root folder and write a binary log.\n    FilePath msBuildLogFile = @\"c:\\build\\msbuild.log\";\n    var msBuildSettings =\n        new DotNetMSBuildSettings().WithLogger(\n            \"BinaryLogger,\" + Context.Tools.Resolve(\"Cake.Issues.MsBuild*/**/StructuredLogger.dll\"),\n            \"\",\n            msBuildLogFile.FullPath);\n    DotNetBuild(\n        repoRootPath.CombineWithFilePath(\"MySolution.sln\").FullPath,\n        new DotNetBuildSettings{MSBuildSettings = msBuildSettings});\n\n    // Create HTML report using Diagnostic template.\n    CreateIssueReport(\n        MsBuildIssuesFromFilePath(\n            msBuildLogFile,\n            MsBuildBinaryLogFileFormat),\n        GenericIssueReportFormatFromEmbeddedTemplate(GenericIssueReportTemplate.HtmlDiagnostic),\n        repoRootPath,\n        @\"c:\\report.html\");\n});\n
Program.cs
using Cake.Common.IO;\nusing Cake.Common.Tools.DotNet;\nusing Cake.Common.Tools.DotNet.Build;\nusing Cake.Common.Tools.DotNet.MSBuild;\nusing Cake.Core.IO;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"Create-IssueReport\")]\npublic sealed class CreateIssueReportTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        var repoRootPath = context.MakeAbsolute(context.Directory(\"./\"));\n\n        // Build MySolution.sln solution in the repository root folder and write a binary log.\n        FilePath msBuildLogFile = @\"c:\\build\\msbuild.log\";\n        var msBuildSettings =\n            new DotNetMSBuildSettings().WithLogger(\n                \"BinaryLogger,\" + context.Tools.Resolve(\"Cake.Issues.MsBuild*/**/StructuredLogger.dll\"),\n                \"\",\n                msBuildLogFile.FullPath);\n        context.DotNetBuild(\n            repoRootPath.CombineWithFilePath(\"MySolution.sln\").FullPath,\n            new DotNetBuildSettings{MSBuildSettings = msBuildSettings});\n\n        // Write issues to console.\n        context.CreateIssueReport(\n            context.MsBuildIssuesFromFilePath(\n                msBuildLogFile,\n                context.MsBuildBinaryLogFileFormat()),\n            context.GenericIssueReportFormatFromEmbeddedTemplate(GenericIssueReportTemplate.HtmlDiagnostic),\n            repoRootPath,\n            @\"c:\\report.html\");\n    }\n}\n
"},{"location":"documentation/report-formats/generic/templates/","title":"Template Gallery","text":"
  • HTML DevExtreme Data Grid
  • HTML Data Table
  • HTML Diagnostic
"},{"location":"documentation/report-formats/generic/templates/htmldatatable/","title":"HTML Data Table","text":"

Template for a HTML report containing a rich data table view with sorting and search functionality powered by Simple-DataTables.

"},{"location":"documentation/report-formats/generic/templates/htmldatatable/#features","title":"Features","text":"
  • Separate table for issues of each issue provider.
  • Table with Severity, Project, Path, File, Location, Rule, Message.
  • Each column sortable by user.
  • Paged table with possibility for user to change number of entries per page.
  • Client-side full text search.
  • No internet access required for displaying.
"},{"location":"documentation/report-formats/generic/templates/htmldatatable/#requirements","title":"Requirements","text":"
  • Cake.Issues.Reporting.Generic 0.2.1 or higher
"},{"location":"documentation/report-formats/generic/templates/htmldatatable/#usage","title":"Usage","text":"

To create a report using the HTML Data Table template you can use the GenericIssueReportTemplate.HtmlDataTable enum value:

Cake .NET ToolCake Frosting
CreateIssueReport(\n    issues,\n    GenericIssueReportFormatFromEmbeddedTemplate(\n        GenericIssueReportTemplate.HtmlDataTable),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
context.CreateIssueReport(\n    issues,\n    context.GenericIssueReportFormatFromEmbeddedTemplate(\n        GenericIssueReportTemplate.HtmlDataTable),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
"},{"location":"documentation/report-formats/generic/templates/htmldatatable/#options","title":"Options","text":"

This template doesn't support any options.

"},{"location":"documentation/report-formats/generic/templates/htmldatatable/#demos","title":"Demos","text":"
  • Default
"},{"location":"documentation/report-formats/generic/templates/htmldatatable/#source-code","title":"Source Code","text":"

Info

You can use the source code as a template for your custom template.

Source code is available on GitHub.

"},{"location":"documentation/report-formats/generic/templates/htmldiagnostic/","title":"HTML Diagnostic","text":"

Template for a HTML report containing a list of all issues with all properties.

"},{"location":"documentation/report-formats/generic/templates/htmldiagnostic/#features","title":"Features","text":"
  • Unstyled table listing all properties of IIssue
  • No internet access required for displaying.
"},{"location":"documentation/report-formats/generic/templates/htmldiagnostic/#requirements","title":"Requirements","text":"
  • No additional requirements.
"},{"location":"documentation/report-formats/generic/templates/htmldiagnostic/#usage","title":"Usage","text":"

To create a report using the HTML diagnostic template you can use the GenericIssueReportTemplate.HtmlDiagnostic enum value:

Cake .NET ToolCake Frosting
CreateIssueReport(\n    issues,\n    GenericIssueReportFormatFromEmbeddedTemplate(\n        GenericIssueReportTemplate.HtmlDiagnostic),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
context.CreateIssueReport(\n    issues,\n    context.GenericIssueReportFormatFromEmbeddedTemplate(\n        GenericIssueReportTemplate.HtmlDiagnostic),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
"},{"location":"documentation/report-formats/generic/templates/htmldiagnostic/#options","title":"Options","text":"

This template doesn't support any options.

"},{"location":"documentation/report-formats/generic/templates/htmldiagnostic/#demos","title":"Demos","text":"
  • Default
"},{"location":"documentation/report-formats/generic/templates/htmldiagnostic/#source-code","title":"Source Code","text":"

Info

You can use the source code as a template for your custom template.

Source code is available on GitHub.

"},{"location":"documentation/report-formats/generic/templates/htmldxdatagrid/","title":"HTML DevExtreme Data Grid","text":"

Template for a HTML report containing a rich data grid with sorting, filtering, grouping and search capabilities powered by DevExtreme.

"},{"location":"documentation/report-formats/generic/templates/htmldxdatagrid/#features","title":"Features","text":"
  • Table with Provider, Severity, Project, Path, File, Location, Rule, Message by default.
  • Support for grouping by multiple columns by user.
  • Total number of issues by each group level.
  • Each column sortable by user.
  • Data can be filtered by any column by user.
  • Paged view.
  • Client-side full text search.
  • Client-side export to Microsoft Excel or PDF.
  • Fully customizable through options.
"},{"location":"documentation/report-formats/generic/templates/htmldxdatagrid/#requirements","title":"Requirements","text":"
  • Cake.Issues.Reporting.Generic 0.3.1 or higher
"},{"location":"documentation/report-formats/generic/templates/htmldxdatagrid/#usage","title":"Usage","text":"

To create a report using the HTML DevExtreme Data Grid template you can use the GenericIssueReportTemplate.HtmlDxDataGrid enum value:

Cake .NET ToolCake Frosting
CreateIssueReport(\n    issues,\n    GenericIssueReportFormatFromEmbeddedTemplate(\n      GenericIssueReportTemplate.HtmlDxDataGrid),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
context.CreateIssueReport(\n    issues,\n    context.GenericIssueReportFormatFromEmbeddedTemplate(\n      GenericIssueReportTemplate.HtmlDxDataGrid),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
"},{"location":"documentation/report-formats/generic/templates/htmldxdatagrid/#options","title":"Options","text":"

See HtmlDxDataGridOption for a list of possible options.

"},{"location":"documentation/report-formats/generic/templates/htmldxdatagrid/#demos","title":"Demos","text":"

The following demo shows the template with its default options:

  • Default (Source Code)
"},{"location":"documentation/report-formats/generic/templates/htmldxdatagrid/#themes","title":"Themes","text":"

The template supports the teams defined in the DevExtremeTheme enumeration which can be set using the HtmlDxDataGridOption.Theme:

Cake .NET ToolCake Frosting
CreateIssueReport(\n    issues,\n    GenericIssueReportFormatFromEmbeddedTemplate(\n        GenericIssueReportTemplate.HtmlDxDataGrid,\n        settings => settings\n            .WithOption(\n                HtmlDxDataGridOption.Theme,\n                DevExtremeTheme.MaterialBlueLight)),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
context.CreateIssueReport(\n    issues,\n    context.GenericIssueReportFormatFromEmbeddedTemplate(\n        GenericIssueReportTemplate.HtmlDxDataGrid,\n        settings => settings\n            .WithOption(\n                  HtmlDxDataGridOption.Theme,\n                  DevExtremeTheme.MaterialBlueLight)),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
  • Light Theme (Source Code)
  • Dark Theme (Source Code)
  • Contrast Theme (Source Code)
  • Carmine Theme (Source Code)
  • Dark Moon Theme (Source Code)
  • Soft Blue Theme (Source Code)
  • Dark Violet Theme (Source Code)
  • Green Mist Theme (Source Code)
  • Light Compact Theme (Source Code)
  • Dark Compact Theme (Source Code)
  • Contrast Compact Theme (Source Code)
  • Material Blue Light Theme (Source Code)
  • Material Lime Light Theme (Source Code)
  • Material Orange Light Theme (Source Code)
  • Material Purple Light Theme (Source Code)
  • Material Teal Light Theme (Source Code)
  • Material Blue Dark Theme (Source Code)
  • Material Lime Dark Theme (Source Code)
  • Material Orange Dark Theme (Source Code)
  • Material Purple Dark Theme (Source Code)
  • Material Teal Dark Theme (Source Code)
  • Material Blue Light Compact Theme (Source Code)
  • Material Lime Light Compact Theme (Source Code)
  • Material Orange Light Compact Theme (Source Code)
  • Material Purple Light Compact Theme (Source Code)
  • Material Teal Light Compact Theme (Source Code)
  • Material Blue Dark Compact Theme (Source Code)
  • Material Lime Dark Compact Theme (Source Code)
  • Material Orange Dark Compact Theme (Source Code)
  • Material Purple Dark Compact Theme (Source Code)
  • Material Teal Dark Compact Theme (Source Code)
"},{"location":"documentation/report-formats/generic/templates/htmldxdatagrid/#column-visibility","title":"Column visibility","text":"

Visible columns can be defined using the ColumnNameVisible option:

Cake .NET ToolCake Frosting
CreateIssueReport(\n    issues,\n    GenericIssueReportFormatFromEmbeddedTemplate(\n        GenericIssueReportTemplate.HtmlDxDataGrid,\n        settings => settings\n            .WithOption(\n                HtmlDxDataGridOption.LineVisible,\n                false)),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
context.CreateIssueReport(\n    issues,\n    context.GenericIssueReportFormatFromEmbeddedTemplate(\n        GenericIssueReportTemplate.HtmlDxDataGrid,\n        settings => settings\n            .WithOption(\n                HtmlDxDataGridOption.LineVisible,\n                false)),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n

Additional columns can be added using the HtmlDxDataGridOption.AdditionalColumns option.

  • Show and hide columns (Source Code)
  • Add additional columns (Source Code)
"},{"location":"documentation/report-formats/generic/templates/htmldxdatagrid/#sorting","title":"Sorting","text":"

Sorted columns can be defined using the HtmlDxDataGridOption.SortedColumns and the ColumnNameSortOder options:

Cake .NET ToolCake Frosting
CreateIssueReport(\n    issues,\n    GenericIssueReportFormatFromEmbeddedTemplate(\n        GenericIssueReportTemplate.HtmlDxDataGrid,\n        settings => settings\n            .WithOption(\n                HtmlDxDataGridOption.SortedColumns,\n                new List<ReportColumn> { ReportColumn.RuleId })\n            .WithOption(\n                HtmlDxDataGridOption.RuleIdSortOrder,\n                ColumnSortOrder.Descending )),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
context.CreateIssueReport(\n    issues,\n    context.GenericIssueReportFormatFromEmbeddedTemplate(\n        GenericIssueReportTemplate.HtmlDxDataGrid,\n        settings => settings\n            .WithOption(\n                HtmlDxDataGridOption.SortedColumns,\n                new List<ReportColumn> { ReportColumn.RuleId })\n            .WithOption(\n                HtmlDxDataGridOption.RuleIdSortOrder, \n                ColumnSortOrder.Descending )),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
  • Change sorting (Source Code)
"},{"location":"documentation/report-formats/generic/templates/htmldxdatagrid/#grouping","title":"Grouping","text":"

Grouping can be defined using the HtmlDxDataGridOption.GroupedColumns option:

Cake .NET ToolCake Frosting
CreateIssueReport(\n    issues,\n    GenericIssueReportFormatFromEmbeddedTemplate(\n        GenericIssueReportTemplate.HtmlDxDataGrid,\n        settings => settings\n            .WithOption(\n                HtmlDxDataGridOption.GroupedColumns, \n                new List<ReportColumn> { ReportColumn.RuleId })),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
context.CreateIssueReport(\n    issues,\n    context.GenericIssueReportFormatFromEmbeddedTemplate(\n        GenericIssueReportTemplate.HtmlDxDataGrid,\n        settings => settings\n            .WithOption(\n                HtmlDxDataGridOption.GroupedColumns, \n                new List<ReportColumn> { ReportColumn.RuleId })),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
  • Change grouping (Source Code)
  • Disable grouping (Source Code)
"},{"location":"documentation/report-formats/generic/templates/htmldxdatagrid/#exporting","title":"Exporting","text":"

Exporting can be enabled using the HtmlDxDataGridOption.EnableExporting option:

Cake .NET ToolCake Frosting
CreateIssueReport(\n    issues,\n    GenericIssueReportFormatFromEmbeddedTemplate(\n        GenericIssueReportTemplate.HtmlDxDataGrid,\n        settings => settings\n            .WithOption(\n                HtmlDxDataGridOption.EnableExporting,\n                true)),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
context.CreateIssueReport(\n    issues,\n    context.GenericIssueReportFormatFromEmbeddedTemplate(\n        GenericIssueReportTemplate.HtmlDxDataGrid,\n        settings => settings\n            .WithOption(\n                HtmlDxDataGridOption.EnableExporting,\n                true)),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
  • Enable exporting (Source Code)
  • Microsoft Excel export (*.xlsx) (Source Code)
  • PDF export (*.pdf) (Source Code)
  • Custom export file name (Source Code)
"},{"location":"documentation/report-formats/generic/templates/htmldxdatagrid/#other-features","title":"Other features","text":"
  • Change title (Source Code)
  • Disable header (Source Code)
  • Disable filtering (Source Code)
  • Disable searching (Source Code)
  • Custom script location and version (Source Code)
"},{"location":"documentation/report-formats/generic/templates/htmldxdatagrid/#source-code","title":"Source Code","text":"

Info

You can use the source code as a template for your custom template.

Source code is available on GitHub.

"},{"location":"documentation/report-formats/sarif/","title":"Sarif","text":"

Support for creating SARIF compatible reports is implemented in the Cake.Issues.Reporting.Sarif addin.

  • Features
  • Examples
  • API
"},{"location":"documentation/report-formats/sarif/examples/","title":"Examples","text":"

To report issues to the console the SARIF report format needs to be imported. For this example the MsBuild issue provider is additionally used for reading issues:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.MsBuild&version=5.0.1\n#addin nuget:?package=Cake.Issues.Reporting&version=5.0.1\n#addin nuget:?package=Cake.Issues.Reporting.Sarif&version=5.0.1\n

Note

In addition to the SARIF report format the Cake.Issues and Cake.Issues.Reporting core addins need to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.MsBuild\" Version=\"5.0.1\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.Reporting.Sarif\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

The following example will create a SARIF report for issues logged as warnings by MsBuild.

Cake .NET ToolCake Frosting build.cake
Task(\"Create-IssueReport\").Does(() =>\n{\n    var repoRootPath = MakeAbsolute(Directory(\"./\"));\n\n    // Build MySolution.sln solution in the repository root folder and write a binary log.\n    FilePath msBuildLogFile = @\"c:\\build\\msbuild.log\";\n    var msBuildSettings =\n        new DotNetMSBuildSettings().WithLogger(\n            \"BinaryLogger,\" + Context.Tools.Resolve(\"Cake.Issues.MsBuild*/**/StructuredLogger.dll\"),\n            \"\",\n            msBuildLogFile.FullPath);\n    DotNetBuild(\n        repoRootPath.CombineWithFilePath(\"MySolution.sln\").FullPath,\n        new DotNetBuildSettings{MSBuildSettings = msBuildSettings});\n\n    // Create SARIF report.\n    CreateIssueReport(\n        MsBuildIssuesFromFilePath(\n            msBuildLogFile,\n            MsBuildBinaryLogFileFormat,\n        SarifIssueReportFormat(),\n        repoRootPath,\n        @\"c:\\report.sarif\");\n});\n
Program.cs
using Cake.Common.IO;\nusing Cake.Common.Tools.DotNet;\nusing Cake.Common.Tools.DotNet.Build;\nusing Cake.Common.Tools.DotNet.MSBuild;\nusing Cake.Core.IO;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"Create-IssueReport\")]\npublic sealed class CreateIssueReportTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        var repoRootPath = context.MakeAbsolute(context.Directory(\"./\"));\n\n        // Build MySolution.sln solution in the repository root folder and write a binary log.\n        FilePath msBuildLogFile = @\"c:\\build\\msbuild.log\";\n        var msBuildSettings =\n            new DotNetMSBuildSettings().WithLogger(\n                \"BinaryLogger,\" + context.Tools.Resolve(\"Cake.Issues.MsBuild*/**/StructuredLogger.dll\"),\n                \"\",\n                msBuildLogFile.FullPath);\n        context.DotNetBuild(\n            repoRootPath.CombineWithFilePath(\"MySolution.sln\").FullPath,\n            new DotNetBuildSettings{MSBuildSettings = msBuildSettings});\n\n        // Create SARIF report.\n        context.CreateIssueReport(\n            context.MsBuildIssuesFromFilePath(\n                msBuildLogFile,\n                context.MsBuildBinaryLogFileFormat()),\n            context.SarifIssueReportFormat(),\n            repoRootPath,\n            @\"c:\\report.sarif\");\n    }\n}\n
"},{"location":"documentation/report-formats/sarif/features/","title":"Features","text":"

The Cake.Issues.Reporting.Sarif addin provides the following features:

  • Creates SARIF compatible files.

Supports the following properties in the SARIF report:

  • RuleId
  • Message
  • Kind
  • Level
  • Location
  • RuleUrl
"},{"location":"documentation/resources/blog-posts/","title":"Blog posts","text":"

Info

If you have written about Cake Issues we would like to hear from you. You can add it by creating a pull request here.

"},{"location":"documentation/resources/blog-posts/#2018","title":"2018","text":"
  • Cake.Issues - A suite of addins for issue handling in Cake - Pascal Berger
"},{"location":"documentation/resources/blog-posts/#2017","title":"2017","text":"
  • Finding typos with ReSharper Command Line Tools, ReSpeller and Cake - Tom Podolak
  • Cake build issue reporting with PRCA - Tomasz Cielecki
"},{"location":"documentation/resources/presentations/","title":"Presentations","text":"

Info

If you have done a presentation about Cake Issues we would like to hear from you. You can add it by creating a pull request here.

"},{"location":"documentation/resources/presentations/#2019","title":"2019","text":"
  • Continuous Code Inspection using Cake - .NET User Group Basel: Video Slides - Pascal Berger
"},{"location":"documentation/resources/presentations/#2018","title":"2018","text":"
  • Ensuring quality in your DevOps pipelines using Cake - Azure DevOps Saturday Gothenburg - Pascal Berger
"},{"location":"documentation/usage/","title":"Usage","text":""},{"location":"documentation/usage/#ready-to-use-distributions","title":"Ready To Use Distributions","text":"

The easiest way to use Cake Issues is by using one of the Recipe packages, which provide build scripts, delivered as a NuGet package, which can be used inside your projects Cake build to add issue management.

"},{"location":"documentation/usage/#consuming-of-individual-addins","title":"Consuming Of Individual Addins","text":"

The addins can be added individually to any Cake build and allow advanced customizations:

  • Creating Issues
  • Reading Issues
  • Creating Reports
  • Reporting Issues To Pull Request And Build Systems
  • Breaking Builds
"},{"location":"documentation/usage/breaking-builds/breaking-builds/","title":"Breaking builds","text":"

The Cake.Issues addin can be used to break builds if specific issues were reported.

To break builds you need to import the following core addin:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n
Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Issues\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

The following task will fail the build if any issues were added to the issues global variable:

Cake .NET ToolCake Frosting build.cake
// Global issues list into which issues need to be added.\nIEnumerable<IIssue> issues = null;\n\nTask(\"BreakBuildOnIssues\")\n    .Description(\"Breaks build if any issues in the code are found.\")\n    .Does(() =>\n{\n    BreakBuildOnIssues(issues);\n});\n
Program.cs
using Cake.Core;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .UseContext<BuildContext>()\n            .Run(args);\n    }\n}\n\npublic class BuildContext(ICakeContext context) : FrostingContext(context)\n{\n    private readonly List<IIssue> _issues = [];\n\n    public IEnumerable<IIssue> Issues { get { return _issues;  } }\n\n    public void AddIssues(IEnumerable<IIssue> issues)\n    {\n        _issues.AddRange(issues);\n    }\n}\n\n[TaskName(\"BreakBuildOnIssues\")]\npublic sealed class BreakBuildOnIssuesTask : FrostingTask<BuildContext>\n{\n    public override void Run(BuildContext context)\n    {\n        context.BreakBuildOnIssues(context.Issues);\n    }\n}\n
"},{"location":"documentation/usage/creating-issues/creating-issues/","title":"Creating issues","text":"

The Cake.Issues addin can be used to create issues directly in the build script. This issues can for example be used to create reports.

To create issues you need to import the following core addin:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n
Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Issues\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

In the following task a new warning for the myfile.txt file on line 42 is created:

Cake .NET ToolCake Frosting build.cake
Task(\"Create-Issue\").Does(() =>\n{\n    var issue =\n        NewIssue(\n            \"Something went wrong\",\n            \"MyCakeScript\",\n            \"My Cake Script\")\n            .WithMessageInHtmlFormat(\"Something went <b>wrong</b>\")\n            .WithMessageInMarkdownFormat(\"Something went **wrong**\")\n            .InFile(\"myfile.txt\", 42)\n            .WithPriority(IssuePriority.Warning)\n            .Create();\n\n    Information(\"Issue created with message: {0}\", issue.MessageText);\n});\n
Program.cs
using Cake.Common.Diagnostics;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"Create-Issue\")]\npublic sealed class CreateIssueTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        var issue =\n            context.NewIssue(\n                \"Something went wrong\",\n                \"MyCakeScript\",\n                \"My Cake Script\")\n                .WithMessageInHtmlFormat(\"Something went <b>wrong</b>\")\n                .WithMessageInMarkdownFormat(\"Something went **wrong**\")\n                .InFile(\"myfile.txt\", 42)\n                .WithPriority(IssuePriority.Warning)\n                .Create();\n\n        context.Information(\"Issue created with message: {0}\", issue.MessageText);\n    }\n}\n
"},{"location":"documentation/usage/creating-reports/","title":"Creating Reports","text":"
  • Create Reports

Tip

For more report format specific examples see Report Format Examples.

"},{"location":"documentation/usage/creating-reports/creating-reports/","title":"Creating reports","text":"

To create report for issues you need to import the corresponding report format. In the following example the issue provider for reading warnings from MsBuild log files and generic report format is imported:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.Reporting&version=5.0.1\n#addin nuget:?package=Cake.Issues.MsBuild&version=5.0.1\n#addin nuget:?package=Cake.Issues.Reporting.Generic&version=5.0.1\n

Note

In addition to the report format the Cake.Issues and Cake.Issues.Reporting core addins need to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.MsBuild\" Version=\"5.0.1\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.Reporting.Generic\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

Afterwards you can define a task where you call the reporting addin with the desired issue provider and report format:

Cake .NET ToolCake Frosting build.cake
Task(\"Create-Report\").Does(() =>\n{\n    var repoRootFolder = new DirectoryPath(@\"C:\\repo\");\n    CreateIssueReport(\n        MsBuildIssuesFromFilePath(\n            @\"C:\\build\\msbuild.log\",\n            MsBuildBinaryLogFileFormat),\n        GenericIssueReportFormatFromEmbeddedTemplate(GenericIssueReportTemplate.HtmlDiagnostic),\n        repoRootFolder,\n        @\"c:\\report.html\");\n});\n
Program.cs
using Cake.Core.IO;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"Create-Report\")]\npublic sealed class CreateReportTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        var repoRootFolder = new DirectoryPath(@\"C:\\repo\");\n        context.CreateIssueReport(\n            context.MsBuildIssuesFromFilePath(\n                @\"C:\\build\\msbuild.log\",\n                context.MsBuildBinaryLogFileFormat()),\n            context.GenericIssueReportFormatFromEmbeddedTemplate(GenericIssueReportTemplate.HtmlDiagnostic),\n            repoRootFolder,\n            @\"c:\\report.html\");\n    }\n}\n
"},{"location":"documentation/usage/reading-issues/","title":"Reading Issues","text":"
  • Read Issues
  • Pass Additional Run Information
  • Configure File Links

Tip

For more issue provider specific examples see Issue Provider Examples.

"},{"location":"documentation/usage/reading-issues/file-linking/","title":"File linking","text":"

File link settings can be defined while reading issues and are passed through the IIssue.FileLink property to reporting formats, pull request systems and build server implementations:

Cake .NET ToolCake Frosting
var settings =\n    new ReadIssuesSettings(@\"c:\\repo\")\n    {\n        FileLinkSettings =\n            IssueFileLinkSettingsForGitHubCommit(\n                \"https://github.com/cake-contrib/Cake.Issues\",\n                \"76a7cacef7ad4295a6766646d45c9b56\")\n    };    \n\n    var issues =\n        ReadIssues(\n            InspectCodeIssuesFromFilePath(\n                @\"C:\\build\\inspectcode.log\"),\n            settings));\n
var settings =\n    new ReadIssuesSettings(@\"c:\\repo\")\n    {\n        FileLinkSettings =\n            IssueFileLinkSettingsForGitHubCommit(\n                \"https://github.com/cake-contrib/Cake.Issues\",\n                \"76a7cacef7ad4295a6766646d45c9b56\")\n    };    \n\n    var issues =\n        context.ReadIssues(\n            context.InspectCodeIssuesFromFilePath(\n                @\"C:\\build\\inspectcode.log\"),\n            settings));\n

Cake.Issues comes with out-of-the-box support for linking to files hosted on GitHub and Azure Repos, either for a specific branch or commit. Additionally there are aliases which can be used to define any custom pattern.

"},{"location":"documentation/usage/reading-issues/reading-issues/","title":"Reading issues","text":"

The Cake.Issues addin can be used to aggregate issues from different sources. This can for example be useful to break builds based on the reported issues.

To read issues you need to import at least one issue provider. In the following example the issue providers for reading warnings from MsBuild log files and from JetBrains InspectCode are imported:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.MsBuild&version=5.0.1\n#addin nuget:?package=Cake.Issues.InspectCode&version=5.0.1\n

Note

In addition to the issue providers the Cake.Issues core addin needs to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.MsBuild\" Version=\"5.0.1\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.InspectCode\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

Afterwards you can define a task where you call the core addin with the desired issue providers. The following example reads warnings and errors reported by MsBuild from a binary log and issues reported by JetBrains InspectCode:

Cake .NET ToolCake Frosting build.cake
Task(\"Read-Issues\").Does(() =>\n{\n    var repoRootFolder = new DirectoryPath(@\"C:\\repo\");\n    var issues = ReadIssues(\n        new List<IIssueProvider>\n        {\n            MsBuildIssuesFromFilePath(\n                @\"C:\\build\\msbuild.log\",\n                MsBuildBinaryLogFileFormat),\n            InspectCodeIssuesFromFilePath(\n                @\"C:\\build\\inspectcode.log\")\n        },\n        repoRootFolder);\n\n    Information(\"{0} issues are found.\", issues.Count());\n});\n
Program.cs
using Cake.Common.Diagnostics;\nusing Cake.Core.IO;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"Read-Issues\")]\npublic sealed class ReadIssuesTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        var repoRootFolder = new DirectoryPath(@\"C:\\repo\");\n        var issues = context.ReadIssues(\n            new List<IIssueProvider>\n            {\n                context.MsBuildIssuesFromFilePath(\n                    @\"C:\\build\\msbuild.log\",\n                    context.MsBuildBinaryLogFileFormat()),\n                context.InspectCodeIssuesFromFilePath(\n                    @\"C:\\build\\inspectcode.log\")\n            },\n            repoRootFolder);\n\n        context.Information(\"{0} issues are found.\", issues.Count());\n    }\n}\n
"},{"location":"documentation/usage/reading-issues/run-information/","title":"Additional run information","text":"

If a build script needs to parse multiple log files from the same tool, e.g. because multiple MsBuild solutions were built, this can be done by calling the issue provider multiple times. If the results are read into the same list and shown on the same report, individual issues could not be assigned to any of the calls, since issue provider type and name are identical.

Starting with Cake.Issues 0.9.0 it is possible to pass additional run information while reading issues, which then will be stored with each issues in the IIssue.Run property:

Cake .NET ToolCake Frosting
var issues = new List<IIssue>();\n\n// Parse issues from build of solution 1\nissues.AddRange(\n    ReadIssues(\n        MsBuildIssuesFromFilePath(\n            @\"C:\\build\\solution1-msbuild.log\",\n            MsBuildBinaryLogFileFormat),\n        new ReadIssuesSettings(@\"c:\\repo\")\n        {\n            Run = \"Solution 1\"\n        }\n    )\n);\n\n// Parse issues from build of solution 2\nissues.AddRange(\n    ReadIssues(\n        MsBuildIssuesFromFilePath(\n            @\"C:\\build\\solution2-msbuild.log\",\n            MsBuildBinaryLogFileFormat),\n        new ReadIssuesSettings(@\"c:\\repo\")\n        {\n            Run = \"Solution 2\"\n        }\n    )\n);\n
var issues = new List<IIssue>();\n\n// Parse issues from build of solution 1\nissues.AddRange(\n    context.ReadIssues(\n        context.MsBuildIssuesFromFilePath(\n            @\"C:\\build\\solution1-msbuild.log\",\n            context.MsBuildBinaryLogFileFormat()),\n        new ReadIssuesSettings(@\"c:\\repo\")\n        {\n            Run = \"Solution 1\"\n        }\n    )\n);\n\n// Parse issues from build of solution 2\nissues.AddRange(\n    context.ReadIssues(\n        context.MsBuildIssuesFromFilePath(\n            @\"C:\\build\\solution2-msbuild.log\",\n            context.MsBuildBinaryLogFileFormat()),\n        new ReadIssuesSettings(@\"c:\\repo\")\n        {\n            Run = \"Solution 2\"\n        }\n    )\n);\n
"},{"location":"documentation/usage/recipe/","title":"Recipe usage","text":"

Cake.Issues recipes provide build scripts, delivered as a NuGet package, which can be used inside your projects Cake build to add issue management.

Integration of code analyzing and linting tools into a build pipeline often looks the similar, and differentiates mainly on the used linters, build and pull request systems. Cake.Issues recipes contain code to do all the parsing, integration with build and pull request systems for you, using the individual Cake.Issues addins. They support different linters based on the linting log files you pass it and integrate automatically with different build and pull request systems.

There are two flavors available:

  • Cake.Issues.Recipe

    For Cake .NET Tool

  • Cake.Frosting.Issues.Recipe

    For Cake Frosting

"},{"location":"documentation/usage/recipe/using-cake-frosting-issues-recipe/","title":"Using Cake.Frosting.Issues.Recipe","text":"

The Cake.Frosting.Issues.Recipe package can be used to easily add issue management functionality to your Cake Frosting build.

Info

See Setting Up A New Frosting Project for instructions how to create a new Cake Frosting project.

"},{"location":"documentation/usage/recipe/using-cake-frosting-issues-recipe/#add-cakefrostingissuesrecipe-to-your-cake-frosting-build","title":"Add Cake.Frosting.Issues.Recipe to your Cake Frosting build","text":"

To use Cake.Frosting.Issues.Recipe in your Cake Frosting build you need to first add the NuGet package in your .csproj file:

<PackageReference Include=\"Cake.Frosting.Issues.Recipe\" Version=\"5.0.1\" />\n
"},{"location":"documentation/usage/recipe/using-cake-frosting-issues-recipe/#register-cakeissues-tasks","title":"Register Cake.Issues tasks","text":"

To make Cake Issues tasks available to your Cake Frosting build you need to register them.

Add the following line to the bootstrapping code in the Main method of your Cake Frosting project:

AddAssembly(Assembly.GetAssembly(typeof(IssuesTask)))\n

The following bootstrapping code registers the Cake Issues tasks and also installs JetBrains InspectCode:

using System;\nusing System.Reflection;\nusing Cake.Frosting;\nusing Cake.Frosting.Issues.Recipe;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .UseContext<BuildContext>()\n            .InstallTool(\n                new Uri(\n                    \"nuget:?package=JetBrains.ReSharper.CommandLineTools\")) // (1)\n            .AddAssembly(Assembly.GetAssembly(typeof(IssuesTask)))\n            .Run(args);\n    }\n}\n
  1. In production code this dependency should be pinned to a specific version to make sure builds are deterministic and won't break due to updates.

    See Reproducible Builds for details.

"},{"location":"documentation/usage/recipe/using-cake-frosting-issues-recipe/#create-build-context","title":"Create build context","text":"

Cake.Frosting.Issues.Recipe provides a build context from which you need to inherit your custom build context. The build context contains configuration parameters, but also the state of the current running build, like for example all collected issues.

The following example creates a build context and defines that Cake Issues should use Cake.Git addin to determine state of the Git repository:

public class BuildContext : IssuesContext\n{\n    public BuildContext(ICakeContext context)\n        : base(context, RepositoryInfoProviderType.CakeGit)\n    {\n    }\n}\n
"},{"location":"documentation/usage/recipe/using-cake-frosting-issues-recipe/#passing-issues-to-cakefrostingissuesrecipe","title":"Passing issues to Cake.Frosting.Issues.Recipe","text":"

To make issues available to Cake.Frosting.Issues.Recipe you need pass the log files through the corresponding methods. The tasks need to also be a dependency of ReadIssuesTask provided by Cake.Frosting.Issues.Recipe.

In the following example a new task is introduced which runs JetBrains InspectCode and passes the log file to Cake.Frosting.Issues.Recipe:

[TaskName(\"Run-InspectCode\")]\n[IsDependeeOf(typeof(ReadIssuesTask))]\npublic class RunInspectCodeTask : FrostingTask<BuildContext>\n{\n    public override void Run(BuildContext context)\n    {\n        var inspectCodeLogFilePath = context.Parameters.OutputDirectory..CombineWithFilePath(\"inspectCode.log\");\n\n        // Run JetBrains InspectCode\n        context.InspectCode(\n            context.State.RepositoryRootDirectory.Combine(\"src\").CombineWithFilePath(\"ClassLibrary1.sln\"),\n            new InspectCodeSettings() {\n                OutputFile = context.InspectCodeLogFilePath\n            });\n\n        // Pass path to InspectCode log file to Cake.Frosting.Issues.Recipe\n        context.Parameters.InputFiles.AddInspectCodeLogFilePath(context.InspectCodeLogFilePath);\n    }\n}\n

See configuration for a full list of available configuration parameters.

"},{"location":"documentation/usage/recipe/using-cake-frosting-issues-recipe/#calling-issues-tasks","title":"Calling issues tasks","text":"

Cake.Frosting.Issues.Recipe will add a bunch of tasks to your build script.

To add the issues functionality into your existing build pipeline you need to add ReadIssuesTask to your pipeline.

In the following example the Default task makes sure the main IssuesTask is executed:

[TaskName(\"Default\")]\n[IsDependentOn(typeof(IssuesTask))]\npublic class DefaultTask : FrostingTask\n{\n}\n
"},{"location":"documentation/usage/recipe/using-cake-issues-recipe/","title":"Using Cake.Issues.Recipe","text":"

The Cake.Issues.Recipe package can be used to easily add issue management functionality to your build script.

"},{"location":"documentation/usage/recipe/using-cake-issues-recipe/#add-cakeissuesrecipe-to-your-build-script","title":"Add Cake.Issues.Recipe to your build script","text":"

To use Cake.Issues.Recipe in your build script you need to first load the NuGet package:

#load nuget:package=Cake.Issues.Recipe&version=5.0.1\n
"},{"location":"documentation/usage/recipe/using-cake-issues-recipe/#configuring-cakeissuesrecipe","title":"Configuring Cake.Issues.Recipe","text":"

To make issues available to Cake.Issues.Recipe you need to set the corresponding configuration parameters.

In the following example a new task is introduced which depends on existing tasks which build a MsBuild solution and run JetBrains InspectCode. It will pass the MsBuild and InspectCode logfile to Cake.Issues.Recipe:

// Run issues task by default.\nTask(\"Configure-CakeIssuesRecipe\")\n    .IsDependentOn(\"Build\")\n    .IsDependentOn(\"Run-InspectCode\")\n    .Does(() =>\n{\n    IssuesParameters.InputFiles.AddMsBuildBinaryLogFilePath(msBuildLogFilePath);\n    IssuesParameters.InputFiles.AddInspectCodeLogFilePath(inspectCodeLogFilePath);\n}\n

See configuration for a full list of available configuration parameters.

"},{"location":"documentation/usage/recipe/using-cake-issues-recipe/#calling-issues-tasks","title":"Calling issues tasks","text":"

Cake.Issues.Recipe will add a bunch of tasks to your build script.

To add the issues functionality into your existing build pipeline you can make the Read-Issues task dependent on the task which configures Cake.Issues.Recipe:

// Make sure build and linters run before issues task.\nIssuesBuildTasks.ReadIssuesTask\n    .IsDependentOn(\"Configure-CakeIssuesRecipe\");\n

At some point you need to call the tasks provided by Cake.Isses.Recipe. In the following example the Default task calls the main Issues task:

// Run issues task by default.\nTask(\"Default\")\n    .IsDependentOn(\"Issues\");\n
"},{"location":"documentation/usage/reporting-issues-to-pull-requests/","title":"Reporting Issues To Pull Requests","text":"
  • Report Issues To Pull Requests
  • Apply Custom Issue Filter

Tip

For more pull request system specific examples see Pull Request System Examples

"},{"location":"documentation/usage/reporting-issues-to-pull-requests/custom-issue-filter/","title":"Custom issue filter","text":"

You can define custom filters which are applied to issues before they are posted as comments to pull requests.

Tip: Filter to issues introduced with pull request

You can use a custom filter to only have issues introduced with the current code posted to the pull request.

For this you need to store your log files as artifacts on your build system, then you can define a custom filter which retrieves the logs from the previous build, parses them using the appropriate issue provider and filters out any issues which were already existing in the previous build.

The following example will filter out all issues from the rule CA1000 from being posted to the pull request.

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.MsBuild&version=5.0.1\n#addin nuget:?package=Cake.Issues.PullRequests&version=5.0.1\n#addin nuget:?package=Cake.Issues.PullRequests.AzureDevOps&version=5.0.1    \n\nTask(\"ReportIssuesToPullRequest\").Does(() =>\n{\n    var repoRootFolder = new DirectoryPath(@\"C:\\repo\");    \n\n    var settings = new ReportIssuesToPullRequestFromIssueProviderSettings(repoRootFolder);    \n\n    // Add custom filter.\n    settings.IssueFilters.Add(x => x.Where(issue => issue.RuleId != \"CA1000\"));    \n\n    ReportIssuesToPullRequest(\n        new List<IIssueProvider>\n        {\n            MsBuildIssuesFromFilePath(\n                @\"C:\\build\\msbuild.log\",\n                MsBuildBinaryLogFileFormat)\n        },\n        AzureDevOpsPullRequests(),\n        settings);\n});\n
Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.MsBuild\" Version=\"5.0.1\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.PullRequests.AzureDevOps\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n
Program.cs
using Cake.Core.IO;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"ReportIssuesToPullRequest\")]\npublic sealed class ReportIssuesToPullRequestTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        var repoRootFolder = new DirectoryPath(@\"C:\\repo\");        \n\n        var settings = new ReportIssuesToPullRequestFromIssueProviderSettings(repoRootFolder);        \n\n        // Add custom filter.\n        settings.IssueFilters.Add(x => x.Where(issue => issue.RuleId != \"CA1000\"));        \n\n        context.ReportIssuesToPullRequest(\n            new List<IIssueProvider>\n            {\n                context.MsBuildIssuesFromFilePath(\n                    @\"C:\\build\\msbuild.log\",\n                    context.MsBuildBinaryLogFileFormat())\n            },\n            context.AzureDevOpsPullRequests(),\n            settings);\n    }\n}\n
"},{"location":"documentation/usage/reporting-issues-to-pull-requests/report-issues-to-pull-requests/","title":"Report issues to pull requests","text":"

To use report issues to pull requests you need to import the corresponding pull request system addin. In the following example the issue provider for reading warnings from MsBuild log files and support for Azure DevOps pull requests is imported:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.PullRequests&version=5.0.1\n#addin nuget:?package=Cake.Issues.MsBuild&version=5.0.1\n#addin nuget:?package=Cake.Issues.PullRequests.AzureDevOps&version=5.0.1\n

Note

In addition to the pull request system the Cake.Issues and Cake.Issues.PullRequests core addins need to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.MsBuild\" Version=\"5.0.1\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.PullRequests.AzureDevOps\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

Afterwards you can define a task where you call the core addin with the desired issue provider and pull request system:

Cake .NET ToolCake Frosting build.cake
    Task(\"ReportIssuesToPullRequest\").Does(() =>\n    {\n        var repoRootFolder = new DirectoryPath(@\"C:\\repo\");\n        ReportIssuesToPullRequest(\n            MsBuildIssuesFromFilePath(\n                @\"C:\\build\\msbuild.log\",\n                MsBuildBinaryLogFileFormat),\n            AzureDevOpsPullRequests(),\n            repoRootFolder);\n    });\n
Program.cs
using Cake.Core.IO;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"ReportIssuesToPullRequest\")]\npublic sealed class ReportIssuesToPullRequestTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        var repoRootFolder = new DirectoryPath(@\"C:\\repo\");\n        context.ReportIssuesToPullRequest(\n            context.MsBuildIssuesFromFilePath(\n                @\"C:\\build\\msbuild.log\",\n                context.MsBuildBinaryLogFileFormat()),\n            context.AzureDevOpsPullRequests(),\n            repoRootFolder);\n    }\n}\n
"},{"location":"news/","title":"News","text":""},{"location":"news/2020/08/22/cake-issues-v090-released/","title":"Cake Issues v0.9.0 Released","text":"

Cake Issues version 0.9.0 has been released. This is a major release bringing a lot of new features across all addins.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • AdmiringWorm
  • christianbumann
  • eoehen
  • gep13
  • janniksam
  • mholo65
  • pascalberger
  • Speeedy01
  • jokay
","boost":0.5},{"location":"news/2020/08/22/cake-issues-v090-released/#full-cross-platform-support","title":"Full cross-platform support","text":"

While in previous versions most parts of Cake Issues was already targeting .NET Standard and with this could be executed on .NET Framework, .NET Core and Mono, Cake.Issues.Reporting.Generic could only run on .NET Framework and Mono, but not on .NET Core. With this release Cake.Issues.Reporting.Generic was ported to also run on .NET Core.

The migration was done by gep13 on his Twitch stream and you can watch work done in Stream 90 - Working on Cake.Issues.Recipe, Stream 91 - Working on Cake.Issues.Reporting.Generic and Gazorator and Stream 92 - Working on Cake.Issues.Reporting.Generic and Gazorator - Part 2.

","boost":0.5},{"location":"news/2020/08/22/cake-issues-v090-released/#enhanced-issue-information","title":"Enhanced issue information","text":"

The description for issues has been extended by additional information for column and ranges:

  • IIssue.EndLine
  • IIssue.Column
  • IIssue.EndColumn

Existing issue providers have been updated to provide the additional information where available. See feature description for individual issue providers for which information a specific issue provider supports.

","boost":0.5},{"location":"news/2020/08/22/cake-issues-v090-released/#file-linking","title":"File linking","text":"

In previous versions Cake.Issues.Reporting.Generic supported entries linking to the file on the source code provider (GitHub, Azure Repos, ...). With this release file linking infrastructure has been moved to the Cake.Issues addin and can be used by any addin.

File link settings can be defined while reading issues and are passed through the new IIssue.FileLink property to reporting formats, pull request systems and build server implementations:

var settings =\n    new ReadIssuesSettings(@\"c:\\repo\")\n    {\n        FileLinkSettings =\n            IssueFileLinkSettingsForGitHubCommit(\n                \"https://github.com/cake-contrib/Cake.Issues.Reporting.Generic\",\n                \"76a7cacef7ad4295a6766646d45c9b56\")\n    };\n\n    var issues =\n        ReadIssues(\n            InspectCodeIssuesFromFilePath(\n                @\"C:\\build\\inspectcode.log\"),\n            settings));\n

Cake.Issues comes with out-of-the-box support for linking to files hosted on GitHub and Azure Repos, either for a specific branch or commit. Additionally there are aliases which can be used to define any custom pattern.

","boost":0.5},{"location":"news/2020/08/22/cake-issues-v090-released/#support-for-passing-additional-run-information","title":"Support for passing additional run information","text":"

If a build script needed to parse multiple log files from the same tool, e.g. because multiple MsBuild solutions were built, this was currently possible by calling the issue provider multiple times. If the results were read into the same list and shown on the same report, individual issues could not be assigned to any of the calls, since issue provider type and name were identical. Starting with Cake.Issues 0.9.0 it is now possible to pass additional run information while reading issues, which then will be stored with each issues in the IIssue.Run property:

var issues = new List<IIssue>();\n\n// Parse issues from build of solutions 1\nissues.AddRange(\n    ReadIssues(\n        MsBuildIssuesFromFilePath(\n            @\"C:\\build\\solution1-msbuild.log\",\n            MsBuildXmlFileLoggerFormat),\n        new ReadIssuesSettings(@\"c:\\repo\")\n        {\n            Run = \"Solution 1\"\n        }\n    )\n);\n\n// Parse issues from build of solutions 2\nissues.AddRange(\n    ReadIssues(\n        MsBuildIssuesFromFilePath(\n            @\"C:\\build\\solution2-msbuild.log\",\n            MsBuildXmlFileLoggerFormat),\n        new ReadIssuesSettings(@\"c:\\repo\")\n        {\n            Run = \"Solution 2\"\n        }\n    )\n);\n
","boost":0.5},{"location":"news/2020/08/22/cake-issues-v090-released/#improved-pull-request-integration","title":"Improved pull request integration","text":"

In previous versions the text message of an issue was used to detect issues already reported in a previous run. This didn't work well for issues which contain information in the message which likely changes between runs, like e.g. line information. In this version a specific identifier, IIssue.Identifier, is used which can be set by the issue provider.

When working with legacy code bases which contain a lot of existing issues, using something like Cake.Issues can be hard, since it will notify about every existing issue if something is changed in a file. To work around this issue it is possible to limit issues which will be posted to pull request systems. In previous versions it was already possible to limit the total number of issues, the number of issues for every issue provider and the total number of issues across multiple run. With 0.9.0 it will additionally be possible to limit the number of issues for specific issue providers for either a single or across multiple runs. This allows advanced scenarios like posting a maximum of 10 MsBuild issues every run, but not more than 20 in total across all runs.

","boost":0.5},{"location":"news/2020/08/22/cake-issues-v090-released/#get-everything-together","title":"Get everything together","text":"

Cake.Issues.Recipe, the Cake Recipe script which you can integrate into your build script for easy integration of full feature issue management, has been updated to version 0.4.0, bringing all the new features of Cake.Issues 0.9.0.

","boost":0.5},{"location":"news/2020/08/22/cake-issues-v090-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 0.9.0 is a breaking release, which means that it probably requires changes to your build script. This section documents the most common changes which might be required:

  • Cake.Issues
  • Serialization format has been updated to version 3. Older version are still supported for deserialization.
  • Cake.Issues.Markdownlint
  • MarkdownlintLogFileFormat alias has been renamed to MarkdownlintV1LogFileFormat (#116).
  • Cake.Issues.PullRequest
  • ReportIssuesToPullRequest alias which accepts an issue provider, or a list of issue providers, and settings requires now settings of type IReportIssuesToPullRequestFromIssueProviderSettings instead of ReportIssuesToPullRequestSettings to provider additional functionality, like support for File linking and Support for passing additional run information.
  • Cake.Issues.PullRequests.AzureDevOps
  • Cake.Issues.PullRequests.AzureDevOps requires at least Cake.AzureDevOps 0.5.0
  • Cake.Issues.Reporting
  • CreateIssueReport alias which accepts an issue provider, or a list of issue providers, and settings requires now settings of type ICreateIssueReportFromIssueProviderSettings instead of CreateIssueReportSettings to provider additional functionality, like support for File linking and Support for passing additional run information.
  • Cake.Issues.Reporting.Generic
  • Cake.Issues.Reporting.Generic requires at least Cake 0.38.0
  • HtmlDxDataGridOption.FileLinkSettings has been removed. File link settings can now be defined while reading the issues. For details see File linking. (#265).
  • HtmlDxDataGridOption.JSZipLocation has been split into HtmlDxDataGridOption.JsZipLocation and HtmlDxDataGridOption.JsZipVersion (#320).
  • Cake.Issues.Recipe
  • Cake.Issues.Recipe requires at least Cake 0.38.0

For details see release notes of the individual addins:

  • Cake.Issues 0.9.0
  • Cake.Issues.MsBuild 0.9.0
  • Cake.Issues.InspectCode 0.9.0
  • Cake.Issues.DupFinder 0.9.0
  • Cake.Issues.GitRepository 0.9.0
  • Cake.Issues.Markdownlint 0.9.0
  • Cake.Issues.EsLint 0.9.0
  • Cake.Issues.DocFx 0.9.0
  • Cake.Issues.PullRequests 0.9.0
  • Cake.Issues.PullRequests.AzureDevOps 0.9.0
  • Cake.Issues.PullRequests.AppVeyor 0.9.0
  • Cake.Issues.Reporting 0.9.0
  • Cake.Issues.Reporting.Generic 0.9.0
  • Cake.Issues.Reporting.Sarif 0.9.0
  • Cake.Issues.Recipe 0.4.0
","boost":0.5},{"location":"news/2020/09/19/cake-issues-v091-released/","title":"Cake Issues v0.9.1 Released","text":"

Version 0.9.1 of Cake Issues and Cake.Issues.PullRequests.AzureDevOps have been released. These are minor releases containing improvements and bug fixes.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • christianbumann
  • janniksam
  • pascalberger
  • jokay
","boost":0.5},{"location":"news/2020/09/19/cake-issues-v091-released/#easier-file-linking-for-manually-created-issues","title":"Easier file linking for manually created issues","text":"

With 0.8.0 file links was implemented in Cake.Issues.Reporting.Generic and worked for any issues passed to the report. With 0.9.0 file link infrastructure was moved to Cake.Issues. File link settings can now be set while reading issues, and are passed through the IIssue.FileLink property to reports and pull request systems.

While this solution works for issues read by an issue provider, where file link settings can be passed to the ReadIssues alias, it become much more complicated for issues created using the NewIssue alias, where an URL can be set, which needs to be resolved manually before.

Cake.Issues 0.9.1 adds an WithFileLinkSettings method to IIssueBuilder where a file link setting object can be passed which does resolve the URL.

","boost":0.5},{"location":"news/2020/09/19/cake-issues-v091-released/#line-range-and-column-support-in-azure-devops-pull-request-integration","title":"Line range and column support in Azure DevOps pull request integration","text":"

Cake Issues 0.9.0 added support for line ranges and column information. With 0.9.0 the Azure DevOps pull request integration didn't use this information while posting comments to pull requests. Cake.Issues.PullRequests.AzureDevOps 0.9.1 fixes this and will post comments for line and column ranges if they are available on an issue.

","boost":0.5},{"location":"news/2020/09/19/cake-issues-v091-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues and Cake.Issues.PullRequests.AzureDevOps 0.9.1 are compatible with version 0.9.0 without any breaking changes. To update to the new version bump the version of the specific addins.

","boost":0.5},{"location":"news/2020/09/24/cake-issues-recipe-v042-released-bringing-support-for-github-actions/","title":"Cake Issues Recipe v0.4.2 released, bringing support for GitHub Actions","text":"

Version 0.4.2 of Cake Issues Recipe has been released bringing support for GitHub Actions.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • admiringworm
  • pascalberger
","boost":0.5},{"location":"news/2020/09/24/cake-issues-recipe-v042-released-bringing-support-for-github-actions/#support-for-github-actions","title":"Support for GitHub Actions","text":"

This version of Cake.Issues.Recipe brings support for running under GitHub Actions. Currently supported feature is writing of issues to build server which will show up in the build log grouped by issue provider / run:

Additionally the issues show up as annotations:

Having issues available as annotations also means that they will be shown in pull requests on the related file / position:

It's planned to support remaining features like providing full issue report as artifact in a future release.

Info

Support for GitHub Actions integration is currently only available in Cake.Issues.Recipe, but not as a standalone addin. It's planned to additionally provide a standalone addin which can be used outside of Cake.Issues.Recipe in the future.

","boost":0.5},{"location":"news/2020/09/24/cake-issues-recipe-v042-released-bringing-support-for-github-actions/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues.Recipe 0.4.2 is compatible with version 0.4.x without any breaking changes. To update to the new version bump the version in your build script.

","boost":0.5},{"location":"news/2020/09/27/new-github-actions-addin/","title":"New GitHub Actions addin","text":"

A new Cake.Issues.PullRequest.GitHubActions addin has been released which brings integration with GitHub Actions and GitHub pull requests.

Cake.Issues.PullRequest.GitHubActions addin creates annotations from issues when running on GitHub Actions:

These annotations will also be shown in pull requests on the related file / position, bringing first class integration for GitHub pull requests to Cake.Issues:

This integration was first released in Cake.Issues.Recipe 0.4.2 and has now been moved to its own addin, which can also be used outside of Cake.Issues.Recipe.

","boost":0.5},{"location":"news/2020/10/09/cake-issues-pullrequests-v091-released/","title":"Cake Issues PullRequests v0.9.1 Released","text":"

Version 0.9.1 of Cake.Issues.PullRequests has been released. This is a minor releases containing bug fixes.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • janniksam
  • pascalberger
  • phlorian
","boost":0.5},{"location":"news/2020/10/09/cake-issues-pullrequests-v091-released/#dont-post-issues-if-a-provider-limit-is-set-to-0","title":"Don't post issues if a provider limit is set to 0","text":"

This version fixes a bug where if MaxIssuesToPost or MaxIssuesToPostAcrossRuns was set to 0 all issues were posted to the pull request instead of none.

","boost":0.5},{"location":"news/2020/10/09/cake-issues-pullrequests-v091-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues.PullRequests 0.9.1 is compatible with version 0.9.0 without any breaking changes. To update to the new version bump the version of the addin.

","boost":0.5},{"location":"news/2020/10/20/cake-issues-msbuild-v091-released/","title":"Cake Issues MsBuild v0.9.1 Released","text":"

Version 0.9.1 of MsBuild support for Cake.Issues has been released. This is a minor release containing improvements.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • cho-trackman
  • eoehen
  • pascalberger
  • jokay
","boost":0.5},{"location":"news/2020/10/20/cake-issues-msbuild-v091-released/#support-for-reading-of-errors","title":"Support for reading of errors","text":"

Until now MsBuild support did read warnings from MsBuild log files. Starting with version 0.9.1 it will also return errors. Reading of errors has been implemented for MsBuildBinaryLogFileFormat and MsBuildXmlFileLoggerFormat. For errors IIssue.Priority will be set to IssuePriority.Error.

Info

To keep previous behavior result after reading the issues can be filtered for IIssue.Priority == IIssuePriority.Warning.

","boost":0.5},{"location":"news/2020/10/20/cake-issues-msbuild-v091-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues.MsBuild 0.9.1 is compatible with version 0.9.0 without any breaking changes. To update to the new version bump the version of the addin.

","boost":0.5},{"location":"news/2020/12/01/cake-issues-recipe-v044-released-bringing-support-for-eslint/","title":"Cake Issues Recipe v0.4.4 released, bringing support for ESLint","text":"

Version 0.4.4 of Cake Issues Recipe has been released bringing support for ESLint.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions. For details see full release notes.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • pascalberger
","boost":0.5},{"location":"news/2020/12/01/cake-issues-recipe-v044-released-bringing-support-for-eslint/#support-for-eslint","title":"Support for ESLint","text":"

This version of Cake.Issues.Recipe brings support for issues reported by ESLint. Currently supported are files generated using the ESLint json formatter

","boost":0.5},{"location":"news/2020/12/01/cake-issues-recipe-v044-released-bringing-support-for-eslint/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues.Recipe 0.4.4 is compatible with version 0.4.x without any breaking changes. To update to the new version bump the version in your build script.

","boost":0.5},{"location":"news/2021/07/27/new-addin-for-terraform-support/","title":"New addin for Terraform support","text":"

A new Cake.Issues.Terraform addin has been released which adds support for reading issues from Terraform validate command.

Cake.Issues.Terraform addin brings support for Terraform to the Cake.Issues ecosystem. It allows to read the output of the Terraform validate command. Together with other Cake.Issues addins it is possible to create powerful infrastructure as code pipelines which ensure quality standards by validating Terraform files before merging or deploying the changes. When using a pull requests workflow it is also possible to have the issues reported by Terraform validate automatically reported as comments to pull request.

","boost":0.5},{"location":"news/2021/07/28/cake-issues-v100-released/","title":"Cake Issues v1.0.0 Released","text":"

More than 4 years after the first commit for Cake.Prca, the predecessor of Cake Issues, we're happy to announce that Cake Issues version 1.0.0 has been released. This is a major release bringing a lot of new features across all addins.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • eoehen
  • janniksam
  • pascalberger
  • phlorian
  • jokay
","boost":0.5},{"location":"news/2021/07/28/cake-issues-v100-released/#support-for-cake-10","title":"Support for Cake 1.0","text":"

All addins have been updated to support Cake 1.x.

","boost":0.5},{"location":"news/2021/07/28/cake-issues-v100-released/#support-for-cake-frosting","title":"Support for Cake Frosting","text":"

All addins can be used with Cake Frosting.

Cake Issues addins have always been self-contained, shipping with all required dependencies, to provide the best user experience. While this approach makes sense for Cake script runners, it makes things more complex than required when running under Cake Frosting. This is especially true for the Cake.Issues.Reporting.Generic addin, which uses Razor engine to generate the reports.

It was therefore decided to release separate versions of the Cake.Issues.Reporting.Generic addin for the different script runners:

  • Cake.Issues.Reporting.Generic: The addin packaged in a self-contained NuGet package for use with Cake script runners
  • Cake.Frosting.Issues.Reporting.Generic: The addin packaged in a NuGet package containing dependencies for use with Cake Frosting

Cake.Frosting.Issues.Reporting.Generic has the additional benefit for the user that it gives the user full control of what exact version of dependencies should be used. In the future more Cake Issues addins might be released in Frosting specific packages.

","boost":0.5},{"location":"news/2021/07/28/cake-issues-v100-released/#support-for-arbitrary-values-in-an-issue","title":"Support for arbitrary values in an issue","text":"

Specific issue providers might have additional information for which no equivalent does exist on IIssue. These kind of information can now be stored in the IIssue.AdditionalInformation property.

","boost":0.5},{"location":"news/2021/07/28/cake-issues-v100-released/#new-provider-type-property","title":"New provider type property","text":"

While there are aliases to get provider type name (e.g. MsBuildIssuesProviderTypeName), this information was in previous versions not available through the IIssueProvider interface. There is a new IIssueProvider.ProviderType property which can be used to retrieve the provider type.

","boost":0.5},{"location":"news/2021/07/28/cake-issues-v100-released/#pdf-export","title":"PDF export","text":"

A new PDF export has been added to the HtmlDxDataGrid template of the Cake.Issues.Reporting.Generic addin.

","boost":0.5},{"location":"news/2021/07/28/cake-issues-v100-released/#simplified-release-process","title":"Simplified release process","text":"

Starting with Cake Issues 1.0.0 the three core addins Cake.Issues, Cake.Issues.PullRequests and Cake.Issues.Reporting will be always released together. For that source code for the addin has been merged in the Cake.Issues repository. Please open any issues related to any of the core addins in the Cake.Issues issue tracker.

","boost":0.5},{"location":"news/2021/07/28/cake-issues-v100-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 1.0.0 is a breaking release, which means that it probably requires changes to your build script. This section documents the most common changes which might be required:

  • Cake.Issues
  • Serialization format has been updated to version 4. Older version are still supported for deserialization.
  • IIssueProvider was extended with an additional ProviderType property. For issue providers inheriting from BaseIssueProvider no action is required to keep the same behavior as with previous versions, with the type name used as provider type.

Info

Cake.Recipe has not been updated to 1.0 yet.

For details see release notes of the individual addins:

  • Cake.Issues 1.0.0
  • Cake.Issues.MsBuild 1.0.0
  • Cake.Issues.InspectCode 1.0.0
  • Cake.Issues.DupFinder 1.0.0
  • Cake.Issues.GitRepository 1.0.0
  • Cake.Issues.Markdownlint 1.0.0
  • Cake.Issues.EsLint 1.0.0
  • Cake.Issues.DocFx 1.0.0
  • Cake.Issues.Terraform 1.0.0
  • Cake.Issues.PullRequests 1.0.0
  • Cake.Issues.PullRequests.AzureDevOps 1.0.0
  • Cake.Issues.PullRequests.AppVeyor 1.0.0
  • Cake.Issues.Reporting 1.0.0
  • Cake.Issues.Reporting.Generic 1.0.0
  • Cake.Issues.Reporting.Sarif 1.0.0
","boost":0.5},{"location":"news/2021/07/30/cake-issues-eslint-v101-released/","title":"Cake Issues ESLint v1.0.1 Released","text":"

Version 1.0.1 of ESLint support for Cake.Issues has been released. This is a minor release containing bug fixes.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • eoehen
  • pascalberger
  • Speeedy01
","boost":0.5},{"location":"news/2021/07/30/cake-issues-eslint-v101-released/#bug-fix-for-issues-with-line-column-or-rule","title":"Bug fix for issues with line, column or rule","text":"

When an issue reported by ESLint didn't contain line or column information, or rule was set to null an exception ocurred while parsing the file. This release fixes this and can now also correctly parse issues without position or rule information.

","boost":0.5},{"location":"news/2021/07/30/cake-issues-eslint-v101-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues.EsLint 1.0.1 is compatible with version 1.0.0 without any breaking changes. To update to the new version bump the version of the addin.

","boost":0.5},{"location":"news/2021/08/04/cake-issues-recipe-v100-released-bringing-support-for-cake-frosting/","title":"Cake Issues Recipe v1.0.0 Released, bringing support for Cake Frosting","text":"

Hard on the heels of the announcement for release 1.0 of Cake.Issues addins, we're happy to announce release 1.0 of the recipe script for Cake.Issues.

This is a major release bringing support for Cake Frosting and other new features.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • pascalberger
","boost":0.5},{"location":"news/2021/08/04/cake-issues-recipe-v100-released-bringing-support-for-cake-frosting/#support-for-cake-10","title":"Support for Cake 1.0","text":"

Cake Issues recipe has been updated to use latest 1.x versions of the Cake.Issues addins which support Cake 1.x.

See announcement for release 1.0 of Cake.Issues addins for features added in the individual addins.

","boost":0.5},{"location":"news/2021/08/04/cake-issues-recipe-v100-released-bringing-support-for-cake-frosting/#support-for-cake-frosting","title":"Support for Cake Frosting","text":"

Additionally to the existing Cake.Issues.Recipe package, which works fine for Cake script runners, there's a new Cake.Frosting.Issues.Recipe package suitable for builds using Cake Frosting.

See Using Cake.Frosting.Issues.Recipe for an example.

","boost":0.5},{"location":"news/2021/08/04/cake-issues-recipe-v100-released-bringing-support-for-cake-frosting/#support-for-environments-not-compatible-with-cakegit-addin","title":"Support for environments not compatible with Cake.Git addin","text":"

In previous versions Cake.Issues recipes had used Cake.Git addin to determine state of the Git repository. While this works in most cases, there are some environments where Cake.Git addin currently does not work.

Starting with this version it is now possible to define if Cake.Git addin or Git CLI should be used.

See Git repository information configuration for details.

","boost":0.5},{"location":"news/2021/08/04/cake-issues-recipe-v100-released-bringing-support-for-cake-frosting/#define-settings-for-issue-providers","title":"Define settings for issue providers","text":"

Previous versions of Cake.Issues recipes used default settings for reading issues from the passed log files. This made it impossible to parse log files which for example are created by tools running in containers, as they have a root path different to the repository root.

This version introduced methods to pass log files to the recipe scripts, which additionally to the log file path accept a settings object.

The new implementation also supports other use-cases like reading multiple files with the same issues provider, but different settings (e.g. run information).

","boost":0.5},{"location":"news/2021/08/04/cake-issues-recipe-v100-released-bringing-support-for-cake-frosting/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues Recipes 1.0.0 is a breaking release, which means that it probably requires changes to your build script. This section documents the most common changes which might be required:

  • Properties for passing input files to the recipe scripts have been replaced by methods. As an example, in previous versions MsBuild XML log files could be passed by setting the IssuesParameters.InputFiles.MsBuildXmlFileLoggerLogFilePath property:
IssuesParameters.InputFiles.MsBuildXmlFileLoggerLogFilePath = @\"c:\\build\\msbuild.log\";\n

With 1.0 the IssuesParameters.InputFiles.AddMsBuildXmlFileLoggerLogFile() method needs to be called instead:

IssuesParameters.InputFiles.AddMsBuildXmlFileLoggerLogFile(@\"c:\\build\\msbuild.log\");\n

For details see full release notes

","boost":0.5},{"location":"news/2021/08/11/cake-issues-recipes-v110-released/","title":"Cake Issues Recipes v1.1.0 released","text":"

Version 1.1.0 of Cake Issues recipes have been released adding support to customize report generation.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • pascalberger
","boost":0.5},{"location":"news/2021/08/11/cake-issues-recipes-v110-released/#report-customization","title":"Report customization","text":"

This version of Cake Issues recipes adds a new FullIssuesReportSettings configuration parameter which allows to customize the generated issue report. See Report creation parameters for details.

The following example enables exporting of the report when using Cake.Issues.Recipe:

IssuesParameters.Reporting.FullIssuesReportSettings\n    .WithOption(HtmlDxDataGridOption.EnableExporting, true)\n

The following example enables exporting of the report when using Cake.Frosting.Issues.Recipe:

context.Parameters.Reporting.FullIssuesReportSettings\n    .WithOption(HtmlDxDataGridOption.EnableExporting, true)\n
","boost":0.5},{"location":"news/2021/08/11/cake-issues-recipes-v110-released/#updated-addins","title":"Updated addins","text":"

Cake.Git has been updated to version 1.1.0 which comes with an updated version of LibGit2Sharp which adds support for Ubuntu 20.

See Cake.Git 1.1.0 release notes for details.

","boost":0.5},{"location":"news/2021/08/11/cake-issues-recipes-v110-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake Issues recipes 1.1.0 are compatible with version 1.x without any breaking changes. To update to the new version bump the version in your build.

","boost":0.5},{"location":"news/2021/08/19/cake-issues-recipes-v120-released/","title":"Cake Issues Recipes v1.2.0 released","text":"

Version 1.2.0 of Cake Issues recipes have been released adding support to customize issue reporting to pull requests.

This post shows the highlights included in this release. For details see full release notes. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • pascalberger
","boost":0.5},{"location":"news/2021/08/19/cake-issues-recipes-v120-released/#customization-of-pull-request-integration","title":"Customization of pull request integration","text":"

This version of Cake Issues recipes adds several new configuration parameter which allows to customize how issues are reported to pull requests. See Pull request integration parameters for details.

The following example limits the number of issues posted to pull requests to 20 when using Cake.Issues.Recipe:

IssuesParameters.PullRequestSystem.MaxIssuesToPost = 20;\n

The following example limits the number of issues posted to pull requests to 20 when using Cake.Frosting.Issues.Recipe:

context.Parameters.PullRequestSystem.MaxIssuesToPost = 20;\n
","boost":0.5},{"location":"news/2021/08/19/cake-issues-recipes-v120-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake Issues recipes 1.2.0 are compatible with version 1.x without any breaking changes. To update to the new version bump the version in your build.

","boost":0.5},{"location":"news/2021/08/29/new-addin-for-printing-issues-to-console/","title":"New addin for printing issues to console","text":"

A new Cake.Issues.Reporting.Console addin has been released which allows to output issues to the console.

Cake.Issues.Reporting.Console addin can be used to print issues to the console and is built on top of the excellent Errata library by Patrik Svensson.

Its main focus is to annotate source code with issues:

It currently only supports issues containing line and column information. Output can be grouped by rule, like in the image above, or individual entries for every issue.

Beside printing issues it can also show summary tables.

There's one summary which shows the number of issues for everyprovider and run:

Another summary shows the number of issues by priority for every provider and run:

","boost":0.5},{"location":"news/2021/08/31/cake-issues-markdownlint-v110-released/","title":"Cake Issues Markdownlint v1.1.0 Released","text":"

Version 1.1.0 of Markdownlint support for Cake.Issues has been released. This is a minor release adding features and improvements.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • pascalberger
","boost":0.5},{"location":"news/2021/08/31/cake-issues-markdownlint-v110-released/#support-for-markdownlint-cli-json-format","title":"Support for markdownlint-cli JSON format","text":"

Since version 0.28.0 markdownlint-cli supports a --json option to output result in JSON format. This version adds support for this format through the MarkdownlintCliJsonLogFileFormat alias.

","boost":0.5},{"location":"news/2021/08/31/cake-issues-markdownlint-v110-released/#provide-column-information","title":"Provide column information","text":"

This release of Cake.Issues.Markdownlint enhances the MarkdownlintCliLogFileFormat to provide column information if reported by markdownlint.

","boost":0.5},{"location":"news/2021/08/31/cake-issues-markdownlint-v110-released/#recipe-packages","title":"Recipe packages","text":"

Cake Issues recipes have been released in version 1.3.0 shipping with Cake.Issues.Markdownlint 1.1.0 and adding support for markdownlint-cli JSON files.

","boost":0.5},{"location":"news/2021/08/31/cake-issues-markdownlint-v110-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues.Markdownlint 1.1.0 is compatible with version 1.0.0 without any breaking changes. To update to the new version bump the version of the addin.

","boost":0.5},{"location":"news/2021/09/05/cake-issues-reporting-console-v030-released-adding-support-for-all-cake-runners/","title":"Cake Issues Reporting Console v0.3.0 released, adding support for all Cake runners","text":"

Version 0.3.0 of Cake.Issues.Reporting.Console has been released. This is a minor release adding features and improvements.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • pascalberger
  • patriksvensson
","boost":0.5},{"location":"news/2021/09/05/cake-issues-reporting-console-v030-released-adding-support-for-all-cake-runners/#support-for-all-cake-runners","title":"Support for all Cake runners","text":"

Starting with this release Cake.Issues.Reporting.Console will target .NET Standard 2.0 instead of .NET 5.0 and therefore will support all Cake runners.

","boost":0.5},{"location":"news/2021/09/05/cake-issues-reporting-console-v030-released-adding-support-for-all-cake-runners/#improved-reporting","title":"Improved reporting","text":"

Provider report is now rendered in different colors for the individual bars, making it easier to read:

","boost":0.5},{"location":"news/2021/09/05/cake-issues-reporting-console-v030-released-adding-support-for-all-cake-runners/#errata-060","title":"Errata 0.6.0","text":"

Underlying Errata library has been updated to 0.6.0, containing additional bug fixes and rendering improvements.

","boost":0.5},{"location":"news/2021/09/05/cake-issues-reporting-console-v030-released-adding-support-for-all-cake-runners/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues.Reporting.Console 0.3.0 is compatible with previous versions without any breaking changes. To update to the new version bump the version of the addin.

","boost":0.5},{"location":"news/2022/12/10/cake-issues-v200-released/","title":"Cake Issues v2.0.0 Released","text":"

After several months with beta releases Cake Issues version 2.0.0 has been released. This is a major release, containing breaking changes beside bringing new features and bug fixes across all addins.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • eoehen
  • KirillOsenkov
  • pascalberger
  • twenzel
  • yansklyarenko
","boost":0.5},{"location":"news/2022/12/10/cake-issues-v200-released/#support-for-cake-20","title":"Support for Cake 2.0","text":"

All addins have been updated to support Cake 2.x.

Target framework have been updated to .NET Core 3.1, .NET 5 and .NET 6 to be in line with Cake. See Sunsetting of .NET Framework and .NET Core runners in Cake 2.0 for details.

","boost":0.5},{"location":"news/2022/12/10/cake-issues-v200-released/#support-for-msbuild-binary-logs-version-9","title":"Support for MsBuild binary logs version 9","text":"

Support for binary logs in version 9 has been added to Cake.Issues.MsBuild.

","boost":0.5},{"location":"news/2022/12/10/cake-issues-v200-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 2.0.0 is a breaking release, which means that it probably requires changes to your build script. This section documents the most common changes which might be required:

  • Cake.Issues
  • Serialization format has been updated to version 5. Older version are still supported for deserialization.
  • ProviderIssueIssueLimits has been renamed to ProviderIssueLimits
  • IIssue.Rule has been renamed to IIssue.RuleId
  • IIssue was extended with an additional RuleName property.
  • Cake.Issues.MsBuild
  • MsBuild 15 or newer required for binary logs

For details see release notes of the individual addins:

  • Cake.Issues 2.0.0
  • Cake.Issues.DocFx 2.0.0
  • Cake.Issues.DupFinder 2.0.0
  • Cake.Issues.EsLint 2.0.0
  • Cake.Issues.GitRepository 2.0.0
  • Cake.Issues.InspectCode 2.0.0
  • Cake.Issues.Markdownlint 2.0.0
  • Cake.Issues.MsBuild 2.0.0
  • Cake.Issues.Terraform 2.0.0
  • Cake.Issues.Reporting.Console 2.0.0
  • Cake.Issues.Reporting.Generic 2.0.0
  • Cake.Issues.Reporting.Sarif 2.0.0
  • Cake.Issues.PullRequests.AppVeyor 2.0.0
  • Cake.Issues.PullRequests.AzureDevOps 2.0.0
  • Cake.Issues.PullRequests.GitHubActions 2.0.0
","boost":0.5},{"location":"news/2023/07/22/cake-issues-v300-released/","title":"Cake Issues v3.0.0 Released","text":"

Cake Issues version 3.0.0 has been released. This is a major release, containing breaking changes beside bringing new features and bug fixes across all addins.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • DiDoHH
  • eoehen
  • pascalberger
","boost":0.5},{"location":"news/2023/07/22/cake-issues-v300-released/#support-for-cake-30","title":"Support for Cake 3.0","text":"

All addins have been updated to support Cake 3.x.

Target framework have been updated to .NET 6 and .NET 7 to be in line with Cake.

","boost":0.5},{"location":"news/2023/07/22/cake-issues-v300-released/#support-for-msbuild-binary-logs-version-16","title":"Support for MsBuild binary logs version 16","text":"

Support for binary logs in version 16 has been added to Cake.Issues.MsBuild.

","boost":0.5},{"location":"news/2023/07/22/cake-issues-v300-released/#out-of-the-box-support-for-more-rule-links","title":"Out of the box support for more rule links","text":"

Cake.Issues.MsBuild now will automatically provide links for Roslynator and SonarLint rules. Links for CA rules have updated to link to learn.microsoft.com.

","boost":0.5},{"location":"news/2023/07/22/cake-issues-v300-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 3.0.0 is a breaking release, which means that it probably requires changes to your build script. This section documents the most common changes which might be required:

  • Cake.Issues
  • StringPathExtensions.IsValideRepositoryFilePath has been renamed to StringPathExtensions.IsValidRepositoryFilePath
  • BaseRuleDescription.Rule has been made immutable after initialization
  • Cake.Issues.Recipe
  • Since Dupfinder has been sunsetted end of 2021, out of the box support for it has been removed from Cake Issues Recipe and DupFinderLogFilePaths is no longer available. To keep using DupFinder you need to manually add Cake.Issues.DupFinder and add issues using the AddIssues method.

For details see release notes of the individual addins:

  • Cake.Issues.Recipe 3.0.0
  • Cake.Issues 3.0.0
  • Cake.Issues.DocFx 3.0.0
  • Cake.Issues.DupFinder 3.0.0
  • Cake.Issues.EsLint 3.0.0
  • Cake.Issues.GitRepository 3.0.0
  • Cake.Issues.InspectCode 3.0.0
  • Cake.Issues.Markdownlint 3.0.0
  • Cake.Issues.MsBuild 3.0.0
  • Cake.Issues.Terraform 3.0.0
  • Cake.Issues.Reporting.Console 3.0.0
  • Cake.Issues.Reporting.Generic 3.0.0
  • Cake.Issues.Reporting.Sarif 3.0.0
  • Cake.Issues.PullRequests.AppVeyor 3.0.0
  • Cake.Issues.PullRequests.AzureDevOps 3.0.0
  • Cake.Issues.PullRequests.GitHubActions 3.0.0
","boost":0.5},{"location":"news/2023/08/16/cake-issues-recipes-v310-released/","title":"Cake Issues Recipes v3.1.0 released","text":"

Version 3.1.0 of Cake Issues recipes have been released adding support for creating of reports in SARIF format.

This post shows the highlights included in this release. For details see full release notes. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • pascalberger
","boost":0.5},{"location":"news/2023/08/16/cake-issues-recipes-v310-released/#reports-in-sarif-format","title":"Reports in SARIF format","text":"

This version of Cake Issues recipes adds a new configuration parameter which allows to create reports in SARIF format allowing further processing in a lot of different tools also supporting the SARIF standard. See Report parameters for details.

If running on Azure Pipelines the generated SARIF file is uploaded so that it will be shown in the SARIF SAST Scans Tab extension.

","boost":0.5},{"location":"news/2023/08/16/cake-issues-recipes-v310-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake Issues recipes 3.1.0 are compatible with version 3.x without any breaking changes. To update to the new version bump the version in your build.

","boost":0.5},{"location":"news/2023/12/23/cake-issues-v400-released/","title":"Cake Issues v4.0.0 Released","text":"

Cake Issues version 4.0.0 has been released. This is a major release, containing breaking changes beside bringing new features and bug fixes across all addins.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • pascalberger
","boost":0.5},{"location":"news/2023/12/23/cake-issues-v400-released/#support-for-cake-40","title":"Support for Cake 4.0","text":"

All addins have been updated to support Cake 4.x.

Target framework have been updated to .NET 6, .NET 7 and .NET 8 to be in line with Cake.

","boost":0.5},{"location":"news/2023/12/23/cake-issues-v400-released/#switch-to-systemtextjson-for-serialization","title":"Switch to System.Text.Json for serialization","text":"

For serialization / deserialization of issues LitJson was used internally. With Cake.Issues 4.0 internal code has been changed to use System.Text.Json classes.

The change should not have any impact for users.

","boost":0.5},{"location":"news/2023/12/23/cake-issues-v400-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

While Cake.Issues 4.0.0 is a breaking release, there are no breaking changes beside the update to Cake 4.x and the changes to target framework version.

For details see release notes

","boost":0.5},{"location":"news/2024/01/14/alignment-of-addin-lifecycles/","title":"Alignment of addin lifecycles","text":"

Cake Issues has a modular architecture consisting of multiple addins. Historically every addin had its own independent release lifecycle. Starting with the next release work will begin to have all addins share the same release lifecycle.

When Cake Issues started all three core addins (Cake.Issues, Cake.Issues.Reporting and Cake.Issues.PullRequsts) and every issue provider, report format and pull request system addin were released on their own schedule, allowing fast iterations of individual components. With the release of Cake Issues 1.0 the release lifecycle of the three core addins have been aligned, resulting in a simplified release process.

Starting with the next release we'll begin to move also the remaining issue provider, report format and pull request system addins into the main Cake Issues repository and have them released together with the core addins.

","boost":0.5},{"location":"news/2024/02/21/cake-issues-v410-released/","title":"Cake Issues v4.1.0 Released","text":"

Cake Issues version 4.1.0 has been released with improvements for Cake Frosting and support for latest MsBuild binary log format.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • christianbumann
  • pascalberger
","boost":0.5},{"location":"news/2024/02/21/cake-issues-v410-released/#improvement-for-cake-frosting","title":"Improvement for Cake Frosting","text":"

Cake.Frosting.Issues.Reporting and Cake.Frosting.Issues.PullRequests have been released as optimized version of the Cake.Issues.Reporting and Cake.Issues.PullRequests for Cake Frosting.

These addins come with a dependency to the core Cake.Issues addin, allowing it to be consumed as transitive dependency.

","boost":0.5},{"location":"news/2024/02/21/cake-issues-v410-released/#support-for-msbuild-binary-logs-version-18","title":"Support for MsBuild binary logs version 18","text":"

Support for binary logs in version 18 has been added to Cake.Issues.MsBuild.

","boost":0.5},{"location":"news/2024/02/21/cake-issues-v410-released/#alignment-of-release-lifecycle","title":"Alignment of release lifecycle","text":"

As announced in Alignment of addin lifecycles work as started to move addins into the main Cake Issues repository.

Starting with this release the following addins will be released together with the core addins:

  • Cake.Issues.DocFx
  • Cake.Issues.EsLint
  • Cake.Issues.MsBuild
  • Cake.Issues.InspectCode
  • Cake.Issues.Markdownlint
","boost":0.5},{"location":"news/2024/02/21/cake-issues-v410-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.1.0 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/04/14/cake-issues-v420-released/","title":"Cake Issues v4.2.0 Released","text":"

Cake Issues version 4.2.0 has been released introducing a new issue provider for SARIF compatible files.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • eoehen
  • pascalberger
","boost":0.5},{"location":"news/2024/04/14/cake-issues-v420-released/#new-issue-provider-for-sarif-files","title":"New issue provider for SARIF files","text":"

A new Cake.Issues.Sarif addin has been released which adds support for reading issues in SARIF format.

See New addin for reading SARIF files for details.

","boost":0.5},{"location":"news/2024/04/14/cake-issues-v420-released/#improvement-for-cake-frosting","title":"Improvement for Cake Frosting","text":"

Optimized versions for Cake Frosting have been released for the following addins:

  • Cake.Frosting.Issues.DocFx
  • Cake.Frosting.Issues.EsLint
  • Cake.Frosting.Issues.GitRepository
  • Cake.Frosting.Issues.InspectCode
  • Cake.Frosting.Issues.Markdownlint
  • Cake.Frosting.Issues.Terraform
  • Cake.Frosting.Issues.PullRequests.AppVeyor
  • Cake.Frosting.Issues.PullRequests.AzureDevOps
  • Cake.Frosting.Issues.PullRequests.GitHubActions

These addins come with a dependency to the core addins, allowing the core addins to be consumed as transitive dependencies.

","boost":0.5},{"location":"news/2024/04/14/cake-issues-v420-released/#alignment-of-release-lifecycle","title":"Alignment of release lifecycle","text":"

As announced in Alignment of addin lifecycles work as started to move addins into the main Cake Issues repository.

Starting with this release the following addins will be released together with the core addins:

  • Cake.Issues.GitRepository
  • Cake.Issues.Terraform
  • Cake.Issues.PullRequests.AppVeyor
  • Cake.Issues.PullRequests.AzureDevOps
  • Cake.Issues.PullRequsts.GitHubActions
  • Cake.Issues.Reporting.Console
  • Cake.Issues.Reporting.Generic
  • Cake.Issues.Reporting.Sarif
","boost":0.5},{"location":"news/2024/04/14/cake-issues-v420-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.2.0 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/04/14/new-addin-for-reading-sarif-files/","title":"New addin for reading SARIF files","text":"

A new Cake.Issues.Sarif addin has been released which adds support for reading issues in SARIF format.

SARIF is an industry standard format for the output of static analysis tools. With the introduction of SARIF support through the Cake.Issues.Sarif addin any tool which can output results in SARIF format can now be used together with Cake Issues.

See Supported Tools for an updated list of supported tools.

The addins is available in a version for Cake .NET Tool (Cake.Issues.Sarif) and Cake Frosting (Cake.Frosting.Issues.Sarif).

","boost":0.5},{"location":"news/2024/04/16/cake-issues-v421-released/","title":"Cake Issues v4.2.1 Released","text":"

Cake Issues version 4.2.1 has been released with compatibility fixes.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • pascalberger
","boost":0.5},{"location":"news/2024/04/16/cake-issues-v421-released/#compatibility-improvements","title":"Compatibility improvements","text":"

As a side-effect of moving all addins to the central Cake Issues repository, AssemblyVersion of every has been set to the release version.

Addins are backwards compatible though to latest major version, which was no longer possible with this change.

This release fixes this by setting the AssemblyVersion to the major version (currently 4.0.0).

","boost":0.5},{"location":"news/2024/04/16/cake-issues-v421-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.2.1 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/04/20/cake-issues-v430-released/","title":"Cake Issues v4.3.0 Released","text":"

Cake Issues version 4.3.0 has been released with support for MsBuild binary log format version 20.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • pascalberger
","boost":0.5},{"location":"news/2024/04/20/cake-issues-v430-released/#support-for-msbuild-binary-logs-version-20","title":"Support for MsBuild binary logs version 20","text":"

Support for binary logs in version 20 has been added to Cake.Issues.MsBuild.

","boost":0.5},{"location":"news/2024/04/20/cake-issues-v430-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.3.0 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/04/25/cake-issues-v431-released/","title":"Cake Issues v4.3.1 Released","text":"

Cake Issues version 4.3.1 has been released bringing bug fixes.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • pascalberger
","boost":0.5},{"location":"news/2024/04/25/cake-issues-v431-released/#bugfix-for-issues-across-multiple-lines","title":"Bugfix for issues across multiple lines","text":"

This release fixes an exception if an issue provider reports an issue across multiple lines and the end column is before the start column.

","boost":0.5},{"location":"news/2024/04/25/cake-issues-v431-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.3.1 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/05/18/cake-issues-v440-released/","title":"Cake Issues v4.4.0 Released","text":"

Cake Issues version 4.4.0 has been released with improvements for Cake Frosting.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • eoehen
  • pascalberger
","boost":0.5},{"location":"news/2024/05/18/cake-issues-v440-released/#cake-frosting-improvements","title":"Cake Frosting improvements","text":"

Support for implicit usings has been added to the Cake Frosting addins.

If <ImplicitUsings>enable</ImplicitUsings> is set in a Cake Frosting build, namespaces for Cake Issues addins are implicitly added, resulting in a similar experience as when using Cake .NET Tool, where aliases can be used directly without the requirements to first add using statements.

","boost":0.5},{"location":"news/2024/05/18/cake-issues-v440-released/#filtering-improvements-in-html-devextreme-data-grid-template","title":"Filtering improvements in HTML DevExtreme Data Grid template","text":"

The HTML DevExtreme Data Grid template now supports search boxes in filter dropdowns.

See Header Filter Customization in DataGrid for details.

","boost":0.5},{"location":"news/2024/05/18/cake-issues-v440-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.4.0 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/05/23/cake-issues-v450-released/","title":"Cake Issues v4.5.0 Released","text":"

Cake Issues version 4.5.0 has been released adding support for build breaking.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • eoehen
  • pascalberger
  • Speeedy01
","boost":0.5},{"location":"news/2024/05/23/cake-issues-v450-released/#support-for-breaking-builds","title":"Support for breaking builds","text":"

New BreakBuildOnIssues aliases have been introduced to fail builds when issues are found.

See build breaking for an example.

","boost":0.5},{"location":"news/2024/05/23/cake-issues-v450-released/#possibility-to-define-license-for-html-devextreme-data-grid","title":"Possibility to define license for HTML DevExtreme Data Grid","text":"

Starting with version 23.2 DevExtreme no longer comes with a free community license. HTML DevExtreme Data Grid template will stay on version 23.1 for this reason.

If you have a DevExtreme license you can pass it to the new DevExtremeLicenseKey option and update to a newer version using the DevExtremeVersion option.

","boost":0.5},{"location":"news/2024/05/23/cake-issues-v450-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.5.0 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/05/24/cake-issues-v451-released/","title":"Cake Issues v4.5.1 Released","text":"

Cake Issues version 4.5.1 has been released containing bug fixes.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • eoehen
  • pascalberger
","boost":0.5},{"location":"news/2024/05/24/cake-issues-v451-released/#fixed-log-output","title":"Fixed log output","text":"

This release fixes verbose output of Cake.Issues.PullRequests for provider issue limits.

","boost":0.5},{"location":"news/2024/05/24/cake-issues-v451-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.5.1 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/06/24/cake-issues-v460-released/","title":"Cake Issues v4.6.0 Released","text":"

Cake Issues version 4.6.0 has been released with improvements for SARIF reports.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • christianbumann
  • eoehen
  • pascalberger
  • Speeedy01
","boost":0.5},{"location":"news/2024/06/24/cake-issues-v460-released/#improvements-for-sarif-reports","title":"Improvements for SARIF Reports","text":"

A new option SarifIssueReportFormatSettings.ExistingIssues has been introduced which allows to pass in a list of known issues not related to current code changes, resulting in the baselineState property being set in the resulting SARIF report.

This property is for example be used in the SARIF viewer extension for Azure Pipelines as filter option.

The following new settings options have been added:

SarifIssueReportFormatSettings property Output property Description Guid automationDetails.guid Unique, stable identifier for the run BaselineGuid run.baselineGuid String equal to Guid of a previous run CorrelationGuid automationDetails.correlationGuid Guid shared by all runs of the same type","boost":0.5},{"location":"news/2024/06/24/cake-issues-v460-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.6.0 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/07/16/cake-issues-v470-released/","title":"Cake Issues v4.7.0 Released","text":"

Cake Issues version 4.7.0 has been released with detailed line information for SARIF issue provider and support for MsBuild binary log format version 21.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • eoehen
  • pascalberger
","boost":0.5},{"location":"news/2024/07/16/cake-issues-v470-released/#support-for-msbuild-binary-logs-version-21","title":"Support for MsBuild binary logs version 21","text":"

Support for binary logs in version 21 has been added to Cake.Issues.MsBuild.

","boost":0.5},{"location":"news/2024/07/16/cake-issues-v470-released/#enhanced-line-and-column-information-from-sarif-reports","title":"Enhanced line and column information from SARIF reports","text":"

Cake.Issues.Sarif has been enhanced to also provide the following IIssue properties if available:

  • IIssue.EndLine
  • IIssue.Column
  • IIssue.EndColumn
","boost":0.5},{"location":"news/2024/07/16/cake-issues-v470-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.7.0 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/07/17/cake-issues-v471-released/","title":"Cake Issues v4.7.1 Released","text":"

Cake Issues version 4.7.1 has been released with bugfixes for SARIF reports

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • christianbumann
  • eoehen
  • pascalberger
","boost":0.5},{"location":"news/2024/07/17/cake-issues-v471-released/#bugfixes-for-sarif-reports","title":"Bugfixes for SARIF reports","text":"

This release fixes two bugs in Cake.Issues.Reporting.Sarif:

  • If two or more different rules containing a rule URL are reported by the same issue provider, the first occurrence of the second rule will have 0 as ruleIndex instead of 1
  • originalUriBaseIds should end with a slash as defined in SARIF Specification 2.1.0 \u00a73.14.14.
","boost":0.5},{"location":"news/2024/07/17/cake-issues-v471-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.7.1 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/07/18/cake-issues-v472-released/","title":"Cake Issues v4.7.2 Released","text":"

Cake Issues version 4.7.2 has been released containing bug fixes for generic reporting addin.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • pascalberger
","boost":0.5},{"location":"news/2024/07/18/cake-issues-v472-released/#fix-for-generic-reporting-addin","title":"Fix for generic reporting addin","text":"

This release fixes an bug in Cake.Issues.Reporting.Generic where it was not possible to overwrite version of JsPdf version used in HTML DevExtreme Data Grid template.

","boost":0.5},{"location":"news/2024/07/18/cake-issues-v472-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.7.2 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/07/19/cake-issues-v480-released/","title":"Cake Issues v4.8.0 Released","text":"

Cake Issues version 4.8.0 has been released with improvements for SARIF issue provider.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • pascalberger
","boost":0.5},{"location":"news/2024/07/19/cake-issues-v480-released/#improvements-for-sarif-issue-provider","title":"Improvements for SARIF issue provider","text":"

In previous releases the SARIF issue provider used the tool name defined in the SARIF file for a specific run as issue provider. This has the advantage that if multiple SARIF files from different sources are read, every issue has a different issue provider name, which reflects the original tool.

But it can also have side-effect, for example that different states are reported to pull request depending if run is successful or not (see cake-contrib/Cake.Issues.Recipe#477), because the actual issue provider name is only known once there are issues reported.

This release introduces a new option SarifIssuesSettings.UseToolNameAsIssueProviderName to define whether the tool name reported in the SARIF log or a fixed value should be used as issue provider name.

","boost":0.5},{"location":"news/2024/07/19/cake-issues-v480-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.8.0 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/07/25/cake-issues-v490-released/","title":"Cake Issues v4.9.0 Released","text":"

Cake Issues version 4.9.0 has been released with bugfixes for SARIF report format and Terraform issue provider.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • christianbumann
  • eoehen
  • pascalberger
","boost":0.5},{"location":"news/2024/07/25/cake-issues-v490-released/#bugfixes-for-sarif-report-format","title":"Bugfixes for SARIF report format","text":"

This release fixes an issue where entries in a SARIF report were marked as updated if branch or commit in file link has changed.

To achieve this, a new constructor for the generic IIssueComparer has been introduced, which allows to define which IIssue properties should be ignored for the comparison.

","boost":0.5},{"location":"news/2024/07/25/cake-issues-v490-released/#bugfixes-for-terraform-issue-provider","title":"Bugfixes for Terraform issue provider","text":"

A bug has been fixed where root directory was not correctly determined when running on Linux or macOS.

","boost":0.5},{"location":"news/2024/07/25/cake-issues-v490-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.9.0 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/07/30/cake-issues-v4100-released/","title":"Cake Issues v4.10.0 Released","text":"

Cake Issues version 4.10.0 has been released with support for MsBuild binary log format version 22.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • christianbumann
  • eoehen
  • pascalberger
","boost":0.5},{"location":"news/2024/07/30/cake-issues-v4100-released/#support-for-msbuild-binary-logs-version-22","title":"Support for MsBuild binary logs version 22","text":"

Support for binary logs in version 20 has been added to Cake.Issues.MsBuild.

","boost":0.5},{"location":"news/2024/07/30/cake-issues-v4100-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.10.0 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/08/20/cake-issues-v4101-released/","title":"Cake Issues v4.10.1 Released","text":"

Cake Issues version v4.10.1 has been released with bugfixes for Cake Frosting and file linking

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • christianbumann
  • eoehen
  • gep13
  • hotchkj
  • pascalberger
","boost":0.5},{"location":"news/2024/08/20/cake-issues-v4101-released/#bugfixes-for-cake-frosting","title":"Bugfixes for Cake Frosting","text":"

This release fixes dependencies of the following Cake Frosting optimized NuGet packages:

  • Cake.Frosting.Issues.PullRequests.AppVeyor
  • Cake.Frosting.Issues.PullRequests.AzureDevOps
  • Cake.Frosting.Issues.PullRequests.GitHubActions
  • Cake.Frosting.Issues.Reporting.Console
  • Cake.Frosting.Issues.Reporting.Generic
  • Cake.Frosting.Issues.Reporting.Sarif
","boost":0.5},{"location":"news/2024/08/20/cake-issues-v4101-released/#bugfixes-for-file-linking","title":"Bugfixes for file linking","text":"

This release fixes an issue that file links are created for issues which are not related to a file.

","boost":0.5},{"location":"news/2024/08/20/cake-issues-v4101-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues v4.10.1 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/10/06/cake-issues-v4110-released/","title":"Cake Issues v4.11.0 Released","text":"

Cake Issues version 4.11.0 has been released with support for MsBuild binary log format version 23.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • eoehen
  • pascalberger
","boost":0.5},{"location":"news/2024/10/06/cake-issues-v4110-released/#support-for-msbuild-binary-logs-version-23","title":"Support for MsBuild binary logs version 23","text":"

Support for binary logs in version 23 has been added to Cake.Issues.MsBuild.

","boost":0.5},{"location":"news/2024/10/06/cake-issues-v4110-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.11.0 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/11/05/cake-issues-v4120-released/","title":"Cake Issues v4.12.0 Released","text":"

Cake Issues version 4.12.0 has been released with support for MsBuild binary log format version 24.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • eoehen
  • pascalberger
","boost":0.5},{"location":"news/2024/11/05/cake-issues-v4120-released/#support-for-msbuild-binary-logs-version-24","title":"Support for MsBuild binary logs version 24","text":"

Support for binary logs in version 24 has been added to Cake.Issues.MsBuild.

","boost":0.5},{"location":"news/2024/11/05/cake-issues-v4120-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.12.0 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/12/02/cake-issues-v500-released/","title":"Cake Issues v5.0.0 Released","text":"

Cake Issues version 5.0.0 has been released. This is a major release, containing breaking changes beside bringing new features and bug fixes across all addins.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • eoehen
  • pascalberger
","boost":0.5},{"location":"news/2024/12/02/cake-issues-v500-released/#support-for-cake-50","title":"Support for Cake 5.0","text":"

All addins have been updated to support Cake 5.x.

Target framework have been updated to .NET 8 and .NET 9 to be in line with Cake.

","boost":0.5},{"location":"news/2024/12/02/cake-issues-v500-released/#improvements-for-cake-frosting","title":"Improvements for Cake Frosting","text":"

Cake.Frosting.Issues.PullRequests.AzureDevOps now references Cake.Frosting.AzureDevOps, a version of Cake.AzureDevOps, optimized for Cake Frosting.

Instead of shipping client assemblies to access Azure DevOps as part of Cake.AzureDevOps, Cake.Frosting.AzureDevOps references the corresponding NuGet packages, which for example allows to control version of the libraries used.

","boost":0.5},{"location":"news/2024/12/02/cake-issues-v500-released/#security-improvements","title":"Security improvements","text":"

Transitive dependencies which contain known security vulnerabilities have been updated to newer versions where the vulnerabilities are fixed.

","boost":0.5},{"location":"news/2024/12/02/cake-issues-v500-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 5.0.0 is a breaking release, which means that there is a small change that changes to your build script are required.

For details see release notes

","boost":0.5},{"location":"news/2024/12/17/cake-issues-v501-released/","title":"Cake Issues v5.0.1 Released","text":"

Cake Issues version 5.0.1 has been released containing bug fixes for Cake Frosting addins

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • christianbumann
  • eoehen
  • pascalberger
","boost":0.5},{"location":"news/2024/12/17/cake-issues-v501-released/#bugfixes-for-cake-frosting","title":"Bugfixes for Cake Frosting","text":"

This release fixes dependencies of the following Cake Frosting optimized NuGet packages:

  • Cake.Frosting.Issues.PullRequests.AppVeyor
","boost":0.5},{"location":"news/2024/12/17/cake-issues-v501-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.7.2 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/12/21/new-website/","title":"New website","text":"

Today a new version of the Cake Issues website has been published.

The Cake Issues website was introduced 2017 as a static website built using Wyam, like the Cake website. Using Wyam allowed to add full API documentation and other features like list of addins or overview of open issues across all addins.

Wyam is no longer maintained, with Statiq as its successor. Unfortunately also the deployment pipeline for the Cake Issues website stopped working in 2023, resulting in the website no longer receiving updates.

Since the introduction of the Cake Issues website seven years ago, the Cake website also has been improved, among other things, with a dedicated page for each addin listing the aliases the addin provides. These improvements made a full API documentation on Cake Issues website somehow redundant.

With .NET API documentation no longer being a requirement there are much more tooling options available. The choice was made to use Material for MkDocs, which comes with a lot of features for writing technical documentation.

One of the features of the new website is support for multiple versions using mike. https://cakeissues.net/latest/ will always point to the documentation of the latest released version. https://cakeissues.net/develop/ points to the documentation of the current development branch. Beside that there's now a version selector in the header to show documentation for any old version.

","boost":0.5},{"location":"news/2025/01/01/2024-in-review/","title":"2024 In Review","text":"

2024 had been an amazing year for Cake Issues. In this post we'll look back to what had been achieved in 2024.

","boost":0.5},{"location":"news/2025/01/01/2024-in-review/#alignment-of-addin-lifecycles","title":"Alignment of addin lifecycles","text":"

2024 started with an announcement to consolidate all Cake Issue addins into the main Cake.Issues GitHub repository, which has been finished by now.

Beside having all addins share a release lifecycle, having them in a single repository also simplified maintenance work and release process. This resulted in a total of 20 releases of Cake Issues in 2024, including one major release with 5.0.0, bringing constant improvements and bugfixes.

Core Cake.Issues addin has seen a steady, and stronger than 2023, rise of downloads during 2024, resulting in nearly 1 million downloads by the end of the year:

See NuGet Trends for details.

The individual addins had a different age, some up to 7 years old, written for .NET Framework. As part of the consolidation of all addins in a single mono-repository effort was made to unify and modernize the code base across all addins.

","boost":0.5},{"location":"news/2025/01/01/2024-in-review/#new-addins","title":"New addins","text":"

With the introduction of Cake.Issues.Sarif a lot of additional tools supporting the SARIF standard are now supported by Cake Issues as listed on Supported Tools.

","boost":0.5},{"location":"news/2025/01/01/2024-in-review/#improvements-for-cake-frosting","title":"Improvements for Cake Frosting","text":"

Several improvements were released during 2024 for running Cake Issues with Cake Frosting.

For all addins a NuGet package optimized for running with Cake Frosting is now available. These NuGet packages have dependencies to Cake, Cake Issues core addins or any other required dependency defined, which gives full control about the dependency, their version and update behavior to the user through the standard .NET project system.

These packages also support implicit usings improving discoverability of aliases for build authors. Implicit usings can be enabled by setting <ImplicitUsings>enable</ImplicitUsings> in the csproj file of a build.

","boost":0.5},{"location":"news/2025/01/01/2024-in-review/#updated-website","title":"Updated website","text":"

The end of 2024 saw also the relaunch of Cake Issues website, which has been updated to modern standards and tooling. Effort has also been put into content to improve discoverability of documentation for users. Examples and documentation have also been updated to latest Cake Issues and .NET version.

","boost":0.5},{"location":"news/2025/01/01/2024-in-review/#thanks","title":"Thanks","text":"

\u2764 Huge thanks to our community! All what had been achieved in 2024 would not have been possible without the support and contributions of the community! \u2764

People contributing to Cake Issues in 2024:

  • christianbumann
  • eoehen
  • gep13
  • hotchkj
  • pascalberger
  • Speeedy01
","boost":0.5},{"location":"news/archive/2025/","title":"2025","text":""},{"location":"news/archive/2024/","title":"2024","text":""},{"location":"news/archive/2023/","title":"2023","text":""},{"location":"news/archive/2022/","title":"2022","text":""},{"location":"news/archive/2021/","title":"2021","text":""},{"location":"news/archive/2020/","title":"2020","text":""},{"location":"news/category/announcements/","title":"Announcements","text":""},{"location":"news/category/release-notes/","title":"Release Notes","text":""},{"location":"news/category/new-addin/","title":"New Addin","text":""},{"location":"news/page/2/","title":"News","text":""},{"location":"news/page/3/","title":"News","text":""},{"location":"news/page/4/","title":"News","text":""},{"location":"news/page/5/","title":"News","text":""},{"location":"news/archive/2024/page/2/","title":"2024","text":""},{"location":"news/archive/2024/page/3/","title":"2024","text":""},{"location":"news/category/release-notes/page/2/","title":"Release Notes","text":""},{"location":"news/category/release-notes/page/3/","title":"Release Notes","text":""},{"location":"news/category/release-notes/page/4/","title":"Release Notes","text":""}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"api/","title":"API","text":""},{"location":"api/#core-addins","title":"Core Addins","text":"
  • Cake.Issues
  • Cake.Issues.Reporting
  • Cake.Issues.PullRequests
"},{"location":"api/#issue-provider","title":"Issue Provider","text":"
  • Cake.Issues.DocFx
  • Cake.Issues.EsLint
  • Cake.Issues.GitRepository
  • Cake.Issues.InspectCode
  • Cake.Issues.Markdownlint
  • Cake.Issues.MsBuild
  • Cake.Issues.Sarif
  • Cake.Issues.Terraform
"},{"location":"api/#report-formats","title":"Report Formats","text":"
  • Cake.Issues.Reporting.Console
  • Cake.Issues.Reporting.Generic
  • Cake.Issues.Reporting.Sarif
"},{"location":"api/#pull-request-systems","title":"Pull Request Systems","text":"
  • Cake.Issues.PullRequests.AppVeyor
  • Cake.Issues.PullRequests.AzureDevOps
  • Cake.Issues.PullRequests.GitHubActions
"},{"location":"documentation/features/","title":"Features","text":""},{"location":"documentation/features/#ready-to-use-distributions","title":"Ready To Use Distributions","text":"
  • Cake Recipe Packages

    Cake Issues recipes provide build scripts, delivered as a NuGet package, which can be used inside your projects Cake build to add issue management.

    It handles all the parsing, integration with build and pull request systems for you, using the individual Cake Issues addins.

    Recipes

"},{"location":"documentation/features/#reading-creating-issues","title":"Reading & Creating Issues","text":"
  • Read issues provided by tools

    The ReadIssues aliases can be used for reading issues reported by a linter to tool using an issue provider.

    There are overloads for reading using a single or multiple issue provider.

    Aliases

  • Create issues in your build

    The NewIssue aliases can be used for creating issues in the build script.

    Aliases

  • Support for file links

    Support for creating links to file & location on source code hosting system (GitHub, Azure Repos, etc).

    Aliases

  • Issue serialization

    Support for serializing and deserializing created issues and issues read from tools.

    Aliases

  • Support for multiple message formats

    Support for reading issues in multiple formats (Plain text, Markdown, HTML) if supported by issue provider.

  • Support for run information

    Support for passing additional run information to identify specific runs.

"},{"location":"documentation/features/#breaking-builds","title":"Breaking builds","text":"
  • Fail builds on reported issues

    The BreakBuildOnIssues aliases can be used for failing builds if specific issues were reported.

    There are overloads for failing if issues of certain minimum priority or issue providers are found, or by passing any custom function.

    Aliases

"},{"location":"documentation/features/#reporting","title":"Reporting","text":"
  • Create reports

    The CreateIssueReport aliases can be used for creating reports in a supported reporting format.

    There are overloads for reading issues from a single or multiple issue provider or for passing an existing list of issues.

    Aliases

"},{"location":"documentation/features/#build-pull-request-system-integration","title":"Build & Pull Request System Integration","text":"
  • Add comments to pull requests

    The ReportIssuesToPullRequest aliases can be used for writing issues as comments to pull requests.

    There are overloads for reading issues from a single or multiple issue provider or for passing an existing list of issues.

    Aliases

  • Report issues to build runs

    The ReportIssuesToPullRequest aliases can be used for reporting issues to build runs.

    There are overloads for reading issues from a single or multiple issue provider or for passing an existing list of issues.

    Aliases

  • Issue filters

    Support for passing custom issue filter routines.

    Setting

  • Limit reported issues

    Advanced support to limit number of maximum issues per run, across multiple runs or per issue provider through settings.

    Settings

  • Automatic comment resolving

    If supported by the pull request system, comments for issues are automatic resolved if fixed in subsequent commits.

"},{"location":"documentation/how-cake-issues-works/","title":"How Cake Issues Works","text":"

The Cake Issues addins are built in a modular architecture, allowing to easily enhance it for supporting additional analyzers, linters, report formats and pull request systems.

"},{"location":"documentation/how-cake-issues-works/#cakeissues-addin","title":"Cake.Issues addin","text":"

The Cake.Issues addin provides aliases for creating issues or reading issues using one or more issue providers.

Support for different code analyzers and linters is provided through issue provider addins which cover a wide range of linters and tools.

The issues are read into IIssue objects which then can be passed to Cake.Issues.Reporting addin, Cake.Issues.PullRequests addin or further processed in the build script.

The use of issue provider addins, which contain the parsing logic for individual tool output formats, and the use of IIssue as common data structure, allows to abstract the tooling output from other concerns like integration with build systems, pull request workflow or the creation of reports.

"},{"location":"documentation/how-cake-issues-works/#cakeissuesreporting-addin","title":"Cake.Issues.Reporting addin","text":"

The Cake.Issues.Reporting addin provides aliases for creating reports for issues which are read or have been created using the Cake.Issues addin.

Support for different report formats is provided through report format addins.

"},{"location":"documentation/how-cake-issues-works/#cakeissuespullrequests-addin","title":"Cake.Issues.PullRequests addin","text":"

The Cake.Issues.PullRequests addin provides aliases for reporting issues which are read or have been created using the Cake.Issues addin as comments to pull requests or builds.

Support for different pull request systems is provided through pull request system addins.

"},{"location":"documentation/overview/","title":"Introduction","text":"

The Cake.Issues addins for the Cake build automation system offer an extensive and flexible solution for reading linting issues.

Cake.Issues redefines issue management within the Cake build system by offering a comprehensive, universal, and extensible solution. The unique capabilities of the addins empower development teams to enforce coding standards, generate insightful reports, seamlessly incorporate various linting tools, and streamlining the integration with pull requests. With its modular architecture and extensive set of aliases, Cake.Issues provides a future-proof infrastructure for issue management in Cake builds, fostering a more efficient and adaptable development process.

"},{"location":"documentation/overview/#unique-problem-solving","title":"Unique Problem Solving","text":"

Some examples how Cake.Issues can help development teams to improve code quality.

"},{"location":"documentation/overview/#break-build-on-linting-issues","title":"Break build on linting issues","text":"

Cake.Issues provides a seamless integration, allowing you to enforce coding standards by breaking builds when linting issues are detected.

Breaking builds

"},{"location":"documentation/overview/#pull-requests-integration","title":"Pull Requests integration","text":"

Ensure linting issues are promptly addressed by having them reported as comments on pull requests. Cake.Issues bridges the gap between linting tools and version control systems, fostering efficient collaboration during code reviews.

Integrate with pull request systems

"},{"location":"documentation/overview/#reports","title":"Reports","text":"

Craft detailed and visually appealing reports for linting issues directly within your Cake build. The addins facilitates easy identification and resolution of linting concerns, enhancing the overall code quality.

Creating Reports

"},{"location":"documentation/overview/#universal-compatibility","title":"Universal Compatibility","text":""},{"location":"documentation/overview/#diverse-linting-tool-support","title":"Diverse Linting Tool Support","text":"

Regardless of the linting tools you use, Cake.Issues ensures that you're not left out. Cake.Issues supports a variety of analyzers and linters, allowing you to incorporate new tools effortlessly while maintaining integration with existing ones.

Supported Tools

"},{"location":"documentation/overview/#build-system-agnosticism","title":"Build System Agnosticism","text":"

Embrace the freedom to choose the build system that best suit your needs. If your current build system lacks tasks for reporting issues in pull requests, Cake.Issues steps in to fill that void seamlessly. In the case of using multiple CI services, Cake.Issues guarantees a consistent feature set across all of them.

Supported Build and pull request systems

"},{"location":"documentation/overview/#unprecedented-extensibility","title":"Unprecedented Extensibility","text":""},{"location":"documentation/overview/#modular-architecture","title":"Modular Architecture","text":"

The Cake.Issues addin breaks away from the norm by offering a modular architecture. Comprising over 15 distinct addins, it presents a cohesive solution through more than 75 aliases for Cake builds, providing unparalleled flexibility.

Architecture

"},{"location":"documentation/overview/#extensible-infrastructure","title":"Extensible Infrastructure","text":"

Designed with extensibility in mind, Cake.Issues provides extension points for supporting additional analyzers, linters,report formats, and code review systems. This adaptability ensures that your build scripts can evolve with the ever-changing landscape of development tools.

Documentation

"},{"location":"documentation/supported-tools/","title":"Supported Tools","text":"

This pages lists tools known to be working with Cake Issues (1)

  1. If you have used Cake Issues with other we would like to hear from you. You can add it to this list by creating a pull request here.
"},{"location":"documentation/supported-tools/#net","title":".NET","text":"Tool Tool Version Format Issue Provider Supported Since dupFinder Cake.Issues.DupFinder 0.8.0 InspectCode xml Cake.Issues.InspectCode 0.1.0 InspectCode >= 2024.1 SARIF Cake.Issues.Sarif 4.2.0 MsBuild Binary Log 7 Cake.Issues.MsBuild 0.6.1 MsBuild Binary Log 8 Cake.Issues.MsBuild 0.8.0 MsBuild Binary Log 9 Cake.Issues.MsBuild 2.0.0 MsBuild Binary Log 16 Cake.Issues.MsBuild 3.0.0 MsBuild Binary Log 17 Cake.Issues.MsBuild 4.0.0 MsBuild Binary Log 18 Cake.Issues.MsBuild 4.1.0 MsBuild Binary Log 20 Cake.Issues.MsBuild 4.3.0 MsBuild Binary Log 21 Cake.Issues.MsBuild 4.7.0 MsBuild Binary Log 22 Cake.Issues.MsBuild 4.10.0 MsBuild Binary Log 23 Cake.Issues.MsBuild 4.11.0 MsBuild Binary Log 24 Cake.Issues.MsBuild 4.12.0 MsBuild XmlFileLogger Cake.Issues.MsBuild 0.1.0"},{"location":"documentation/supported-tools/#ansible","title":"Ansible","text":"Tool Tool Version Format Issue Provider Supported Since Ansible-lint SARIF Cake.Issues.Sarif 4.2.0 checkov SARIF Cake.Issues.Sarif 4.2.0 kics sarif Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#amazon-cloud-formation-templates","title":"Amazon Cloud Formation Templates","text":"Tool Tool Version Format Issue Provider Supported Since cfn-lint SARIF Cake.Issues.Sarif 4.2.0 checkov SARIF Cake.Issues.Sarif 4.2.0 kics sarif Cake.Issues.Sarif 4.2.0 Trivy SARIF Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#azure-resource-manager-arm","title":"Azure Resource Manager (ARM)","text":"Tool Tool Version Format Issue Provider Supported Since checkov SARIF Cake.Issues.Sarif 4.2.0 kics sarif Cake.Issues.Sarif 4.2.0 Trivy SARIF Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#bicep","title":"Bicep","text":"Tool Tool Version Format Issue Provider Supported Since checkov SARIF Cake.Issues.Sarif 4.2.0 kics sarif Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#dockerfile","title":"Dockerfile","text":"Tool Tool Version Format Issue Provider Supported Since checkov SARIF Cake.Issues.Sarif 4.2.0 Hadolint sarif Cake.Issues.Sarif 4.2.0 kics sarif Cake.Issues.Sarif 4.2.0 Trivy SARIF Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#github-actions","title":"GitHub Actions","text":"Tool Tool Version Format Issue Provider Supported Since actionlint SARIF Cake.Issues.Sarif 4.2.0 checkov SARIF Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#go","title":"Go","text":"Tool Tool Version Format Issue Provider Supported Since golangci-lint sarif Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#groovy","title":"Groovy","text":"Tool Tool Version Format Issue Provider Supported Since npm-groovy-lint sarif Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#helm-charts","title":"Helm charts","text":"Tool Tool Version Format Issue Provider Supported Since checkov SARIF Cake.Issues.Sarif 4.2.0 kics sarif Cake.Issues.Sarif 4.2.0 Trivy SARIF Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#java","title":"Java","text":"Tool Tool Version Format Issue Provider Supported Since checkstyle sarif Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#javascript","title":"JavaScript","text":"Tool Tool Version Format Issue Provider Supported Since ESLint Current json Cake.Issues.EsLint 0.1.0"},{"location":"documentation/supported-tools/#json","title":"JSON","text":"Tool Tool Version Format Issue Provider Supported Since eslint-plugin-json Cake.Issues.EsLint 0.1.0 eslint-plugin-jsonc Cake.Issues.EsLint 0.1.0"},{"location":"documentation/supported-tools/#jsx-tsx","title":"JSX & TSX","text":"Tool Tool Version Format Issue Provider Supported Since eslint-plugin-jsx-a11y Cake.Issues.EsLint 0.1.0 eslint-plugin-react Cake.Issues.EsLint 0.1.0"},{"location":"documentation/supported-tools/#kotlin","title":"Kotlin","text":"Tool Tool Version Format Issue Provider Supported Since detekt sarif Cake.Issues.Sarif 4.2.0 ktlint sarif Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#kubernetes","title":"Kubernetes","text":"Tool Tool Version Format Issue Provider Supported Since checkov SARIF Cake.Issues.Sarif 4.2.0 kics sarif Cake.Issues.Sarif 4.2.0 Trivy SARIF Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#markdown","title":"Markdown","text":"Tool Tool Version Format Issue Provider Supported Since DocFx Cake.Issues.DocFx 0.1.0 markdownlint resultVersion=1 Cake.Issues.Markdownlint 0.1.0 markdownlint-cli < 0.9.0 Default Cake.Issues.Markdownlint 0.2.0 markdownlint-cli >= 0.9.0 Default Cake.Issues.Markdownlint 0.3.0 markdownlint-cli >= 0.19.0 Default Cake.Issues.Markdownlint 0.8.1 markdownlint-cli >= 0.22.0 Default Cake.Issues.Markdownlint 0.8.2 markdownlint-cli json Cake.Issues.Markdownlint 1.1.0"},{"location":"documentation/supported-tools/#openapi","title":"OpenAPI","text":"Tool Tool Version Format Issue Provider Supported Since checkov SARIF Cake.Issues.Sarif 4.2.0 kics sarif Cake.Issues.Sarif 4.2.0 Spectral sarif Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#php","title":"PHP","text":"Tool Tool Version Format Issue Provider Supported Since Psalm results.sarif Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#protobuf","title":"Protobuf","text":"Tool Tool Version Format Issue Provider Supported Since protolint sarif Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#python","title":"Python","text":"Tool Tool Version Format Issue Provider Supported Since Bandit sarif Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#secrets","title":"Secrets","text":"Tool Tool Version Format Issue Provider Supported Since checkov SARIF Cake.Issues.Sarif 4.2.0 DevSkim sarif Cake.Issues.Sarif 4.2.0 gitleaks sarif Cake.Issues.Sarif 4.2.0 secretlint sarif Cake.Issues.Sarif 4.2.0 semgrep sarif Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#terraform","title":"Terraform","text":"Tool Tool Version Format Issue Provider Supported Since checkov SARIF Cake.Issues.Sarif 4.2.0 kics sarif Cake.Issues.Sarif 4.2.0 Terraform Validate Cake.Issues.Terraform 1.0.0 TFLint sarif Cake.Issues.Sarif 4.2.0 Trivy SARIF Cake.Issues.Sarif 4.2.0"},{"location":"documentation/supported-tools/#typescript","title":"TypeScript","text":"Tool Tool Version Format Issue Provider Supported Since ESLint Current json Cake.Issues.EsLint 0.1.0"},{"location":"documentation/contributing/how-to-build/","title":"How to build addins","text":"

To build this a package we are using Cake.

On Windows PowerShell run:

./build\n

On OSX/Linux run:

./build.sh\n
"},{"location":"documentation/contributing/how-to-contribute/","title":"How to contribute","text":"

The repositories are using GitFlow with default configuration. Development is happening on develop branch.

To contribute:

  • Fork this repository.
  • Create a feature branch from develop.
  • Implement your changes.
  • Push your feature branch.
  • Create a pull request.

For getting started see issues marked with Up-for-grabs in the individual repositories.

"},{"location":"documentation/contributing/how-to-release/","title":"How to release addins","text":"

See Cake.Recipe documentation how to create a new release of this addin.

"},{"location":"documentation/extending/","title":"Extending","text":"

Cake Issues can easily be extended with additional Issue Provider, Report Formats and Pull Request System integrations.

"},{"location":"documentation/extending/testing/","title":"Testing","text":"

The Cake.Issues.Testing package provides different helper classes for writing test cases for issue provider, report format or pull request system addins.

API Documentation on fuget.org

"},{"location":"documentation/extending/issue-provider/categories/","title":"Alias categories","text":"

Issue provider aliases should use the IssuesAliasConstants.MainCakeAliasCategory and IssuesAliasConstants.IssueProviderCakeAliasCategory constants for defining their category:

[CakeAliasCategory(IssuesAliasConstants.MainCakeAliasCategory)]\npublic static class MyIssueProviderAliases\n{\n    [CakeMethodAlias]\n    [CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]\n    public static IIssueProvider MyIssueProvider(\n        this ICakeContext context)\n    {\n    }\n}\n
"},{"location":"documentation/extending/issue-provider/helper/","title":"Helper","text":"

The following helpers are provider by Cake.Issues for simplifying implementation of issue providers:

Helper Description StringPathExtensions Extensions for string for handling paths. ByteArrayExtensions Extensions for converting between strings an byte arrays."},{"location":"documentation/extending/issue-provider/helper/#file-linking","title":"File linking","text":"

Cake.Issues provides infrastructure to get links to files on source code hosts like GitHub or Azure Repos. This infrastructure can be used inside issue providers to generate file links which can be used inside the issue messages:

protected override IEnumerable<IIssue> InternalReadIssues()\n{\n    var result = new List<IIssue>();\n\n    var filePath = \"foo.cs\";\n    var line = 10;\n\n    var fileLink = \n        this.Settings.FileLinkSettings.GetFileLink(\n            IssueBuilder\n                .NewIssue(\"Issue for creating file link\", this)\n                .InFile(filePath, line)\n                .Create()\n        );\n\n    var htmlMessage =\n        $\"This is an issues in the file <a href=\\\"{fileLink}\\\">{filePath}</a>\";\n\n    var issue =\n        IssueBuilder\n            .NewIssue(\"MyMessage\", this)\n            .WithMessageInHtmlFormat(htmlMessage)\n            .InFile(filePath, line)\n            .Create();\n\n    return result;\n}\n
"},{"location":"documentation/extending/issue-provider/overview/","title":"Overview","text":"

Issue providers need to implement the IIssueProvider interface.

"},{"location":"documentation/extending/issue-provider/overview/#base-classes","title":"Base classes","text":"

For simplifying implementation there exists base classes from which concrete implementation can be inherited.

Base Class Use case Tutorial BaseIssueProvider Base class for a simple issue provider implementation. Simple provider BaseConfigurableIssueProvider Base class for a issue provider with issue provider specific settings. Provider settings BaseMultiFormatIssueProvider Base class for issue providers supporting multiple log formats. Multiple log file formats support"},{"location":"documentation/extending/issue-provider/tutorials/logfile-format/","title":"Multiple log file formats","text":"

A single issue provider might support reading issues from multiple different log file formats. For these cases the Cake.Issue addin provides the BaseMultiFormatIssueProvider, BaseMultiFormatIssueProviderSettings and BaseLogFileFormat classes for simplifying implementation in the issue provider addin.

"},{"location":"documentation/extending/issue-provider/tutorials/logfile-format/#implementing-issue-provider","title":"Implementing issue provider","text":"

A concrete class inheriting from BaseMultiFormatIssueProvider needs to be implemented defining the concrete types.

/// <summary>\n/// My issue provider.\n/// </summary>\npublic class MyIssuesProvider : BaseMultiFormatIssueProvider<MyIssuesSettings, MyIssuesProvider>\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"MyIssuesProvider\"/> class.\n    /// </summary>\n    /// <param name=\"log\">The Cake log context.</param>\n    /// <param name=\"settings\">Settings for reading the log file.</param>\n    public MyIssuesProvider(ICakeLog log, MyIssuesSettings settings)\n        : base(log, settings)\n    {\n    }\n\n    /// <inheritdoc />\n    public override string ProviderName => \"MyIssuesProvider\";\n}\n

Also a concrete class inheriting from BaseMultiFormatIssueProviderSettings needs to be implemented defining the concrete types. Based on the capabilities of the log file formats the appropriate constructors for reading from the file system or memory can be made public:

/// <summary>\n/// Settings for my issue provider.\n/// </summary>\npublic class MyIssuesSettings : BaseMultiFormatIssueProviderSettings<MyIssuesProvider, MyIssuesSettings>\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"MyIssuesSettings\"/> class\n    /// for reading a log file on disk.\n    /// </summary>\n    /// <param name=\"logFilePath\">Path to the log file.\n    /// The log file needs to be in the format as defined by the <paramref name=\"format\"/> parameter.</param>\n    /// <param name=\"format\">Format of the provided log file.</param>\n    public MyIssuesSettings(FilePath logFilePath, MyLogFileFormat format)\n        : base(logFilePath, format)\n    {\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"MyIssuesSettings\"/> class\n    /// for a log file content in memory.\n    /// </summary>\n    /// <param name=\"logFileContent\">Content of the log file.\n    /// The log file needs to be in the format as defined by the <paramref name=\"format\"/> parameter.</param>\n    /// <param name=\"format\">Format of the provided log file.</param>\n    public MyIssuesSettings(byte[] logFileContent, MyLogFileFormat format)\n        : base(logFileContent, format)\n    {\n    }\n}\n
"},{"location":"documentation/extending/issue-provider/tutorials/logfile-format/#implementing-log-file-format-infrastructure","title":"Implementing log file format infrastructure","text":"

An abstract class inheriting from BaseLogFileFormat needs to be implemented defining the concrete types for the issue provider:

/// <summary>\n/// Base class for all log file formats supported by my issue provider.\n/// </summary>\npublic abstract class MyLogFileFormat : BaseLogFileFormat<MyIssuesProvider, MyIssuesSettings>\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"MyLogFileFormat\"/> class.\n    /// </summary>\n    /// <param name=\"log\">The Cake log instance.</param>\n    protected MyLogFileFormat(ICakeLog log)\n        : base(log)\n    {\n    }\n}\n
"},{"location":"documentation/extending/issue-provider/tutorials/logfile-format/#implementing-log-file-format","title":"Implementing log file format","text":"

The different log file formats of an issue provider need to be inherited from the abstract log file format class:

/// <summary>\n/// Concrete log format.\n/// </summary>\ninternal class MyConcreteLogFileFormat : MyLogFileFormat\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"MyConcreteLogFileFormat\"/> class.\n    /// </summary>\n    /// <param name=\"log\">The Cake log instance.</param>\n    public MyConcreteLogFileFormat(ICakeLog log)\n        : base(log)\n    {\n    }\n\n    /// <inheritdoc/>\n    public override IEnumerable<IIssue> ReadIssues(\n        MyIssuesProvider issueProvider,\n        RepositorySettings repositorySettings,\n        MyIssuesSettings issueProviderSettings)\n    {\n        issueProvider.NotNull(nameof(issueProvider));\n        repositorySettings.NotNull(nameof(repositorySettings));\n        issueProviderSettings.NotNull(nameof(issueProviderSettings));\n\n        var result = new List<IIssue>();\n\n        // Implement log file format logic here.\n        result.Add(\n            IssueBuilder\n                .NewIssue(\"Some message\", issueProvider)\n                .WithPriority(IssuePriority.Warning)\n                .OfRule(\"My rule\")\n                .Create());\n\n        return result;\n    }\n}\n
"},{"location":"documentation/extending/issue-provider/tutorials/logfile-format/#aliases","title":"Aliases","text":"

For each concrete log file format a Cake property alias should be provided:

/// <summary>\n/// Gets an instance of the concrete log format.\n/// </summary>\n/// <param name=\"context\">The context.</param>\n/// <returns>Instance of the concrete log format.</returns>\n[CakePropertyAlias]\n[CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]\npublic static MyLogFileFormat MyConcreteLogFileFormat(\n    this ICakeContext context)\n{\n    context.NotNull(nameof(context));\n\n    return new MyConcreteLogFileFormat(context.Log);\n}\n

Additionally an alias for reading issues with a specific format should be provided:

/// <summary>\n/// Gets an instance of a provider for issues using specified settings\n/// </summary>\n/// <param name=\"context\">The context.</param>\n/// <param name=\"settings\">Settings for reading the log.</param>\n/// <returns>Instance of a provider for issues.</returns>\n/// <example>\n/// <para>Read issues using my concrete log file format:</para>\n/// <code>\n/// <![CDATA[\n///     var settings =\n///         new MyIssuesSettings(\n///             @\"c:\\build\\issues.xml\",\n///             MyConcreteLogFileFormat);\n///\n///     var issues =\n///         ReadIssues(\n///             MyIssues(settings),\n///             @\"c:\\repo\");\n/// ]]>\n/// </code>\n/// </example>\n[CakeMethodAlias]\n[CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]\npublic static IIssueProvider MyIssues(\n    this ICakeContext context,\n    MyIssuesSettings settings)\n{\n    context.NotNull(nameof(context));\n    settings.NotNull(nameof(settings));\n\n    return new MyIssuesProvider(context.Log, settings);\n}\n

For convenience of the user and based on the capabilities of the issue provider additional aliases for reading from the file system or from memory can be added:

/// <summary>\n/// Gets an instance of my issues provider for reading a log file from disk.\n/// </summary>\n/// <param name=\"context\">The context.</param>\n/// <param name=\"logFilePath\">Path to the log file.\n/// The log file needs to be in the format as defined by the <paramref name=\"format\"/> parameter.</param>\n/// <param name=\"format\">Format of the provided log file.</param>\n/// <returns>Instance of my issues provider.</returns>\n/// <example>\n/// <para>Read issues using my issues provider:</para>\n/// <code>\n/// <![CDATA[\n///     var issues =\n///         ReadIssues(\n///             MyIssuesFromFilePath(\n///                 @\"c:\\build\\issues.log\",\n///                 MyConcreteLogFileFormat));\n/// ]]>\n/// </code>\n/// </example>\n[CakeMethodAlias]\n[CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]\npublic static IIssueProvider MyIssuesFromFilePath(\n    this ICakeContext context,\n    FilePath logFilePath,\n    MyLogFileFormat format)\n{\n    context.NotNull(nameof(context));\n    logFilePath.NotNull(nameof(logFilePath));\n    format.NotNull(nameof(format));\n\n    return context.MyIssues(new MyIssuesSettings(logFilePath, format));\n}\n\n/// <summary>\n/// Gets an instance of my issues provider for reading a log file from memory.\n/// </summary>\n/// <param name=\"context\">The context.</param>\n/// <param name=\"logFileContent\">Content of the log file.\n/// The log content needs to be in the format as defined by the <paramref name=\"format\"/> parameter.</param>\n/// <param name=\"format\">Format of the provided log content.</param>\n/// <returns>Instance of my issues provider.</returns>\n/// <example>\n/// <para>Read issues using my issues provider:</para>\n/// <code>\n/// <![CDATA[\n///     var issues =\n///         ReadIssues(\n///             MyIssuesFromContent(\n///                 logFileContent,\n///                 MyConcreteLogFileFormat));\n/// ]]>\n/// </code>\n/// </example>\n[CakeMethodAlias]\n[CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]\npublic static IIssueProvider MyIssuesFromContent(\n    this ICakeContext context,\n    string logFileContent,\n    MyLogFileFormat format)\n{\n    context.NotNull(nameof(context));\n    logFileContent.NotNullOrWhiteSpace(nameof(logFileContent));\n    format.NotNull(nameof(format));\n\n    return context.MyIssues(new MyIssuesSettings(logFileContent.ToByteArray(), format));\n}\n

Finally an additional property alias for returning the provider type name should be defined:

/// <summary>\n/// Gets the name of my issue provider.\n/// This name can be used to identify issues based on the <see cref=\"IIssue.ProviderType\"/> property.\n/// </summary>\n/// <param name=\"context\">The context.</param>\n/// <returns>Name of my issue provider.</returns>\n[CakePropertyAlias]\n[CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]\npublic static string MyIssuesProviderTypeName(\n    this ICakeContext context)\n{\n    context.NotNull(nameof(context));\n\n    return typeof(MyIssuesProvider).FullName;\n}\n
"},{"location":"documentation/extending/issue-provider/tutorials/rule-url-resolving/","title":"Rule URL resolving","text":"

For cases where additional logic is required to determine the URL for a rule, the Cake.Issue addin provides the BaseRuleDescription and BaseRuleUrlResolver classes for simplifying implementation of providing URLs linking to site providing information about issues.

"},{"location":"documentation/extending/issue-provider/tutorials/rule-url-resolving/#implementing-ruleurlresolver","title":"Implementing RuleUrlResolver","text":"

In the issue provider a concrete class inheriting from BaseRuleDescription should be implemented containing all properties required to determine the URL to a rule. The following class adds two properties Category and RuleId to the description:

/// <summary>\n/// Class describing rules for my issue provider.\n/// </summary>\npublic class MyRuleDescription : BaseRuleDescription\n{\n    /// <summary>\n    /// Gets or sets the category of the rule.\n    /// </summary>\n    public string Category { get; set; }\n\n    /// <summary>\n    /// Gets or sets the identifier of the rule.\n    /// </summary>\n    public int RuleId { get; set; }\n}\n

Also a class inheriting from BaseRuleUrlResolver needs to be implemented containing an implementation of TryGetRuleDescription for parsing rule urls to the concrete BaseRuleDescription class.

/// <summary>\n/// Class for retrieving an URL linking to a site describing a rule.\n/// </summary>\ninternal class MyRuleUrlResolver : BaseUrlResolver<MyRuleDescription>\n{\n        /// <inheritdoc/>\n        protected override bool TryGetRuleDescription(string rule, MyRuleDescription ruleDescription)\n        {\n            ruleDescription.RuleId = rule.Substring(3, rule.Length - 3);\n            ruleDescription.Category = rule.Substring(0, 3);\n\n            return true;\n        }\n    }\n

To use the URL resolver the ResolveRuleUrl method needs to be called:

var resolver = new MyRuleUrlResolver();\nvar url = resolver.ResolveRuleUrl(rule)\n

Afterwards different resolvers can be registered which return the actual URL based on the rule description:

/// <summary>\n/// Class for retrieving an URL linking to a site describing a rule.\n/// </summary>\ninternal class MyRuleUrlResolver : BaseUrlResolver<MyRuleDescription>\n{\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"MyRuleUrlResolver\"/> class.\n        /// </summary>\n        private MyRuleUrlResolver()\n        {\n            // Add resolver for different issue categories.\n            this.AddUrlResolver(x =>\n                x.Category.ToUpperInvariant() == \"FOO\" ?\n                    new Uri(\"https://www.google.com/search?q=%22\" + x.Rule) :\n                    null);\n            this.AddUrlResolver(x =>\n                x.Category.ToUpperInvariant() == \"BAR\" ?\n                    new Uri(\"https://www.bing.com/search?q=%22\" + x.Rule) :\n                    null);\n        }\n    }\n
"},{"location":"documentation/extending/issue-provider/tutorials/rule-url-resolving/#support-custom-url-resolvers","title":"Support custom URL resolvers","text":"

The AddUrlResolver method can also be called from an Cake alias to allow users of the addin to register custom resolvers. For this the URL resolver class needs to be implemented as a singleton:

/// <summary>\n/// Class for retrieving an URL linking to a site describing a rule.\n/// </summary>\ninternal class MyRuleUrlResolver : BaseUrlResolver<MyRuleDescription>\n{\n    private static readonly Lazy<MyRuleUrlResolver> InstanceValue =\n        new Lazy<MyRuleUrlResolver>(() => new MyRuleUrlResolver());\n\n    /// <summary>\n    /// Gets the instance of the rule resolver.\n    /// </summary>\n    public static MyRuleUrlResolver Instance => InstanceValue.Value;\n}\n\n[CakeAliasCategory(IssuesAliasConstants.MainCakeAliasCategory)]\npublic static class MyIssueProviderAliases\n{\n    /// <summary>\n    /// Registers a new URL resolver with default priority of 0.\n    /// </summary>\n    /// <param name=\"context\">The context.</param>\n    /// <param name=\"resolver\">Resolver which returns an <see cref=\"Uri\"/> linking to a site\n    /// containing help for a specific <see cref=\"MyRuleDescription\"/>.</param>\n    [CakeMethodAlias]\n    [CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]\n    public static void MyIssueProviderAddRuleUrlResolver(\n        this ICakeContext context,\n        Func<MyRuleDescription, Uri> resolver)\n    {\n        context.NotNull(nameof(context));\n        resolver.NotNull(nameof(resolver));\n\n        MyRuleUrlResolver.Instance.AddUrlResolver(resolver);\n    }\n
"},{"location":"documentation/extending/issue-provider/tutorials/settings/","title":"Provider settings","text":"

Often issue providers require specific settings. For these cases the Cake.Issue addin provides the BaseConfigurableIssueProvider and IssueProviderSettings classes for simplifying implementation in the issue provider addin.

"},{"location":"documentation/extending/issue-provider/tutorials/settings/#implementing-issue-provider","title":"Implementing issue provider","text":"

A concrete class inheriting from BaseConfigurableIssueProvider needs to be implemented defining the concrete settings class to use:

/// <summary>\n/// My issue provider.\n/// </summary>\npublic class MyIssuesProvider : BaseConfigurableIssueProvider<MyIssuesSettings>\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"MyIssuesProvider\"/> class.\n    /// </summary>\n    /// <param name=\"log\">The Cake log context.</param>\n    /// <param name=\"settings\">Settings for reading the log file.</param>\n    public MyIssuesProvider(ICakeLog log, MyIssuesSettings settings)\n        : base(log, settings)\n    {\n    }\n\n    /// <inheritdoc />\n    public override string ProviderName => \"MyIssuesProvider\";\n\n    /// <inheritdoc />\n    protected override IEnumerable<IIssue> InternalReadIssues()\n    {\n        var result = new List<IIssue>();\n\n        // Implement issue provider logic here.\n        result.Add(\n            IssueBuilder\n                .NewIssue(\"Some message\", issueProvider)\n                .WithPriority(IssuePriority.Warning)\n                .OfRule(\"My rule\")\n                .Create());\n\n        return result;\n    }\n}\n

Also a concrete class inheriting from IssueProviderSettings needs to be implemented. Based on the capabilities of the issue provider the appropriate constructors for reading from the file system or memory can be made public:

/// <summary>\n/// Settings for my issue provider.\n/// </summary>\npublic class MyIssuesSettings : IssueProviderSettings\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"MyIssuesSettings\"/> class\n    /// for reading a log file on disk.\n    /// </summary>\n    /// <param name=\"logFilePath\">Path to the log file.</param>\n    public MyIssuesSettings(FilePath logFilePath)\n        : base(logFilePath)\n    {\n    }\n\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"MyIssuesSettings\"/> class\n    /// for a log file content in memory.\n    /// </summary>\n    /// <param name=\"logFileContent\">Content of the log file.</param>\n    public MyIssuesSettings(byte[] logFileContent)\n        : base(logFileContent)\n    {\n    }\n\n    // Add additional settings for the issue provider here.\n}\n
"},{"location":"documentation/extending/issue-provider/tutorials/settings/#aliases","title":"Aliases","text":"

An alias for reading issues with the provider should be provided:

/// <summary>\n/// Gets an instance of my issues provider using specified settings.\n/// </summary>\n/// <param name=\"context\">The context.</param>\n/// <param name=\"settings\">Settings for reading the log.</param>\n/// <returns>Instance of my issues provider.</returns>\n/// <example>\n/// <para>Read issues using my issues provider:</para>\n/// <code>\n/// <![CDATA[\n///     var settings =\n///         new MyIssuesSettings(@\"c:\\build\\issues.log\");\n///\n///     var issues =\n///         ReadIssues(\n///             MyIssues(settings));\n/// ]]>\n/// </code>\n/// </example>\n[CakeMethodAlias]\n[CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]\npublic static IIssueProvider MyIssues(\n    this ICakeContext context,\n    MyIssuesSettings settings)\n{\n    context.NotNull(nameof(context));\n    settings.NotNull(nameof(settings));\n\n    return new MyIssuesProvider(context.Log, settings);\n}\n

For convenience of the user and based on the capabilities of the issue provider additional aliases for reading from the file system or from memory can be added:

/// <summary>\n/// Gets an instance of my issues provider for reading a log file from disk.\n/// </summary>\n/// <param name=\"context\">The context.</param>\n/// <param name=\"logFilePath\">Path to the log file.</param>\n/// <returns>Instance of my issues provider.</returns>\n/// <example>\n/// <para>Read issues using my issues provider:</para>\n/// <code>\n/// <![CDATA[\n///     var issues =\n///         ReadIssues(\n///             MyIssuesFromFilePath(@\"c:\\build\\issues.log\"));\n/// ]]>\n/// </code>\n/// </example>\n[CakeMethodAlias]\n[CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]\npublic static IIssueProvider MyIssuesFromFilePath(\n    this ICakeContext context,\n    FilePath logFilePath)\n{\n    context.NotNull(nameof(context));\n    logFilePath.NotNull(nameof(logFilePath));\n\n    return context.MyIssues(new MyIssuesSettings(logFilePath));\n}\n\n/// <summary>\n/// Gets an instance of my issues provider for reading a log file from memory.\n/// </summary>\n/// <param name=\"context\">The context.</param>\n/// <param name=\"logFileContent\">Content of the log file.</param>\n/// <returns>Instance of my issues provider.</returns>\n/// <example>\n/// <para>Read issues using my issues provider:</para>\n/// <code>\n/// <![CDATA[\n///     var issues =\n///         ReadIssues(\n///             MyIssuesFromContent(logFileContent));\n/// ]]>\n/// </code>\n/// </example>\n[CakeMethodAlias]\n[CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]\npublic static IIssueProvider MyIssuesFromContent(\n    this ICakeContext context,\n    string logFileContent)\n{\n    context.NotNull(nameof(context));\n    logFileContent.NotNullOrWhiteSpace(nameof(logFileContent));\n\n    return context.MyIssues(new MyIssuesSettings(logFileContent.ToByteArray()));\n}\n

Finally an additional property alias for returning the provider type name should be defined:

/// <summary>\n/// Gets the name of my issue provider.\n/// This name can be used to identify issues based on the <see cref=\"IIssue.ProviderType\"/> property.\n/// </summary>\n/// <param name=\"context\">The context.</param>\n/// <returns>Name of my issue provider.</returns>\n[CakePropertyAlias]\n[CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]\npublic static string MyIssuesProviderTypeName(\n    this ICakeContext context)\n{\n    context.NotNull(nameof(context));\n\n    return typeof(MyIssuesProvider).FullName;\n}\n
"},{"location":"documentation/extending/issue-provider/tutorials/simple/","title":"Simple issue provider","text":"

This tutorial explains how to implement a simple issue provider using the BaseIssueProvider class from the Cake.Issue addin.

"},{"location":"documentation/extending/issue-provider/tutorials/simple/#implementing-issue-provider","title":"Implementing issue provider","text":"

A concrete class inheriting from BaseIssueProvider needs to be implemented:

/// <summary>\n/// My issue provider.\n/// </summary>\npublic class MyIssuesProvider : BaseIssueProvider\n{\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"MyIssuesProvider\"/> class.\n    /// </summary>\n    /// <param name=\"log\">The Cake log context.</param>\n    public MyIssuesProvider(ICakeLog log)\n        : base(log, settings)\n    {\n    }\n\n    /// <inheritdoc />\n    public override string ProviderName => \"MyIssuesProvider\";\n\n    /// <inheritdoc />\n    protected override IEnumerable<IIssue> InternalReadIssues()\n    {\n        var result = new List<IIssue>();\n\n        // Implement issue provider logic here.\n        result.Add(\n            IssueBuilder\n                .NewIssue(\"Some message\", issueProvider)\n                .WithPriority(IssuePriority.Warning)\n                .OfRule(\"My rule\")\n                .Create());\n\n        return result;\n    }\n}\n
"},{"location":"documentation/extending/issue-provider/tutorials/simple/#aliases","title":"Aliases","text":"

An alias for reading issues with the provider should be provided:

/// <summary>\n/// Gets an instance of my issues provider using specified settings.\n/// </summary>\n/// <param name=\"context\">The context.</param>\n/// <returns>Instance of my issues provider.</returns>\n/// <example>\n/// <para>Read issues using my issues provider:</para>\n/// <code>\n/// <![CDATA[\n///     var issues =\n///         ReadIssues(\n///             MyIssues());\n/// ]]>\n/// </code>\n/// </example>\n[CakeMethodAlias]\n[CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]\npublic static IIssueProvider MyIssues(\n    this ICakeContext context)\n{\n    context.NotNull(nameof(context));\n\n    return new MyIssuesProvider(context.Log);\n}\n

Additionally a property alias for returning the provider type name should be defined:

/// <summary>\n/// Gets the name of my issue provider.\n/// This name can be used to identify issues based on the <see cref=\"IIssue.ProviderType\"/> property.\n/// </summary>\n/// <param name=\"context\">The context.</param>\n/// <returns>Name of my issue provider.</returns>\n[CakePropertyAlias]\n[CakeAliasCategory(IssuesAliasConstants.IssueProviderCakeAliasCategory)]\npublic static string MyIssuesProviderTypeName(\n    this ICakeContext context)\n{\n    context.NotNull(nameof(context));\n\n    return typeof(MyIssuesProvider).FullName;\n}\n
"},{"location":"documentation/extending/pull-request-system/categories/","title":"Alias categories","text":"

Pull request system aliases should use the IssuesAliasConstants.MainCakeAliasCategory and PullRequestsAliasConstants.PullRequestSystemCakeAliasCategory constants for defining their category:

[CakeAliasCategory(IssuesAliasConstants.MainCakeAliasCategory)]\npublic static class MyPullRequestSystemAliases\n{\n    [CakeMethodAlias]\n    [CakeAliasCategory(PullRequestsAliasConstants.PullRequestSystemCakeAliasCategory)]\n    public static IPullRequestSystem MyPullRequestSystem(\n        this ICakeContext context)\n    {\n    }\n}\n
"},{"location":"documentation/extending/pull-request-system/overview/","title":"Overview","text":"

Pull Request Systems need to implement the IPullRequestSystem interface.

"},{"location":"documentation/extending/pull-request-system/overview/#baseclasses","title":"BaseClasses","text":"

For simplifying implementation there exists base classes from which concrete implementation can be inherited. BasePullRequestSystem is the main base class with the required functionality for a pull request system implementation. Additionally there exists several classes which can be implemented to support additional optional capabilities in a pull request system implementation.

Base Class Use case Tutorial BasePullRequestSystem Base class for all pull request system implementations. BaseCheckingCommitIdCapability Base class for capability to post issues only if pull request is for a specific commit. BaseDiscussionThreadsCapability Base class for capability to read, resolve and reopen discussion threads. BaseFilteringByModifiedFilesCapability Base class for capability to filter issues to only those affecting files modified in the pull request."},{"location":"documentation/extending/report-format/categories/","title":"Alias categories","text":"

Report format aliases should use the IssuesAliasConstants.MainCakeAliasCategory and ReportingAliasConstants.ReportingFormatCakeAliasCategory constants for defining their category:

[CakeAliasCategory(IssuesAliasConstants.MainCakeAliasCategory)]\npublic static class MyReportFormatAliases\n{\n    [CakeMethodAlias]\n    [CakeAliasCategory(ReportingAliasConstants.ReportingFormatCakeAliasCategory)]\n    public static IIssueReportFormat MyReportFormat(\n        this ICakeContext context)\n    {\n    }\n}\n
"},{"location":"documentation/extending/report-format/overview/","title":"Overview","text":"

Report formats need to implement the IIssueReportFormat interface. For simplifying implementation there exists an abstract IssueReportFormat base class from which concrete implementation can be inherited.

"},{"location":"documentation/issue-providers/","title":"Issue Providers","text":"

Issue provider addins are responsible for providing the output of an analyzer or linter to the Cake Issues addin.

  • DocFx \u2013 Issue provider for reading DocFx warnings
  • ESLint \u2013 Issue provider for reading ESLint issues
  • Git Repository \u2013 Issue provider for analyzing Git repositories
  • Inspect Code \u2013 Issue provider for reading JetBrains Inspect Code / ReSharper issues
  • Markdownlint \u2013 Issue provider for reading issues from markdownlint
  • MsBuild \u2013 Issue provider for reading MsBuild errors and warnings
  • Sarif \u2013 Issue provider for reading SARIF reports
  • Terraform \u2013 Issue provider for reading Terraform validation output

Tip

See How to implement issue providers for instruction on how to implement support for additional issue providers.

"},{"location":"documentation/issue-providers/docfx/","title":"DocFx","text":"

Support for reading warnings reported by DocFx is implemented in the Cake.Issues.DocFx addin.

  • Features
  • Examples
  • API
"},{"location":"documentation/issue-providers/docfx/examples/","title":"Examples","text":"

To call DocFx from a Cake script the Cake.DocFx addin can be used. To read issues from DocFx log files the DocFx issue provider needs to be imported:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.DocFx&version=1.0.0\n#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.DocFx&version=5.0.1\n

Note

In addition to the DocFx issue provider the Cake.Issues core addin needs to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.DocFx\" Version=\"1.0.0\" />\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.DocFx\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

The following example contains a task which will build the DocFx project and write a log file and a task to read issues from the log file and write the number of warnings to the console:

Cake .NET ToolCake Frosting build.cake
var logPath = @\"c:\\build\\docfx.log\";\nvar repoRootFolder = MakeAbsolute(Directory(\"./\"));\nvar docRootPath = @\"docs\";\n\nTask(\"Build-Documentation\").Does(() =>\n{\n    // Run DocFx.\n    DocFxBuild(new DocFxBuildSettings()\n    {\n        LogPath = logPath\n    });\n});\n\nTask(\"Read-Issues\")\n    .IsDependentOn(\"Build-Documentation\")\n    .Does(() =>\n    {\n        // Read issues.\n        var issues =\n            ReadIssues(\n                DocFxIssuesFromFilePath(logPath, docRootPath),\n                repoRootPath);    \n\n        Information(\"{0} issues are found.\", issues.Count());\n    });\n
Program.cs
using Cake.Common.Diagnostics;\nusing Cake.Core.IO;\nusing Cake.Core;\nusing Cake.DocFx;\nusing Cake.DocFx.Build;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .UseContext<BuildContext>()\n            .Run(args);\n    }\n}\n\npublic class BuildContext(ICakeContext context) : FrostingContext(context)\n{\n    public FilePath LogPath { get; } = @\"c:\\build\\docfx.log\";\n    public DirectoryPath RepoRootPath { get; } =\n        context.MakeAbsolute(context.Directory(\"./\"));\n    public string DocRootPath { get; } = \"docs\";\n}\n\n[TaskName(\"Build-Documentation\")]\npublic sealed class BuildDocumentationTask : FrostingTask<BuildContext>\n{\n    public override void Run(BuildContext context)\n    {\n        // Run DocFx.\n        context.DocFxBuild(new DocFxBuildSettings()\n        {\n            LogPath = context.LogPath\n        });\n    }\n}\n\n[TaskName(\"Read-Issues\")]\n[IsDependentOn(typeof(BuildDocumentationTask))]\npublic sealed class ReadIssuesTask : FrostingTask<BuildContext>\n{\n    public override void Run(BuildContext context)\n    {\n        // Read issues.\n        var issues =\n            context.ReadIssues(\n                context.DocFxIssuesFromFilePath(\n                    context.LogPath,\n                    context.DocRootPath),\n                context.RepoRootPath);\n\n        context.Information(\"{0} issues are found.\", issues.Count());\n    }\n}\n
"},{"location":"documentation/issue-providers/docfx/features/","title":"Features","text":"

The Cake.Issues.DocFx addin provides the following features.

Tip: Running DocFx

DocFx can be run with Cake.DocFx addin.

"},{"location":"documentation/issue-providers/docfx/features/#basic-features","title":"Basic features","text":"
  • Reads warnings from DocFx log files.
"},{"location":"documentation/issue-providers/docfx/features/#supported-iissue-properties","title":"Supported IIssue properties","text":"
  • IIssue.ProviderType
  • IIssue.ProviderName
  • IIssue.Run (1)
  • IIssue.Identifier (2)
  • IIssue.ProjectName
  • IIssue.ProjectFileRelativePath
  • IIssue.AffectedFileRelativePath
  • IIssue.Line
  • IIssue.EndLine
  • IIssue.Column
  • IIssue.EndColumn
  • IIssue.FileLink (3)
  • IIssue.MessageText
  • IIssue.MessageHtml
  • IIssue.MessageMarkdown
  • IIssue.Priority
  • IIssue.PriorityName
  • IIssue.Rule
  • IIssue.RuleUrl
  1. Can be set while reading issues
  2. Set to IIssue.MessageText
  3. Can be set while reading issues
"},{"location":"documentation/issue-providers/eslint/","title":"ESLint","text":"

Support for reading issues reported by ESLint is implemented in the Cake.Issues.EsLint addin.

  • Features
  • API
"},{"location":"documentation/issue-providers/eslint/features/","title":"Features","text":"

The Cake.Issues.EsLint addin provides the following features.

Tip: Running ESLint

ESLint can be run with Cake.ESLint addin.

"},{"location":"documentation/issue-providers/eslint/features/#basic-features","title":"Basic features","text":"
  • Reads issues reported by ESLint.
  • Provides URLs for all issues.
  • Support for custom URL resolving using the EsLintAddRuleUrlResolver alias.
"},{"location":"documentation/issue-providers/eslint/features/#supported-log-file-formats","title":"Supported log file formats","text":"
  • EsLintJsonFormat alias for reading issues from log files created by ESLint json formatter.
"},{"location":"documentation/issue-providers/eslint/features/#supported-iissue-properties","title":"Supported IIssue properties","text":"
  • IIssue.ProviderType
  • IIssue.ProviderName
  • IIssue.Run (1)
  • IIssue.Identifier (2)
  • IIssue.ProjectName
  • IIssue.ProjectFileRelativePath
  • IIssue.AffectedFileRelativePath
  • IIssue.Line
  • IIssue.EndLine
  • IIssue.Column
  • IIssue.EndColumn
  • IIssue.FileLink (3)
  • IIssue.MessageText
  • IIssue.MessageHtml
  • IIssue.MessageMarkdown
  • IIssue.Priority
  • IIssue.PriorityName
  • IIssue.Rule
  • IIssue.RuleUrl (4)
  1. Can be set while reading issues
  2. Set to IIssue.MessageText
  3. Can be set while reading issues
  4. Support for custom rules can be added through a custom EsLintAddRuleUrlResolver
"},{"location":"documentation/issue-providers/gitrepository/","title":"Git Repository","text":"

Support for analyzing Git repositories is implemented in the Cake.Issues.GitRepository addin.

  • Features
  • Examples
  • Rules
  • API
"},{"location":"documentation/issue-providers/gitrepository/examples/","title":"Examples","text":"

To analyze Git repositories you need to import the Git repository issue provider:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.GitRepository&version=5.0.1\n

Note

In addition to the Git repository issue provider the Cake.Issues core addin needs to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.GitRepository\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

The following example prints the number of binary files which are not tracked by Git Large File Storage in a repository.

Warning

Checking binary files requires Git and Git Large File Storage available on the local machine.

Cake .NET ToolCake Frosting build.cake
Task(\"Analyze-Repo\")\n.Does(() =>\n{\n    // Read issues.\n    var repoRootPath = MakeAbsolute(Directory(\"./\"));\n    var settings =\n        new GitRepositoryIssuesSettings\n        {\n            CheckBinaryFilesTrackedByLfs = true\n        };    \n\n    var issues =\n        ReadIssues(\n            GitRepositoryIssues(settings),\n            repoRootPath);    \n\n    Information(\"{0} issues are found.\", issues.Count());\n});\n
Program.cs
using Cake.Common.Diagnostics;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"Analyze-Repo\")]\npublic sealed class AnalyzeRepoTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        // Read issues.\n        var repoRootPath = context.MakeAbsolute(context.Directory(\"./\"));\n        var settings =\n            new GitRepositoryIssuesSettings\n            {\n                CheckBinaryFilesTrackedByLfs = true\n            };    \n\n        var issues =\n            context.ReadIssues(\n                context.GitRepositoryIssues(settings),\n                repoRootPath);    \n\n        context.Information(\"{0} issues are found.\", issues.Count());\n    }\n}\n
"},{"location":"documentation/issue-providers/gitrepository/features/","title":"Features","text":"

The Cake.Issues.GitRepository addin provides the following features.

"},{"location":"documentation/issue-providers/gitrepository/features/#basic-features","title":"Basic features","text":"
  • Checks path length of files. See FilePathTooLong for details.
  • Checks if binary files are tracked by Git LFS. See BinaryFileNotTrackedByLfs for details.
"},{"location":"documentation/issue-providers/gitrepository/features/#supported-iissue-properties","title":"Supported IIssue properties","text":"
  • IIssue.ProviderType
  • IIssue.ProviderName
  • IIssue.Run (1)
  • IIssue.Identifier (2)
  • IIssue.ProjectName
  • IIssue.ProjectFileRelativePath
  • IIssue.AffectedFileRelativePath
  • IIssue.Line
  • IIssue.EndLine
  • IIssue.Column
  • IIssue.EndColumn
  • IIssue.FileLink (3)
  • IIssue.MessageText
  • IIssue.MessageHtml
  • IIssue.MessageMarkdown
  • IIssue.Priority
  • IIssue.PriorityName
  • IIssue.Rule
  • IIssue.RuleUrl
  1. Can be set while reading issues
  2. Set to IIssue.MessageText
  3. Can be set while reading issues
"},{"location":"documentation/issue-providers/gitrepository/rules/","title":"Rules","text":"
  • BinaryFileNotTrackedByLfs
  • FilePathTooLong
"},{"location":"documentation/issue-providers/gitrepository/rules/BinaryFileNotTrackedByLfs/","title":"BinaryFileNotTrackedByLfs","text":"Metadata Rule Id BinaryFileNotTrackedByLfs Priority Warning Available in 0.7.0 or higher"},{"location":"documentation/issue-providers/gitrepository/rules/BinaryFileNotTrackedByLfs/#cause","title":"Cause","text":"

A binary file in the repository is not tracked by Git Large File Storage.

"},{"location":"documentation/issue-providers/gitrepository/rules/BinaryFileNotTrackedByLfs/#rule-description","title":"Rule description","text":"

By its nature Git repositories cannot handle binary files well and will keep a full copy of that file in the repository every time a change to that file is committed. Considering that you always clone the full history of a repository, and not only the latest version, using binary files in a repository considerably slow downs the operation. Git Large File Storage replaces large files with small text pointers inside the Git repository, while storing the file contents on a remote server.

Info

The rule assumes that all files, which are not text files are binary files. This also includes for example empty files.

"},{"location":"documentation/issue-providers/gitrepository/rules/BinaryFileNotTrackedByLfs/#how-to-fix-violations","title":"How to fix violations","text":"

Track the file with Git Large File Storage.

"},{"location":"documentation/issue-providers/gitrepository/rules/FilePathTooLong/","title":"FilePathTooLong","text":"Metadata Rule Id FilePathTooLong Priority Warning Available in 0.7.3 or higher"},{"location":"documentation/issue-providers/gitrepository/rules/FilePathTooLong/#cause","title":"Cause","text":"

The path of a file in the repository is too long.

"},{"location":"documentation/issue-providers/gitrepository/rules/FilePathTooLong/#rule-description","title":"Rule description","text":"

Some operating systems and applications have a limitation of maximum path length which they can handle. To guarantee proper building this length should not be exceeded.

"},{"location":"documentation/issue-providers/gitrepository/rules/FilePathTooLong/#how-to-fix-violations","title":"How to fix violations","text":"

Rename the name of the file or shorten the path name.

"},{"location":"documentation/issue-providers/inspectcode/","title":"InspectCode","text":"

Support for reading issues reported by JetBrains Inspect Code is implemented in the Cake.Issues.InspectCode addin.

  • Features
  • Examples
  • API
"},{"location":"documentation/issue-providers/inspectcode/examples/","title":"Examples","text":"

To read issues from InspectCode log files the InspectCode issue provider needs to be imported:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.InspectCode&version=5.0.1\n

Note

In addition to the InspectCode issue provider the Cake.Issues core addin needs to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.InspectCode\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

The following example contains a task which will run JetBrains InspectCode and write a log file and a task to read issues from the log file and write the number of warnings to the console. JetBrains InspectCode is installed using JetBrains.ReSharper.CommandLineTools:

Cake .NET ToolCake Frosting build.cake
#tool \"nuget:?package=JetBrains.ReSharper.CommandLineTools&version=1.0.0\"\n\nvar logPath = @\"c:\\build\\inspectcode.xml\";\nvar repoRootFolder = MakeAbsolute(Directory(\"./\"));\n\nTask(\"Analyze-Project\").Does(() =>\n{\n    // Run InspectCode.\n    var settings = new InspectCodeSettings() {\n        OutputFile = logPath\n    };\n\n    InspectCode(repoRootPath.CombineWithFilePath(\"MySolution.sln\"), settings);\n});\n\nTask(\"Read-Issues\")\n    .IsDependentOn(\"Analyze-Project\")\n    .Does(() =>\n    {\n        // Read issues.\n        var issues =\n            ReadIssues(\n                InspectCodeIssuesFromFilePath(logPath),\n                repoRootPath);\n\n        Information(\"{0} issues are found.\", issues.Count());\n});\n
Program.cs
using Cake.Common.Diagnostics;\nusing Cake.Core.IO;\nusing Cake.Core;\nusing Cake.Frosting;\nusing Cake.Common.Tools.InspectCode;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .UseContext<BuildContext>()\n            .InstallTool(\n            new Uri(\n                \"nuget:?package=JetBrains.ReSharper.CommandLineTools&version=1.0.0\"))\n            .Run(args);\n    }\n}\n\npublic class BuildContext(ICakeContext context) : FrostingContext(context)\n{\n    public FilePath LogPath { get; } = @\"c:\\build\\inspectcode.xml\";\n    public DirectoryPath RepoRootPath { get; } =\n        context.MakeAbsolute(context.Directory(\"./\"));\n}\n\n[TaskName(\"Analyze-Project\")]\npublic sealed class AnalyzeProjectTask : FrostingTask<BuildContext>\n{\n    public override void Run(BuildContext context)\n    {\n        // Run InspectCode.\n        var settings = new InspectCodeSettings() {\n            OutputFile = context.LogPath\n        };\n\n        context.InspectCode(\n            context.RepoRootPath.CombineWithFilePath(\"MySolution.sln\"),\n            settings);\n    }\n}\n\n[TaskName(\"Read-Issues\")]\n[IsDependentOn(typeof(AnalyzeProjectTask))]\npublic sealed class ReadIssuesTask : FrostingTask<BuildContext>\n{\n    public override void Run(BuildContext context)\n    {\n        // Read issues.\n        var issues =\n            context.ReadIssues(\n                context.InspectCodeIssuesFromFilePath(context.LogPath),\n                context.RepoRootPath);\n\n        context.Information(\"{0} issues are found.\", issues.Count());\n    }\n}\n
"},{"location":"documentation/issue-providers/inspectcode/features/","title":"Features","text":"

The Cake.Issues.InspectCode addin provides the following features.

Tip: Running InspectCode

JetBrains InsepectCode can be run using the InspectCode alias.

"},{"location":"documentation/issue-providers/inspectcode/features/#basic-features","title":"Basic features","text":"
  • Reads warnings from JetBrains InsepectCode log files.
  • Provides URLs for issues containing a Wiki URL.
"},{"location":"documentation/issue-providers/inspectcode/features/#supported-iissue-properties","title":"Supported IIssue properties","text":"
  • IIssue.ProviderType
  • IIssue.ProviderName
  • IIssue.Run (1)
  • IIssue.Identifier (2)
  • IIssue.ProjectName
  • IIssue.ProjectFileRelativePath
  • IIssue.AffectedFileRelativePath
  • IIssue.Line
  • IIssue.EndLine
  • IIssue.Column
  • IIssue.EndColumn
  • IIssue.FileLink (3)
  • IIssue.MessageText
  • IIssue.MessageHtml
  • IIssue.MessageMarkdown
  • IIssue.Priority
  • IIssue.PriorityName
  • IIssue.Rule
  • IIssue.RuleUrl
  1. Can be set while reading issues
  2. Set to IIssue.MessageText
  3. Can be set while reading issues
"},{"location":"documentation/issue-providers/markdownlint/","title":"markdownlint","text":"

Support for reading issues reported by markdownlint is implemented in the Cake.Issues.Markdownlint addin.

  • Features
  • Examples
  • API
"},{"location":"documentation/issue-providers/markdownlint/examples/","title":"Examples","text":"

To call markdownlint-cli from a Cake script the Cake.Markdownlint addin can be used. To read issues from markdownlint-cli log files the markdownlint issue provider needs to be imported:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Markdownlint&version=1.0.0\n#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.Markdownlint&version=5.0.1\n

Note

In addition to the markdownlint issue provider the Cake.Issues core addin needs to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Markdownlint\" Version=\"1.0.0\" />\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.Markdownlint\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

The following example contains a task which will run markdownlint-cli and write a log file and a task to read issues from the log file and write the number of warnings to the console:

Cake .NET ToolCake Frosting build.cake
var logPath = @\"c:\\build\\markdownlint.log\";\nvar repoRootFolder = MakeAbsolute(Directory(\"./\"));\n\nTask(\"Lint-Documentation\").Does(() =>\n{\n    // Run markdownlint-cli.\n    var settings =\n        MarkdownlintNodeJsRunnerSettings.ForDirectory(\n            context.RepoRootPath.Combine(\"docs\"));\n    settings.OutputFile = logPath;\n    settings.ThrowOnIssue = false;\n    RunMarkdownlintNodeJs(settings);\n});\n\nTask(\"Read-Issues\")\n    .IsDependentOn(\"Lint-Documentation\")\n    .Does(() =>\n    {\n        // Read issues.\n        var issues =\n            ReadIssues(\n                MarkdownlintIssuesFromFilePath(\n                    logPath,\n                    MarkdownlintCliLogFileFormat),\n                repoRootPath);\n\n        Information(\"{0} issues are found.\", issues.Count());\n});\n
Program.cs
using Cake.Common.Diagnostics;\nusing Cake.Common.IO;\nusing Cake.Core;\nusing Cake.Core.IO;\nusing Cake.Frosting;\nusing Cake.Markdownlint;\nusing Cake.Markdownlint.NodeJs;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .UseContext<BuildContext>()\n            .Run(args);\n    }\n}\n\npublic class BuildContext(ICakeContext context) : FrostingContext(context)\n{\n    public FilePath LogPath { get; } = @\"c:\\build\\markdownlint.log\";\n    public DirectoryPath RepoRootPath { get; } =\n        context.MakeAbsolute(context.Directory(\"./\"));\n}\n\n[TaskName(\"Lint-Documentation\")]\npublic sealed class LintDocumentationTask : FrostingTask<BuildContext>\n{\n    public override void Run(BuildContext context)\n    {\n        // Run markdownlint-cli.\n        var settings =\n            MarkdownlintNodeJsRunnerSettings.ForDirectory(\n                context.RepoRootPath.Combine(\"docs\"));\n        settings.OutputFile = context.LogPath;\n        settings.ThrowOnIssue = false;\n        context.RunMarkdownlintNodeJs(settings);\n    }\n}\n\n[TaskName(\"Read-Issues\")]\n[IsDependentOn(typeof(LintDocumentationTask))]\npublic sealed class ReadIssuesTask : FrostingTask<BuildContext>\n{\n    public override void Run(BuildContext context)\n    {\n        // Read issues.\n        var issues =\n            context.ReadIssues(\n                context.MarkdownlintIssuesFromFilePath(\n                    context.LogPath,\n                    context.MarkdownlintCliLogFileFormat()),\n                context.RepoRootPath);\n\n        context.Information(\"{0} issues are found.\", issues.Count());\n    }\n}\n
"},{"location":"documentation/issue-providers/markdownlint/features/","title":"Features","text":"

The Cake.Issues.Markdownlint addin provides the following features.

Tip: Running markdownlint

markdownlint-cli can be run with the Cake.Markdownlint addin.

"},{"location":"documentation/issue-providers/markdownlint/features/#basic-features","title":"Basic features","text":"
  • Reads warnings from Markdownlint logfiles.
  • Provides URLs for all issues.
  • Support for custom URL resolving using the MarkdownlintAddRuleUrlResolver alias (except for MarkdownlintCliJsonLogFileFormat).
"},{"location":"documentation/issue-providers/markdownlint/features/#supported-log-file-formats","title":"Supported log file formats","text":"
  • MarkdownlintV1LogFileFormat alias for reading issues from Markdownlint output generated with options.resultVersion set to 1.
  • MarkdownlintCliLogFileFormat alias for reading issues from markdownlint-cli log files.
  • MarkdownlintCliJsonLogFileFormat alias for reading issues from markdownlint-cli log files created with the --json parameter.
"},{"location":"documentation/issue-providers/markdownlint/features/#supported-iissue-properties","title":"Supported IIssue properties","text":"
  • IIssue.ProviderType
  • IIssue.ProviderName
  • IIssue.Run (1)
  • IIssue.Identifier (2)
  • IIssue.ProjectName
  • IIssue.ProjectFileRelativePath
  • IIssue.AffectedFileRelativePath
  • IIssue.Line
  • IIssue.EndLine
  • IIssue.Column (3)
  • IIssue.EndColumn
  • IIssue.FileLink (4)
  • IIssue.MessageText
  • IIssue.MessageHtml
  • IIssue.MessageMarkdown
  • IIssue.Priority (5)
  • IIssue.PriorityName (6)
  • IIssue.Rule
  • IIssue.RuleUrl (7)
  1. Can be set while reading issues
  2. Set to IIssue.MessageText
  3. Only for MarkdownlintCliLogFileFormat
  4. Can be set while reading issues
  5. Always IssuePriority.Warning
  6. Always Warning
  7. Support for custom rules can be added through a custom MarkdownlintAddRuleUrlResolver except for MarkdownlintCliJsonLogFileFormat
"},{"location":"documentation/issue-providers/msbuild/","title":"MsBuild","text":"

Support for reading warnings reported by MsBuild is implemented in the Cake.Issues.MsBuild.

  • Features
  • Examples
  • API
"},{"location":"documentation/issue-providers/msbuild/examples/","title":"Examples","text":"

To read issues from MsBuild log files you need to import the MsBuild issue provider needs to be imported:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.MsBuild&version=5.0.1\n

Note

In addition to the MsBuild issue provider the Cake.Issues core addin needs to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.MsBuild\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

The following example contains a task which will call MsBuild to build the solution and write a binary log file and a task to read issues from the binary log file and write the number of warnings to the console:

Cake .NET ToolCake Frosting build.cake
var logPath = @\"c:\\build\\msbuild.xml\";\nvar repoRootPath = MakeAbsolute(Directory(\"./\"));\n\nTask(\"Build-Solution\").Does(() =>\n{\n    // Build solution.\n    var msBuildSettings =\n        new DotNetMSBuildSettings().WithLogger(\n            \"BinaryLogger,\" + Context.Tools.Resolve(\"Cake.Issues.MsBuild*/**/StructuredLogger.dll\"),\n            \"\",\n            logPath.FullPath);\n    DotNetBuild(\n        repoRootPath.CombineWithFilePath(\"MySolution.sln\").FullPath,\n        new DotNetBuildSettings{MSBuildSettings = msBuildSettings});\n});\n\nTask(\"Read-Issues\")\n    .IsDependentOn(\"Build-Solution\")\n    .Does(() =>\n    {\n        // Read issues.\n        var issues =\n            ReadIssues(\n                MsBuildIssuesFromFilePath(\n                    logPath,\n                    MsBuildBinaryLogFileFormat),\n                repoRootPath);\n\n        Information(\"{0} issues are found.\", issues.Count());\n});\n
Program.cs
using Cake.Common.Diagnostics;\nusing Cake.Common.IO;\nusing Cake.Common.Tools.DotNet;\nusing Cake.Common.Tools.DotNet.Build;\nusing Cake.Core;\nusing Cake.Core.IO;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .UseContext<BuildContext>()\n            .Run(args);\n    }\n}\n\npublic class BuildContext(ICakeContext context) : FrostingContext(context)\n{\n    public FilePath LogPath { get; } = @\"c:\\build\\msbuild.xml\";\n    public DirectoryPath RepoRootPath { get; } =\n        context.MakeAbsolute(context.Directory(\"./\"));\n}\n\n[TaskName(\"Build-Solution\")]\npublic sealed class BuildSolutionTask : FrostingTask<BuildContext>\n{\n    public override void Run(BuildContext context)\n    {\n        // Build solution.\n        var msBuildSettings =\n            new DotNetMSBuildSettings().WithLogger(\n                \"BinaryLogger,\" + context.Tools.Resolve(\"Cake.Issues.MsBuild*/**/StructuredLogger.dll\"),\n                \"\",\n                context.LogPath.FullPath);\n        context.DotNetBuild(\n            context.RepoRootPath.CombineWithFilePath(\"MySolution.sln\").FullPath,\n            new DotNetBuildSettings{MSBuildSettings = msBuildSettings});\n    }\n}\n\n[TaskName(\"Read-Issues\")]\n[IsDependentOn(typeof(BuildSolutionTask))]\npublic sealed class ReadIssuesTask : FrostingTask<BuildContext>\n{\n    public override void Run(BuildContext context)\n    {\n        // Read issues.\n        var issues =\n            context.ReadIssues(\n                context.MsBuildIssuesFromFilePath(\n                    context.LogPath,\n                    context.MsBuildBinaryLogFileFormat()),\n                context.RepoRootPath);\n\n        context.Information(\"{0} issues are found.\", issues.Count());\n    }\n}\n

Tip

When using MSBuildSettings.BinaryLogger property to write a binary log, the version of the binary log format written depends on the version of the .NET SDK.

To avoid the risk of breaking builds when the .NET SDK is updated and introduces a new binary log format, which is not supported in the used version of Cake.Issues.MsBuild, the binary logger instance shipped as part of Cake.Issues.MsBuild is used in the above example.

"},{"location":"documentation/issue-providers/msbuild/features/","title":"Features","text":"

The Cake.Issues.MsBuild addin provides the following features.

Tip: Running MSBuild

MSBuild can be run using the DotNet aliases or MsBuild aliases.

"},{"location":"documentation/issue-providers/msbuild/features/#basic-features","title":"Basic features","text":"
  • Reads errors and warnings from MSBuild log files.
  • Provides URLs for all code analysis (CA*) and StyleCop (SA*) warnings.
  • Support for custom URL resolving using the MsBuildAddRuleUrlResolver alias.
"},{"location":"documentation/issue-providers/msbuild/features/#supported-log-file-formats","title":"Supported log file formats","text":"
  • MsBuildBinaryLogFileFormat alias for reading issues from binary log files.
  • MsBuildXmlFileLoggerFormat alias for reading issues from log files created by MSBuild Extension Pack XmlFileLogger.
"},{"location":"documentation/issue-providers/msbuild/features/#supported-iissue-properties","title":"Supported IIssue properties","text":"
  • IIssue.ProviderType
  • IIssue.ProviderName
  • IIssue.Run (1)
  • IIssue.Identifier (2)
  • IIssue.ProjectName
  • IIssue.ProjectFileRelativePath
  • IIssue.AffectedFileRelativePath
  • IIssue.Line
  • IIssue.EndLine
  • IIssue.Column (3)
  • IIssue.EndColumn
  • IIssue.FileLink (4)
  • IIssue.MessageText
  • IIssue.MessageHtml
  • IIssue.MessageMarkdown
  • IIssue.Priority
  • IIssue.PriorityName
  • IIssue.Rule
  • IIssue.RuleUrl (5)
  1. Can be set while reading issues
  2. Set to IIssue.MessageText
  3. Only for MsBuildXmlFileLoggerFormat
  4. Can be set while reading issues
  5. For code analysis (CA*) and StyleCop (SA*) warnings. Support for additional rules can be added through a custom MsBuildAddRuleUrlResolver
"},{"location":"documentation/issue-providers/sarif/","title":"Sarif","text":"

Support for reading issues in SARIF format is implemented in the Cake.Issues.Sarif addin.

  • Features
  • API
"},{"location":"documentation/issue-providers/sarif/features/","title":"Features","text":"

The Cake.Issues.Sarif addin provides the following features.

"},{"location":"documentation/issue-providers/sarif/features/#basic-features","title":"Basic features","text":"
  • Reads issues from files in SARIF format.
"},{"location":"documentation/issue-providers/sarif/features/#supported-iissue-properties","title":"Supported IIssue properties","text":"
  • IIssue.ProviderType
  • IIssue.ProviderName
  • IIssue.Run (1)
  • IIssue.Identifier (2)
  • IIssue.ProjectName
  • IIssue.ProjectFileRelativePath
  • IIssue.AffectedFileRelativePath
  • IIssue.Line
  • IIssue.EndLine
  • IIssue.Column
  • IIssue.EndColumn
  • IIssue.FileLink (3)
  • IIssue.MessageText
  • IIssue.MessageHtml
  • IIssue.MessageMarkdown
  • IIssue.Priority
  • IIssue.PriorityName
  • IIssue.Rule
  • IIssue.RuleUrl
  1. Can be set while reading issues
  2. Set to IIssue.MessageText
  3. Can be set while reading issues
"},{"location":"documentation/issue-providers/terraform/","title":"Terraform","text":"

Support for reading issues reported by Terraform validate command is implemented in the Cake.Issues.Terraform addin.

  • Features
  • API
"},{"location":"documentation/issue-providers/terraform/features/","title":"Features","text":"

The Cake.Issues.Terraform addin provides the following features.

Tip: Running Terraform

Terraform can be run with Cake.Terraform addin.

"},{"location":"documentation/issue-providers/terraform/features/#basic-features","title":"Basic features","text":"
  • Reads warnings from Terraform validate command.
"},{"location":"documentation/issue-providers/terraform/features/#supported-iissue-properties","title":"Supported IIssue properties","text":"
  • IIssue.ProviderType
  • IIssue.ProviderName
  • IIssue.Run (1)
  • IIssue.Identifier (2)
  • IIssue.ProjectName
  • IIssue.ProjectFileRelativePath
  • IIssue.AffectedFileRelativePath
  • IIssue.Line
  • IIssue.EndLine
  • IIssue.Column
  • IIssue.EndColumn
  • IIssue.FileLink (3)
  • IIssue.MessageText
  • IIssue.MessageHtml
  • IIssue.MessageMarkdown
  • IIssue.Priority
  • IIssue.PriorityName
  • IIssue.Rule
  • IIssue.RuleUrl
  1. Can be set while reading issues
  2. Set to IIssue.MessageText
  3. Can be set while reading issues
"},{"location":"documentation/pull-request-systems/","title":"Pull Request Systems","text":"

Pull request addins implement specific Pull Request Systems and allow the Cake Issues addin to write found issues as comments to pull requests.

  • AppVeyor \u2013 Integration with AppVeyor builds
  • Azure DevOps \u2013 Integration with Azure DevOps pull requests
  • GitHub Actions \u2013 Integration with GitHub Actions

Tip

See How to implement pull request systems for instruction on how to implement support for additional pull request systems.

"},{"location":"documentation/pull-request-systems/appveyor/","title":"AppVeyor","text":"

Support for AppVeyor is implemented in the Cake.Issues.PullRequests.AppVeyor addin.

  • Features
  • Examples
  • API
"},{"location":"documentation/pull-request-systems/appveyor/features/","title":"Features","text":"

The Cake.Issues.PullRequests.AppVeyor addin reports issues as messages to AppVeyor builds.

Info

There's a demo repository available which you can fork and to which you can create pull requests to test the integration functionality.

"},{"location":"documentation/pull-request-systems/appveyor/features/#basic-features","title":"Basic features","text":"
  • Reports issues as messages to AppVeyor builds.
  • Messages can be written as comment to GitHub pull requests. See GitHub pull request integration for an example.
"},{"location":"documentation/pull-request-systems/appveyor/features/#supported-capabilities","title":"Supported capabilities","text":"

The Cake.Issues.PullRequests.AppVeyor addin doesn't support any additional capabilities.

  • Checking commit ID
  • Discussion threads
  • Filtering by modified files
"},{"location":"documentation/pull-request-systems/appveyor/examples/","title":"Examples","text":"
  • Writting Messages To AppVeyor
  • GitHub PullRequest Integration

Info

There's a demo repository available which you can fork and to which you can create pull requests to test the integration functionality.

"},{"location":"documentation/pull-request-systems/appveyor/examples/github-pullrequest-integration/","title":"GitHub pull request integration","text":"

This example shows how to write AppVeyor messages created by Cake.Issues to GitHub pull requests.

Issues reported as messages to AppVeyor builds can be written to a GitHub pull request using GitHub Pull Request Notification in your appveyor.yml file.

The following example will write a comment to the GitHub pull request containing all issues which were posted as message to the AppVeyor build:

notifications:\n- provider: GitHubPullRequest\n  template: \"{{#passed}}:white_check_mark:{{/passed}}{{#failed}}:x:{{/failed}} [Build {{&projectName}} {{buildVersion}} {{status}}]({{buildUrl}}) (commit {{commitUrl}} by @{{&commitAuthorUsername}})<p>Build messages:</p><ul>{{#jobs}}{{#messages}}<li>{{message}}<br/>{{details}}</li>{{/messages}}{{/jobs}}</ul>\"\n

The output will look similar to this:

"},{"location":"documentation/pull-request-systems/appveyor/examples/write-messages/","title":"Writing message to AppVeyor","text":"

To report issues as messages to an AppVeyor build, the AppVeyor addin needs to be imported. For this example the JetBrains InspectCode issue provider is additionally used for reading issues:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.InspectCode&version=5.0.1\n#addin nuget:?package=Cake.Issues.PullRequests&version=5.0.1\n#addin nuget:?package=Cake.Issues.PullRequests.AppVeyor&version=5.0.1\n

Note

In addition to the AppVeyor pull request system the Cake.Issues and Cake.Issues.PullRequests core addins need to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.InspectCode\" Version=\"5.0.1\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.PullRequests.AppVeyor\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

This example shows how to report issues as messages to an AppVeyor build using the AppVeyorBuilds alias:

Cake .NET ToolCake Frosting build.cake
Task(\"Report-IssuesToAppVeyor\").Does(() =>\n{\n    var repoRootPath = MakeAbsolute(Directory(\"./\"));\n\n    ReportIssuesToPullRequest(\n        InspectCodeIssuesFromFilePath(\n            @\"C:\\build\\inspectcode.log\"),\n        AppVeyorBuilds(),\n        repoRootPath);\n});\n
Program.cs
using Cake.Common.IO;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"Report-IssuesToAppVeyor\")]\npublic sealed class ReportIssuesToAppVeyorTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        var repoRootPath = context.MakeAbsolute(context.Directory(\"./\"));\n\n        context.ReportIssuesToPullRequest(\n            context.InspectCodeIssuesFromFilePath(\n                @\"C:\\build\\inspectcode.log\"),\n            context.AppVeyorBuilds(),\n            repoRootPath);\n    }\n}\n

The output will look similar to this:

"},{"location":"documentation/pull-request-systems/azure-devops/","title":"Azure DevOps","text":"

Support for Azure DevOps is implemented in the Cake.Issues.PullRequests.AzureDevOps addin.

  • Features
  • Setup
  • Examples
  • API
"},{"location":"documentation/pull-request-systems/azure-devops/features/","title":"Features","text":"

The Cake.Issues.PullRequests.AzureDevOps addin provides the following features.

Info

There's a demo repository available which you can fork and to which you can create pull requests to test the integration functionality.

"},{"location":"documentation/pull-request-systems/azure-devops/features/#basic-features","title":"Basic features","text":"
  • Writes issues as comments to Azure DevOps pull requests.
  • Identification of pull requests through source branch or pull request ID.
  • Comments written by the addin will be rendered with a specific icon corresponding to the state of the issue.
  • Adds rule number and, if provided by the issue provider, link to the rule description to the comment.
  • Support for issues messages formatted in Markdown format.
"},{"location":"documentation/pull-request-systems/azure-devops/features/#supported-capabilities","title":"Supported capabilities","text":"

The Cake.Issues.PullRequests.AzureDevOps addin supports the following capabilities.

  • Checking commit ID
  • Discussion threads
  • Filtering by modified files
"},{"location":"documentation/pull-request-systems/azure-devops/features/#supported-authentication-methods","title":"Supported authentication methods","text":"Azure DevOps Server Azure DevOps Service Authentication method NTLM Basic authentication Personal access token OAuth Azure Active Directory

For detailed instructions how to connect using the different methods see Setup instructions.

"},{"location":"documentation/pull-request-systems/azure-devops/setup/","title":"Setup","text":"

This page describes the different ways how the Cake.Issues.PullRequests.AzureDevOps addin can be setup.

"},{"location":"documentation/pull-request-systems/azure-devops/setup/#ntlm-authentication","title":"NTLM authentication","text":"

Info

NTLM authentication is only available for on-premise Azure DevOps Server.

To authenticate with NTLM you can use the AzureDevOpsAuthenticationNtlm alias from the Cake.AzureDevOps addin.

The user needs to have Contribute to pull requests permission for the specific repository to allow Cake.Issues.PullRequests.AzureDevOps addin to post issues as comments to pull requests.

"},{"location":"documentation/pull-request-systems/azure-devops/setup/#basic-authentication","title":"Basic authentication","text":"

Info

Basic authentication is only available for on-premise Azure DevOps Server.

To authenticate with basic authentication you can use the AzureDevOpsAuthenticationBasic alias from the Cake.AzureDevOps addin and need to Configure Azure DevOps Server to use Basic Authentication.

The user needs to have Contribute to pull requests permission for the specific repository to allow Cake.Issues.PullRequests.AzureDevOps addin to post issues as comments to pull requests.

"},{"location":"documentation/pull-request-systems/azure-devops/setup/#personal-access-token","title":"Personal access token","text":"

To authenticate with an personal access token you can use the AzureDevOpsAuthenticationPersonalAccessToken alias from the Cake.AzureDevOps addin.

If you want to use the Cake.Issues.PullRequests.AzureDevOps addin with an personal access token see Authenticate access with personal access tokens for Azure DevOps for instructions how to create a personal access token.

The access token needs to have the scope Code (read and write) set and the user needs to have Contribute to pull requests permission for the specific repository to allow Cake.Issues.PullRequests.AzureDevOps addin to post issues as comments to pull requests.

"},{"location":"documentation/pull-request-systems/azure-devops/setup/#oauth-authentication-from-azure-pipelines","title":"OAuth authentication from Azure Pipelines","text":"

Info

OAuth authentication is only available for Azure DevOps Service.

If you want to use the Cake.Issues.PullRequests.AzureDevOps addin from an Azure Pipelines you can authenticate using the OAuth token provided to the build. For this you need to enable the Allow scripts to access the OAuth token option on the build definition.

To authenticate you can use the AzureDevOpsAuthenticationOAuth alias from the Cake.AzureDevOps addin.

The user under which the build runs, named <projectName> Build Service (<organizationName>) (e.g. Cake.Issues-Demo Build Service (cake-contrib)), needs to have Contribute to pull requests permission for the specific repository to allow Cake.Issues.PullRequests.AzureDevOps addin to post issues as comments to pull requests.

"},{"location":"documentation/pull-request-systems/azure-devops/setup/#entra-authentication","title":"Entra authentication","text":"

Info

Entra authentication is only available for Azure DevOps Service.

To authenticate with Entra ID you can use the AzureDevOpsAuthenticationAzureActiveDirectory alias from the Cake.AzureDevOps addin.

The user needs to have Contribute to pull requests permission for the specific repository to allow Cake.Issues.PullRequests.AzureDevOps addin to post issues as comments to pull requests.

"},{"location":"documentation/pull-request-systems/azure-devops/examples/","title":"Examples","text":"
  • Using With Pull Request ID
  • Using With Repository Remote URL And Source Branch Name
  • Using With Azure Pipelines

Info

There's a demo repository available which you can fork and to which you can create pull requests to test the integration functionality.

"},{"location":"documentation/pull-request-systems/azure-devops/examples/azure-pipelines/","title":"Using with Azure Pipelines","text":"

To write issues as comments to Azure DevOps pull requests, the Azure DevOps addin needs to be imported. For this example the JetBrains InspectCode issue provider is additionally used for reading issues:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.InspectCode&version=5.0.1\n#addin nuget:?package=Cake.Issues.PullRequests&version=5.0.1\n#addin nuget:?package=Cake.Issues.PullRequests.AzureDevOps&version=5.0.1\n#addin nuget:?package=Cake.AzureDevOps&version=1.0.0\n

Note

In addition to the Azure DevOps pull request system the Cake.Issues and Cake.Issues.PullRequests core addins and the Cake.AzureDevOps addin need to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.InspectCode\" Version=\"5.0.1\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.PullRequests.AzureDevOps\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

The following example shows a task which will call the AzureDevOpsPullRequests alias to connect to the pull request using the environment variables provided by Azure Pipelines.:

Cake .NET ToolCake Frosting build.cake
Task(\"Report-IssuesToPullRequest\").Does(() =>\n{\n    var repoRootFolder =\n        MakeAbsolute(Directory(\"./\"));\n\n    ReportIssuesToPullRequest(\n        InspectCodeIssuesFromFilePath(\n            @\"C:\\build\\inspectcode.log\"),\n        AzureDevOpsPullRequests(),\n        repoRootPath);\n});\n
Program.cs
using Cake.Common.IO;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"Report-IssuesToPullRequest\")]\npublic sealed class ReportIssuesToPullRequestTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        var repoRootPath =\n            context.MakeAbsolute(context.Directory(\"./\"));\n\n        context.ReportIssuesToPullRequest(\n            context.InspectCodeIssuesFromFilePath(\n                @\"C:\\build\\inspectcode.log\"),\n            context.AzureDevOpsPullRequests(),\n            repoRootPath);\n    }\n}\n

Info

Please note that you'll need to setup your Azure Pipelines build to Allow scripts to access the OAuth token and need to setup proper permissions.

See OAuth authentication from Azure Pipelines for details.

"},{"location":"documentation/pull-request-systems/azure-devops/examples/pullrequest-id/","title":"Using with pull request id","text":"

To write issues as comments to Azure DevOps pull requests, the Azure DevOps addin needs to be imported. To determine the remote repository URL the Cake.Git addin can be used. For this example the JetBrains InspectCode issue provider is additionally used for reading issues:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Git&version=1.0.0\n#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.InspectCode&version=5.0.1\n#addin nuget:?package=Cake.Issues.PullRequests&version=5.0.1\n#addin nuget:?package=Cake.Issues.PullRequests.AzureDevOps&version=5.0.1\n#addin nuget:?package=Cake.AzureDevOps&version=1.0.0\n

Note

In addition to the Azure DevOps pull request system the Cake.Issues and Cake.Issues.PullRequests core addins and the Cake.AzureDevOps addin need to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Git\" Version=\"{{ cake_git }}\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.InspectCode\" Version=\"5.0.1\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.PullRequests.AzureDevOps\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

The following example shows a task which will first determine the remote repository URL and with this information call the AzureDevOpsPullRequests alias, which will authenticate through NTLM to an on-premise Azure DevOps Server instance:

Cake .NET ToolCake Frosting build.cake
Task(\"Report-IssuesToPullRequest\").Does(() =>\n{\n    var repoRootPath =\n        MakeAbsolute(Directory(\"./\"));\n    var currentBranch =\n        GitBranchCurrent(repoRootPath);\n    var repoRemoteUrl =\n        new Uri(currentBranch.Remotes.Single(x => x.Name == \"origin\").Url);\n    var pullRequestId = 123;\n\n    ReportIssuesToPullRequest(\n        InspectCodeIssuesFromFilePath(\n            @\"C:\\build\\inspectcode.log\"),\n        AzureDevOpsPullRequests(\n            repoRemoteUrl,\n            pullRequestId,\n            AzureDevOpsAuthenticationNtlm()),\n        repoRootPath);\n});\n
Program.cs
using Cake.Common.IO;\nusing Cake.Frosting;\nusing Cake.Git;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"Report-IssuesToPullRequest\")]\npublic sealed class ReportIssuesToPullRequestTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        var repoRootPath =\n            context.MakeAbsolute(context.Directory(\"./\"));\n        var currentBranch =\n            context.GitBranchCurrent(repoRootPath);\n        var repoRemoteUrl = \n            new Uri(currentBranch.Remotes.Single(x => x.Name == \"origin\").Url);\n        var pullRequestId = 123;\n\n        context.ReportIssuesToPullRequest(\n            context.InspectCodeIssuesFromFilePath(\n                @\"C:\\build\\inspectcode.log\"),\n            context.AzureDevOpsPullRequests(\n                repoRemoteUrl,\n                pullRequestId,\n                context.AzureDevOpsAuthenticationNtlm()),\n            repoRootPath);\n    }\n}\n
"},{"location":"documentation/pull-request-systems/azure-devops/examples/repository-information/","title":"Using with repository remote url and source branch name","text":"

To write issues as comments to Azure DevOps pull requests, the Azure DevOps addin needs to be imported. To determine the remote repository URL and source branch of the pull request the Cake.Git addin can be used. For this example the JetBrains InspectCode issue provider is additionally used for reading issues:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Git&version=1.0.0\n#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.InspectCode&version=5.0.1\n#addin nuget:?package=Cake.Issues.PullRequests&version=5.0.1\n#addin nuget:?package=Cake.Issues.PullRequests.AzureDevOps&version=5.0.1\n#addin nuget:?package=Cake.AzureDevOps&version=1.0.0\n

Note

In addition to the Azure DevOps pull request system the Cake.Issues and Cake.Issues.PullRequests core addins and the Cake.AzureDevOps addin need to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Git\" Version=\"1.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.InspectCode\" Version=\"5.0.1\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.PullRequests.AzureDevOps\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

The following example shows a task which will first determine the remote repository URL and source branch of the pull request and with this information call the AzureDevOpsPullRequests alias, which will authenticate through NTLM to an on-premise Azure DevOps Server instance:

Cake .NET ToolCake Frosting build.cake
Task(\"Report-IssuesToPullRequest\").Does(() =>\n{\n    var repoRootFolder =\n        MakeAbsolute(Directory(\"./\"));\n    var currentBranch =\n        GitBranchCurrent(repoRootFolder);\n    var repoRemoteUrl =\n        new Uri(currentBranch.Remotes.Single(x => x.Name == \"origin\").Url);\n    var sourceBranchName = currentBranch.CanonicalName;\n\n    ReportIssuesToPullRequest(\n        InspectCodeIssuesFromFilePath(\n            @\"C:\\build\\inspectcode.log\"),\n        AzureDevOpsPullRequests(\n            repoRemoteUrl,\n            sourceBranchName,\n            AzureDevOpsAuthenticationNtlm()),\n        repoRootFolder);\n});\n
Program.cs
using Cake.Common.IO;\nusing Cake.Frosting;\nusing Cake.Git;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"Report-IssuesToPullRequest\")]\npublic sealed class ReportIssuesToPullRequestTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        var repoRootPath =\n            context.MakeAbsolute(context.Directory(\"./\"));\n        var currentBranch =\n            context.GitBranchCurrent(repoRootPath);\n        var repoRemoteUrl = \n            new Uri(currentBranch.Remotes.Single(x => x.Name == \"origin\").Url);\n        var sourceBranchName = currentBranch.CanonicalName;\n\n        context.ReportIssuesToPullRequest(\n            context.InspectCodeIssuesFromFilePath(\n                @\"C:\\build\\inspectcode.log\"),\n            context.AzureDevOpsPullRequests(\n                repoRemoteUrl,\n                sourceBranchName,\n                context.AzureDevOpsAuthenticationNtlm()),\n            repoRootPath);\n    }\n}\n
"},{"location":"documentation/pull-request-systems/github-actions/","title":"GitHub Actions","text":"

Support for GitHub Actions is implemented in the Cake.Issues.PullRequests.GitHubActions addin.

  • Features
  • Examples
  • API
"},{"location":"documentation/pull-request-systems/github-actions/features/","title":"Features","text":"

The Cake.Issues.PullRequests.GitHubActions addin creates annotations from issues when running on GitHub actions.

"},{"location":"documentation/pull-request-systems/github-actions/features/#basic-features","title":"Basic features","text":"
  • Reports issues as annotations to GitHub Actions builds.
  • Group issues in log output by provider and run information.
"},{"location":"documentation/pull-request-systems/github-actions/features/#supported-capabilities","title":"Supported capabilities","text":"

The Cake.Issues.PullRequests.GitHubActions addin doesn't support any additional capabilities.

  • Checking commit ID
  • Discussion threads
  • Filtering by modified files
"},{"location":"documentation/pull-request-systems/github-actions/examples/","title":"Examples","text":"
  • Create Annotations In GitHub Actions
"},{"location":"documentation/pull-request-systems/github-actions/examples/write-annotations/","title":"Create annotations in GitHub Actions","text":"

To report issues as annotations to a GitHub Actions build, the GitHub Actions addin needs to be imported. For this example the JetBrains InspectCode issue provider is additionally used for reading issues:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.InspectCode&version=5.0.1\n#addin nuget:?package=Cake.Issues.PullRequests&version=5.0.1\n#addin nuget:?package=Cake.Issues.PullRequests.GitHubActions&version=5.0.1\n

Note

In addition to the GitHub Actions pull request system the Cake.Issues and Cake.Issues.PullRequests core addins need to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.InspectCode\" Version=\"5.0.1\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.PullRequests.GitHubActions\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

This example shows how to report issues as annotations to GitHubActions build using the GitHubActionsBuilds alias:

Cake .NET ToolCake Frosting build.cake
Task(\"ReportIssuesToGitHubActions\").Does(() =>\n{\n    var repoRootPath = MakeAbsolute(Directory(\"./\"));\n\n    ReportIssuesToPullRequest(\n        InspectCodeIssuesFromFilePath(\n            @\"C:\\build\\inspectcode.log\"),\n        GitHubActionsBuilds(),\n        repoRootFolder);\n});\n
Program.cs
using Cake.Common.IO;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"Report-IssuesToAppVeyor\")]\npublic sealed class ReportIssuesToAppVeyorTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        var repoRootPath = context.MakeAbsolute(context.Directory(\"./\"));\n\n        context.ReportIssuesToPullRequest(\n            context.InspectCodeIssuesFromFilePath(\n                @\"C:\\build\\inspectcode.log\"),\n            context.GitHubActionsBuilds(),\n            repoRootPath);\n    }\n}\n

The output will show up in the build log grouped by issue provider / run:

Additionally the issues show up as annotations:

Having issues available as annotations also means that they will be shown in pull requests on the related file / position:

"},{"location":"documentation/recipe/","title":"Overview","text":"

Cake.Issues recipes provide build scripts, delivered as a NuGet package, which can be used inside your projects Cake build to add issue management.

Integration of code analyzing and linting tools into a build pipeline often looks the similar, and differentiates mainly on the used linters, build and pull request systems. Cake.Issues recipes contain code to do all the parsing, integration with build and pull request systems for you, using the individual Cake.Issues addins. They support different linters based on the linting log files you pass it and integrate automatically with different build and pull request systems.

There are two flavors available:

  • Cake.Issues.Recipe

    For Cake .NET Tool

  • Cake.Frosting.Issues.Recipe

    For Cake Frosting

"},{"location":"documentation/recipe/#supported-tools","title":"Supported tools","text":"

See supported tools for a list of supported linters, build servers and pull request systems.

"},{"location":"documentation/recipe/#bundled-addins","title":"Bundled addins","text":"

Cake.Issues recipes will add the following addins to your build:

Cake.Issues.RecipeCake.Frosting.Issues.Recipe Addin Version Remarks Cake.Git 5.0.1 Only used if RepositoryInfoProvider type is set to RepositoryInfoProviderType.CakeGit. See Git repository information configuration for details. Cake.Issues 5.0.1 Cake.Issues.MsBuild 5.0.1 Cake.Issues.InspectCode 5.0.1 Cake.Issues.Markdownlint 5.0.1 Cake.Issues.EsLint 5.0.1 Cake.Issues.Sarif 5.0.1 Cake.Issues.Reporting 5.0.1 Cake.Issues.Reporting.Generic 5.0.1 Cake.Issues.Reporting.Sarif 5.0.1 Cake.Issues.PullRequests 5.0.1 Cake.Issues.PullRequests.AppVeyor 5.0.1 Cake.Issues.PullRequests.AzureDevOps 5.0.1 Cake.Issues.PullRequests.GitHubActions 5.0.1 Cake.AzureDevOps 5.0.0 Addin Version Remarks Cake.Frosting.Git 5.0.1 Only used if RepositoryInfoProvider type is set to RepositoryInfoProviderType.CakeGit. See Git repository information configuration for details. Cake.Issues 5.0.1 Cake.Frosting.Issues.MsBuild 5.0.1 Cake.Frosting.Issues.InspectCode 5.0.1 Cake.Frosting.Issues.Markdownlint 5.0.1 Cake.Frosting.Issues.EsLint 5.0.1 Cake.Frosting.Issues.Sarif 5.0.1 Cake.Frosting.Issues.Reporting 5.0.1 Cake.Frosting.Issues.Reporting.Generic 5.0.1 Cake.Frosting.Issues.Reporting.Sarif 5.0.1 Cake.Frosting.Issues.PullRequests 5.0.1 Cake.Frosting.Issues.PullRequests.AppVeyor 5.0.1 Cake.Frosting.Issues.PullRequests.AzureDevOps 5.0.1 Cake.Frosting.Issues.PullRequests.GitHubActions 5.0.1 Cake.AzureDevOps 5.0.0"},{"location":"documentation/recipe/configuration/","title":"Configuration","text":"

This page lists configuration properties which can be used to define the functionality and behavior of Cake.Issues recipes.

"},{"location":"documentation/recipe/configuration/#git-repository-information","title":"Git repository information","text":"

Cake.Issues recipes require some information about current Git repository.

To define the Git provider in Cake.Issues.Recipe set the global variable RepositoryInfoProvider. To define the Git provider in Cake.Frosting.Issues.Recipe pass the value to the constructor of IssueContext.

The following providers are supported:

Provider Description RepositoryInfoProviderType.CakeGit Read repository information using Cake.Git addin. Requires system to be compatible with Cake.Git addin. RepositoryInfoProviderType.Cli Read repository information using Git CLI. Requires Git CLI to be available in path.

By default Cake.Git addin will be used.

"},{"location":"documentation/recipe/configuration/#general","title":"General","text":"Cake.Issues.RecipeCake.Frosting.Issues.Recipe IssuesParameters Property Default Value Description OutputDirectory BuildArtifacts Path to the output directory. A relative path will be relative to the current working directory. BuildIdentifier string.Empty Identifier for the build run. If set this identifier will be used to identify to artifacts provided by the build if building on multiple configurations. IssuesContext.Parameters Property Default Value Description OutputDirectory BuildArtifacts Path to the output directory. A relative path will be relative to the current working directory. BuildIdentifier string.Empty Identifier for the build run. If set this identifier will be used to identify to artifacts provided by the build if building on multiple configurations."},{"location":"documentation/recipe/configuration/#input-files","title":"Input files","text":"Cake.Issues.RecipeCake.Frosting.Issues.Recipe IssuesParameters.InputFiles Methods Description AddMsBuildXmlFileLoggerLogFilePath() Adds a path to a MSBuild log file created by XmlFileLogger. AddMsBuildXmlFileLoggerLogFileContent() Adds content of a MSBuild log file created by XmlFileLogger. AddMsBuildBinaryLogFilePath() Adds a path to a MSBuild binary log file. AddMsBuildBinaryLogFileContent() Adds content of a MSBuild binary log file. AddInspectCodeLogFilePath() Adds a path to a JetBrains InspectCode log file. AddInspectCodeLogFileContent() Adds content of a JetBrains InspectCode log file. AddMarkdownlintCliLogFilePath() Adds a path to a markdownlint-cli log file. AddMarkdownlintCliLogFileContent() Adds content of a markdownlint-cli log file. AddMarkdownlintCliJsonLogFilePath() Adds a path to a markdownlint-cli log file writting with --json. AddMarkdownlintCliJsonLogFileContent() Adds content of a markdownlint-cli log file writting with --json. AddMarkdownlintV1LogFilePath() Adds a path to a markdownlint log file in version 1. AddMarkdownlintV1LogFileContent() Adds content of a markdownlint log file in version 1. AddEsLintJsonLogFilePath() Adds a path to a ESLint log file generated by the ESLint json formatter. AddEsLintJsonLogFileContent() Adds content of a ESLint log file generated by the ESLint json formatter. AddSarifLogFilePath() Adds a path to a SARIF log file. AddSarifLogFileContent() Adds content of a SARIF log file. IssuesContext.Parameters.InputFiles Methods Description AddMsBuildXmlFileLoggerLogFilePath() Adds a path to a MSBuild log file created by XmlFileLogger. AddMsBuildXmlFileLoggerLogFileContent() Adds content of a MSBuild log file created by XmlFileLogger. AddMsBuildBinaryLogFilePath() Adds a path to a MSBuild binary log file. AddMsBuildBinaryLogFileContent() Adds content of a MSBuild binary log file. AddInspectCodeLogFilePath() Adds a path to a JetBrains InspectCode log file. AddInspectCodeLogFileContent() Adds content of a JetBrains InspectCode log file. AddMarkdownlintCliLogFilePath() Adds a path to a markdownlint-cli log file. AddMarkdownlintCliLogFileContent() Adds content of a markdownlint-cli log file. AddMarkdownlintCliJsonLogFilePath() Adds a path to a markdownlint-cli log file writting with --json. AddMarkdownlintCliJsonLogFileContent() Adds content of a markdownlint-cli log file writting with --json. AddMarkdownlintV1LogFilePath() Adds a path to a markdownlint log file in version 1. AddMarkdownlintV1LogFileContent() Adds content of a markdownlint log file in version 1. AddEsLintJsonLogFilePath() Adds a path to a ESLint log file generated by the ESLint json formatter. AddEsLintJsonLogFileContent() Adds content of a ESLint log file generated by the ESLint json formatter. AddSarifLogFilePath() Adds a path to a SARIF log file. AddSarifLogFileContent() Adds content of a SARIF log file."},{"location":"documentation/recipe/configuration/#report-creation","title":"Report creation","text":"Cake.Issues.RecipeCake.Frosting.Issues.Recipe IssuesParameters.Reporting Property Default Value Description ShouldCreateFullIssuesReport true Indicates whether full issues report should be created. FullIssuesReportSettings GenericIssueReportTemplate.HtmlDxDataGrid template with DevExtremeTheme.MaterialBlueLight theme. Settings for creating the full issues report. See Template Gallery for possible options. ShouldCreateSarifReport true Indicates whether a report in SARIF format should be created. ShouldReportIssuesToConsole false Indicates whether issues should be reported to the console. ReportToConsoleSettings Settings for reporting issues to the console. IssuesContext.Parameters.Reporting Property Default Value Description ShouldCreateFullIssuesReport true Indicates whether full issues report should be created. FullIssuesReportSettings GenericIssueReportTemplate.HtmlDxDataGrid template with DevExtremeTheme.MaterialBlueLight theme. Settings for creating the full issues report. See Template Gallery for possible options. ShouldCreateSarifReport true Indicates whether a report in SARIF format should be created. ShouldReportIssuesToConsole false Indicates whether issues should be reported to the console. ReportToConsoleSettings Settings for reporting issues to the console."},{"location":"documentation/recipe/configuration/#build-server-integration","title":"Build server integration","text":"Cake.Issues.RecipeCake.Frosting.Issues.Recipe IssuesParameters.BuildServer Property Default Value Description ShouldReportIssuesToBuildServer true Indicates whether issues should be reported to the build server. ShouldPublishFullIssuesReport true Indicates whether full issues report should be published as artifact to the build system. ShouldPublishSarifReport true Indicates whether report int SARIF format shoudl be published as artifact to the build system. ShouldCreateSummaryIssuesReport true Indicates whether summary issues report should be created. IssuesContext.Parameters.BuildServer Property Default Value Description ShouldReportIssuesToBuildServer true Indicates whether issues should be reported to the build server. ShouldPublishFullIssuesReport true Indicates whether full issues report should be published as artifact to the build system. ShouldPublishSarifReport true Indicates whether report int SARIF format shoudl be published as artifact to the build system. ShouldCreateSummaryIssuesReport true Indicates whether summary issues report should be created."},{"location":"documentation/recipe/configuration/#pull-request-integration","title":"Pull request integration","text":"Cake.Issues.RecipeCake.Frosting.Issues.Recipe IssuesParameters.PullRequestSystem Property Default Value Description ShouldReportIssuesToPullRequest true Indicates whether issues should be reported to the pull request system. MaxIssuesToPost null Global number of issues which should be posted at maximum over all issue provider. Issues are filtered by priority and issues with a file path are prioritized. null won't set a global limit. MaxIssuesToPostAcrossRuns null Global number of issues which should be posted at maximum over all issue providers and across multiple runs. Issues are filtered by priority and issues with a file path are prioritized. null won't set a limit across multiple runs. MaxIssuesToPostForEachIssueProvider 100 Number of issues which should be posted at maximum for each issue provider. Issues are filtered by priority and issues with a file path are prioritized. null won't limit issues per issue provider. ProviderIssueLimits Empty Issue limits for individual issue provider. The key must be the IIssue.ProviderType of a specific provider to which the limits should be applied to. IssueFilters Empty List of filter functions which should be applied before posting issues to pull requests. ShouldSetPullRequestStatus true Indicates whether a status on the pull request should be set if there are any issues found. ShouldSetSeparatePullRequestStatusForEachIssueProviderAndRun true Indicates whether a separate status should be set for issues of every issue provider and run. IssuesContext.Parameters.PullRequestSystem Property Default Value Description ShouldReportIssuesToPullRequest true Indicates whether issues should be reported to the pull request system. MaxIssuesToPost null Global number of issues which should be posted at maximum over all issue provider. Issues are filtered by priority and issues with a file path are prioritized. null won't set a global limit. MaxIssuesToPostAcrossRuns null Global number of issues which should be posted at maximum over all issue providers and across multiple runs. Issues are filtered by priority and issues with a file path are prioritized. null won't set a limit across multiple runs. MaxIssuesToPostForEachIssueProvider 100 Number of issues which should be posted at maximum for each issue provider. Issues are filtered by priority and issues with a file path are prioritized. null won't limit issues per issue provider. ProviderIssueLimits Empty Issue limits for individual issue provider. The key must be the IIssue.ProviderType of a specific provider to which the limits should be applied to. IssueFilters Empty List of filter functions which should be applied before posting issues to pull requests. ShouldSetPullRequestStatus true Indicates whether a status on the pull request should be set if there are any issues found. ShouldSetSeparatePullRequestStatusForEachIssueProviderAndRun true Indicates whether a separate status should be set for issues of every issue provider and run."},{"location":"documentation/recipe/demos/","title":"Demos","text":"

There are demo setups available for different combinations of build servers and repositories which you can fork and to which you can create pull requests to test the recipe functionality.

Recipe Build Server Repository Cake.Issues.Recipe Azure Pipelines Azure Repos"},{"location":"documentation/recipe/supported-tools/","title":"Supported tools","text":"

Cake.Issues recipes support reading issues from different tools and integrates with different build and pull request systems.

"},{"location":"documentation/recipe/supported-tools/#tools","title":"Tools","text":"

Cake.Issues recipes support reading issues from output of the following tools:

Cake.Issues.RecipeCake.Frosting.Issues.Recipe Tool Format IssuesParameters.InputFiles Method MsBuild MSBuild Extension Pack XmlFileLogger AddMsBuildXmlFileLoggerLogFile*() MsBuild Binary Log File AddMsBuildBinaryLogFile*() JetBrains InspectCode (ReSharper) xml AddInspectCodeLogFile*() markdownlint markdownlint-cli default format AddMarkdownlintCliLogFile*() markdownlint markdownlint-cli with --json AddMarkdownlintCliJsonLogFile*() markdownlint markdownlint version 1 AddMarkdownlintV1LogFile*() ESLint json formatter AddEsLintJsonLogFile*() Any SARIF compatible tool SARIF AddSarifLogFile*() Tool Format IssuesContext.Parameters.InputFiles Method MsBuild MSBuild Extension Pack XmlFileLogger AddMsBuildXmlFileLoggerLogFile*() MsBuild Binary Log File AddMsBuildBinaryLogFile*() JetBrains InspectCode (ReSharper) xml AddInspectCodeLogFile*() markdownlint markdownlint-cli default format AddMarkdownlintCliLogFile*() markdownlint markdownlint-cli with --json AddMarkdownlintCliJsonLogFile*() markdownlint markdownlint version 1 AddMarkdownlintV1LogFile*() ESLint json formatter AddEsLintJsonLogFile*() Any SARIF compatible tool SARIF AddSarifLogFile*()

Tip

See Supported tools for a list of tools supporting the SARIF format.

"},{"location":"documentation/recipe/supported-tools/#build-systems","title":"Build systems","text":"

Cake.Issues recipes integrates with the following build systems:

AppVeyorAzure PipelinesGitHub Actions
  • Write issues to build server
  • Issues summary
  • Full issues report
  • Write issues to build server (1)
  • Issues summary
  • Full issues report
  1. Only first 10
  • Write issues to build server
  • Issues summary
  • Full issues report
"},{"location":"documentation/recipe/supported-tools/#pull-request-systems","title":"Pull request systems","text":"

Cake.Issues recipes integrates with the following pull request systems:

Azure ReposGitHub
  • Write issues to pull requests
  • Set pull request status
  • Write issues to pull requests (1)
  • Set pull request status
  1. When build from GitHub Actions
"},{"location":"documentation/recipe/tasks/","title":"Tasks","text":"

Cake.Issues recipes provide the following tasks to your build script:

Cake.Issues.RecipeCake.Frosting.Issues.Recipe Task Description IssuesBuildTasks property Issues Main tasks for issue management integration. IssuesTask Read-Issues Reads issues from the provided log files. ReadIssuesTask Create-FullIssuesReport Creates issue report. CreateFullIssuesReportTask Publish-IssuesArtifacts Publish artifacts to build server. PublishIssuesArtifactsTask Report-IssuesToBuildServer Report issues to build server. ReportIssuesToBuildServerTask Create-SummaryIssuesReport Creates a summary issue report. CreateSummaryIssuesReportTask Report-IssuesToPullRequest Report issues to pull request. ReportIssuesToPullRequestTask Set-PullRequestIssuesState Set pull request status. SetPullRequestIssuesStateTask Report-IssuesToConsole Report issues to console. ReportIssuesToConsoleTask Task Description Task type Issues Main tasks for issue management integration. Cake.Frosting.Issues.Recipe. IssuesTask Read-Issues Reads issues from the provided log files. Cake.Frosting.Issues.Recipe. ReadIssuesTask Create-FullIssuesReport Creates issue report. Cake.Frosting.Issues.Recipe. CreateFullIssuesReportTask Publish-IssuesArtifacts Publish artifacts to build server. Cake.Frosting.Issues.Recipe. PublishIssuesArtifactsTask Report-IssuesToBuildServer Report issues to build server. Cake.Frosting.Issues.Recipe. ReportIssuesToBuildServerTask Create-SummaryIssuesReport Creates a summary issue report. Cake.Frosting.Issues.Recipe. CreateSummaryIssuesReportTask Report-IssuesToPullRequest Report issues to pull request. Cake.Frosting.Issues.Recipe. ReportIssuesToPullRequestTask Set-PullRequestIssuesState Set pull request status. Cake.Frosting.Issues.Recipe. SetPullRequestIssuesStateTask Report-IssuesToConsole Report issues to console. Cake.Frosting.Issues.Recipe. ReportIssuesToConsoleTask"},{"location":"documentation/report-formats/","title":"Report Formats","text":"

Report format addins implement specific report formats and allow the Cake Issues addin to create reports in the specific format.

  • Console \u2013 Support for reporting issues to the console
  • Generic \u2013 Support for creating reports in any text based format (HTML, Markdown, ...)
  • Sarif \u2013 Support for creating reports in SARIF format

Tip

See How to implement report format for instruction on how to implement support for additional report formats.

"},{"location":"documentation/report-formats/console/","title":"Console","text":"

Support for printing issues to the console is implemented in the a Cake.Issues.Reporting.Console addin.

  • Features
  • Examples
  • API
"},{"location":"documentation/report-formats/console/examples/","title":"Examples","text":"

To report issues to the console the Console report format needs to be imported. For this example the MsBuild issue provider is additionally used for reading issues:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.MsBuild&version=5.0.1\n#addin nuget:?package=Cake.Issues.Reporting&version=5.0.1\n#addin nuget:?package=Cake.Issues.Reporting.Console&version=5.0.1\n

Note

In addition to the Console report format the Cake.Issues and Cake.Issues.Reporting core addins need to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.MsBuild\" Version=\"5.0.1\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.Reporting.Console\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

The following example will print issues logged as warnings by MsBuild to the console.

Cake .NET ToolCake Frosting build.cake
Task(\"Create-IssueReport\").Does(() =>\n{\n    var repoRootPath = MakeAbsolute(Directory(\"./\"));\n\n    // Build MySolution.sln solution in the repository root folder and write a binary log.\n    FilePath msBuildLogFile = @\"c:\\build\\msbuild.log\";\n    var msBuildSettings =\n        new DotNetMSBuildSettings().WithLogger(\n            \"BinaryLogger,\" + Context.Tools.Resolve(\"Cake.Issues.MsBuild*/**/StructuredLogger.dll\"),\n            \"\",\n            msBuildLogFile.FullPath);\n    DotNetBuild(\n        repoRootPath.CombineWithFilePath(\"MySolution.sln\").FullPath,\n        new DotNetBuildSettings{MSBuildSettings = msBuildSettings});\n\n    // Write issues to console.\n    CreateIssueReport(\n        MsBuildIssuesFromFilePath(\n            msBuildLogFile,\n            MsBuildBinaryLogFileFormat),\n        ConsoleIssueReportFormat(\n            new ConsoleIssueReportFormatSettings\n            {\n                GroupByRule = true,\n                ShowProviderSummary = true,\n                ShowPrioritySummary = true\n            }),\n        repoRootPath,\n        string.Empty);\n});\n
Program.cs
using Cake.Common.IO;\nusing Cake.Common.Tools.DotNet;\nusing Cake.Common.Tools.DotNet.Build;\nusing Cake.Common.Tools.DotNet.MSBuild;\nusing Cake.Core.IO;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"Create-IssueReport\")]\npublic sealed class CreateIssueReportTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        var repoRootPath = context.MakeAbsolute(context.Directory(\"./\"));\n\n        // Build MySolution.sln solution in the repository root folder and write a binary log.\n        FilePath msBuildLogFile = @\"c:\\build\\msbuild.log\";\n        var msBuildSettings =\n            new DotNetMSBuildSettings().WithLogger(\n                \"BinaryLogger,\" + context.Tools.Resolve(\"Cake.Issues.MsBuild*/**/StructuredLogger.dll\"),\n                \"\",\n                msBuildLogFile.FullPath);\n        context.DotNetBuild(\n            repoRootPath.CombineWithFilePath(\"MySolution.sln\").FullPath,\n            new DotNetBuildSettings{MSBuildSettings = msBuildSettings});\n\n        // Write issues to console.\n        context.CreateIssueReport(\n            context.MsBuildIssuesFromFilePath(\n                msBuildLogFile,\n                context.MsBuildBinaryLogFileFormat()),\n            context.ConsoleIssueReportFormat(\n                new ConsoleIssueReportFormatSettings\n                {\n                    GroupByRule = true,\n                    ShowProviderSummary = true,\n                    ShowPrioritySummary = true\n                }),\n            repoRootPath,\n            string.Empty);\n    }\n}\n
"},{"location":"documentation/report-formats/console/features/","title":"Features","text":"

The Cake.Issues.Reporting.Console addin provides the following features:

  • Prints issues containing line and column information.
  • Group issues by rule

Reports:

  • Number of issues by provider
  • Number of issues by priority for every provider and run
"},{"location":"documentation/report-formats/generic/","title":"Generic","text":"

Support for creating reports in any text based format like HTML or Markdown is implemented in the Cake.Issues.Reporting.Generic addin.

  • Features
  • Examples
  • Template Gallery
  • API
"},{"location":"documentation/report-formats/generic/features/","title":"Features","text":"

The Cake.Issues.Reporting.Generic addin provides the following features:

  • Creates reports in any text based format like HTML or Markdown.
  • Provides out of the box templates
  • Possibility to use custom templates using Razor

Info

See Template Gallery for a list of available out of the box and 3rd party templates.

"},{"location":"documentation/report-formats/generic/examples/","title":"Examples","text":"
  • Embedded Default Template
  • Custom Template
"},{"location":"documentation/report-formats/generic/examples/custom-template/","title":"Custom template","text":"

Info

If you create a universally usable custom template we're happy to package it with the addin. To have it included in the addin please create a pull request with your contribution.

To create custom HTML reports the Generic report format needs to be imported. For this example the MsBuild issue provider is additionally used for reading issues:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.MsBuild&version=5.0.1\n#addin nuget:?package=Cake.Issues.Reporting&version=5.0.1\n#addin nuget:?package=Cake.Issues.Reporting.Generic&version=5.0.1\n

Note

In addition to the Generic report format the Cake.Issues and Cake.Issues.Reporting core addins need to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.MsBuild\" Version=\"5.0.1\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.Reporting.Generic\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

The following example will create a HTML report for issues logged as warnings by MsBuild using a custom template.

Cake .NET ToolCake Frosting build.cake
Task(\"Create-IssueReport\").Does(() =>\n{\n    var repoRootFolder = new DirectoryPath(@\"c:\\repo\");\n\n    // Build MySolution.sln solution in the repository root folder and write a binary log.\n    FilePath msBuildLogFile = @\"c:\\build\\msbuild.log\";\n    var msBuildSettings =\n        new MSBuildSettings().WithLogger(\n            \"BinaryLogger,\" + Context.Tools.Resolve(\"Cake.Issues.MsBuild*/**/StructuredLogger.dll\"),\n            \"\",\n            msBuildLogFile)\n    DotNetBuild(\n        repoRootPath.CombineWithFilePath(\"MySolution.sln\"),\n        new DotNetBuildSettings{MSBuildSettings = msBuildSettings});\n\n    // Create HTML report using Diagnostic template.\n    CreateIssueReport(\n        new List<IIssueProvider>\n        {\n            MsBuildIssuesFromFilePath(\n                msBuildLogFile,\n                MsBuildBinaryLogFileFormat)\n        },\n        GenericIssueReportFormatFromFilePath(@\"c:\\ReportTemplate.cshtml\"),\n        repoRootFolder,\n        @\"c:\\report.html\");\n});\n
Program.cs
using Cake.Common.IO;\nusing Cake.Common.Tools.DotNet;\nusing Cake.Common.Tools.DotNet.Build;\nusing Cake.Common.Tools.DotNet.MSBuild;\nusing Cake.Core.IO;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"Create-IssueReport\")]\npublic sealed class CreateIssueReportTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        var repoRootPath = context.MakeAbsolute(context.Directory(\"./\"));\n\n        // Build MySolution.sln solution in the repository root folder and write a binary log.\n        FilePath msBuildLogFile = @\"c:\\build\\msbuild.log\";\n        var msBuildSettings =\n            new DotNetMSBuildSettings().WithLogger(\n                \"BinaryLogger,\" + context.Tools.Resolve(\"Cake.Issues.MsBuild*/**/StructuredLogger.dll\"),\n                \"\",\n                msBuildLogFile.FullPath);\n        context.DotNetBuild(\n            repoRootPath.CombineWithFilePath(\"MySolution.sln\").FullPath,\n            new DotNetBuildSettings{MSBuildSettings = msBuildSettings});\n\n        // Write issues to console.\n        context.CreateIssueReport(\n            context.MsBuildIssuesFromFilePath(\n                msBuildLogFile,\n                context.MsBuildBinaryLogFileFormat()),\n            context.GenericIssueReportFormatFromFilePath(@\"c:\\ReportTemplate.cshtml\"),\n            repoRootPath,\n            @\"c:\\report.html\");\n    }\n}\n

The template looks like this:

ReportTemplate.cshtml
@model IEnumerable<Cake.Issues.IIssue>\n\n<!DOCTYPE html>\n\n<html lang=\"en\" xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n    <meta charset=\"utf-8\" />\n    <title></title>\n</head>\n<body>\n    <table>\n        <thead>\n            <tr>\n                <th scope=\"col\">AffectedFileRelativePath</th>\n                <th scope=\"col\">Line</th>\n                <th scope=\"col\">Message</th>\n                <th scope=\"col\">Priority</th>\n                <th scope=\"col\">Rule</th>\n                <th scope=\"col\">RuleUrl</th>\n                <th scope=\"col\">ProviderType</th>\n            </tr>\n        </thead>\n        <tbody>\n            @foreach (var issue in Model)\n            {\n                <tr>\n                    <td>@issue.AffectedFileRelativePath</td>\n                    <td>@issue.Line</td>\n                    <td>@issue.MessageText</td>\n                    <td>@issue.Priority</td>\n                    <td>@issue.RuleId</td>\n                    <td>@issue.RuleUrl</td>\n                    <td>@issue.ProviderType</td>\n                </tr>\n            }\n        </tbody>\n    </table>\n</body>\n</html>\n

The template retrieves an IEnumerable<Cake.Issues.IIssue> as model.

Info

In custom templates functionality from the following assemblies are available:

  • System.dll
  • System.Core.dll
  • netstandard.dll
  • Cake.Core.dll
  • Cake.Issues.dll
  • Cake.Issues.Reporting.Generic.dll
"},{"location":"documentation/report-formats/generic/examples/default-template/","title":"Embedded default template","text":"

To create HTML reports the Generic report format needs to be imported. For this example the MsBuild issue provider is additionally used for reading issues:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.MsBuild&version=5.0.1\n#addin nuget:?package=Cake.Issues.Reporting&version=5.0.1\n#addin nuget:?package=Cake.Issues.Reporting.Generic&version=5.0.1\n

Note

In addition to the Generic report format the Cake.Issues and Cake.Issues.Reporting core addins need to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.MsBuild\" Version=\"5.0.1\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.Reporting.Generic\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

The following example will create a HTML report for issues logged as warnings by MsBuild.

Cake .NET ToolCake Frosting build.cake
Task(\"Create-IssueReport\").Does(() =>\n{\n    var repoRootPath = MakeAbsolute(Directory(\"./\"));\n\n    // Build MySolution.sln solution in the repository root folder and write a binary log.\n    FilePath msBuildLogFile = @\"c:\\build\\msbuild.log\";\n    var msBuildSettings =\n        new DotNetMSBuildSettings().WithLogger(\n            \"BinaryLogger,\" + Context.Tools.Resolve(\"Cake.Issues.MsBuild*/**/StructuredLogger.dll\"),\n            \"\",\n            msBuildLogFile.FullPath);\n    DotNetBuild(\n        repoRootPath.CombineWithFilePath(\"MySolution.sln\").FullPath,\n        new DotNetBuildSettings{MSBuildSettings = msBuildSettings});\n\n    // Create HTML report using Diagnostic template.\n    CreateIssueReport(\n        MsBuildIssuesFromFilePath(\n            msBuildLogFile,\n            MsBuildBinaryLogFileFormat),\n        GenericIssueReportFormatFromEmbeddedTemplate(GenericIssueReportTemplate.HtmlDiagnostic),\n        repoRootPath,\n        @\"c:\\report.html\");\n});\n
Program.cs
using Cake.Common.IO;\nusing Cake.Common.Tools.DotNet;\nusing Cake.Common.Tools.DotNet.Build;\nusing Cake.Common.Tools.DotNet.MSBuild;\nusing Cake.Core.IO;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"Create-IssueReport\")]\npublic sealed class CreateIssueReportTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        var repoRootPath = context.MakeAbsolute(context.Directory(\"./\"));\n\n        // Build MySolution.sln solution in the repository root folder and write a binary log.\n        FilePath msBuildLogFile = @\"c:\\build\\msbuild.log\";\n        var msBuildSettings =\n            new DotNetMSBuildSettings().WithLogger(\n                \"BinaryLogger,\" + context.Tools.Resolve(\"Cake.Issues.MsBuild*/**/StructuredLogger.dll\"),\n                \"\",\n                msBuildLogFile.FullPath);\n        context.DotNetBuild(\n            repoRootPath.CombineWithFilePath(\"MySolution.sln\").FullPath,\n            new DotNetBuildSettings{MSBuildSettings = msBuildSettings});\n\n        // Write issues to console.\n        context.CreateIssueReport(\n            context.MsBuildIssuesFromFilePath(\n                msBuildLogFile,\n                context.MsBuildBinaryLogFileFormat()),\n            context.GenericIssueReportFormatFromEmbeddedTemplate(GenericIssueReportTemplate.HtmlDiagnostic),\n            repoRootPath,\n            @\"c:\\report.html\");\n    }\n}\n
"},{"location":"documentation/report-formats/generic/templates/","title":"Template Gallery","text":"
  • HTML DevExtreme Data Grid
  • HTML Data Table
  • HTML Diagnostic
"},{"location":"documentation/report-formats/generic/templates/htmldatatable/","title":"HTML Data Table","text":"

Template for a HTML report containing a rich data table view with sorting and search functionality powered by Simple-DataTables.

"},{"location":"documentation/report-formats/generic/templates/htmldatatable/#features","title":"Features","text":"
  • Separate table for issues of each issue provider.
  • Table with Severity, Project, Path, File, Location, Rule, Message.
  • Each column sortable by user.
  • Paged table with possibility for user to change number of entries per page.
  • Client-side full text search.
  • No internet access required for displaying.
"},{"location":"documentation/report-formats/generic/templates/htmldatatable/#requirements","title":"Requirements","text":"
  • Cake.Issues.Reporting.Generic 0.2.1 or higher
"},{"location":"documentation/report-formats/generic/templates/htmldatatable/#usage","title":"Usage","text":"

To create a report using the HTML Data Table template you can use the GenericIssueReportTemplate.HtmlDataTable enum value:

Cake .NET ToolCake Frosting
CreateIssueReport(\n    issues,\n    GenericIssueReportFormatFromEmbeddedTemplate(\n        GenericIssueReportTemplate.HtmlDataTable),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
context.CreateIssueReport(\n    issues,\n    context.GenericIssueReportFormatFromEmbeddedTemplate(\n        GenericIssueReportTemplate.HtmlDataTable),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
"},{"location":"documentation/report-formats/generic/templates/htmldatatable/#options","title":"Options","text":"

This template doesn't support any options.

"},{"location":"documentation/report-formats/generic/templates/htmldatatable/#demos","title":"Demos","text":"
  • Default
"},{"location":"documentation/report-formats/generic/templates/htmldatatable/#source-code","title":"Source Code","text":"

Info

You can use the source code as a template for your custom template.

Source code is available on GitHub.

"},{"location":"documentation/report-formats/generic/templates/htmldiagnostic/","title":"HTML Diagnostic","text":"

Template for a HTML report containing a list of all issues with all properties.

"},{"location":"documentation/report-formats/generic/templates/htmldiagnostic/#features","title":"Features","text":"
  • Unstyled table listing all properties of IIssue
  • No internet access required for displaying.
"},{"location":"documentation/report-formats/generic/templates/htmldiagnostic/#requirements","title":"Requirements","text":"
  • No additional requirements.
"},{"location":"documentation/report-formats/generic/templates/htmldiagnostic/#usage","title":"Usage","text":"

To create a report using the HTML diagnostic template you can use the GenericIssueReportTemplate.HtmlDiagnostic enum value:

Cake .NET ToolCake Frosting
CreateIssueReport(\n    issues,\n    GenericIssueReportFormatFromEmbeddedTemplate(\n        GenericIssueReportTemplate.HtmlDiagnostic),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
context.CreateIssueReport(\n    issues,\n    context.GenericIssueReportFormatFromEmbeddedTemplate(\n        GenericIssueReportTemplate.HtmlDiagnostic),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
"},{"location":"documentation/report-formats/generic/templates/htmldiagnostic/#options","title":"Options","text":"

This template doesn't support any options.

"},{"location":"documentation/report-formats/generic/templates/htmldiagnostic/#demos","title":"Demos","text":"
  • Default
"},{"location":"documentation/report-formats/generic/templates/htmldiagnostic/#source-code","title":"Source Code","text":"

Info

You can use the source code as a template for your custom template.

Source code is available on GitHub.

"},{"location":"documentation/report-formats/generic/templates/htmldxdatagrid/","title":"HTML DevExtreme Data Grid","text":"

Template for a HTML report containing a rich data grid with sorting, filtering, grouping and search capabilities powered by DevExtreme.

"},{"location":"documentation/report-formats/generic/templates/htmldxdatagrid/#features","title":"Features","text":"
  • Table with Provider, Severity, Project, Path, File, Location, Rule, Message by default.
  • Support for grouping by multiple columns by user.
  • Total number of issues by each group level.
  • Each column sortable by user.
  • Data can be filtered by any column by user.
  • Paged view.
  • Client-side full text search.
  • Client-side export to Microsoft Excel or PDF.
  • Fully customizable through options.
"},{"location":"documentation/report-formats/generic/templates/htmldxdatagrid/#requirements","title":"Requirements","text":"
  • Cake.Issues.Reporting.Generic 0.3.1 or higher
"},{"location":"documentation/report-formats/generic/templates/htmldxdatagrid/#usage","title":"Usage","text":"

To create a report using the HTML DevExtreme Data Grid template you can use the GenericIssueReportTemplate.HtmlDxDataGrid enum value:

Cake .NET ToolCake Frosting
CreateIssueReport(\n    issues,\n    GenericIssueReportFormatFromEmbeddedTemplate(\n      GenericIssueReportTemplate.HtmlDxDataGrid),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
context.CreateIssueReport(\n    issues,\n    context.GenericIssueReportFormatFromEmbeddedTemplate(\n      GenericIssueReportTemplate.HtmlDxDataGrid),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
"},{"location":"documentation/report-formats/generic/templates/htmldxdatagrid/#options","title":"Options","text":"

See HtmlDxDataGridOption for a list of possible options.

"},{"location":"documentation/report-formats/generic/templates/htmldxdatagrid/#demos","title":"Demos","text":"

The following demo shows the template with its default options:

  • Default (Source Code)
"},{"location":"documentation/report-formats/generic/templates/htmldxdatagrid/#themes","title":"Themes","text":"

The template supports the teams defined in the DevExtremeTheme enumeration which can be set using the HtmlDxDataGridOption.Theme:

Cake .NET ToolCake Frosting
CreateIssueReport(\n    issues,\n    GenericIssueReportFormatFromEmbeddedTemplate(\n        GenericIssueReportTemplate.HtmlDxDataGrid,\n        settings => settings\n            .WithOption(\n                HtmlDxDataGridOption.Theme,\n                DevExtremeTheme.MaterialBlueLight)),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
context.CreateIssueReport(\n    issues,\n    context.GenericIssueReportFormatFromEmbeddedTemplate(\n        GenericIssueReportTemplate.HtmlDxDataGrid,\n        settings => settings\n            .WithOption(\n                  HtmlDxDataGridOption.Theme,\n                  DevExtremeTheme.MaterialBlueLight)),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
  • Light Theme (Source Code)
  • Dark Theme (Source Code)
  • Contrast Theme (Source Code)
  • Carmine Theme (Source Code)
  • Dark Moon Theme (Source Code)
  • Soft Blue Theme (Source Code)
  • Dark Violet Theme (Source Code)
  • Green Mist Theme (Source Code)
  • Light Compact Theme (Source Code)
  • Dark Compact Theme (Source Code)
  • Contrast Compact Theme (Source Code)
  • Material Blue Light Theme (Source Code)
  • Material Lime Light Theme (Source Code)
  • Material Orange Light Theme (Source Code)
  • Material Purple Light Theme (Source Code)
  • Material Teal Light Theme (Source Code)
  • Material Blue Dark Theme (Source Code)
  • Material Lime Dark Theme (Source Code)
  • Material Orange Dark Theme (Source Code)
  • Material Purple Dark Theme (Source Code)
  • Material Teal Dark Theme (Source Code)
  • Material Blue Light Compact Theme (Source Code)
  • Material Lime Light Compact Theme (Source Code)
  • Material Orange Light Compact Theme (Source Code)
  • Material Purple Light Compact Theme (Source Code)
  • Material Teal Light Compact Theme (Source Code)
  • Material Blue Dark Compact Theme (Source Code)
  • Material Lime Dark Compact Theme (Source Code)
  • Material Orange Dark Compact Theme (Source Code)
  • Material Purple Dark Compact Theme (Source Code)
  • Material Teal Dark Compact Theme (Source Code)
"},{"location":"documentation/report-formats/generic/templates/htmldxdatagrid/#column-visibility","title":"Column visibility","text":"

Visible columns can be defined using the ColumnNameVisible option:

Cake .NET ToolCake Frosting
CreateIssueReport(\n    issues,\n    GenericIssueReportFormatFromEmbeddedTemplate(\n        GenericIssueReportTemplate.HtmlDxDataGrid,\n        settings => settings\n            .WithOption(\n                HtmlDxDataGridOption.LineVisible,\n                false)),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
context.CreateIssueReport(\n    issues,\n    context.GenericIssueReportFormatFromEmbeddedTemplate(\n        GenericIssueReportTemplate.HtmlDxDataGrid,\n        settings => settings\n            .WithOption(\n                HtmlDxDataGridOption.LineVisible,\n                false)),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n

Additional columns can be added using the HtmlDxDataGridOption.AdditionalColumns option.

  • Show and hide columns (Source Code)
  • Add additional columns (Source Code)
"},{"location":"documentation/report-formats/generic/templates/htmldxdatagrid/#sorting","title":"Sorting","text":"

Sorted columns can be defined using the HtmlDxDataGridOption.SortedColumns and the ColumnNameSortOder options:

Cake .NET ToolCake Frosting
CreateIssueReport(\n    issues,\n    GenericIssueReportFormatFromEmbeddedTemplate(\n        GenericIssueReportTemplate.HtmlDxDataGrid,\n        settings => settings\n            .WithOption(\n                HtmlDxDataGridOption.SortedColumns,\n                new List<ReportColumn> { ReportColumn.RuleId })\n            .WithOption(\n                HtmlDxDataGridOption.RuleIdSortOrder,\n                ColumnSortOrder.Descending )),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
context.CreateIssueReport(\n    issues,\n    context.GenericIssueReportFormatFromEmbeddedTemplate(\n        GenericIssueReportTemplate.HtmlDxDataGrid,\n        settings => settings\n            .WithOption(\n                HtmlDxDataGridOption.SortedColumns,\n                new List<ReportColumn> { ReportColumn.RuleId })\n            .WithOption(\n                HtmlDxDataGridOption.RuleIdSortOrder, \n                ColumnSortOrder.Descending )),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
  • Change sorting (Source Code)
"},{"location":"documentation/report-formats/generic/templates/htmldxdatagrid/#grouping","title":"Grouping","text":"

Grouping can be defined using the HtmlDxDataGridOption.GroupedColumns option:

Cake .NET ToolCake Frosting
CreateIssueReport(\n    issues,\n    GenericIssueReportFormatFromEmbeddedTemplate(\n        GenericIssueReportTemplate.HtmlDxDataGrid,\n        settings => settings\n            .WithOption(\n                HtmlDxDataGridOption.GroupedColumns, \n                new List<ReportColumn> { ReportColumn.RuleId })),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
context.CreateIssueReport(\n    issues,\n    context.GenericIssueReportFormatFromEmbeddedTemplate(\n        GenericIssueReportTemplate.HtmlDxDataGrid,\n        settings => settings\n            .WithOption(\n                HtmlDxDataGridOption.GroupedColumns, \n                new List<ReportColumn> { ReportColumn.RuleId })),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
  • Change grouping (Source Code)
  • Disable grouping (Source Code)
"},{"location":"documentation/report-formats/generic/templates/htmldxdatagrid/#exporting","title":"Exporting","text":"

Exporting can be enabled using the HtmlDxDataGridOption.EnableExporting option:

Cake .NET ToolCake Frosting
CreateIssueReport(\n    issues,\n    GenericIssueReportFormatFromEmbeddedTemplate(\n        GenericIssueReportTemplate.HtmlDxDataGrid,\n        settings => settings\n            .WithOption(\n                HtmlDxDataGridOption.EnableExporting,\n                true)),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
context.CreateIssueReport(\n    issues,\n    context.GenericIssueReportFormatFromEmbeddedTemplate(\n        GenericIssueReportTemplate.HtmlDxDataGrid,\n        settings => settings\n            .WithOption(\n                HtmlDxDataGridOption.EnableExporting,\n                true)),\n    @\"c:\\repo\",\n    @\"c:\\report.html\");\n
  • Enable exporting (Source Code)
  • Microsoft Excel export (*.xlsx) (Source Code)
  • PDF export (*.pdf) (Source Code)
  • Custom export file name (Source Code)
"},{"location":"documentation/report-formats/generic/templates/htmldxdatagrid/#other-features","title":"Other features","text":"
  • Change title (Source Code)
  • Disable header (Source Code)
  • Disable filtering (Source Code)
  • Disable searching (Source Code)
  • Custom script location and version (Source Code)
"},{"location":"documentation/report-formats/generic/templates/htmldxdatagrid/#source-code","title":"Source Code","text":"

Info

You can use the source code as a template for your custom template.

Source code is available on GitHub.

"},{"location":"documentation/report-formats/sarif/","title":"Sarif","text":"

Support for creating SARIF compatible reports is implemented in the Cake.Issues.Reporting.Sarif addin.

  • Features
  • Examples
  • API
"},{"location":"documentation/report-formats/sarif/examples/","title":"Examples","text":"

To report issues to the console the SARIF report format needs to be imported. For this example the MsBuild issue provider is additionally used for reading issues:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.MsBuild&version=5.0.1\n#addin nuget:?package=Cake.Issues.Reporting&version=5.0.1\n#addin nuget:?package=Cake.Issues.Reporting.Sarif&version=5.0.1\n

Note

In addition to the SARIF report format the Cake.Issues and Cake.Issues.Reporting core addins need to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.MsBuild\" Version=\"5.0.1\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.Reporting.Sarif\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

The following example will create a SARIF report for issues logged as warnings by MsBuild.

Cake .NET ToolCake Frosting build.cake
Task(\"Create-IssueReport\").Does(() =>\n{\n    var repoRootPath = MakeAbsolute(Directory(\"./\"));\n\n    // Build MySolution.sln solution in the repository root folder and write a binary log.\n    FilePath msBuildLogFile = @\"c:\\build\\msbuild.log\";\n    var msBuildSettings =\n        new DotNetMSBuildSettings().WithLogger(\n            \"BinaryLogger,\" + Context.Tools.Resolve(\"Cake.Issues.MsBuild*/**/StructuredLogger.dll\"),\n            \"\",\n            msBuildLogFile.FullPath);\n    DotNetBuild(\n        repoRootPath.CombineWithFilePath(\"MySolution.sln\").FullPath,\n        new DotNetBuildSettings{MSBuildSettings = msBuildSettings});\n\n    // Create SARIF report.\n    CreateIssueReport(\n        MsBuildIssuesFromFilePath(\n            msBuildLogFile,\n            MsBuildBinaryLogFileFormat,\n        SarifIssueReportFormat(),\n        repoRootPath,\n        @\"c:\\report.sarif\");\n});\n
Program.cs
using Cake.Common.IO;\nusing Cake.Common.Tools.DotNet;\nusing Cake.Common.Tools.DotNet.Build;\nusing Cake.Common.Tools.DotNet.MSBuild;\nusing Cake.Core.IO;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"Create-IssueReport\")]\npublic sealed class CreateIssueReportTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        var repoRootPath = context.MakeAbsolute(context.Directory(\"./\"));\n\n        // Build MySolution.sln solution in the repository root folder and write a binary log.\n        FilePath msBuildLogFile = @\"c:\\build\\msbuild.log\";\n        var msBuildSettings =\n            new DotNetMSBuildSettings().WithLogger(\n                \"BinaryLogger,\" + context.Tools.Resolve(\"Cake.Issues.MsBuild*/**/StructuredLogger.dll\"),\n                \"\",\n                msBuildLogFile.FullPath);\n        context.DotNetBuild(\n            repoRootPath.CombineWithFilePath(\"MySolution.sln\").FullPath,\n            new DotNetBuildSettings{MSBuildSettings = msBuildSettings});\n\n        // Create SARIF report.\n        context.CreateIssueReport(\n            context.MsBuildIssuesFromFilePath(\n                msBuildLogFile,\n                context.MsBuildBinaryLogFileFormat()),\n            context.SarifIssueReportFormat(),\n            repoRootPath,\n            @\"c:\\report.sarif\");\n    }\n}\n
"},{"location":"documentation/report-formats/sarif/features/","title":"Features","text":"

The Cake.Issues.Reporting.Sarif addin provides the following features:

  • Creates SARIF compatible files.

Supports the following properties in the SARIF report:

  • RuleId
  • Message
  • Kind
  • Level
  • Location
  • RuleUrl
"},{"location":"documentation/resources/blog-posts/","title":"Blog posts","text":"

Info

If you have written about Cake Issues we would like to hear from you. You can add it by creating a pull request here.

"},{"location":"documentation/resources/blog-posts/#2018","title":"2018","text":"
  • Cake.Issues - A suite of addins for issue handling in Cake - Pascal Berger
"},{"location":"documentation/resources/blog-posts/#2017","title":"2017","text":"
  • Finding typos with ReSharper Command Line Tools, ReSpeller and Cake - Tom Podolak
  • Cake build issue reporting with PRCA - Tomasz Cielecki
"},{"location":"documentation/resources/presentations/","title":"Presentations","text":"

Info

If you have done a presentation about Cake Issues we would like to hear from you. You can add it by creating a pull request here.

"},{"location":"documentation/resources/presentations/#2019","title":"2019","text":"
  • Continuous Code Inspection using Cake - .NET User Group Basel: Video Slides - Pascal Berger
"},{"location":"documentation/resources/presentations/#2018","title":"2018","text":"
  • Ensuring quality in your DevOps pipelines using Cake - Azure DevOps Saturday Gothenburg - Pascal Berger
"},{"location":"documentation/usage/","title":"Usage","text":""},{"location":"documentation/usage/#ready-to-use-distributions","title":"Ready To Use Distributions","text":"

The easiest way to use Cake Issues is by using one of the Recipe packages, which provide build scripts, delivered as a NuGet package, which can be used inside your projects Cake build to add issue management.

"},{"location":"documentation/usage/#consuming-of-individual-addins","title":"Consuming Of Individual Addins","text":"

The addins can be added individually to any Cake build and allow advanced customizations:

  • Creating Issues
  • Reading Issues
  • Creating Reports
  • Reporting Issues To Pull Request And Build Systems
  • Breaking Builds
"},{"location":"documentation/usage/breaking-builds/breaking-builds/","title":"Breaking builds","text":"

The Cake.Issues addin can be used to break builds if specific issues were reported.

To break builds you need to import the following core addin:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n
Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Issues\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

The following task will fail the build if any issues were added to the issues global variable:

Cake .NET ToolCake Frosting build.cake
// Global issues list into which issues need to be added.\nIEnumerable<IIssue> issues = null;\n\nTask(\"BreakBuildOnIssues\")\n    .Description(\"Breaks build if any issues in the code are found.\")\n    .Does(() =>\n{\n    BreakBuildOnIssues(issues);\n});\n
Program.cs
using Cake.Core;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .UseContext<BuildContext>()\n            .Run(args);\n    }\n}\n\npublic class BuildContext(ICakeContext context) : FrostingContext(context)\n{\n    private readonly List<IIssue> _issues = [];\n\n    public IEnumerable<IIssue> Issues { get { return _issues;  } }\n\n    public void AddIssues(IEnumerable<IIssue> issues)\n    {\n        _issues.AddRange(issues);\n    }\n}\n\n[TaskName(\"BreakBuildOnIssues\")]\npublic sealed class BreakBuildOnIssuesTask : FrostingTask<BuildContext>\n{\n    public override void Run(BuildContext context)\n    {\n        context.BreakBuildOnIssues(context.Issues);\n    }\n}\n
"},{"location":"documentation/usage/creating-issues/creating-issues/","title":"Creating issues","text":"

The Cake.Issues addin can be used to create issues directly in the build script. This issues can for example be used to create reports.

To create issues you need to import the following core addin:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n
Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Issues\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

In the following task a new warning for the myfile.txt file on line 42 is created:

Cake .NET ToolCake Frosting build.cake
Task(\"Create-Issue\").Does(() =>\n{\n    var issue =\n        NewIssue(\n            \"Something went wrong\",\n            \"MyCakeScript\",\n            \"My Cake Script\")\n            .WithMessageInHtmlFormat(\"Something went <b>wrong</b>\")\n            .WithMessageInMarkdownFormat(\"Something went **wrong**\")\n            .InFile(\"myfile.txt\", 42)\n            .WithPriority(IssuePriority.Warning)\n            .Create();\n\n    Information(\"Issue created with message: {0}\", issue.MessageText);\n});\n
Program.cs
using Cake.Common.Diagnostics;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"Create-Issue\")]\npublic sealed class CreateIssueTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        var issue =\n            context.NewIssue(\n                \"Something went wrong\",\n                \"MyCakeScript\",\n                \"My Cake Script\")\n                .WithMessageInHtmlFormat(\"Something went <b>wrong</b>\")\n                .WithMessageInMarkdownFormat(\"Something went **wrong**\")\n                .InFile(\"myfile.txt\", 42)\n                .WithPriority(IssuePriority.Warning)\n                .Create();\n\n        context.Information(\"Issue created with message: {0}\", issue.MessageText);\n    }\n}\n
"},{"location":"documentation/usage/creating-reports/","title":"Creating Reports","text":"
  • Create Reports

Tip

For more report format specific examples see Report Format Examples.

"},{"location":"documentation/usage/creating-reports/creating-reports/","title":"Creating reports","text":"

To create report for issues you need to import the corresponding report format. In the following example the issue provider for reading warnings from MsBuild log files and generic report format is imported:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.Reporting&version=5.0.1\n#addin nuget:?package=Cake.Issues.MsBuild&version=5.0.1\n#addin nuget:?package=Cake.Issues.Reporting.Generic&version=5.0.1\n

Note

In addition to the report format the Cake.Issues and Cake.Issues.Reporting core addins need to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.MsBuild\" Version=\"5.0.1\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.Reporting.Generic\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

Afterwards you can define a task where you call the reporting addin with the desired issue provider and report format:

Cake .NET ToolCake Frosting build.cake
Task(\"Create-Report\").Does(() =>\n{\n    var repoRootFolder = new DirectoryPath(@\"C:\\repo\");\n    CreateIssueReport(\n        MsBuildIssuesFromFilePath(\n            @\"C:\\build\\msbuild.log\",\n            MsBuildBinaryLogFileFormat),\n        GenericIssueReportFormatFromEmbeddedTemplate(GenericIssueReportTemplate.HtmlDiagnostic),\n        repoRootFolder,\n        @\"c:\\report.html\");\n});\n
Program.cs
using Cake.Core.IO;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"Create-Report\")]\npublic sealed class CreateReportTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        var repoRootFolder = new DirectoryPath(@\"C:\\repo\");\n        context.CreateIssueReport(\n            context.MsBuildIssuesFromFilePath(\n                @\"C:\\build\\msbuild.log\",\n                context.MsBuildBinaryLogFileFormat()),\n            context.GenericIssueReportFormatFromEmbeddedTemplate(GenericIssueReportTemplate.HtmlDiagnostic),\n            repoRootFolder,\n            @\"c:\\report.html\");\n    }\n}\n
"},{"location":"documentation/usage/reading-issues/","title":"Reading Issues","text":"
  • Read Issues
  • Pass Additional Run Information
  • Configure File Links

Tip

For more issue provider specific examples see Issue Provider Examples.

"},{"location":"documentation/usage/reading-issues/file-linking/","title":"File linking","text":"

File link settings can be defined while reading issues and are passed through the IIssue.FileLink property to reporting formats, pull request systems and build server implementations:

Cake .NET ToolCake Frosting
var settings =\n    new ReadIssuesSettings(@\"c:\\repo\")\n    {\n        FileLinkSettings =\n            IssueFileLinkSettingsForGitHubCommit(\n                \"https://github.com/cake-contrib/Cake.Issues\",\n                \"76a7cacef7ad4295a6766646d45c9b56\")\n    };    \n\n    var issues =\n        ReadIssues(\n            InspectCodeIssuesFromFilePath(\n                @\"C:\\build\\inspectcode.log\"),\n            settings));\n
var settings =\n    new ReadIssuesSettings(@\"c:\\repo\")\n    {\n        FileLinkSettings =\n            IssueFileLinkSettingsForGitHubCommit(\n                \"https://github.com/cake-contrib/Cake.Issues\",\n                \"76a7cacef7ad4295a6766646d45c9b56\")\n    };    \n\n    var issues =\n        context.ReadIssues(\n            context.InspectCodeIssuesFromFilePath(\n                @\"C:\\build\\inspectcode.log\"),\n            settings));\n

Cake.Issues comes with out-of-the-box support for linking to files hosted on GitHub and Azure Repos, either for a specific branch or commit. Additionally there are aliases which can be used to define any custom pattern.

"},{"location":"documentation/usage/reading-issues/reading-issues/","title":"Reading issues","text":"

The Cake.Issues addin can be used to aggregate issues from different sources. This can for example be useful to break builds based on the reported issues.

To read issues you need to import at least one issue provider. In the following example the issue providers for reading warnings from MsBuild log files and from JetBrains InspectCode are imported:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.MsBuild&version=5.0.1\n#addin nuget:?package=Cake.Issues.InspectCode&version=5.0.1\n

Note

In addition to the issue providers the Cake.Issues core addin needs to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.MsBuild\" Version=\"5.0.1\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.InspectCode\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

Afterwards you can define a task where you call the core addin with the desired issue providers. The following example reads warnings and errors reported by MsBuild from a binary log and issues reported by JetBrains InspectCode:

Cake .NET ToolCake Frosting build.cake
Task(\"Read-Issues\").Does(() =>\n{\n    var repoRootFolder = new DirectoryPath(@\"C:\\repo\");\n    var issues = ReadIssues(\n        new List<IIssueProvider>\n        {\n            MsBuildIssuesFromFilePath(\n                @\"C:\\build\\msbuild.log\",\n                MsBuildBinaryLogFileFormat),\n            InspectCodeIssuesFromFilePath(\n                @\"C:\\build\\inspectcode.log\")\n        },\n        repoRootFolder);\n\n    Information(\"{0} issues are found.\", issues.Count());\n});\n
Program.cs
using Cake.Common.Diagnostics;\nusing Cake.Core.IO;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"Read-Issues\")]\npublic sealed class ReadIssuesTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        var repoRootFolder = new DirectoryPath(@\"C:\\repo\");\n        var issues = context.ReadIssues(\n            new List<IIssueProvider>\n            {\n                context.MsBuildIssuesFromFilePath(\n                    @\"C:\\build\\msbuild.log\",\n                    context.MsBuildBinaryLogFileFormat()),\n                context.InspectCodeIssuesFromFilePath(\n                    @\"C:\\build\\inspectcode.log\")\n            },\n            repoRootFolder);\n\n        context.Information(\"{0} issues are found.\", issues.Count());\n    }\n}\n
"},{"location":"documentation/usage/reading-issues/run-information/","title":"Additional run information","text":"

If a build script needs to parse multiple log files from the same tool, e.g. because multiple MsBuild solutions were built, this can be done by calling the issue provider multiple times. If the results are read into the same list and shown on the same report, individual issues could not be assigned to any of the calls, since issue provider type and name are identical.

Starting with Cake.Issues 0.9.0 it is possible to pass additional run information while reading issues, which then will be stored with each issues in the IIssue.Run property:

Cake .NET ToolCake Frosting
var issues = new List<IIssue>();\n\n// Parse issues from build of solution 1\nissues.AddRange(\n    ReadIssues(\n        MsBuildIssuesFromFilePath(\n            @\"C:\\build\\solution1-msbuild.log\",\n            MsBuildBinaryLogFileFormat),\n        new ReadIssuesSettings(@\"c:\\repo\")\n        {\n            Run = \"Solution 1\"\n        }\n    )\n);\n\n// Parse issues from build of solution 2\nissues.AddRange(\n    ReadIssues(\n        MsBuildIssuesFromFilePath(\n            @\"C:\\build\\solution2-msbuild.log\",\n            MsBuildBinaryLogFileFormat),\n        new ReadIssuesSettings(@\"c:\\repo\")\n        {\n            Run = \"Solution 2\"\n        }\n    )\n);\n
var issues = new List<IIssue>();\n\n// Parse issues from build of solution 1\nissues.AddRange(\n    context.ReadIssues(\n        context.MsBuildIssuesFromFilePath(\n            @\"C:\\build\\solution1-msbuild.log\",\n            context.MsBuildBinaryLogFileFormat()),\n        new ReadIssuesSettings(@\"c:\\repo\")\n        {\n            Run = \"Solution 1\"\n        }\n    )\n);\n\n// Parse issues from build of solution 2\nissues.AddRange(\n    context.ReadIssues(\n        context.MsBuildIssuesFromFilePath(\n            @\"C:\\build\\solution2-msbuild.log\",\n            context.MsBuildBinaryLogFileFormat()),\n        new ReadIssuesSettings(@\"c:\\repo\")\n        {\n            Run = \"Solution 2\"\n        }\n    )\n);\n
"},{"location":"documentation/usage/recipe/","title":"Recipe usage","text":"

Cake.Issues recipes provide build scripts, delivered as a NuGet package, which can be used inside your projects Cake build to add issue management.

Integration of code analyzing and linting tools into a build pipeline often looks the similar, and differentiates mainly on the used linters, build and pull request systems. Cake.Issues recipes contain code to do all the parsing, integration with build and pull request systems for you, using the individual Cake.Issues addins. They support different linters based on the linting log files you pass it and integrate automatically with different build and pull request systems.

There are two flavors available:

  • Cake.Issues.Recipe

    For Cake .NET Tool

  • Cake.Frosting.Issues.Recipe

    For Cake Frosting

"},{"location":"documentation/usage/recipe/using-cake-frosting-issues-recipe/","title":"Using Cake.Frosting.Issues.Recipe","text":"

The Cake.Frosting.Issues.Recipe package can be used to easily add issue management functionality to your Cake Frosting build.

Info

See Setting Up A New Frosting Project for instructions how to create a new Cake Frosting project.

"},{"location":"documentation/usage/recipe/using-cake-frosting-issues-recipe/#add-cakefrostingissuesrecipe-to-your-cake-frosting-build","title":"Add Cake.Frosting.Issues.Recipe to your Cake Frosting build","text":"

To use Cake.Frosting.Issues.Recipe in your Cake Frosting build you need to first add the NuGet package in your .csproj file:

<PackageReference Include=\"Cake.Frosting.Issues.Recipe\" Version=\"5.0.1\" />\n
"},{"location":"documentation/usage/recipe/using-cake-frosting-issues-recipe/#register-cakeissues-tasks","title":"Register Cake.Issues tasks","text":"

To make Cake Issues tasks available to your Cake Frosting build you need to register them.

Add the following line to the bootstrapping code in the Main method of your Cake Frosting project:

AddAssembly(Assembly.GetAssembly(typeof(IssuesTask)))\n

The following bootstrapping code registers the Cake Issues tasks and also installs JetBrains InspectCode:

using System;\nusing System.Reflection;\nusing Cake.Frosting;\nusing Cake.Frosting.Issues.Recipe;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .UseContext<BuildContext>()\n            .InstallTool(\n                new Uri(\n                    \"nuget:?package=JetBrains.ReSharper.CommandLineTools&version=1.0.0\"))\n            .AddAssembly(Assembly.GetAssembly(typeof(IssuesTask)))\n            .Run(args);\n    }\n}\n
"},{"location":"documentation/usage/recipe/using-cake-frosting-issues-recipe/#create-build-context","title":"Create build context","text":"

Cake.Frosting.Issues.Recipe provides a build context from which you need to inherit your custom build context. The build context contains configuration parameters, but also the state of the current running build, like for example all collected issues.

The following example creates a build context and defines that Cake Issues should use Cake.Git addin to determine state of the Git repository:

public class BuildContext : IssuesContext\n{\n    public BuildContext(ICakeContext context)\n        : base(context, RepositoryInfoProviderType.CakeGit)\n    {\n    }\n}\n
"},{"location":"documentation/usage/recipe/using-cake-frosting-issues-recipe/#passing-issues-to-cakefrostingissuesrecipe","title":"Passing issues to Cake.Frosting.Issues.Recipe","text":"

To make issues available to Cake.Frosting.Issues.Recipe you need pass the log files through the corresponding methods. The tasks need to also be a dependency of ReadIssuesTask provided by Cake.Frosting.Issues.Recipe.

In the following example a new task is introduced which runs JetBrains InspectCode and passes the log file to Cake.Frosting.Issues.Recipe:

[TaskName(\"Run-InspectCode\")]\n[IsDependeeOf(typeof(ReadIssuesTask))]\npublic class RunInspectCodeTask : FrostingTask<BuildContext>\n{\n    public override void Run(BuildContext context)\n    {\n        var inspectCodeLogFilePath = context.Parameters.OutputDirectory..CombineWithFilePath(\"inspectCode.log\");\n\n        // Run JetBrains InspectCode\n        context.InspectCode(\n            context.State.RepositoryRootDirectory.Combine(\"src\").CombineWithFilePath(\"ClassLibrary1.sln\"),\n            new InspectCodeSettings() {\n                OutputFile = context.InspectCodeLogFilePath\n            });\n\n        // Pass path to InspectCode log file to Cake.Frosting.Issues.Recipe\n        context.Parameters.InputFiles.AddInspectCodeLogFilePath(context.InspectCodeLogFilePath);\n    }\n}\n

See configuration for a full list of available configuration parameters.

"},{"location":"documentation/usage/recipe/using-cake-frosting-issues-recipe/#calling-issues-tasks","title":"Calling issues tasks","text":"

Cake.Frosting.Issues.Recipe will add a bunch of tasks to your build script.

To add the issues functionality into your existing build pipeline you need to add ReadIssuesTask to your pipeline.

In the following example the Default task makes sure the main IssuesTask is executed:

[TaskName(\"Default\")]\n[IsDependentOn(typeof(IssuesTask))]\npublic class DefaultTask : FrostingTask\n{\n}\n
"},{"location":"documentation/usage/recipe/using-cake-issues-recipe/","title":"Using Cake.Issues.Recipe","text":"

The Cake.Issues.Recipe package can be used to easily add issue management functionality to your build script.

"},{"location":"documentation/usage/recipe/using-cake-issues-recipe/#add-cakeissuesrecipe-to-your-build-script","title":"Add Cake.Issues.Recipe to your build script","text":"

To use Cake.Issues.Recipe in your build script you need to first load the NuGet package:

#load nuget:package=Cake.Issues.Recipe&version=5.0.1\n
"},{"location":"documentation/usage/recipe/using-cake-issues-recipe/#configuring-cakeissuesrecipe","title":"Configuring Cake.Issues.Recipe","text":"

To make issues available to Cake.Issues.Recipe you need to set the corresponding configuration parameters.

In the following example a new task is introduced which depends on existing tasks which build a MsBuild solution and run JetBrains InspectCode. It will pass the MsBuild and InspectCode logfile to Cake.Issues.Recipe:

// Run issues task by default.\nTask(\"Configure-CakeIssuesRecipe\")\n    .IsDependentOn(\"Build\")\n    .IsDependentOn(\"Run-InspectCode\")\n    .Does(() =>\n{\n    IssuesParameters.InputFiles.AddMsBuildBinaryLogFilePath(msBuildLogFilePath);\n    IssuesParameters.InputFiles.AddInspectCodeLogFilePath(inspectCodeLogFilePath);\n}\n

See configuration for a full list of available configuration parameters.

"},{"location":"documentation/usage/recipe/using-cake-issues-recipe/#calling-issues-tasks","title":"Calling issues tasks","text":"

Cake.Issues.Recipe will add a bunch of tasks to your build script.

To add the issues functionality into your existing build pipeline you can make the Read-Issues task dependent on the task which configures Cake.Issues.Recipe:

// Make sure build and linters run before issues task.\nIssuesBuildTasks.ReadIssuesTask\n    .IsDependentOn(\"Configure-CakeIssuesRecipe\");\n

At some point you need to call the tasks provided by Cake.Isses.Recipe. In the following example the Default task calls the main Issues task:

// Run issues task by default.\nTask(\"Default\")\n    .IsDependentOn(\"Issues\");\n
"},{"location":"documentation/usage/reporting-issues-to-pull-requests/","title":"Reporting Issues To Pull Requests","text":"
  • Report Issues To Pull Requests
  • Apply Custom Issue Filter

Tip

For more pull request system specific examples see Pull Request System Examples

"},{"location":"documentation/usage/reporting-issues-to-pull-requests/custom-issue-filter/","title":"Custom issue filter","text":"

You can define custom filters which are applied to issues before they are posted as comments to pull requests.

Tip: Filter to issues introduced with pull request

You can use a custom filter to only have issues introduced with the current code posted to the pull request.

For this you need to store your log files as artifacts on your build system, then you can define a custom filter which retrieves the logs from the previous build, parses them using the appropriate issue provider and filters out any issues which were already existing in the previous build.

The following example will filter out all issues from the rule CA1000 from being posted to the pull request.

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.MsBuild&version=5.0.1\n#addin nuget:?package=Cake.Issues.PullRequests&version=5.0.1\n#addin nuget:?package=Cake.Issues.PullRequests.AzureDevOps&version=5.0.1    \n\nTask(\"ReportIssuesToPullRequest\").Does(() =>\n{\n    var repoRootFolder = new DirectoryPath(@\"C:\\repo\");    \n\n    var settings = new ReportIssuesToPullRequestFromIssueProviderSettings(repoRootFolder);    \n\n    // Add custom filter.\n    settings.IssueFilters.Add(x => x.Where(issue => issue.RuleId != \"CA1000\"));    \n\n    ReportIssuesToPullRequest(\n        new List<IIssueProvider>\n        {\n            MsBuildIssuesFromFilePath(\n                @\"C:\\build\\msbuild.log\",\n                MsBuildBinaryLogFileFormat)\n        },\n        AzureDevOpsPullRequests(),\n        settings);\n});\n
Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.MsBuild\" Version=\"5.0.1\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.PullRequests.AzureDevOps\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n
Program.cs
using Cake.Core.IO;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"ReportIssuesToPullRequest\")]\npublic sealed class ReportIssuesToPullRequestTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        var repoRootFolder = new DirectoryPath(@\"C:\\repo\");        \n\n        var settings = new ReportIssuesToPullRequestFromIssueProviderSettings(repoRootFolder);        \n\n        // Add custom filter.\n        settings.IssueFilters.Add(x => x.Where(issue => issue.RuleId != \"CA1000\"));        \n\n        context.ReportIssuesToPullRequest(\n            new List<IIssueProvider>\n            {\n                context.MsBuildIssuesFromFilePath(\n                    @\"C:\\build\\msbuild.log\",\n                    context.MsBuildBinaryLogFileFormat())\n            },\n            context.AzureDevOpsPullRequests(),\n            settings);\n    }\n}\n
"},{"location":"documentation/usage/reporting-issues-to-pull-requests/report-issues-to-pull-requests/","title":"Report issues to pull requests","text":"

To use report issues to pull requests you need to import the corresponding pull request system addin. In the following example the issue provider for reading warnings from MsBuild log files and support for Azure DevOps pull requests is imported:

Cake .NET ToolCake Frosting build.cake
#addin nuget:?package=Cake.Issues&version=5.0.1\n#addin nuget:?package=Cake.Issues.PullRequests&version=5.0.1\n#addin nuget:?package=Cake.Issues.MsBuild&version=5.0.1\n#addin nuget:?package=Cake.Issues.PullRequests.AzureDevOps&version=5.0.1\n

Note

In addition to the pull request system the Cake.Issues and Cake.Issues.PullRequests core addins need to be added.

Build.csproj
<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Cake.Frosting\" Version=\"5.0.0\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.MsBuild\" Version=\"5.0.1\" />\n    <PackageReference Include=\"Cake.Frosting.Issues.PullRequests.AzureDevOps\" Version=\"5.0.1\" />\n  </ItemGroup>\n</Project>\n

Afterwards you can define a task where you call the core addin with the desired issue provider and pull request system:

Cake .NET ToolCake Frosting build.cake
    Task(\"ReportIssuesToPullRequest\").Does(() =>\n    {\n        var repoRootFolder = new DirectoryPath(@\"C:\\repo\");\n        ReportIssuesToPullRequest(\n            MsBuildIssuesFromFilePath(\n                @\"C:\\build\\msbuild.log\",\n                MsBuildBinaryLogFileFormat),\n            AzureDevOpsPullRequests(),\n            repoRootFolder);\n    });\n
Program.cs
using Cake.Core.IO;\nusing Cake.Frosting;\n\npublic static class Program\n{\n    public static int Main(string[] args)\n    {\n        return new CakeHost()\n            .Run(args);\n    }\n}\n\n[TaskName(\"ReportIssuesToPullRequest\")]\npublic sealed class ReportIssuesToPullRequestTask : FrostingTask<FrostingContext>\n{\n    public override void Run(FrostingContext context)\n    {\n        var repoRootFolder = new DirectoryPath(@\"C:\\repo\");\n        context.ReportIssuesToPullRequest(\n            context.MsBuildIssuesFromFilePath(\n                @\"C:\\build\\msbuild.log\",\n                context.MsBuildBinaryLogFileFormat()),\n            context.AzureDevOpsPullRequests(),\n            repoRootFolder);\n    }\n}\n
"},{"location":"news/","title":"News","text":""},{"location":"news/2020/08/22/cake-issues-v090-released/","title":"Cake Issues v0.9.0 Released","text":"

Cake Issues version 0.9.0 has been released. This is a major release bringing a lot of new features across all addins.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • AdmiringWorm
  • christianbumann
  • eoehen
  • gep13
  • janniksam
  • mholo65
  • pascalberger
  • Speeedy01
  • jokay
","boost":0.5},{"location":"news/2020/08/22/cake-issues-v090-released/#full-cross-platform-support","title":"Full cross-platform support","text":"

While in previous versions most parts of Cake Issues was already targeting .NET Standard and with this could be executed on .NET Framework, .NET Core and Mono, Cake.Issues.Reporting.Generic could only run on .NET Framework and Mono, but not on .NET Core. With this release Cake.Issues.Reporting.Generic was ported to also run on .NET Core.

The migration was done by gep13 on his Twitch stream and you can watch work done in Stream 90 - Working on Cake.Issues.Recipe, Stream 91 - Working on Cake.Issues.Reporting.Generic and Gazorator and Stream 92 - Working on Cake.Issues.Reporting.Generic and Gazorator - Part 2.

","boost":0.5},{"location":"news/2020/08/22/cake-issues-v090-released/#enhanced-issue-information","title":"Enhanced issue information","text":"

The description for issues has been extended by additional information for column and ranges:

  • IIssue.EndLine
  • IIssue.Column
  • IIssue.EndColumn

Existing issue providers have been updated to provide the additional information where available. See feature description for individual issue providers for which information a specific issue provider supports.

","boost":0.5},{"location":"news/2020/08/22/cake-issues-v090-released/#file-linking","title":"File linking","text":"

In previous versions Cake.Issues.Reporting.Generic supported entries linking to the file on the source code provider (GitHub, Azure Repos, ...). With this release file linking infrastructure has been moved to the Cake.Issues addin and can be used by any addin.

File link settings can be defined while reading issues and are passed through the new IIssue.FileLink property to reporting formats, pull request systems and build server implementations:

var settings =\n    new ReadIssuesSettings(@\"c:\\repo\")\n    {\n        FileLinkSettings =\n            IssueFileLinkSettingsForGitHubCommit(\n                \"https://github.com/cake-contrib/Cake.Issues.Reporting.Generic\",\n                \"76a7cacef7ad4295a6766646d45c9b56\")\n    };\n\n    var issues =\n        ReadIssues(\n            InspectCodeIssuesFromFilePath(\n                @\"C:\\build\\inspectcode.log\"),\n            settings));\n

Cake.Issues comes with out-of-the-box support for linking to files hosted on GitHub and Azure Repos, either for a specific branch or commit. Additionally there are aliases which can be used to define any custom pattern.

","boost":0.5},{"location":"news/2020/08/22/cake-issues-v090-released/#support-for-passing-additional-run-information","title":"Support for passing additional run information","text":"

If a build script needed to parse multiple log files from the same tool, e.g. because multiple MsBuild solutions were built, this was currently possible by calling the issue provider multiple times. If the results were read into the same list and shown on the same report, individual issues could not be assigned to any of the calls, since issue provider type and name were identical. Starting with Cake.Issues 0.9.0 it is now possible to pass additional run information while reading issues, which then will be stored with each issues in the IIssue.Run property:

var issues = new List<IIssue>();\n\n// Parse issues from build of solutions 1\nissues.AddRange(\n    ReadIssues(\n        MsBuildIssuesFromFilePath(\n            @\"C:\\build\\solution1-msbuild.log\",\n            MsBuildXmlFileLoggerFormat),\n        new ReadIssuesSettings(@\"c:\\repo\")\n        {\n            Run = \"Solution 1\"\n        }\n    )\n);\n\n// Parse issues from build of solutions 2\nissues.AddRange(\n    ReadIssues(\n        MsBuildIssuesFromFilePath(\n            @\"C:\\build\\solution2-msbuild.log\",\n            MsBuildXmlFileLoggerFormat),\n        new ReadIssuesSettings(@\"c:\\repo\")\n        {\n            Run = \"Solution 2\"\n        }\n    )\n);\n
","boost":0.5},{"location":"news/2020/08/22/cake-issues-v090-released/#improved-pull-request-integration","title":"Improved pull request integration","text":"

In previous versions the text message of an issue was used to detect issues already reported in a previous run. This didn't work well for issues which contain information in the message which likely changes between runs, like e.g. line information. In this version a specific identifier, IIssue.Identifier, is used which can be set by the issue provider.

When working with legacy code bases which contain a lot of existing issues, using something like Cake.Issues can be hard, since it will notify about every existing issue if something is changed in a file. To work around this issue it is possible to limit issues which will be posted to pull request systems. In previous versions it was already possible to limit the total number of issues, the number of issues for every issue provider and the total number of issues across multiple run. With 0.9.0 it will additionally be possible to limit the number of issues for specific issue providers for either a single or across multiple runs. This allows advanced scenarios like posting a maximum of 10 MsBuild issues every run, but not more than 20 in total across all runs.

","boost":0.5},{"location":"news/2020/08/22/cake-issues-v090-released/#get-everything-together","title":"Get everything together","text":"

Cake.Issues.Recipe, the Cake Recipe script which you can integrate into your build script for easy integration of full feature issue management, has been updated to version 0.4.0, bringing all the new features of Cake.Issues 0.9.0.

","boost":0.5},{"location":"news/2020/08/22/cake-issues-v090-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 0.9.0 is a breaking release, which means that it probably requires changes to your build script. This section documents the most common changes which might be required:

  • Cake.Issues
  • Serialization format has been updated to version 3. Older version are still supported for deserialization.
  • Cake.Issues.Markdownlint
  • MarkdownlintLogFileFormat alias has been renamed to MarkdownlintV1LogFileFormat (#116).
  • Cake.Issues.PullRequest
  • ReportIssuesToPullRequest alias which accepts an issue provider, or a list of issue providers, and settings requires now settings of type IReportIssuesToPullRequestFromIssueProviderSettings instead of ReportIssuesToPullRequestSettings to provider additional functionality, like support for File linking and Support for passing additional run information.
  • Cake.Issues.PullRequests.AzureDevOps
  • Cake.Issues.PullRequests.AzureDevOps requires at least Cake.AzureDevOps 0.5.0
  • Cake.Issues.Reporting
  • CreateIssueReport alias which accepts an issue provider, or a list of issue providers, and settings requires now settings of type ICreateIssueReportFromIssueProviderSettings instead of CreateIssueReportSettings to provider additional functionality, like support for File linking and Support for passing additional run information.
  • Cake.Issues.Reporting.Generic
  • Cake.Issues.Reporting.Generic requires at least Cake 0.38.0
  • HtmlDxDataGridOption.FileLinkSettings has been removed. File link settings can now be defined while reading the issues. For details see File linking. (#265).
  • HtmlDxDataGridOption.JSZipLocation has been split into HtmlDxDataGridOption.JsZipLocation and HtmlDxDataGridOption.JsZipVersion (#320).
  • Cake.Issues.Recipe
  • Cake.Issues.Recipe requires at least Cake 0.38.0

For details see release notes of the individual addins:

  • Cake.Issues 0.9.0
  • Cake.Issues.MsBuild 0.9.0
  • Cake.Issues.InspectCode 0.9.0
  • Cake.Issues.DupFinder 0.9.0
  • Cake.Issues.GitRepository 0.9.0
  • Cake.Issues.Markdownlint 0.9.0
  • Cake.Issues.EsLint 0.9.0
  • Cake.Issues.DocFx 0.9.0
  • Cake.Issues.PullRequests 0.9.0
  • Cake.Issues.PullRequests.AzureDevOps 0.9.0
  • Cake.Issues.PullRequests.AppVeyor 0.9.0
  • Cake.Issues.Reporting 0.9.0
  • Cake.Issues.Reporting.Generic 0.9.0
  • Cake.Issues.Reporting.Sarif 0.9.0
  • Cake.Issues.Recipe 0.4.0
","boost":0.5},{"location":"news/2020/09/19/cake-issues-v091-released/","title":"Cake Issues v0.9.1 Released","text":"

Version 0.9.1 of Cake Issues and Cake.Issues.PullRequests.AzureDevOps have been released. These are minor releases containing improvements and bug fixes.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • christianbumann
  • janniksam
  • pascalberger
  • jokay
","boost":0.5},{"location":"news/2020/09/19/cake-issues-v091-released/#easier-file-linking-for-manually-created-issues","title":"Easier file linking for manually created issues","text":"

With 0.8.0 file links was implemented in Cake.Issues.Reporting.Generic and worked for any issues passed to the report. With 0.9.0 file link infrastructure was moved to Cake.Issues. File link settings can now be set while reading issues, and are passed through the IIssue.FileLink property to reports and pull request systems.

While this solution works for issues read by an issue provider, where file link settings can be passed to the ReadIssues alias, it become much more complicated for issues created using the NewIssue alias, where an URL can be set, which needs to be resolved manually before.

Cake.Issues 0.9.1 adds an WithFileLinkSettings method to IIssueBuilder where a file link setting object can be passed which does resolve the URL.

","boost":0.5},{"location":"news/2020/09/19/cake-issues-v091-released/#line-range-and-column-support-in-azure-devops-pull-request-integration","title":"Line range and column support in Azure DevOps pull request integration","text":"

Cake Issues 0.9.0 added support for line ranges and column information. With 0.9.0 the Azure DevOps pull request integration didn't use this information while posting comments to pull requests. Cake.Issues.PullRequests.AzureDevOps 0.9.1 fixes this and will post comments for line and column ranges if they are available on an issue.

","boost":0.5},{"location":"news/2020/09/19/cake-issues-v091-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues and Cake.Issues.PullRequests.AzureDevOps 0.9.1 are compatible with version 0.9.0 without any breaking changes. To update to the new version bump the version of the specific addins.

","boost":0.5},{"location":"news/2020/09/24/cake-issues-recipe-v042-released-bringing-support-for-github-actions/","title":"Cake Issues Recipe v0.4.2 released, bringing support for GitHub Actions","text":"

Version 0.4.2 of Cake Issues Recipe has been released bringing support for GitHub Actions.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • admiringworm
  • pascalberger
","boost":0.5},{"location":"news/2020/09/24/cake-issues-recipe-v042-released-bringing-support-for-github-actions/#support-for-github-actions","title":"Support for GitHub Actions","text":"

This version of Cake.Issues.Recipe brings support for running under GitHub Actions. Currently supported feature is writing of issues to build server which will show up in the build log grouped by issue provider / run:

Additionally the issues show up as annotations:

Having issues available as annotations also means that they will be shown in pull requests on the related file / position:

It's planned to support remaining features like providing full issue report as artifact in a future release.

Info

Support for GitHub Actions integration is currently only available in Cake.Issues.Recipe, but not as a standalone addin. It's planned to additionally provide a standalone addin which can be used outside of Cake.Issues.Recipe in the future.

","boost":0.5},{"location":"news/2020/09/24/cake-issues-recipe-v042-released-bringing-support-for-github-actions/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues.Recipe 0.4.2 is compatible with version 0.4.x without any breaking changes. To update to the new version bump the version in your build script.

","boost":0.5},{"location":"news/2020/09/27/new-github-actions-addin/","title":"New GitHub Actions addin","text":"

A new Cake.Issues.PullRequest.GitHubActions addin has been released which brings integration with GitHub Actions and GitHub pull requests.

Cake.Issues.PullRequest.GitHubActions addin creates annotations from issues when running on GitHub Actions:

These annotations will also be shown in pull requests on the related file / position, bringing first class integration for GitHub pull requests to Cake.Issues:

This integration was first released in Cake.Issues.Recipe 0.4.2 and has now been moved to its own addin, which can also be used outside of Cake.Issues.Recipe.

","boost":0.5},{"location":"news/2020/10/09/cake-issues-pullrequests-v091-released/","title":"Cake Issues PullRequests v0.9.1 Released","text":"

Version 0.9.1 of Cake.Issues.PullRequests has been released. This is a minor releases containing bug fixes.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • janniksam
  • pascalberger
  • phlorian
","boost":0.5},{"location":"news/2020/10/09/cake-issues-pullrequests-v091-released/#dont-post-issues-if-a-provider-limit-is-set-to-0","title":"Don't post issues if a provider limit is set to 0","text":"

This version fixes a bug where if MaxIssuesToPost or MaxIssuesToPostAcrossRuns was set to 0 all issues were posted to the pull request instead of none.

","boost":0.5},{"location":"news/2020/10/09/cake-issues-pullrequests-v091-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues.PullRequests 0.9.1 is compatible with version 0.9.0 without any breaking changes. To update to the new version bump the version of the addin.

","boost":0.5},{"location":"news/2020/10/20/cake-issues-msbuild-v091-released/","title":"Cake Issues MsBuild v0.9.1 Released","text":"

Version 0.9.1 of MsBuild support for Cake.Issues has been released. This is a minor release containing improvements.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • cho-trackman
  • eoehen
  • pascalberger
  • jokay
","boost":0.5},{"location":"news/2020/10/20/cake-issues-msbuild-v091-released/#support-for-reading-of-errors","title":"Support for reading of errors","text":"

Until now MsBuild support did read warnings from MsBuild log files. Starting with version 0.9.1 it will also return errors. Reading of errors has been implemented for MsBuildBinaryLogFileFormat and MsBuildXmlFileLoggerFormat. For errors IIssue.Priority will be set to IssuePriority.Error.

Info

To keep previous behavior result after reading the issues can be filtered for IIssue.Priority == IIssuePriority.Warning.

","boost":0.5},{"location":"news/2020/10/20/cake-issues-msbuild-v091-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues.MsBuild 0.9.1 is compatible with version 0.9.0 without any breaking changes. To update to the new version bump the version of the addin.

","boost":0.5},{"location":"news/2020/12/01/cake-issues-recipe-v044-released-bringing-support-for-eslint/","title":"Cake Issues Recipe v0.4.4 released, bringing support for ESLint","text":"

Version 0.4.4 of Cake Issues Recipe has been released bringing support for ESLint.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions. For details see full release notes.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • pascalberger
","boost":0.5},{"location":"news/2020/12/01/cake-issues-recipe-v044-released-bringing-support-for-eslint/#support-for-eslint","title":"Support for ESLint","text":"

This version of Cake.Issues.Recipe brings support for issues reported by ESLint. Currently supported are files generated using the ESLint json formatter

","boost":0.5},{"location":"news/2020/12/01/cake-issues-recipe-v044-released-bringing-support-for-eslint/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues.Recipe 0.4.4 is compatible with version 0.4.x without any breaking changes. To update to the new version bump the version in your build script.

","boost":0.5},{"location":"news/2021/07/27/new-addin-for-terraform-support/","title":"New addin for Terraform support","text":"

A new Cake.Issues.Terraform addin has been released which adds support for reading issues from Terraform validate command.

Cake.Issues.Terraform addin brings support for Terraform to the Cake.Issues ecosystem. It allows to read the output of the Terraform validate command. Together with other Cake.Issues addins it is possible to create powerful infrastructure as code pipelines which ensure quality standards by validating Terraform files before merging or deploying the changes. When using a pull requests workflow it is also possible to have the issues reported by Terraform validate automatically reported as comments to pull request.

","boost":0.5},{"location":"news/2021/07/28/cake-issues-v100-released/","title":"Cake Issues v1.0.0 Released","text":"

More than 4 years after the first commit for Cake.Prca, the predecessor of Cake Issues, we're happy to announce that Cake Issues version 1.0.0 has been released. This is a major release bringing a lot of new features across all addins.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • eoehen
  • janniksam
  • pascalberger
  • phlorian
  • jokay
","boost":0.5},{"location":"news/2021/07/28/cake-issues-v100-released/#support-for-cake-10","title":"Support for Cake 1.0","text":"

All addins have been updated to support Cake 1.x.

","boost":0.5},{"location":"news/2021/07/28/cake-issues-v100-released/#support-for-cake-frosting","title":"Support for Cake Frosting","text":"

All addins can be used with Cake Frosting.

Cake Issues addins have always been self-contained, shipping with all required dependencies, to provide the best user experience. While this approach makes sense for Cake script runners, it makes things more complex than required when running under Cake Frosting. This is especially true for the Cake.Issues.Reporting.Generic addin, which uses Razor engine to generate the reports.

It was therefore decided to release separate versions of the Cake.Issues.Reporting.Generic addin for the different script runners:

  • Cake.Issues.Reporting.Generic: The addin packaged in a self-contained NuGet package for use with Cake script runners
  • Cake.Frosting.Issues.Reporting.Generic: The addin packaged in a NuGet package containing dependencies for use with Cake Frosting

Cake.Frosting.Issues.Reporting.Generic has the additional benefit for the user that it gives the user full control of what exact version of dependencies should be used. In the future more Cake Issues addins might be released in Frosting specific packages.

","boost":0.5},{"location":"news/2021/07/28/cake-issues-v100-released/#support-for-arbitrary-values-in-an-issue","title":"Support for arbitrary values in an issue","text":"

Specific issue providers might have additional information for which no equivalent does exist on IIssue. These kind of information can now be stored in the IIssue.AdditionalInformation property.

","boost":0.5},{"location":"news/2021/07/28/cake-issues-v100-released/#new-provider-type-property","title":"New provider type property","text":"

While there are aliases to get provider type name (e.g. MsBuildIssuesProviderTypeName), this information was in previous versions not available through the IIssueProvider interface. There is a new IIssueProvider.ProviderType property which can be used to retrieve the provider type.

","boost":0.5},{"location":"news/2021/07/28/cake-issues-v100-released/#pdf-export","title":"PDF export","text":"

A new PDF export has been added to the HtmlDxDataGrid template of the Cake.Issues.Reporting.Generic addin.

","boost":0.5},{"location":"news/2021/07/28/cake-issues-v100-released/#simplified-release-process","title":"Simplified release process","text":"

Starting with Cake Issues 1.0.0 the three core addins Cake.Issues, Cake.Issues.PullRequests and Cake.Issues.Reporting will be always released together. For that source code for the addin has been merged in the Cake.Issues repository. Please open any issues related to any of the core addins in the Cake.Issues issue tracker.

","boost":0.5},{"location":"news/2021/07/28/cake-issues-v100-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 1.0.0 is a breaking release, which means that it probably requires changes to your build script. This section documents the most common changes which might be required:

  • Cake.Issues
  • Serialization format has been updated to version 4. Older version are still supported for deserialization.
  • IIssueProvider was extended with an additional ProviderType property. For issue providers inheriting from BaseIssueProvider no action is required to keep the same behavior as with previous versions, with the type name used as provider type.

Info

Cake.Recipe has not been updated to 1.0 yet.

For details see release notes of the individual addins:

  • Cake.Issues 1.0.0
  • Cake.Issues.MsBuild 1.0.0
  • Cake.Issues.InspectCode 1.0.0
  • Cake.Issues.DupFinder 1.0.0
  • Cake.Issues.GitRepository 1.0.0
  • Cake.Issues.Markdownlint 1.0.0
  • Cake.Issues.EsLint 1.0.0
  • Cake.Issues.DocFx 1.0.0
  • Cake.Issues.Terraform 1.0.0
  • Cake.Issues.PullRequests 1.0.0
  • Cake.Issues.PullRequests.AzureDevOps 1.0.0
  • Cake.Issues.PullRequests.AppVeyor 1.0.0
  • Cake.Issues.Reporting 1.0.0
  • Cake.Issues.Reporting.Generic 1.0.0
  • Cake.Issues.Reporting.Sarif 1.0.0
","boost":0.5},{"location":"news/2021/07/30/cake-issues-eslint-v101-released/","title":"Cake Issues ESLint v1.0.1 Released","text":"

Version 1.0.1 of ESLint support for Cake.Issues has been released. This is a minor release containing bug fixes.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • eoehen
  • pascalberger
  • Speeedy01
","boost":0.5},{"location":"news/2021/07/30/cake-issues-eslint-v101-released/#bug-fix-for-issues-with-line-column-or-rule","title":"Bug fix for issues with line, column or rule","text":"

When an issue reported by ESLint didn't contain line or column information, or rule was set to null an exception ocurred while parsing the file. This release fixes this and can now also correctly parse issues without position or rule information.

","boost":0.5},{"location":"news/2021/07/30/cake-issues-eslint-v101-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues.EsLint 1.0.1 is compatible with version 1.0.0 without any breaking changes. To update to the new version bump the version of the addin.

","boost":0.5},{"location":"news/2021/08/04/cake-issues-recipe-v100-released-bringing-support-for-cake-frosting/","title":"Cake Issues Recipe v1.0.0 Released, bringing support for Cake Frosting","text":"

Hard on the heels of the announcement for release 1.0 of Cake.Issues addins, we're happy to announce release 1.0 of the recipe script for Cake.Issues.

This is a major release bringing support for Cake Frosting and other new features.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • pascalberger
","boost":0.5},{"location":"news/2021/08/04/cake-issues-recipe-v100-released-bringing-support-for-cake-frosting/#support-for-cake-10","title":"Support for Cake 1.0","text":"

Cake Issues recipe has been updated to use latest 1.x versions of the Cake.Issues addins which support Cake 1.x.

See announcement for release 1.0 of Cake.Issues addins for features added in the individual addins.

","boost":0.5},{"location":"news/2021/08/04/cake-issues-recipe-v100-released-bringing-support-for-cake-frosting/#support-for-cake-frosting","title":"Support for Cake Frosting","text":"

Additionally to the existing Cake.Issues.Recipe package, which works fine for Cake script runners, there's a new Cake.Frosting.Issues.Recipe package suitable for builds using Cake Frosting.

See Using Cake.Frosting.Issues.Recipe for an example.

","boost":0.5},{"location":"news/2021/08/04/cake-issues-recipe-v100-released-bringing-support-for-cake-frosting/#support-for-environments-not-compatible-with-cakegit-addin","title":"Support for environments not compatible with Cake.Git addin","text":"

In previous versions Cake.Issues recipes had used Cake.Git addin to determine state of the Git repository. While this works in most cases, there are some environments where Cake.Git addin currently does not work.

Starting with this version it is now possible to define if Cake.Git addin or Git CLI should be used.

See Git repository information configuration for details.

","boost":0.5},{"location":"news/2021/08/04/cake-issues-recipe-v100-released-bringing-support-for-cake-frosting/#define-settings-for-issue-providers","title":"Define settings for issue providers","text":"

Previous versions of Cake.Issues recipes used default settings for reading issues from the passed log files. This made it impossible to parse log files which for example are created by tools running in containers, as they have a root path different to the repository root.

This version introduced methods to pass log files to the recipe scripts, which additionally to the log file path accept a settings object.

The new implementation also supports other use-cases like reading multiple files with the same issues provider, but different settings (e.g. run information).

","boost":0.5},{"location":"news/2021/08/04/cake-issues-recipe-v100-released-bringing-support-for-cake-frosting/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues Recipes 1.0.0 is a breaking release, which means that it probably requires changes to your build script. This section documents the most common changes which might be required:

  • Properties for passing input files to the recipe scripts have been replaced by methods. As an example, in previous versions MsBuild XML log files could be passed by setting the IssuesParameters.InputFiles.MsBuildXmlFileLoggerLogFilePath property:
IssuesParameters.InputFiles.MsBuildXmlFileLoggerLogFilePath = @\"c:\\build\\msbuild.log\";\n

With 1.0 the IssuesParameters.InputFiles.AddMsBuildXmlFileLoggerLogFile() method needs to be called instead:

IssuesParameters.InputFiles.AddMsBuildXmlFileLoggerLogFile(@\"c:\\build\\msbuild.log\");\n

For details see full release notes

","boost":0.5},{"location":"news/2021/08/11/cake-issues-recipes-v110-released/","title":"Cake Issues Recipes v1.1.0 released","text":"

Version 1.1.0 of Cake Issues recipes have been released adding support to customize report generation.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • pascalberger
","boost":0.5},{"location":"news/2021/08/11/cake-issues-recipes-v110-released/#report-customization","title":"Report customization","text":"

This version of Cake Issues recipes adds a new FullIssuesReportSettings configuration parameter which allows to customize the generated issue report. See Report creation parameters for details.

The following example enables exporting of the report when using Cake.Issues.Recipe:

IssuesParameters.Reporting.FullIssuesReportSettings\n    .WithOption(HtmlDxDataGridOption.EnableExporting, true)\n

The following example enables exporting of the report when using Cake.Frosting.Issues.Recipe:

context.Parameters.Reporting.FullIssuesReportSettings\n    .WithOption(HtmlDxDataGridOption.EnableExporting, true)\n
","boost":0.5},{"location":"news/2021/08/11/cake-issues-recipes-v110-released/#updated-addins","title":"Updated addins","text":"

Cake.Git has been updated to version 1.1.0 which comes with an updated version of LibGit2Sharp which adds support for Ubuntu 20.

See Cake.Git 1.1.0 release notes for details.

","boost":0.5},{"location":"news/2021/08/11/cake-issues-recipes-v110-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake Issues recipes 1.1.0 are compatible with version 1.x without any breaking changes. To update to the new version bump the version in your build.

","boost":0.5},{"location":"news/2021/08/19/cake-issues-recipes-v120-released/","title":"Cake Issues Recipes v1.2.0 released","text":"

Version 1.2.0 of Cake Issues recipes have been released adding support to customize issue reporting to pull requests.

This post shows the highlights included in this release. For details see full release notes. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • pascalberger
","boost":0.5},{"location":"news/2021/08/19/cake-issues-recipes-v120-released/#customization-of-pull-request-integration","title":"Customization of pull request integration","text":"

This version of Cake Issues recipes adds several new configuration parameter which allows to customize how issues are reported to pull requests. See Pull request integration parameters for details.

The following example limits the number of issues posted to pull requests to 20 when using Cake.Issues.Recipe:

IssuesParameters.PullRequestSystem.MaxIssuesToPost = 20;\n

The following example limits the number of issues posted to pull requests to 20 when using Cake.Frosting.Issues.Recipe:

context.Parameters.PullRequestSystem.MaxIssuesToPost = 20;\n
","boost":0.5},{"location":"news/2021/08/19/cake-issues-recipes-v120-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake Issues recipes 1.2.0 are compatible with version 1.x without any breaking changes. To update to the new version bump the version in your build.

","boost":0.5},{"location":"news/2021/08/29/new-addin-for-printing-issues-to-console/","title":"New addin for printing issues to console","text":"

A new Cake.Issues.Reporting.Console addin has been released which allows to output issues to the console.

Cake.Issues.Reporting.Console addin can be used to print issues to the console and is built on top of the excellent Errata library by Patrik Svensson.

Its main focus is to annotate source code with issues:

It currently only supports issues containing line and column information. Output can be grouped by rule, like in the image above, or individual entries for every issue.

Beside printing issues it can also show summary tables.

There's one summary which shows the number of issues for everyprovider and run:

Another summary shows the number of issues by priority for every provider and run:

","boost":0.5},{"location":"news/2021/08/31/cake-issues-markdownlint-v110-released/","title":"Cake Issues Markdownlint v1.1.0 Released","text":"

Version 1.1.0 of Markdownlint support for Cake.Issues has been released. This is a minor release adding features and improvements.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • pascalberger
","boost":0.5},{"location":"news/2021/08/31/cake-issues-markdownlint-v110-released/#support-for-markdownlint-cli-json-format","title":"Support for markdownlint-cli JSON format","text":"

Since version 0.28.0 markdownlint-cli supports a --json option to output result in JSON format. This version adds support for this format through the MarkdownlintCliJsonLogFileFormat alias.

","boost":0.5},{"location":"news/2021/08/31/cake-issues-markdownlint-v110-released/#provide-column-information","title":"Provide column information","text":"

This release of Cake.Issues.Markdownlint enhances the MarkdownlintCliLogFileFormat to provide column information if reported by markdownlint.

","boost":0.5},{"location":"news/2021/08/31/cake-issues-markdownlint-v110-released/#recipe-packages","title":"Recipe packages","text":"

Cake Issues recipes have been released in version 1.3.0 shipping with Cake.Issues.Markdownlint 1.1.0 and adding support for markdownlint-cli JSON files.

","boost":0.5},{"location":"news/2021/08/31/cake-issues-markdownlint-v110-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues.Markdownlint 1.1.0 is compatible with version 1.0.0 without any breaking changes. To update to the new version bump the version of the addin.

","boost":0.5},{"location":"news/2021/09/05/cake-issues-reporting-console-v030-released-adding-support-for-all-cake-runners/","title":"Cake Issues Reporting Console v0.3.0 released, adding support for all Cake runners","text":"

Version 0.3.0 of Cake.Issues.Reporting.Console has been released. This is a minor release adding features and improvements.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • pascalberger
  • patriksvensson
","boost":0.5},{"location":"news/2021/09/05/cake-issues-reporting-console-v030-released-adding-support-for-all-cake-runners/#support-for-all-cake-runners","title":"Support for all Cake runners","text":"

Starting with this release Cake.Issues.Reporting.Console will target .NET Standard 2.0 instead of .NET 5.0 and therefore will support all Cake runners.

","boost":0.5},{"location":"news/2021/09/05/cake-issues-reporting-console-v030-released-adding-support-for-all-cake-runners/#improved-reporting","title":"Improved reporting","text":"

Provider report is now rendered in different colors for the individual bars, making it easier to read:

","boost":0.5},{"location":"news/2021/09/05/cake-issues-reporting-console-v030-released-adding-support-for-all-cake-runners/#errata-060","title":"Errata 0.6.0","text":"

Underlying Errata library has been updated to 0.6.0, containing additional bug fixes and rendering improvements.

","boost":0.5},{"location":"news/2021/09/05/cake-issues-reporting-console-v030-released-adding-support-for-all-cake-runners/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues.Reporting.Console 0.3.0 is compatible with previous versions without any breaking changes. To update to the new version bump the version of the addin.

","boost":0.5},{"location":"news/2022/12/10/cake-issues-v200-released/","title":"Cake Issues v2.0.0 Released","text":"

After several months with beta releases Cake Issues version 2.0.0 has been released. This is a major release, containing breaking changes beside bringing new features and bug fixes across all addins.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • eoehen
  • KirillOsenkov
  • pascalberger
  • twenzel
  • yansklyarenko
","boost":0.5},{"location":"news/2022/12/10/cake-issues-v200-released/#support-for-cake-20","title":"Support for Cake 2.0","text":"

All addins have been updated to support Cake 2.x.

Target framework have been updated to .NET Core 3.1, .NET 5 and .NET 6 to be in line with Cake. See Sunsetting of .NET Framework and .NET Core runners in Cake 2.0 for details.

","boost":0.5},{"location":"news/2022/12/10/cake-issues-v200-released/#support-for-msbuild-binary-logs-version-9","title":"Support for MsBuild binary logs version 9","text":"

Support for binary logs in version 9 has been added to Cake.Issues.MsBuild.

","boost":0.5},{"location":"news/2022/12/10/cake-issues-v200-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 2.0.0 is a breaking release, which means that it probably requires changes to your build script. This section documents the most common changes which might be required:

  • Cake.Issues
  • Serialization format has been updated to version 5. Older version are still supported for deserialization.
  • ProviderIssueIssueLimits has been renamed to ProviderIssueLimits
  • IIssue.Rule has been renamed to IIssue.RuleId
  • IIssue was extended with an additional RuleName property.
  • Cake.Issues.MsBuild
  • MsBuild 15 or newer required for binary logs

For details see release notes of the individual addins:

  • Cake.Issues 2.0.0
  • Cake.Issues.DocFx 2.0.0
  • Cake.Issues.DupFinder 2.0.0
  • Cake.Issues.EsLint 2.0.0
  • Cake.Issues.GitRepository 2.0.0
  • Cake.Issues.InspectCode 2.0.0
  • Cake.Issues.Markdownlint 2.0.0
  • Cake.Issues.MsBuild 2.0.0
  • Cake.Issues.Terraform 2.0.0
  • Cake.Issues.Reporting.Console 2.0.0
  • Cake.Issues.Reporting.Generic 2.0.0
  • Cake.Issues.Reporting.Sarif 2.0.0
  • Cake.Issues.PullRequests.AppVeyor 2.0.0
  • Cake.Issues.PullRequests.AzureDevOps 2.0.0
  • Cake.Issues.PullRequests.GitHubActions 2.0.0
","boost":0.5},{"location":"news/2023/07/22/cake-issues-v300-released/","title":"Cake Issues v3.0.0 Released","text":"

Cake Issues version 3.0.0 has been released. This is a major release, containing breaking changes beside bringing new features and bug fixes across all addins.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • DiDoHH
  • eoehen
  • pascalberger
","boost":0.5},{"location":"news/2023/07/22/cake-issues-v300-released/#support-for-cake-30","title":"Support for Cake 3.0","text":"

All addins have been updated to support Cake 3.x.

Target framework have been updated to .NET 6 and .NET 7 to be in line with Cake.

","boost":0.5},{"location":"news/2023/07/22/cake-issues-v300-released/#support-for-msbuild-binary-logs-version-16","title":"Support for MsBuild binary logs version 16","text":"

Support for binary logs in version 16 has been added to Cake.Issues.MsBuild.

","boost":0.5},{"location":"news/2023/07/22/cake-issues-v300-released/#out-of-the-box-support-for-more-rule-links","title":"Out of the box support for more rule links","text":"

Cake.Issues.MsBuild now will automatically provide links for Roslynator and SonarLint rules. Links for CA rules have updated to link to learn.microsoft.com.

","boost":0.5},{"location":"news/2023/07/22/cake-issues-v300-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 3.0.0 is a breaking release, which means that it probably requires changes to your build script. This section documents the most common changes which might be required:

  • Cake.Issues
  • StringPathExtensions.IsValideRepositoryFilePath has been renamed to StringPathExtensions.IsValidRepositoryFilePath
  • BaseRuleDescription.Rule has been made immutable after initialization
  • Cake.Issues.Recipe
  • Since Dupfinder has been sunsetted end of 2021, out of the box support for it has been removed from Cake Issues Recipe and DupFinderLogFilePaths is no longer available. To keep using DupFinder you need to manually add Cake.Issues.DupFinder and add issues using the AddIssues method.

For details see release notes of the individual addins:

  • Cake.Issues.Recipe 3.0.0
  • Cake.Issues 3.0.0
  • Cake.Issues.DocFx 3.0.0
  • Cake.Issues.DupFinder 3.0.0
  • Cake.Issues.EsLint 3.0.0
  • Cake.Issues.GitRepository 3.0.0
  • Cake.Issues.InspectCode 3.0.0
  • Cake.Issues.Markdownlint 3.0.0
  • Cake.Issues.MsBuild 3.0.0
  • Cake.Issues.Terraform 3.0.0
  • Cake.Issues.Reporting.Console 3.0.0
  • Cake.Issues.Reporting.Generic 3.0.0
  • Cake.Issues.Reporting.Sarif 3.0.0
  • Cake.Issues.PullRequests.AppVeyor 3.0.0
  • Cake.Issues.PullRequests.AzureDevOps 3.0.0
  • Cake.Issues.PullRequests.GitHubActions 3.0.0
","boost":0.5},{"location":"news/2023/08/16/cake-issues-recipes-v310-released/","title":"Cake Issues Recipes v3.1.0 released","text":"

Version 3.1.0 of Cake Issues recipes have been released adding support for creating of reports in SARIF format.

This post shows the highlights included in this release. For details see full release notes. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • pascalberger
","boost":0.5},{"location":"news/2023/08/16/cake-issues-recipes-v310-released/#reports-in-sarif-format","title":"Reports in SARIF format","text":"

This version of Cake Issues recipes adds a new configuration parameter which allows to create reports in SARIF format allowing further processing in a lot of different tools also supporting the SARIF standard. See Report parameters for details.

If running on Azure Pipelines the generated SARIF file is uploaded so that it will be shown in the SARIF SAST Scans Tab extension.

","boost":0.5},{"location":"news/2023/08/16/cake-issues-recipes-v310-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake Issues recipes 3.1.0 are compatible with version 3.x without any breaking changes. To update to the new version bump the version in your build.

","boost":0.5},{"location":"news/2023/12/23/cake-issues-v400-released/","title":"Cake Issues v4.0.0 Released","text":"

Cake Issues version 4.0.0 has been released. This is a major release, containing breaking changes beside bringing new features and bug fixes across all addins.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • pascalberger
","boost":0.5},{"location":"news/2023/12/23/cake-issues-v400-released/#support-for-cake-40","title":"Support for Cake 4.0","text":"

All addins have been updated to support Cake 4.x.

Target framework have been updated to .NET 6, .NET 7 and .NET 8 to be in line with Cake.

","boost":0.5},{"location":"news/2023/12/23/cake-issues-v400-released/#switch-to-systemtextjson-for-serialization","title":"Switch to System.Text.Json for serialization","text":"

For serialization / deserialization of issues LitJson was used internally. With Cake.Issues 4.0 internal code has been changed to use System.Text.Json classes.

The change should not have any impact for users.

","boost":0.5},{"location":"news/2023/12/23/cake-issues-v400-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

While Cake.Issues 4.0.0 is a breaking release, there are no breaking changes beside the update to Cake 4.x and the changes to target framework version.

For details see release notes

","boost":0.5},{"location":"news/2024/01/14/alignment-of-addin-lifecycles/","title":"Alignment of addin lifecycles","text":"

Cake Issues has a modular architecture consisting of multiple addins. Historically every addin had its own independent release lifecycle. Starting with the next release work will begin to have all addins share the same release lifecycle.

When Cake Issues started all three core addins (Cake.Issues, Cake.Issues.Reporting and Cake.Issues.PullRequsts) and every issue provider, report format and pull request system addin were released on their own schedule, allowing fast iterations of individual components. With the release of Cake Issues 1.0 the release lifecycle of the three core addins have been aligned, resulting in a simplified release process.

Starting with the next release we'll begin to move also the remaining issue provider, report format and pull request system addins into the main Cake Issues repository and have them released together with the core addins.

","boost":0.5},{"location":"news/2024/02/21/cake-issues-v410-released/","title":"Cake Issues v4.1.0 Released","text":"

Cake Issues version 4.1.0 has been released with improvements for Cake Frosting and support for latest MsBuild binary log format.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • christianbumann
  • pascalberger
","boost":0.5},{"location":"news/2024/02/21/cake-issues-v410-released/#improvement-for-cake-frosting","title":"Improvement for Cake Frosting","text":"

Cake.Frosting.Issues.Reporting and Cake.Frosting.Issues.PullRequests have been released as optimized version of the Cake.Issues.Reporting and Cake.Issues.PullRequests for Cake Frosting.

These addins come with a dependency to the core Cake.Issues addin, allowing it to be consumed as transitive dependency.

","boost":0.5},{"location":"news/2024/02/21/cake-issues-v410-released/#support-for-msbuild-binary-logs-version-18","title":"Support for MsBuild binary logs version 18","text":"

Support for binary logs in version 18 has been added to Cake.Issues.MsBuild.

","boost":0.5},{"location":"news/2024/02/21/cake-issues-v410-released/#alignment-of-release-lifecycle","title":"Alignment of release lifecycle","text":"

As announced in Alignment of addin lifecycles work as started to move addins into the main Cake Issues repository.

Starting with this release the following addins will be released together with the core addins:

  • Cake.Issues.DocFx
  • Cake.Issues.EsLint
  • Cake.Issues.MsBuild
  • Cake.Issues.InspectCode
  • Cake.Issues.Markdownlint
","boost":0.5},{"location":"news/2024/02/21/cake-issues-v410-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.1.0 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/04/14/cake-issues-v420-released/","title":"Cake Issues v4.2.0 Released","text":"

Cake Issues version 4.2.0 has been released introducing a new issue provider for SARIF compatible files.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • eoehen
  • pascalberger
","boost":0.5},{"location":"news/2024/04/14/cake-issues-v420-released/#new-issue-provider-for-sarif-files","title":"New issue provider for SARIF files","text":"

A new Cake.Issues.Sarif addin has been released which adds support for reading issues in SARIF format.

See New addin for reading SARIF files for details.

","boost":0.5},{"location":"news/2024/04/14/cake-issues-v420-released/#improvement-for-cake-frosting","title":"Improvement for Cake Frosting","text":"

Optimized versions for Cake Frosting have been released for the following addins:

  • Cake.Frosting.Issues.DocFx
  • Cake.Frosting.Issues.EsLint
  • Cake.Frosting.Issues.GitRepository
  • Cake.Frosting.Issues.InspectCode
  • Cake.Frosting.Issues.Markdownlint
  • Cake.Frosting.Issues.Terraform
  • Cake.Frosting.Issues.PullRequests.AppVeyor
  • Cake.Frosting.Issues.PullRequests.AzureDevOps
  • Cake.Frosting.Issues.PullRequests.GitHubActions

These addins come with a dependency to the core addins, allowing the core addins to be consumed as transitive dependencies.

","boost":0.5},{"location":"news/2024/04/14/cake-issues-v420-released/#alignment-of-release-lifecycle","title":"Alignment of release lifecycle","text":"

As announced in Alignment of addin lifecycles work as started to move addins into the main Cake Issues repository.

Starting with this release the following addins will be released together with the core addins:

  • Cake.Issues.GitRepository
  • Cake.Issues.Terraform
  • Cake.Issues.PullRequests.AppVeyor
  • Cake.Issues.PullRequests.AzureDevOps
  • Cake.Issues.PullRequsts.GitHubActions
  • Cake.Issues.Reporting.Console
  • Cake.Issues.Reporting.Generic
  • Cake.Issues.Reporting.Sarif
","boost":0.5},{"location":"news/2024/04/14/cake-issues-v420-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.2.0 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/04/14/new-addin-for-reading-sarif-files/","title":"New addin for reading SARIF files","text":"

A new Cake.Issues.Sarif addin has been released which adds support for reading issues in SARIF format.

SARIF is an industry standard format for the output of static analysis tools. With the introduction of SARIF support through the Cake.Issues.Sarif addin any tool which can output results in SARIF format can now be used together with Cake Issues.

See Supported Tools for an updated list of supported tools.

The addins is available in a version for Cake .NET Tool (Cake.Issues.Sarif) and Cake Frosting (Cake.Frosting.Issues.Sarif).

","boost":0.5},{"location":"news/2024/04/16/cake-issues-v421-released/","title":"Cake Issues v4.2.1 Released","text":"

Cake Issues version 4.2.1 has been released with compatibility fixes.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • pascalberger
","boost":0.5},{"location":"news/2024/04/16/cake-issues-v421-released/#compatibility-improvements","title":"Compatibility improvements","text":"

As a side-effect of moving all addins to the central Cake Issues repository, AssemblyVersion of every has been set to the release version.

Addins are backwards compatible though to latest major version, which was no longer possible with this change.

This release fixes this by setting the AssemblyVersion to the major version (currently 4.0.0).

","boost":0.5},{"location":"news/2024/04/16/cake-issues-v421-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.2.1 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/04/20/cake-issues-v430-released/","title":"Cake Issues v4.3.0 Released","text":"

Cake Issues version 4.3.0 has been released with support for MsBuild binary log format version 20.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • pascalberger
","boost":0.5},{"location":"news/2024/04/20/cake-issues-v430-released/#support-for-msbuild-binary-logs-version-20","title":"Support for MsBuild binary logs version 20","text":"

Support for binary logs in version 20 has been added to Cake.Issues.MsBuild.

","boost":0.5},{"location":"news/2024/04/20/cake-issues-v430-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.3.0 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/04/25/cake-issues-v431-released/","title":"Cake Issues v4.3.1 Released","text":"

Cake Issues version 4.3.1 has been released bringing bug fixes.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • pascalberger
","boost":0.5},{"location":"news/2024/04/25/cake-issues-v431-released/#bugfix-for-issues-across-multiple-lines","title":"Bugfix for issues across multiple lines","text":"

This release fixes an exception if an issue provider reports an issue across multiple lines and the end column is before the start column.

","boost":0.5},{"location":"news/2024/04/25/cake-issues-v431-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.3.1 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/05/18/cake-issues-v440-released/","title":"Cake Issues v4.4.0 Released","text":"

Cake Issues version 4.4.0 has been released with improvements for Cake Frosting.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • eoehen
  • pascalberger
","boost":0.5},{"location":"news/2024/05/18/cake-issues-v440-released/#cake-frosting-improvements","title":"Cake Frosting improvements","text":"

Support for implicit usings has been added to the Cake Frosting addins.

If <ImplicitUsings>enable</ImplicitUsings> is set in a Cake Frosting build, namespaces for Cake Issues addins are implicitly added, resulting in a similar experience as when using Cake .NET Tool, where aliases can be used directly without the requirements to first add using statements.

","boost":0.5},{"location":"news/2024/05/18/cake-issues-v440-released/#filtering-improvements-in-html-devextreme-data-grid-template","title":"Filtering improvements in HTML DevExtreme Data Grid template","text":"

The HTML DevExtreme Data Grid template now supports search boxes in filter dropdowns.

See Header Filter Customization in DataGrid for details.

","boost":0.5},{"location":"news/2024/05/18/cake-issues-v440-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.4.0 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/05/23/cake-issues-v450-released/","title":"Cake Issues v4.5.0 Released","text":"

Cake Issues version 4.5.0 has been released adding support for build breaking.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • eoehen
  • pascalberger
  • Speeedy01
","boost":0.5},{"location":"news/2024/05/23/cake-issues-v450-released/#support-for-breaking-builds","title":"Support for breaking builds","text":"

New BreakBuildOnIssues aliases have been introduced to fail builds when issues are found.

See build breaking for an example.

","boost":0.5},{"location":"news/2024/05/23/cake-issues-v450-released/#possibility-to-define-license-for-html-devextreme-data-grid","title":"Possibility to define license for HTML DevExtreme Data Grid","text":"

Starting with version 23.2 DevExtreme no longer comes with a free community license. HTML DevExtreme Data Grid template will stay on version 23.1 for this reason.

If you have a DevExtreme license you can pass it to the new DevExtremeLicenseKey option and update to a newer version using the DevExtremeVersion option.

","boost":0.5},{"location":"news/2024/05/23/cake-issues-v450-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.5.0 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/05/24/cake-issues-v451-released/","title":"Cake Issues v4.5.1 Released","text":"

Cake Issues version 4.5.1 has been released containing bug fixes.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • eoehen
  • pascalberger
","boost":0.5},{"location":"news/2024/05/24/cake-issues-v451-released/#fixed-log-output","title":"Fixed log output","text":"

This release fixes verbose output of Cake.Issues.PullRequests for provider issue limits.

","boost":0.5},{"location":"news/2024/05/24/cake-issues-v451-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.5.1 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/06/24/cake-issues-v460-released/","title":"Cake Issues v4.6.0 Released","text":"

Cake Issues version 4.6.0 has been released with improvements for SARIF reports.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • christianbumann
  • eoehen
  • pascalberger
  • Speeedy01
","boost":0.5},{"location":"news/2024/06/24/cake-issues-v460-released/#improvements-for-sarif-reports","title":"Improvements for SARIF Reports","text":"

A new option SarifIssueReportFormatSettings.ExistingIssues has been introduced which allows to pass in a list of known issues not related to current code changes, resulting in the baselineState property being set in the resulting SARIF report.

This property is for example be used in the SARIF viewer extension for Azure Pipelines as filter option.

The following new settings options have been added:

SarifIssueReportFormatSettings property Output property Description Guid automationDetails.guid Unique, stable identifier for the run BaselineGuid run.baselineGuid String equal to Guid of a previous run CorrelationGuid automationDetails.correlationGuid Guid shared by all runs of the same type","boost":0.5},{"location":"news/2024/06/24/cake-issues-v460-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.6.0 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/07/16/cake-issues-v470-released/","title":"Cake Issues v4.7.0 Released","text":"

Cake Issues version 4.7.0 has been released with detailed line information for SARIF issue provider and support for MsBuild binary log format version 21.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • eoehen
  • pascalberger
","boost":0.5},{"location":"news/2024/07/16/cake-issues-v470-released/#support-for-msbuild-binary-logs-version-21","title":"Support for MsBuild binary logs version 21","text":"

Support for binary logs in version 21 has been added to Cake.Issues.MsBuild.

","boost":0.5},{"location":"news/2024/07/16/cake-issues-v470-released/#enhanced-line-and-column-information-from-sarif-reports","title":"Enhanced line and column information from SARIF reports","text":"

Cake.Issues.Sarif has been enhanced to also provide the following IIssue properties if available:

  • IIssue.EndLine
  • IIssue.Column
  • IIssue.EndColumn
","boost":0.5},{"location":"news/2024/07/16/cake-issues-v470-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.7.0 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/07/17/cake-issues-v471-released/","title":"Cake Issues v4.7.1 Released","text":"

Cake Issues version 4.7.1 has been released with bugfixes for SARIF reports

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • christianbumann
  • eoehen
  • pascalberger
","boost":0.5},{"location":"news/2024/07/17/cake-issues-v471-released/#bugfixes-for-sarif-reports","title":"Bugfixes for SARIF reports","text":"

This release fixes two bugs in Cake.Issues.Reporting.Sarif:

  • If two or more different rules containing a rule URL are reported by the same issue provider, the first occurrence of the second rule will have 0 as ruleIndex instead of 1
  • originalUriBaseIds should end with a slash as defined in SARIF Specification 2.1.0 \u00a73.14.14.
","boost":0.5},{"location":"news/2024/07/17/cake-issues-v471-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.7.1 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/07/18/cake-issues-v472-released/","title":"Cake Issues v4.7.2 Released","text":"

Cake Issues version 4.7.2 has been released containing bug fixes for generic reporting addin.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • pascalberger
","boost":0.5},{"location":"news/2024/07/18/cake-issues-v472-released/#fix-for-generic-reporting-addin","title":"Fix for generic reporting addin","text":"

This release fixes an bug in Cake.Issues.Reporting.Generic where it was not possible to overwrite version of JsPdf version used in HTML DevExtreme Data Grid template.

","boost":0.5},{"location":"news/2024/07/18/cake-issues-v472-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.7.2 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/07/19/cake-issues-v480-released/","title":"Cake Issues v4.8.0 Released","text":"

Cake Issues version 4.8.0 has been released with improvements for SARIF issue provider.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • pascalberger
","boost":0.5},{"location":"news/2024/07/19/cake-issues-v480-released/#improvements-for-sarif-issue-provider","title":"Improvements for SARIF issue provider","text":"

In previous releases the SARIF issue provider used the tool name defined in the SARIF file for a specific run as issue provider. This has the advantage that if multiple SARIF files from different sources are read, every issue has a different issue provider name, which reflects the original tool.

But it can also have side-effect, for example that different states are reported to pull request depending if run is successful or not (see cake-contrib/Cake.Issues.Recipe#477), because the actual issue provider name is only known once there are issues reported.

This release introduces a new option SarifIssuesSettings.UseToolNameAsIssueProviderName to define whether the tool name reported in the SARIF log or a fixed value should be used as issue provider name.

","boost":0.5},{"location":"news/2024/07/19/cake-issues-v480-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.8.0 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/07/25/cake-issues-v490-released/","title":"Cake Issues v4.9.0 Released","text":"

Cake Issues version 4.9.0 has been released with bugfixes for SARIF report format and Terraform issue provider.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • christianbumann
  • eoehen
  • pascalberger
","boost":0.5},{"location":"news/2024/07/25/cake-issues-v490-released/#bugfixes-for-sarif-report-format","title":"Bugfixes for SARIF report format","text":"

This release fixes an issue where entries in a SARIF report were marked as updated if branch or commit in file link has changed.

To achieve this, a new constructor for the generic IIssueComparer has been introduced, which allows to define which IIssue properties should be ignored for the comparison.

","boost":0.5},{"location":"news/2024/07/25/cake-issues-v490-released/#bugfixes-for-terraform-issue-provider","title":"Bugfixes for Terraform issue provider","text":"

A bug has been fixed where root directory was not correctly determined when running on Linux or macOS.

","boost":0.5},{"location":"news/2024/07/25/cake-issues-v490-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.9.0 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/07/30/cake-issues-v4100-released/","title":"Cake Issues v4.10.0 Released","text":"

Cake Issues version 4.10.0 has been released with support for MsBuild binary log format version 22.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • christianbumann
  • eoehen
  • pascalberger
","boost":0.5},{"location":"news/2024/07/30/cake-issues-v4100-released/#support-for-msbuild-binary-logs-version-22","title":"Support for MsBuild binary logs version 22","text":"

Support for binary logs in version 20 has been added to Cake.Issues.MsBuild.

","boost":0.5},{"location":"news/2024/07/30/cake-issues-v4100-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.10.0 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/08/20/cake-issues-v4101-released/","title":"Cake Issues v4.10.1 Released","text":"

Cake Issues version v4.10.1 has been released with bugfixes for Cake Frosting and file linking

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • christianbumann
  • eoehen
  • gep13
  • hotchkj
  • pascalberger
","boost":0.5},{"location":"news/2024/08/20/cake-issues-v4101-released/#bugfixes-for-cake-frosting","title":"Bugfixes for Cake Frosting","text":"

This release fixes dependencies of the following Cake Frosting optimized NuGet packages:

  • Cake.Frosting.Issues.PullRequests.AppVeyor
  • Cake.Frosting.Issues.PullRequests.AzureDevOps
  • Cake.Frosting.Issues.PullRequests.GitHubActions
  • Cake.Frosting.Issues.Reporting.Console
  • Cake.Frosting.Issues.Reporting.Generic
  • Cake.Frosting.Issues.Reporting.Sarif
","boost":0.5},{"location":"news/2024/08/20/cake-issues-v4101-released/#bugfixes-for-file-linking","title":"Bugfixes for file linking","text":"

This release fixes an issue that file links are created for issues which are not related to a file.

","boost":0.5},{"location":"news/2024/08/20/cake-issues-v4101-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues v4.10.1 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/10/06/cake-issues-v4110-released/","title":"Cake Issues v4.11.0 Released","text":"

Cake Issues version 4.11.0 has been released with support for MsBuild binary log format version 23.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • eoehen
  • pascalberger
","boost":0.5},{"location":"news/2024/10/06/cake-issues-v4110-released/#support-for-msbuild-binary-logs-version-23","title":"Support for MsBuild binary logs version 23","text":"

Support for binary logs in version 23 has been added to Cake.Issues.MsBuild.

","boost":0.5},{"location":"news/2024/10/06/cake-issues-v4110-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.11.0 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/11/05/cake-issues-v4120-released/","title":"Cake Issues v4.12.0 Released","text":"

Cake Issues version 4.12.0 has been released with support for MsBuild binary log format version 24.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • eoehen
  • pascalberger
","boost":0.5},{"location":"news/2024/11/05/cake-issues-v4120-released/#support-for-msbuild-binary-logs-version-24","title":"Support for MsBuild binary logs version 24","text":"

Support for binary logs in version 24 has been added to Cake.Issues.MsBuild.

","boost":0.5},{"location":"news/2024/11/05/cake-issues-v4120-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.12.0 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/12/02/cake-issues-v500-released/","title":"Cake Issues v5.0.0 Released","text":"

Cake Issues version 5.0.0 has been released. This is a major release, containing breaking changes beside bringing new features and bug fixes across all addins.

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • eoehen
  • pascalberger
","boost":0.5},{"location":"news/2024/12/02/cake-issues-v500-released/#support-for-cake-50","title":"Support for Cake 5.0","text":"

All addins have been updated to support Cake 5.x.

Target framework have been updated to .NET 8 and .NET 9 to be in line with Cake.

","boost":0.5},{"location":"news/2024/12/02/cake-issues-v500-released/#improvements-for-cake-frosting","title":"Improvements for Cake Frosting","text":"

Cake.Frosting.Issues.PullRequests.AzureDevOps now references Cake.Frosting.AzureDevOps, a version of Cake.AzureDevOps, optimized for Cake Frosting.

Instead of shipping client assemblies to access Azure DevOps as part of Cake.AzureDevOps, Cake.Frosting.AzureDevOps references the corresponding NuGet packages, which for example allows to control version of the libraries used.

","boost":0.5},{"location":"news/2024/12/02/cake-issues-v500-released/#security-improvements","title":"Security improvements","text":"

Transitive dependencies which contain known security vulnerabilities have been updated to newer versions where the vulnerabilities are fixed.

","boost":0.5},{"location":"news/2024/12/02/cake-issues-v500-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 5.0.0 is a breaking release, which means that there is a small change that changes to your build script are required.

For details see release notes

","boost":0.5},{"location":"news/2024/12/17/cake-issues-v501-released/","title":"Cake Issues v5.0.1 Released","text":"

Cake Issues version 5.0.1 has been released containing bug fixes for Cake Frosting addins

This post shows the highlights included in this release. For update instructions skip to Updating from previous versions.

\u2764 Huge thanks to our community! This release would not have been possible without your support and contributions! \u2764

People working on this release:

  • christianbumann
  • eoehen
  • pascalberger
","boost":0.5},{"location":"news/2024/12/17/cake-issues-v501-released/#bugfixes-for-cake-frosting","title":"Bugfixes for Cake Frosting","text":"

This release fixes dependencies of the following Cake Frosting optimized NuGet packages:

  • Cake.Frosting.Issues.PullRequests.AppVeyor
","boost":0.5},{"location":"news/2024/12/17/cake-issues-v501-released/#updating-from-previous-versions","title":"Updating from previous versions","text":"

Cake.Issues 4.7.2 addins are compatible with any 4.x addins. To update to the new version bump the version of the specific addins.

For details see release notes

","boost":0.5},{"location":"news/2024/12/21/new-website/","title":"New website","text":"

Today a new version of the Cake Issues website has been published.

The Cake Issues website was introduced 2017 as a static website built using Wyam, like the Cake website. Using Wyam allowed to add full API documentation and other features like list of addins or overview of open issues across all addins.

Wyam is no longer maintained, with Statiq as its successor. Unfortunately also the deployment pipeline for the Cake Issues website stopped working in 2023, resulting in the website no longer receiving updates.

Since the introduction of the Cake Issues website seven years ago, the Cake website also has been improved, among other things, with a dedicated page for each addin listing the aliases the addin provides. These improvements made a full API documentation on Cake Issues website somehow redundant.

With .NET API documentation no longer being a requirement there are much more tooling options available. The choice was made to use Material for MkDocs, which comes with a lot of features for writing technical documentation.

One of the features of the new website is support for multiple versions using mike. https://cakeissues.net/latest/ will always point to the documentation of the latest released version. https://cakeissues.net/develop/ points to the documentation of the current development branch. Beside that there's now a version selector in the header to show documentation for any old version.

","boost":0.5},{"location":"news/2025/01/01/2024-in-review/","title":"2024 In Review","text":"

2024 had been an amazing year for Cake Issues. In this post we'll look back to what had been achieved in 2024.

","boost":0.5},{"location":"news/2025/01/01/2024-in-review/#alignment-of-addin-lifecycles","title":"Alignment of addin lifecycles","text":"

2024 started with an announcement to consolidate all Cake Issue addins into the main Cake.Issues GitHub repository, which has been finished by now.

Beside having all addins share a release lifecycle, having them in a single repository also simplified maintenance work and release process. This resulted in a total of 20 releases of Cake Issues in 2024, including one major release with 5.0.0, bringing constant improvements and bugfixes.

Core Cake.Issues addin has seen a steady, and stronger than 2023, rise of downloads during 2024, resulting in nearly 1 million downloads by the end of the year:

See NuGet Trends for details.

The individual addins had a different age, some up to 7 years old, written for .NET Framework. As part of the consolidation of all addins in a single mono-repository effort was made to unify and modernize the code base across all addins.

","boost":0.5},{"location":"news/2025/01/01/2024-in-review/#new-addins","title":"New addins","text":"

With the introduction of Cake.Issues.Sarif a lot of additional tools supporting the SARIF standard are now supported by Cake Issues as listed on Supported Tools.

","boost":0.5},{"location":"news/2025/01/01/2024-in-review/#improvements-for-cake-frosting","title":"Improvements for Cake Frosting","text":"

Several improvements were released during 2024 for running Cake Issues with Cake Frosting.

For all addins a NuGet package optimized for running with Cake Frosting is now available. These NuGet packages have dependencies to Cake, Cake Issues core addins or any other required dependency defined, which gives full control about the dependency, their version and update behavior to the user through the standard .NET project system.

These packages also support implicit usings improving discoverability of aliases for build authors. Implicit usings can be enabled by setting <ImplicitUsings>enable</ImplicitUsings> in the csproj file of a build.

","boost":0.5},{"location":"news/2025/01/01/2024-in-review/#updated-website","title":"Updated website","text":"

The end of 2024 saw also the relaunch of Cake Issues website, which has been updated to modern standards and tooling. Effort has also been put into content to improve discoverability of documentation for users. Examples and documentation have also been updated to latest Cake Issues and .NET version.

","boost":0.5},{"location":"news/2025/01/01/2024-in-review/#thanks","title":"Thanks","text":"

\u2764 Huge thanks to our community! All what had been achieved in 2024 would not have been possible without the support and contributions of the community! \u2764

People contributing to Cake Issues in 2024:

  • christianbumann
  • eoehen
  • gep13
  • hotchkj
  • pascalberger
  • Speeedy01
","boost":0.5},{"location":"news/archive/2025/","title":"2025","text":""},{"location":"news/archive/2024/","title":"2024","text":""},{"location":"news/archive/2023/","title":"2023","text":""},{"location":"news/archive/2022/","title":"2022","text":""},{"location":"news/archive/2021/","title":"2021","text":""},{"location":"news/archive/2020/","title":"2020","text":""},{"location":"news/category/announcements/","title":"Announcements","text":""},{"location":"news/category/release-notes/","title":"Release Notes","text":""},{"location":"news/category/new-addin/","title":"New Addin","text":""},{"location":"news/page/2/","title":"News","text":""},{"location":"news/page/3/","title":"News","text":""},{"location":"news/page/4/","title":"News","text":""},{"location":"news/page/5/","title":"News","text":""},{"location":"news/archive/2024/page/2/","title":"2024","text":""},{"location":"news/archive/2024/page/3/","title":"2024","text":""},{"location":"news/category/release-notes/page/2/","title":"Release Notes","text":""},{"location":"news/category/release-notes/page/3/","title":"Release Notes","text":""},{"location":"news/category/release-notes/page/4/","title":"Release Notes","text":""}]} \ No newline at end of file