{"id":354886,"date":"2023-06-29T14:40:53","date_gmt":"2023-06-29T13:40:53","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=dotnet&#038;p=354886"},"modified":"2025-08-06T15:54:21","modified_gmt":"2025-08-06T14:54:21","slug":"elevating-csharp-code-quality-with-qodana-a-journey-towards-perfection","status":"publish","type":"dotnet","link":"https:\/\/blog.jetbrains.com\/en\/dotnet\/2023\/06\/29\/elevating-csharp-code-quality-with-qodana-a-journey-towards-perfection","title":{"rendered":"Elevating C# Code Quality with Qodana: A Journey Towards Perfection"},"content":{"rendered":"\n<p>JetBrains IDEs have always been renowned for their <a href=\"https:\/\/www.jetbrains.com\/pages\/static-code-analysis-guide\/\" data-type=\"link\" data-id=\"https:\/\/www.jetbrains.com\/pages\/static-code-analysis-guide\/\" target=\"_blank\" rel=\"noopener\">powerful static code analysis supporting a wide range of languages<\/a>.\u00a0With the release of\u00a0<a href=\"https:\/\/www.jetbrains.com\/qodana\/\" target=\"_blank\" rel=\"noopener\">Qodana<\/a>,\u00a0we are unifying that knowledge in a central code quality platform that is working at the heart of every development process\u00a0\u2013\u00a0your favorite CI\/CD tool.<\/p>\n\n\n\n<p>Triggered by a commit or pull request,&nbsp;Qodana can generate comprehensive analysis reports&nbsp;(<a href=\"https:\/\/sarifweb.azurewebsites.net\/\" target=\"_blank\" rel=\"noopener\">SARIF<\/a>)&nbsp;about all discovered code quality and security issues.&nbsp;Qodana makes those reports easily accessible,&nbsp;not only to a team of developers or QA engineers&nbsp;but also to security managers and legal\/compliance departments.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1280\" height=\"720\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2021\/07\/qodana_social_image.png\" alt=\"Qodana Banner\" class=\"wp-image-165112\"\/><\/figure>\n\n\n\n<p>Only recently,&nbsp;Qodana has made its first steps into our lineup of&nbsp;.NET tools,&nbsp;and as you might guess,&nbsp;it comes with remarkable integration for Rider.&nbsp;The analysis itself is based on an old acquaintance,&nbsp;namely <em>InspectCode<\/em>,&nbsp;which you might know from other blog posts like&nbsp;<a href=\"https:\/\/blog.jetbrains.com\/en\/dotnet\/2016\/10\/04\/establishing-a-zero-warning-policy-with-resharpers-solution-wide-analysis\"><em>Establishing a zero-warning policy with ReSharper\u2019s solution-wide analysis<\/em><\/a>&nbsp;or&nbsp;<a href=\"https:\/\/blog.jetbrains.com\/en\/dotnet\/2020\/07\/16\/resharper-command-line-tools-cross-platform-and-global-tools\"><em>ReSharper Command-Line Tools \u2013 Cross-Platform and Global Tools<\/em><\/a>.&nbsp;InspectCode&nbsp;runs the same analysis that discovers code issues in Rider and ReSharper.&nbsp;However,&nbsp;working on your CI\/CD agent&nbsp;provides the substantial benefit that the&nbsp;<a href=\"https:\/\/www.jetbrains.com\/help\/rider\/Code_Analysis__Solution-Wide_Analysis.html#enabling-solution-wide-analysis\" target=\"_blank\" rel=\"noreferrer noopener\">Solution-Wide Analysis<\/a>&nbsp;no longer has to run on your local machine,&nbsp;which translates to a better development experience,&nbsp;responsiveness,&nbsp;and battery life.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p align=\"center\"><a class=\"jb-download-button\" title=\"Read More\" href=\"https:\/\/www.jetbrains.com\/qodana\/\" target=\"_blank\" rel=\"noopener noreferrer\" data-mce-href=\"https:\/\/www.jetbrains.com\/qodana\/\" data-mce-selected=\"inline-boundary\" data-mce-><i class=\"download-icon\"><\/i>Try Qodana for free<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"2560\" height=\"1440\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/07\/Blog_Social_Share_1280x720-1.png\" alt=\"\" class=\"wp-image-373570\"\/><\/figure>\n\n\n\n<p>If you want to see a Qodana report live and in action,&nbsp;head over to the public reports of&nbsp;<a href=\"https:\/\/qodana.cloud\/projects\/AgRgk\/reports\/b894a\" target=\"_blank\" rel=\"noreferrer noopener\">FluentAssertions<\/a>&nbsp;or&nbsp;<a href=\"https:\/\/qodana.cloud\/projects\/3BBmd\/reports\/ObDG9\" target=\"_blank\" rel=\"noreferrer noopener\">NUKE<\/a>.&nbsp;If you want to try Qodana on your own project and learn more about its professional capabilities in various CI\/CD environments and Rider itself,&nbsp;stay with us for the next sections!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"setting-up-qodana-for-net-projects\">Setting up Qodana for .NET projects<\/h2>\n\n\n\n<p>Qodana runs in a Docker container,&nbsp;so you should have Docker installed locally and in your CI\/CD environment.&nbsp;For the local experience,&nbsp;it is also recommended to&nbsp;<a href=\"https:\/\/github.com\/JetBrains\/qodana-cli#installation\" target=\"_blank\" rel=\"noreferrer noopener\">install the Qodana CLI<\/a>&nbsp;(although you can also&nbsp;<a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/quick-start.html#quickstart-analyze-project-locally\" target=\"_blank\" rel=\"noreferrer noopener\">invoke Docker directly<\/a>):<\/p>\n\n\n\n<ul>\n<li>On Windows with WinGet: <code>winget install -e --id JetBrains.QodanaCLI<\/code><\/li>\n\n\n\n<li>On Windows with Chocolatey:&nbsp;<code>choco install qodana<\/code><\/li>\n\n\n\n<li>On macOS:&nbsp;<code>brew install jetbrains\/utils\/qodana<\/code><\/li>\n\n\n\n<li>On Linux:&nbsp;<code>curl -fsSL https:\/\/jb.gg\/qodana-cli\/install | bash<\/code><\/li>\n<\/ul>\n\n\n\n<p>In the next step,&nbsp;you can invoke&nbsp;<code>qodana init<\/code>&nbsp;to trigger the setup wizard:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1918\" height=\"752\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/06\/qodana-init.png\" alt=\"Qodana Initialization\" class=\"wp-image-363288\"\/><\/figure>\n\n\n\n<p>Once you&#8217;ve chosen the appropriate linter and your solution file,&nbsp;Qodana should have created a&nbsp;<code>qodana.yml<\/code>&nbsp;<a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/qodana-yaml.html\" target=\"_blank\" rel=\"noreferrer noopener\">configuration file<\/a> similar to the following:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">version: \"1.0\"\n\nlinter: jetbrains\/qodana-dotnet:latest\n\ndotnet:\n  solution: MySolution.sln<\/pre>\n\n\n\n<p><em>For more information about .NET-related settings, refer to the&nbsp;<a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/qodana-dotnet.html\" target=\"_blank\" rel=\"noreferrer noopener\">Qodana for .NET<\/a>&nbsp;documentation.<\/em><\/p>\n\n\n\n<p>Now you are ready to execute a local Qodana Scan by calling&nbsp;<code>qodana scan --show-report<\/code>.&nbsp;Once the scan has finished,&nbsp;Qodana will open an HTML report in your browser at&nbsp;<code>http:\/\/localhost:8080<\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1754\" height=\"1792\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/06\/scan-initial-1.png\" alt=\"Initial Scan\" class=\"wp-image-363310\"\/><\/figure>\n\n\n\n<p>In addition to the general&nbsp;<a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/ui-overview.html\" target=\"_blank\" rel=\"noreferrer noopener\">User interface overview<\/a>,&nbsp;it&#8217;s noteworthy that for&nbsp;.NET projects you can filter by target framework from the&nbsp;<strong>Tags<\/strong>&nbsp;dropdown.&nbsp;And since sunburst charts are cool,&nbsp;let&#8217;s see how you can interact with them to filter results!<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/06\/sunburst-chart2.jpg\" data-gif-src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/06\/sunburst-chart2.gif\" alt=\"Interactive Sunburst Chart\" class=\"wp-image-363321\" width=\"679\" height=\"576\"\/><\/figure>\n\n\n\n<p><em>Super cool!<\/em> ?<\/p>\n\n\n\n<p>Once you&#8217;ve found an issue you intend to investigate,&nbsp;you can expand it to show more details besides the generic issue text\/category\/type.&nbsp;In the details pane,&nbsp;you can see the actual code snippet along with the file path and target framework.&nbsp;Special attention should be put on the&nbsp;<strong>Open file in Rider<\/strong>&nbsp;button,&nbsp;which opens the file directly in your IDE,&nbsp;as well as the footer note with a link to our&nbsp;<a href=\"https:\/\/blog.jetbrains.com\/en\/dotnet\/2023\/03\/20\/why-is-resharper-suggesting-this\"><em>Why is ReSharper suggesting this?<\/em><\/a>&nbsp;knowledge base:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1742\" height=\"816\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/06\/issue-details.png\" alt=\"Issue Details View\" class=\"wp-image-363332\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"qodana-scans-in-cicd-environments\">Qodana Scans in CI\/CD Environments<\/h2>\n\n\n\n<p>Qodana develops its full potential when you integrate it into your CI\/CD environment.&nbsp;Every build should generate a new analysis report that can either be uploaded to <a href=\"https:\/\/qodana.cloud\/\" target=\"_blank\" rel=\"noreferrer noopener\">Qodana Cloud<\/a>,&nbsp;or downloaded and inspected in Rider.&nbsp;You can also establish a so-called&nbsp;<em>quality gate<\/em>&nbsp;in your build pipelines,&nbsp;similar to the approach described in the <a href=\"https:\/\/blog.jetbrains.com\/en\/dotnet\/2016\/10\/04\/establishing-a-zero-warning-policy-with-resharpers-solution-wide-analysis\"><em>Establishing a zero-warning policy with ReSharper\u2019s solution-wide analysis<\/em><\/a>&nbsp;blog post.&nbsp;Whenever a commit or pull request introduces a code issue,&nbsp;Qodana will let you know by failing the build.<\/p>\n\n\n\n<p>You can enable a&nbsp;<strong>code quality gate<\/strong>&nbsp;in three easy steps.&nbsp;For non-greenfield projects,&nbsp;you&#8217;ll likely want to move all the existing problems to the&nbsp;<em>baseline<\/em>&nbsp;(similar to a backlog)&nbsp;to reduce any obstruction:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/06\/baseline-download.png\" data-gif-src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/06\/baseline-download.gif\" alt=\"Baseline Report Download\"\/><\/figure>\n\n\n\n<p>Second,&nbsp;you need to extend the&nbsp;<code>qodana.yml<\/code>&nbsp;configuration file with a&nbsp;<code>failThreshold<\/code>&nbsp;value.&nbsp;This property indicates how many new issues can appear compared to the baseline&nbsp;without failing the build:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">version: \"1.0\"\n\nlinter: jetbrains\/qodana-dotnet:latest\nfailThreshold: 0\n\ndotnet:\n  solution: MySolution.sln<\/pre>\n\n\n\n<p>Third,&nbsp;you have to configure the build pipeline to compare the current set of code issues against the&nbsp;<a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/baseline.html\" target=\"_blank\" rel=\"noreferrer noopener\">baseline<\/a>.&nbsp;This can be done by passing&nbsp;<code>--baseline qodana.sarif.json<\/code>&nbsp;to the Qodana Scan invocation.&nbsp;Check out the Qodana documentation to find more information about&nbsp;<a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/quality-gate.html\" target=\"_blank\" rel=\"noreferrer noopener\">how to enable a quality gate in your CI\/CD environment<\/a>.<\/p>\n\n\n\n<p>Optionally&nbsp;\u2013&nbsp;if you want to take advantage of <a href=\"https:\/\/qodana.cloud\/\" target=\"_blank\" rel=\"noreferrer noopener\">Qodana Cloud<\/a>&nbsp;\u2013&nbsp;you can add the&nbsp;<code>QODANA_TOKEN<\/code>&nbsp;as an environment variable,&nbsp;which will let Qodana continuously upload the reports and allow you to keep an eye on its historical course. Alternatively, you can always use the <code>qodana show<\/code> command to serve a downloaded report locally.<\/p>\n\n\n\n<p>The next Qodana Scan should look as follows,&nbsp;where all problems have been moved to the&nbsp;<strong>Baseline&nbsp;<\/strong>tab:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" loading=\"lazy\" width=\"1692\" height=\"1008\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/06\/scan-clean.png\" alt=\"Clean Scan\" class=\"wp-image-364256\" style=\"width:779px;height:464px\"\/><\/figure>\n\n\n\n<p>In the next few sections,&nbsp;we will look at how Qodana integrates with some of the most popular CI\/CD environments on the market.&nbsp;For further details,&nbsp;please refer to the documentation on&nbsp;<a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/github.html\" target=\"_blank\" rel=\"noreferrer noopener\">GitHub Actions<\/a>,&nbsp;<a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/qodana-azure-pipelines.html\" target=\"_blank\" rel=\"noreferrer noopener\">Azure Pipelines<\/a>,&nbsp;<a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/teamcity.html\" target=\"_blank\" rel=\"noreferrer noopener\">TeamCity<\/a>,&nbsp;<a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/gitlab.html\" target=\"_blank\" rel=\"noopener\">GitLab<\/a>,&nbsp;<a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/circleci.html\" target=\"_blank\" rel=\"noreferrer noopener\">CircleCI<\/a>,&nbsp;<a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/space-automation.html\" target=\"_blank\" rel=\"noreferrer noopener\">Space Automation<\/a>,&nbsp;and&nbsp;<a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/jenkins.html\" target=\"_blank\" rel=\"noreferrer noopener\">Jenkins<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"qodana-in-github-actions\">Qodana in GitHub Actions<\/h3>\n\n\n\n<p>In GitHub Actions,&nbsp;Qodana can act as a&nbsp;<a href=\"https:\/\/docs.github.com\/en\/pull-requests\/collaborating-with-pull-requests\/collaborating-on-repositories-with-code-quality-features\/about-status-checks\" target=\"_blank\" rel=\"noreferrer noopener\">status check<\/a>&nbsp;for every commit and pull request that is built:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" loading=\"lazy\" width=\"1216\" height=\"550\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/06\/github-actions-checks.png\" alt=\"GitHub Actions Checks\" class=\"wp-image-364267\" style=\"width:608px;height:275px\"\/><\/figure>\n\n\n\n<p>For pull requests in particular,&nbsp;Qodana will add code annotations that help code reviewers and committers spot issues at a glance immediately:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" loading=\"lazy\" width=\"1816\" height=\"986\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/06\/github-actions-annotations.png\" alt=\"GitHub Code Annotations\" class=\"wp-image-364278\" style=\"width:908px;height:493px\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"qodana-in-azure-pipelines\">Qodana in Azure Pipelines<\/h3>\n\n\n\n<p>Since Qodana generates reports as&nbsp;<a href=\"https:\/\/sarifweb.azurewebsites.net\/\" target=\"_blank\" rel=\"noreferrer noopener\">SARIF<\/a>&nbsp;files&nbsp;\u2013&nbsp;an industry standard&nbsp;\u2013&nbsp;they can be integrated into Azure Pipelines through the&nbsp;<a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=sariftools.scans\" target=\"_blank\" rel=\"noreferrer noopener\">SARIF SAST Scans Tab<\/a>:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"2184\" height=\"1408\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/06\/azure-pipelines-report.png\" alt=\"Azure Pipelines SARIF Scans Tab\" class=\"wp-image-364289\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"qodana-in-teamcity\">Qodana in TeamCity<\/h3>\n\n\n\n<p>With TeamCity&nbsp;\u2013&nbsp;our own powerful CI\/CD tool&nbsp;\u2013&nbsp;the Qodana report is brought directly into the build details view as a separate tab.&nbsp;You can even compare reports from different builds to see what has changed:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"2004\" height=\"878\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/06\/teamcity-report.png\" alt=\"TeamCity Build Tab\" class=\"wp-image-364300\"\/><\/figure>\n\n\n\n<p><em>Pro-tip: you can&nbsp;<a href=\"https:\/\/www.jetbrains.com\/help\/teamcity\/including-third-party-reports-in-the-build-results.html\" target=\"_blank\" rel=\"noreferrer noopener\">add your own tabs to TeamCity<\/a>!<\/em><\/p>\n\n\n\n<p>Another neat feature is that you can treat code issues as failed tests.&nbsp;This allows you to use the existing&nbsp;<a href=\"https:\/\/www.jetbrains.com\/help\/teamcity\/investigating-and-muting-build-failures.html\" target=\"_blank\" rel=\"noreferrer noopener\">Investigating and Muting Build Failures<\/a>&nbsp;for a more effective team workflow:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"2052\" height=\"1250\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/06\/teamcity-assign.png\" alt=\"TeamCity Code Issue Investigation Assignment\" class=\"wp-image-364311\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"qodana-reports-in-rider\">Qodana Reports in Rider<\/h2>\n\n\n\n<p>Of course,&nbsp;Qodana is fully integrated with Rider and other IntelliJ IDEA derivatives.&nbsp;A dedicated <strong>Qodana&nbsp;<\/strong>tab in the&nbsp;<a href=\"https:\/\/www.jetbrains.com\/help\/rider\/Problems_Tool_Window.html\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Problems<\/strong> tool window<\/a>&nbsp;allows you to walk through all discovered issues,&nbsp;preview them in a separate pane,&nbsp;and hopefully fix them&nbsp;(or alternatively&nbsp;<a href=\"https:\/\/www.jetbrains.com\/help\/rider\/Code_Analysis__Configuring_Warnings.html#suppress\" target=\"_blank\" rel=\"noreferrer noopener\">suppress them<\/a>&nbsp;or&nbsp;<a href=\"https:\/\/www.jetbrains.com\/help\/rider\/Code_Analysis__Configuring_Warnings.html#change_severity\" target=\"_blank\" rel=\"noreferrer noopener\">change their severity<\/a>):<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"2192\" height=\"976\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/06\/tool-window.png\" alt=\"Rider Qodana Tool Window\" class=\"wp-image-364322\"\/><\/figure>\n\n\n\n<p><em>We are planning to add more filtering and grouping capabilities to the tool window, including by target frameworks.<\/em><\/p>\n\n\n\n<p>Depending on your preferences,&nbsp;Qodana reports can be automatically pulled from Qodana Cloud,&nbsp;or manually loaded from a report file.<\/p>\n\n\n\n<p>If you&#8217;re using Qodana Cloud,&nbsp;you can&nbsp;<a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/qodana-ide-plugin.html#Log+in+to+Qodana+Cloud\" target=\"_blank\" rel=\"noreferrer noopener\">log in<\/a>&nbsp;right from the settings dialog.&nbsp;Once you&#8217;re logged in,&nbsp;Rider allows you to link your current project with a project from Qodana Cloud:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" loading=\"lazy\" width=\"863\" height=\"289\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/06\/linking-project2.png\" alt=\"Rider Qodana Project Link Notification\" class=\"wp-image-364333\" style=\"width:432px;height:145px\"\/><\/figure>\n\n\n\n<p>If you don&#8217;t have a Qodana Cloud account or prefer to load reports manually,&nbsp;you can use the&nbsp;<strong>Open Qodana Analysis Report&#8230;<\/strong>&nbsp;action:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" loading=\"lazy\" width=\"1456\" height=\"578\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/06\/load-report.png\" alt=\"Open Qodana Analysis Report Action\" class=\"wp-image-364355\" style=\"width:728px;height:289px\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"future-work\">Future Work<\/h2>\n\n\n\n<p>Qodana is growing quickly and recently made its first steps into the&nbsp;.NET ecosystem.&nbsp;The synergy effect is very strong considering that the whole analysis is done from a component that existed for years already&nbsp;(i.e.,&nbsp;<em>InspectCode<\/em>).&nbsp;Not surprisingly,&nbsp;the Qodana team has even more integration plans!<\/p>\n\n\n\n<p>Keep calm and <kbd>Alt-Enter<\/kbd>!&nbsp;What if your CI could automatically apply quick-fixes for code issues and style violations for you?&nbsp;While this objective will surely take some more time,&nbsp;developers will definitely appreciate spending less time on boilerplate keystrokes and putting more focus on the business value of their projects.<\/p>\n\n\n\n<p>A feature that is more actively being worked on is the&nbsp;<a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/license-audit.html\" target=\"_blank\" rel=\"noreferrer noopener\">license audit<\/a>.&nbsp;This scan helps you to verify that your project license is compliant with the licenses of your dependencies&nbsp;(e.g.,&nbsp;NuGet packages)&nbsp;and all their transitive dependencies.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" loading=\"lazy\" width=\"2660\" height=\"1334\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/06\/license-audit.png\" alt=\"License Audit\" class=\"wp-image-364366\" style=\"width:787px;height:395px\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>Qodana is an excellent way to improve code quality collaboratively in a codebase. It integrates seamlessly into all JetBrains IDEs and in your CI\/CD environment of choice. <\/p>\n\n\n\n<p><strong>Install <a href=\"https:\/\/github.com\/JetBrains\/qodana-cli\" target=\"_blank\" rel=\"noreferrer noopener\">Qodana CLI<\/a><\/strong> and give it a try in one of your solutions, or <strong>sign up for <a href=\"https:\/\/qodana.cloud\/\" target=\"_blank\" rel=\"noreferrer noopener\">Qodana Cloud<\/a><\/strong> to continuously track your code quality progress with ease.<\/p>\n\n\n\n<p>Thank you for reading, and if you have any comments or questions, please feel free to leave them in the comment section.<\/p>\n\n\n\n<p><em><sub>Image credit: <a href=\"https:\/\/unsplash.com\/photos\/AEE4G-6h858\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Jesse Gardner<\/a><\/sub><\/em><\/p>\n","protected":false},"author":553,"featured_media":364212,"comment_status":"closed","ping_status":"closed","template":"","categories":[4992,1401],"tags":[211,228,164,6359,2615],"cross-post-tag":[6687],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/dotnet\/354886"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/dotnet"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/types\/dotnet"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/users\/553"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/comments?post=354886"}],"version-history":[{"count":10,"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/dotnet\/354886\/revisions"}],"predecessor-version":[{"id":590370,"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/dotnet\/354886\/revisions\/590370"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/media\/364212"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/media?parent=354886"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/categories?post=354886"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/tags?post=354886"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/cross-post-tag?post=354886"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}