2014 - DotNetCologne: Build, Builder, Am Buildesten

41
lennybacon.com BUILD BUILD BUILD Daniel Fisher

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 of 2014 - DotNetCologne: Build, Builder, Am Buildesten

Page 1: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

BUILD BUILD BUILD

Daniel Fisher

Page 2: 2014 - DotNetCologne: Build, Builder, Am Buildesten

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

Page 3: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

EFFICIENT COMMUNICATION…

Page 4: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

© Daniel Fisher

Build, Build, Build

Daniel Fisher | [email protected]

Page 5: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

Objectives

Serious Software Development

Product Delivery

C#/.NET

AppDomains

MsBuild

REST APIs

AngularJS

Code Quality

NuGet

Page 6: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

Agenda

• What is a Build?

• MsBuild

• Hosting MsBuild in ASP.NET (YABS?)

• MsMetrics, FxCop & Co.

• Nunit

• …

Page 7: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

WHAT IS A BUILD?

Page 8: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

https://www.flickr.com/photos/86931652@N00/392470198

Page 9: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

Page 10: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

MSBUILD

Page 11: 2014 - DotNetCologne: Build, Builder, Am Buildesten

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).

Page 12: 2014 - DotNetCologne: Build, Builder, Am Buildesten

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>

Page 13: 2014 - DotNetCologne: Build, Builder, Am Buildesten

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>

Page 14: 2014 - DotNetCologne: Build, Builder, Am Buildesten

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>

Page 15: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

Clone-Repository

Update-Version

Update-Dependencies

Generate-Code

Compile-Code

Test-Code

Analyze-Code

Document-Code

Page 16: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

Custom Tasks

public class MyTask : Task

{

override void Execute(){

//TODO: Write your stuff here ...

}

}

Page 17: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

http://www.flickr.com/photos/64550677@N06/12829392063/

Page 18: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

http://www.flickr.com/photos/toaireisdivine/7245696024/

Page 19: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

https://www.flickr.com/photos/seelensturm/4046487038

Page 20: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

YET ANOTHER BUILD SERVER?

Page 21: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

© Daniel Fisher

Page 22: 2014 - DotNetCologne: Build, Builder, Am Buildesten

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

Page 23: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

Page 24: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

© Daniel Fisher

Page 25: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

© Daniel Fisher

Page 26: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

© Daniel Fisher

Page 27: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

Page 28: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

https://www.flickr.com/photos/hectoralejandro/3967217852

Page 29: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

Page 30: 2014 - DotNetCologne: Build, Builder, Am Buildesten

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}

Page 31: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

Page 32: 2014 - DotNetCologne: Build, Builder, Am Buildesten

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);

}}

}

Page 33: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

https://www.flickr.com/photos/25726169@N03/8600834488

Page 34: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

HOSTING MSBUILD

Page 35: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

References

• Microsoft.Build.dll

• Microsoft.Build.Engine.dll

• Microsoft.Build.Framework.dll

Page 36: 2014 - DotNetCologne: Build, Builder, Am Buildesten

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;

}

Page 37: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

https://www.flickr.com/photos/jlauletta/14058076975

Page 38: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

APPDOMAIN ISOLATION

Page 39: 2014 - DotNetCologne: Build, Builder, Am Buildesten

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);

Page 40: 2014 - DotNetCologne: Build, Builder, Am Buildesten

lennybacon.com

https://www.flickr.com/photos/ryan2point0/4986543660

Page 41: 2014 - DotNetCologne: Build, Builder, Am Buildesten

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