2014 - dotnetcologne: build, builder, am buildesten
DESCRIPTION
Ohne den Build ist Code nichts. Mit Continous Integration und Delivery wird er auch für nicht-Programmierer wichtig. Der Build-Server ist der Herzschlag eines Software-produzierenden Teams. Aber würdigen wir das auch so? Wer liest den schon Mails von Jenkins? Weg guckt auf das Dashboard von TeamCity? Aus einer Anforderung in einem Projekt hat sich Daniel gefragt, was man anders machen kann und das eine oder andere selbst implementiert. In dieser Session gibt es Ideen, Konzepte, Lösungen und Umsetzung in C# Code und JavaScript mit AngularJS.TRANSCRIPT
lennybacon.com
BUILD BUILD BUILD
Daniel Fisher
lennybacon.com
Daniel Fisher
• Freelancer
– Developer, Architect, Coach, Trainer
• Justcommunity.de
– Mit-Gründer und Vorstand
• nrwconf.de
– Mit-Gründer und Organisator
• netug-niederrhein.de
– Mit-Gründer und Ex-Leiter
• microsoft.com
– Certified Professional Developer
– Business Platform Technology Advisor
• lennybacon.com
– Blog
• twitter.com
– @lennybacon
lennybacon.com
EFFICIENT COMMUNICATION…
lennybacon.com
Objectives
Serious Software Development
Product Delivery
C#/.NET
AppDomains
MsBuild
REST APIs
AngularJS
Code Quality
NuGet
lennybacon.com
Agenda
• What is a Build?
• MsBuild
• Hosting MsBuild in ASP.NET (YABS?)
• MsMetrics, FxCop & Co.
• Nunit
• …
lennybacon.com
WHAT IS A BUILD?
lennybacon.com
https://www.flickr.com/photos/86931652@N00/392470198
lennybacon.com
lennybacon.com
MSBUILD
lennybacon.com
News?
• MSBuild is now installed as part of Visual
Studio rather than as part of the .NET
Framework.
– The current MSBuild version number is 12.0. If
you want to install MSBuild separately, download
the installation package from MSBuild Download
(http://go.microsoft.com/fwlink/?LinkId=309745).
lennybacon.com
Properties
• Named Value Pairs
– Variables of the Build script
• Part of a PropertyGroup
• Referenced as scalar values
– Using the $() syntax
<PropertyGroup><AssemblyName>MyAssemblyName</AssemblyName>
</PropertyGroup>
lennybacon.com
Items
• Items are Inputs
– Source files, references…
• Part of a ItemGroup
• Items are referenced as groups
– Using the @() syntax
<ItemGroup><CSFile Include="MyLib\Class1.cs" /><CSFile Include="MyLib\Properties\AssemblyInfo.cs" /><Reference Include="System.dll" />
</ItemGroup>
lennybacon.com
Targets and Tasks
• Tasks are Steps that are performed in a build
process as Part of a Target
• A build can be told which target(s) to execute
<Target Name="Compile">
<MSBuild
Projects="MyLibrary\MyLibrary.sln"
Properties="Configuration=Release"/>
</Target>
lennybacon.com
Clone-Repository
Update-Version
Update-Dependencies
Generate-Code
Compile-Code
Test-Code
Analyze-Code
Document-Code
…
lennybacon.com
Custom Tasks
public class MyTask : Task
{
override void Execute(){
//TODO: Write your stuff here ...
}
}
lennybacon.com
http://www.flickr.com/photos/64550677@N06/12829392063/
lennybacon.com
http://www.flickr.com/photos/toaireisdivine/7245696024/
lennybacon.com
https://www.flickr.com/photos/seelensturm/4046487038
lennybacon.com
YET ANOTHER BUILD SERVER?
lennybacon.com
© Daniel Fisher
lennybacon.com
Clone-Repository
Update-Version
Update-Dependencies
Generate-Code
Compile-Code
Test-Code
Analyze-Code
Package-Output
Sign-Package
Deploy-Package
Test-DeploymentSign-Output
Publish-Package
Notify-Stakeholders
Document-Code
Generate-Manual
Report-Results
lennybacon.com
lennybacon.com
© Daniel Fisher
lennybacon.com
© Daniel Fisher
lennybacon.com
© Daniel Fisher
lennybacon.com
lennybacon.com
https://www.flickr.com/photos/hectoralejandro/3967217852
lennybacon.com
lennybacon.com
API
GET /api/builds
POST /api/builds
GET /api/builds/{slug}
PUT /api/builds/{slug}
PATCH /api/builds/{slug}
DELETE /api/builds/{slug}
BUILD /api/builds/{slug}
GET /api/runningBuild/{id}
lennybacon.com
lennybacon.com
Custom Verbs with Web API
using System.Net;using System.Net.Http;using System.Web.Http;
namespace WebApplication1.Controllers{public class BuildController : ApiController{[Route("api/builds/{id}")][AcceptVerbsAttribute("GET", "BUILD")]public HttpResponseMessage Build(Guid value){return new HttpResponseMessage(HttpStatusCode.OK);
}}
}
lennybacon.com
https://www.flickr.com/photos/25726169@N03/8600834488
lennybacon.com
HOSTING MSBUILD
lennybacon.com
References
• Microsoft.Build.dll
• Microsoft.Build.Engine.dll
• Microsoft.Build.Framework.dll
lennybacon.com
Programmatically run a build
public bool Run(string msBuildFile, Dictionary<string, string> properties)
{
var envVer = Environment.Version;
var toolsVersion = envVer.Major + "." + envVer.MajorRevision;
var project = new ProjectInstance(msBuildFile, properties, toolsVersion);
var buildRequestData = new BuildRequestData(project, new string[] { });
var buildParameters = new BuildParameters
{
BuildThreadPriority = ThreadPriority.Highest,
DefaultToolsVersion = toolsVersion,
UseSynchronousLogging = true
};
return
BuildManager.DefaultBuildManager.Build(
buildParameters,
buildRequestData
).OverallResult == BuildResultCode.Success;
}
lennybacon.com
https://www.flickr.com/photos/jlauletta/14058076975
lennybacon.com
APPDOMAIN ISOLATION
lennybacon.com
Run in another AppDomain
var appDomainSetup = new AppDomainSetup {
PrivateBinPath = appPath,
ApplicationBase = appPath};var appDomain =
AppDomain.CreateDomain(
appName,new Evidence(AppDomain.CurrentDomain.Evidence),
appDomainSetup);
var proxyObject =
appDomain.CreateInstanceFromAndUnwrap(Assembly.GetExecutingAssembly().Location,
typeof (AppDomainManager).FullName);
AppDomain.Unload(appDomain);
lennybacon.com
https://www.flickr.com/photos/ryan2point0/4986543660
lennybacon.com
READ LENNYBACON.COM
FOLLOW @LENNYBACON
LINK LINKEDIN.COM/IN/LENNYBACON
XING XING.COM/PROFILE/DANIEL_FISHER
FRIEND FB.COM/DANIEL.FISHER.LENNYBACON
MAIL [email protected]
CALL +49 (176) 6159 8612