1 Building you build process with Windows Workflow Foundation Abid Quereshi.

46
Building you build process with Windows Workflow Foundation Abid Quereshi

Transcript of 1 Building you build process with Windows Workflow Foundation Abid Quereshi.

1

Building you build process with Windows Workflow Foundation

Abid Quereshi

2

Agenda

Existing build technologies

Promise of Workflow Foundation

Demonstration – reusing Nant scripts

Demonstration - Custom Task

Authoring Modes

Serialization and Deserialization

Designer Re-Hosting

3

Cruise Control

MS Build

Nant/Ant

Visual Build

Automated Build Studio

DB Change management tools (DB Ghost, Embarcadero)

Make files, batch files, any other

Existing build technologies

4

Motivation for new way of building software

Existing build technologies

ObjectivesVisual Configuration (script free)

Real-time distributed feedback

Parallel Task processing

Cheap

5

Promise of Windows Workflow Foundation

Design by markup

Access to high level programming language- Threading, tracing, events

End user configuration

Possibilities that WF provides

6

Promise of Windows Workflow Foundation

Co-ordinate work performed by people and software

Long-running and stateful

Based on extensible models

Transparent and dynamic throughout their life cycle

The Four Workflow Tenants:

7

Promise of Windows Workflow Foundation

Build technologies

New software development technologies and platforms

Configuration

Motive for a Dynamic Build process

8

Promise of Windows Workflow Foundation

ScenarioCheckout

Start

Compile in Release configuration

Compile in Debug configuration

Deploy

Stop

ConfigMode = Release?

9

Promise of Windows Workflow Foundation

Reuse of existing scripts and build technologies

Example of a code only workflow

Build script encapsulation demo

10

Authoring Modes

Promise of Windows Workflow Foundation

Code Only

Markup (XAML) + Compiled Code Beside

Full Visual Studio Support

Some Visual Studio Support + Prayer

Markup + Assembly binding

11

Custom Activities

Workflow Customization

Part of Workflow tenants (Based on extensible models)

Reusable components

Possibility of Software Build DSL

12

Domain Specific Language

Workflow Customization

Limited form of computer language designed for a specific class of problems.

Library(Framework) + Configuration (Process, algorithm or how to perform a process)

Most Frameworks in a particular platform address technical concerns

DSL’s address business concerns (Higher level level of abstraction)

13

Domain Specific Language

Workflow Customization

DSL’s typically come with a code generation tool

• Constraint syntax• Accessible to non-developers

14

Domain Specific Language

Workflow Customization

• May require a Parser• Schemas help to validate instructions• Algorithm Syntax - what is being said – is limited

15

Domain Specific Language

Workflow Customization

Algorithm Syntax - what is being said – is limited

How it is being said may take two forms• Internal DSL - syntax of instruction is a subset of host

general purpose language code• External DSL – often a configuration file

16

Custom Workflow

Workflow Customization

SequentialWorkflowActivity

SequenceActivity

CompositeActivity

Activity

DependencyObject<abstract>

MyCustomWorkflow

MyCustomActivity

System.Workflow.ComponentModel

17

Activity Class

Workflow Customization

Methods to override:

• Execute• Cancel• Initialize

These are called by the WF runtime – not manually

Activity

DependencyObject<abstract>

Execute(ActivityExecutionContext):ActivityExecutionContext Cancel(ActivityExecutionContext):ActivityExecutionContext Initialize(IServiceProvider)

18

Activity Class State

Workflow State

Compensating

Closed FaultingCanceling

Executing

Initialized

19

Dependency Object & Dependency Properties

Workflow State

DependencyObject<abstract>

• Activity data storage mechanism• Allows activities to project their properties onto their

children• Essential provision for WF tenent (Long-running and

stateful)

20

Dependency Object

Workflow State

• Hash table

• Essential provision for WF tenant (Long-running and stateful)

• Add a public static instance of Dependency Property to manage that property for all instances of the activity

• Implement .NET Property that accesses an activities Dependency Property

21

Dependency Properties

Workflow State

Must derive from DependencyObject

Register property then define property

22

Dependency Properties

Workflow State

public static DependencyProperty MyDepPropProperty = DependencyProperty.Register( “MyDepProp",

typeof(String), typeof(MyClass));

Property name

Property Type

Owner Type

23

Dependency Properties

Workflow State

public String CompilationMode{ get { return (String)(base.GetValue(MyClass. MyDepPropProperty)); } set { base.SetValue(MyClass.MyDepPropProperty, value); }}

24

Parameter Passing

Workflow State

Dictionary<String, Object> Args = new Dictionary<string, object>();

Args.Add("RepositorySource", "C:\\Projects\\BuildManager\\Repository");

Args.Add("CompilationMode", "Release");

Args.Add("Application", "C:\\Projects\\BuildManager\\Checkout\\BuildMeWinApp\\BuildMeWinApp.sln");

Args.Add("Target", "C:\\Projects\\BuildManager\\BuildTarget");

WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(BuildTasks.Builder), Args);

25

Custom Workflow

Domain specific activities

Domain specific workflow

Example of Code+Markup workflow

Build custom workflow demo

26

Markup

Authoring Modes

<SequentialWorkflowActivity x:Class="MarkupBuild.Build" x:Name="Build"

xmlns:ns0="clr-namespace:BuildTasks;Assembly=BuildTasks, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow">

<ns0:Checkout BuildFile="{x:Null}" x:Name="checkout1" RepositorySource="{x:Null}" />

<ns0:Compile BuildFile="{x:Null}" x:Name="compile1" CompilationMode="{x:Null}" Application="{x:Null}" />

<ns0:Deploy BuildFile="{x:Null}" x:Name="deploy1" CompilationMode="{x:Null}" Target="{x:Null}" />

</SequentialWorkflowActivity>

27

XOML

Authoring Modes

Extensible Orchestration Markup Language (XOML) files, a special case of XAML file types, which specify the workflow logic within an application.

28

Binding

Authoring Modes

<SequentialWorkflowActivity x:Class="MarkupBuild.Build" x:Name="Build"

xmlns:ns0="clr-namespace:BuildTasks;Assembly=BuildTasks, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow">

<ns0:Checkout x:Name="checkout1" RepositorySource="{ActivityBind Build,Path=RepositorySource}" />

<ns0:Compile x:Name="compile1" CompilationMode="{ActivityBind Build,Path=CompilationMode}" Application="{ActivityBind Build,Path=Application}" />

<ns0:Deploy x:Name="deploy1" Target="{ActivityBind Build,Path=Target}" CompilationMode="{ActivityBind Build,Path=CompilationMode}" />

</SequentialWorkflowActivity>

29

Authoring Modes

Binding

gives a dependency property an ActivityBind object to evaluate when asked for its value

ActivityBind can point to other fields, properties, or methods of activities inside a workflow.

One activity could bind its input properties to a previous activity's outputs.

Binding makes the data flow a part of the workflow model.

30

Markup-only workflows

Authoring Modes

Allows for declarative programming

Facilitates the highest degree of encapsulation

Facilitates usage of code-generation tool

Requires mechanism to serialize and deserialize WF

31

Serialization

Serialization

Serialization

Create a XAML workflow markup file from an in-memory workflow model

Deserialization

Reads markup and creates in-memory object containing definition of workflow model

32

Serialization

Serialization

private static void SerializeToMarkup(Activity workflow, String fileName)

{

try

{

using (XmlWriter xmlWriter = XmlWriter.Create(fileName))

{

WorkflowMarkupSerializer mrkupSerializer = new WorkflowMarkupSerializer();

mrkupSerializer.Serialize(xmlWriter, workflow);

}

}

catch (Exception e)

{

Console.WriteLine("Exception during serialization: {0}" e.Message);

}

}

33

Serialization

Deserializer needs knowledge of the types referenced in the markup

ServiceContainer, TypeProvider, DesignSerializationManager

Deserialization

34

Serialization

Activity workflow = null;

ServiceContainer container = new ServiceContainer();

Add a TypeProvider to resolve BuildTask references

TypeProvider provider = new TypeProvider(container);

provider.AddAssembly(typeof(SharedWorkflows.MarkupOnlyBaseWorkflow).Assembly);

container.AddService(typeof(ITypeProvider), provider);

Add ServiceContainer with the TypeProvider to serialization manager

DesignerSerializationManager dsm = new DesignerSerializationManager(container);

XmlReader xmlReader = XmlReader.Create(fileName)

WorkflowMarkupSerializer markupSerializer = new WorkflowMarkupSerializer();

workflow = markupSerializer.Deserialize(dsm, xmlReader) as Activity;

35

Designer Re-Hosting

Code generation tool

Configurable by end user

36

Introduction

Designer Re-hosting

The logic of a build process is often simple enough for to allow drag and drop process design by non-developers

WF allows for re-hosting the workflow designer in a windows application (outside of the Visual Studio environment)

Powerful proposition

37

Designer Classes

System.ComponentModel.Design.DesignSurface

General-purpose design canvas

System.Workflow.ComponentModel.Design.

WorkflowDesignerLoader

Serialization/Deserialization

Loading of services used by the designer

System.Workflow.ComponentModel.Design.WorkflowView

Implements visual representation of your workflow model

38

Designer Classes

IDesignerHost

Persisted Workflow Models

(.xoml files)

Design Surface

MyDesignerLoader: WorkflowDesignerLoader

Load services and populate visual treeIRootDesigner

WorkflowView

BeginLoad method

GetServices method

GetDesigner method

GetView method

39

Property Attributes

Designer Re-hosting

Description

Category

Browsable

DesignerSerializationVisibility

40

Designer Re-hosting

Abstract

Must be implemented in a derived class

Responsible for loading workflow from peristable tore .xoml and populating tree of visual objects in the designer and Vise-Versa

WorkflowDesignerLoader

41

Designer Re-hosting

Services

IMenuCommandService

ITypeProvider

IToolboxService

IPropertyValueUIService

IEventBindingService

42

Designer Re-hosting

Demo

Simple workflow

Workflow with conditional branch

43

Conclusion

Revisiting Objectives

Visual Configuration (script free)

Real-time distributed feedback

Parallel Task processing

Cheap

44

Conclusion

Real-time distributed feedback

Limitation is due to fact that WF Markup is a subset of XAML – the markup parser is not extensible

Parallel Task processing

Parallel task activity is not multithreaded

This can be implemented but it’s not out-of-the box functionality

45

Conclusion

References

• Pro WF Windows Workflow in .NET 3.0, Apress, Bruce Bukovics

• Professional Windows Workflow Foundation, Wrox, Todd Kitta

• Introduction to Domain Specific Languages, Martin Fowler, http://www.infoq.com/presentations/domain-specific-languages

46

Blank Slide

Serialization