Transcript
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


Top Related