building you build process with windows workflow foundation
DESCRIPTION
Building you build process with Windows Workflow Foundation. Abid Quereshi. Agenda. Existing build technologies Promise of Workflow Foundation Demonstration – reusing Nant scripts Demonstration - Custom Task Authoring Modes Serialization and Deserialization Designer Re-Hosting. - PowerPoint PPT PresentationTRANSCRIPT
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