Integrate LeanKit and Visual Studio Online

Integrate LeanKit and Visual Studio Online

LeanKit and Visual Studio Online are both two great tools.  Why not use them both?  Here is a guide to integrate LeanKit and Visual Studio Online.

Although Visual Studio Online (and Team Foundation Server) provide a task board  to visualize work items and flow, I prefer to use the fully customized Kanban board by LeanKit.  Thankfully, I found out that LeanKit has created an Integration Service, which is available on GitHub.

My goal is to manage all work items within LeanKit, however I want to be able to associate Visual Studio Online Work Items to changesets (during checking) within Visual Studio.  (LeanKit/VSO ChangeLog how-to coming soon!)

Overall the installation and configuration is fairly straightforward. However, there were a couple hiccups I encountered along the way that inspired this how-to.  I also wanted to point out that main contributor to the integration service, David Neal (@reverentgeek), was very helpful in answering questions via Twitter.  Check out the source code if you’re interested, pretty nice code.

Integration Service Installation

  1. Download the latest zip/executables from LeanKit’s website here.
  2. Follow the installation guide provided by LeanKit.

Although LeanKit provides a bit of an overview on the configuration, follow these steps specifically for connecting to Visual Studio online (or Team Foundation Server).

Visual Studio  Online – Alternate Authentication Credentials

Before you configure the integration service, you must enable alternate authentication credentials to your Visual Studio account profile.  This allows you to specify a username/password the integration service can use to connect to Visual Studio Online Web Service.

When in Visual Studio Online, access your account profile to enable the alternate authentication credentials.

VSO Alternate Authentication Creds

 LeanKit – Board Settings

In your LeanKit board settings, go to the Card ID Settings section.  Here you will want to make sure that you are using the external card ID.  Do not select the auto-increment card ID setting because we want the Card ID to be the same as the Visual Studio Online Work Item #.

LeanKit Card ID Settings

Configure Integration Service

After installation, browse to http://localhost:8090 to access the web interface.  Specify your LeanKit account and credentials.

LeanKit Integration

Next, specify your Visual Studio Online account and alternate access credentials.

LeanKit Integration

The integration service is very configurable in terms of mapping LeanKit Cards to VSO Work Items and different status.  Select the LeanKit board and the Visual Studio Online Project you would like to create a mapping for.

LeanKit Integration Mapping

In the Selection tab, you will want to select the VSO Work Item States and Types that will be mapped to LeanKit.

LeanKit Mapping

The Lanes and States tab will be populated with the swim lanes and columns from your Kanban board.  Select a column or lane and then select an available state to map.  The intent here is to specify if the LeanKit card moves to that column/lane it will be updated in VSO with the mapped State.  If you define multiple states, only the first matching state will be used.

In the example below, I’ve mapped the Backlog column  to the New and To Do VSO states.

LeanKitVSO-Step5

In the Card Type tab, specify which LeanKit card types you want to map to which VSO Work Items.

LeanKit Integration Card Types

In the Options tab, specify how you want the integration service to sync.  It can sync changes bi-directional, however for my usage, I only want to push changes from LeanKit to VSO.  As mentioned above, I only want to use LeanKit for managing work items, however I want them to be in VSO so I can associate work items to changesets.

LeanKit Integration Options

Be sure to click the save button if you haven’t already.  What may not be obvious at this point is that you need to Activate your new configuration.  Click on the Activation tab, then click on the big red Activate Now button.

LeanKit Integration Activate

That’s it!

I’ve created a LeanKit Defect Card in my Product Backlog and the Integration Service has created the Bug work item in VSO.

LeanKit Test

LeanKit Test

Greg Young: 8 Lines of Code

Greg Young gave a good talk titled 8 Lines of Code, discussing simplicity, dependencies, and magic.

Magic is always something I try and identify and stay away from in my own code, however I really failed to realize how much magic goes on in some of the libraries/frameworks that I often use.  Entity Framework and nHibernate come to mind.  You really should understand the magic happening in these libraries to use them.  Which is very problematic.

If you take the dependency ownership seriously, then a lot of folks developing the front-end of a “modern” web applications are in a world of hurt.  RequireJS, Knockout.js, jQuery, Bootstrap, etc, etc, etc…

Video is posted on InfoQ:

http://www.infoq.com/presentations/8-lines-code-refactoring

Microsoft Fakes (formerly Moles)

Problem: You are writing unit tests that involve a dependency on a 3rd party concrete class. Unfortunately there are no interfaces, nor are the methods/properties defined as virtual.

Solution: Microsoft Fakes (formerly Moles)

Microsoft Fakes help you isolate the code you are testing by replacing other parts of the application with stubs or shims. These are small pieces of code that are under the control of your tests. By isolating your code for testing, you know that if the test fails, the cause is there and not somewhere else. Stubs and shims also let you test your code even if other parts of your application are not working yet.

Example:

[code lang=”csharp”]

// Code under test:
public int GetTheCurrentYear()
{
return DateTime.Now.Year;
}

[TestClass] public class TestClass1
{
[TestMethod] public void TestCurrentYear()
{
int fixedYear = 2000;

// Shims can be used only in a ShimsContext:
using (ShimsContext.Create())
{
// Arrange:
// Shim DateTime.Now to return a fixed date:
System.Fakes.ShimDateTime.NowGet =
() =>
{ return new DateTime(fixedYear, 1, 1); };

// Instantiate the component under test:
var componentUnderTest = new MyComponent();

// Act:
int year = componentUnderTest.GetTheCurrentYear();

// Assert:
// This will always be true if the component is working:
Assert.AreEqual(fixedYear, year);
}
}
}
[/code]