Boosting Development Efficiency with CppDepend and AppVeyor Integration
This awesome in-depth tutorial is based on the NDepend (CppDepend like for .Net) integration written by Jimmy Pelletier reproduced below, courtesy of the author.
- Prerequisites & Assumptions
- Making the tools available during the build
- Create an CppDepend project
- Create your build script
- Setting up AppVeyor and our first build
- Failing the build
- Publishing the CppDepend report
In this documentation I provide step by step instructions on how to integrate CppDepend into your CI pipeline for quality control and historical analytics. For quality control I will demonstrate how to fail your build when violating an CppDepend rule and for historical analytics we will publish the CppDepend report as a build artifact.
Prerequisites & Assumptions
In order to follow along with the steps provided in this article there are a few prerequisites. You will need:
- A C/C++ project of some kind checked into GitHub.
- A DevOps license key. To obtain such file contact us at support@codergears.com. If you are in trial period let us know your company name and postal address in the email. Else if you own a DevOps license key, let us know your license key in the email.
I have also assumed you know how to work with C/C++, Visual Studio and Git.
Making the tools available during the build
In order to run CppDepend as part of your build pipeline you will need to make the CppDepend.Console.exe available to run during the build. When working with a cloud build agent like AppVeyor, options for installing tools and setting up the environment are limited. We’ll simply be checking CppDepend into source control. First download the CppDepend Installer. Then copy its content into a tools directory. I put mine in /tools/CppDepend. You will also need to activate your DevOps license key.
Create an CppDepend project
To do anything with CppDepend we need to create an CppDepend project. The way to get this done is to:
- Install CppDepend in Visual Studio with CppDepend.VisualStudioExtensionInstaller.exe.;
- Open your solution in Visual Studio.
- Build your solution to produce assemblies.
- Select “Attach New CppDepend project to Current VS Solution” from the CppDepend menu.
- Click “Add VS Project(s)”.
- Select your solution.
- Click “Analyze Project”.
- Select “Edit Project” from the “Project” menu in the “CppDepend” menu.
- Select “Paths Referenced” on the right hand side.
- Select each path listed and Right click to select “Set as Path Relative (to the CppDepend Project File Location)”.
- Save your changes.
An CppDepend Developer license is needed to do these steps. If you only have DevOps licensing you can still create a CppDepend project from a VS solution from VisualCppDepend.exe Start Page > New CppDepend project, and then populate the list of projects to analyze. In such situation you'll still need to set paths referenced as relative to the CppDepend Project File Location, as explained above. |
Create your build script
Next we need to add a build script to tell AppVeyor how to build your project. Full details of how AppVeyor build scripts work can be found in the AppVeyor documentation but the one I’ll include here is pretty self explanatory and is correct at the time of writing (September 2018). The file is placed in the root of the repository and is called appveyor.yaml.
The interesting thing to note is that we need to resolve the full absolute path of the CppDepend project file to pass in to CppDepend. Notice that here our CppDepend project file is named SomeProject.cdproj.
image: Visual Studio 2017 before_build: - ps: nuget restore build: project: SomeProject.sln after_build: - ps: $cdproj = Resolve-Path .\SomeProject.cdproj - ps: .tools\CppDepend\CppDepend.Console.exe $cdproj
Setting up AppVeyor and our first build
Next we need to set up our GitHub repo to build in AppVeyor.
- Log in or sign up to AppVeyor using your GitHub account.
- Click “New Project” from the home screen.
- Add your project from the list of repos available from your GitHub account.
- Click “New Build”.
Failing the build
CppDepend will now fail on any Quality Gate failure. AppVeyor terminates a build upon a command that returns a non-zero exit code. At least one Quality Gate failing means that CppDepend.Console.exe will return a non-zero exit code as explained in Quality Gates and Build Failure.
Thus, the easiest way to test build failure is to modify the “Critical Issues” quality gate. First remove the predicate that restricts this rule to considering only critical issues. Then reduce the failif threshold so it will fail on a single issue. With the default rule set and nearly any solution this should be enough to trip the quality gate. Your Quality Gate CQLinq query should now look like this:
// <QualityGate Name="Critical Issues" Unit="issues" />
failif count > 1 issues
warnif count > 0 issues
from i in Issues
select new { i, i.Severity, i.Debt, i.AnnualInterest }
Publishing the CppDepend report
To publish the CppDepend report we need a bunch of files the CppDepend writes to /CppDependOut during the build process. AppVeyor allows us to zip these files up and present them for download. Add the following to the end of your appveyor.yaml file:
artifacts: - path: CppDependOut name: CppDependOut type: zip
Then download the zip file from the “Artifacts” tab on a completed build and extract it to view the html report.