VS Live is Coming to Chicago this May! Special Discount for ALM User Group & Friends

by Angela March 01 2013 10:29

email header2

So in case you haven’t noticed, Visual Studio Live is coming back to Chicago after many, many years of not being here.  This makes me very happy because a) I don’t have to pay for a flight and hotel in L.A. or Seattle, and b) well, see a) because cost is one factor that makes attending great conferences like this so hard to do for some of us.  Regular price of admission is $1,995 for the full 4 days, which isn’t bad when you think of all the awesome content you get.  Early bird registration ends soon and saves you $300 but wait, there’s more! Actually it’s more discount that I can give you.

In case you did not make it out to the last Chicago Visual Studio ALM User Group you may have missed out on the discount code that I was able to get for all of you.  Sign up right now using the links in this email (or the code UGCH1) and you’ll save $500 off of the $1995 registration too, so it would be only $1495 for the full 4 day pass! 

  • Visual Studio Live! Chicago tracks include:
  • ASP.NET
  • Azure / Cloud Computing
  • Cross-Platform Mobile
  • Data Management
  • HTML5 / JavaScript
  • SharePoint / Office
  • Windows 8 / WinRT
  • WPF / Silverlight
  • Visual Studio 2012 / .NET 4.5

 

So no travel costs, no hotel stay, AND save 25%. How can you NOT go? Hope to see you at our next meeting, and at VS Live Chicago this May!

Tags:

ALM | Application Lifecycle Management | Azure | Entity Framework | MSDN | TFS 2012 | Visual Studio 2012 | git | development | Visual Studio | Team Foundation Server | Cloud Computing | HTML5 | Silverlight | .NET 4.5 | VS Live

How to Fail a Build without a Code Review

by Jacob Maki December 11 2012 02:40

I recently had the opportunity to create a build that would fail if certain file types did not have a passing code review in TFS.  For those who would like to do something similar, I’ll detail the way I accomplished it.

Handling Code Reviews

Obviously, the first step in this process is having a way to keep track of the code reviews themselves.  For that, I used the Scrum 2.0 template that comes with TFS2012.  For those not using TFS2012 yet, you can import the Code Review Request and Code Review Response work item types in to a TFS2010.  If you’re not using Visual Studio 2012, then you’ll need to modify the layouts of those work item types so that all the inputs aren’t read only.  Once this part is done, this will associate a change set to a code review.

Creating the Custom Build Activity

The custom activity will need a few parameters to work its magic.  First, it’ll need an instance of IBuildDetail to fail the build if there is non-reviewed code.  An instance of a team project collection is needed as well – it’ll be used to get the work item store to check for code reviews.  It’ll also need a list of change sets in the build to check.  Lastly, it’ll take what file types to check (for example, “.sql,.cs” or blank for all) and a Boolean specifying if the build should be failed or not (it’s a lot easier to change that variable than to remove the activity from the build if a situation arises where the code review can be skipped).  Here’s what the parameters look like:

///<summary>
/// Gets or sets the build detail
///</summary>
[RequiredArgument]
[Browsable(true)]
public InArgument<IBuildDetail> BuildDetail { get; set; }

///<summary>
/// Gets or sets the team project collection.  Use Microsoft's GetTeamProjectCollection activity.
///</summary>
[RequiredArgument]
[Browsable(true)]
public InArgument<TfsTeamProjectCollection> TeamProjectCollection { get; set; }

///<summary>
/// Gets or sets the changesets to check for code reviews
///</summary>
[RequiredArgument]
[Browsable(true)]
public InArgument<IList<Changeset>> Changesets { get; set; }

///<summary>
/// Gets or sets the comma separated list of files types to check (for example, ".sql,.cs").  An
/// empty string means all files require review.
///</summary>
[Browsable(true)]
public InArgument<string> CommaSeparatedFileTypes { get; set; }

///<summary>
/// Gets or sets a value indicating whether the build will fail if there is non-reviewed code
/// matching the specified file types.
///</summary>
[Browsable(true)]
[RequiredArgument]
public InArgument<bool> FailBuildOnNonReviewedCode { get; set; }

An Overview of the Process

At a high level, the execute method of the custom activity will check all the change sets to see if there is any code without a passing code review, output the files that don’t have a passing review, and optionally fail the build.  Here’s what the execute method looks like:

/// <summary>
/// Performs the execution of the activity
/// </summary>
/// <param name="context">The execution context under which the activity executes</param>
protected override void Execute(CodeActivityContext context)
{
    #region Validate arguments and parameters

    if (context == null) { throw new ArgumentNullException("context"); }

    TfsTeamProjectCollection teamProjectCollection = context.GetValue(TeamProjectCollection);
    if (teamProjectCollection == null) { throw new ArgumentException("Team Project Collection cannot be null."); }

    IBuildDetail buildDetail = context.GetValue(BuildDetail);
    if (buildDetail == null) { throw new ArgumentException("Build Detail cannot be null."); }

    IList<Changeset> changesets = context.GetValue(Changesets);
    if (changesets == null) { throw new ArgumentException("Changesets cannot be null."); }

    #endregion

    ICollection<string> filesTypesRequiringReview = ParseFileTypesRequiringReview(context.GetValue(CommaSeparatedFileTypes));
    bool failBuildOnNonReviewedCode = context.GetValue(FailBuildOnNonReviewedCode);

    WorkItemStore workItemStore = teamProjectCollection.GetService<WorkItemStore>();
    IEnumerable<Change> nonReviewedChanges = DoesBuildHaveNonReviewedCode(workItemStore, changesets, filesTypesRequiringReview);

    bool anyNonReviewedChangesets = false;
    foreach (Change nonReviewedChange in nonReviewedChanges)
    {
        anyNonReviewedChangesets = true;
        HandleChangeWithoutPassingReview(context, failBuildOnNonReviewedCode, nonReviewedChange);
    }

    if (anyNonReviewedChangesets && failBuildOnNonReviewedCode)
    {
        buildDetail.Status = BuildStatus.Failed;
    }
}

Checking for Non Reviewed Code

To check for non-reviewed code, the code will loop through all the change sets and check each change to see if the file matches the file types requiring review.  If it does, it then checks to see if there’s a passing code review.  If the change doesn’t have a passing review, it’s returned so the build can output all the files that still need a review.  Here’s the code:

/// <summary>
/// Determines if the build has any changesets that have not been reviewed
/// </summary>
/// <param name="workItemStore">Work item store</param>
/// <param name="changesets">Changesets</param>
/// <param name="filesTypesRequiringReview">File types requiring review (empty collection means all)</param>
/// <returns>Changes without a passing review</returns>
private IEnumerable<Change> DoesBuildHaveNonReviewedCode(WorkItemStore workItemStore, IList<Changeset> changesets, ICollection<string> filesTypesRequiringReview)
{
    foreach (Changeset changeset in changesets)
    {
        // The changeset object passed in may not contain the associated changes (depending on how this is executed - workflow versus unit test)
        Change[] changes = changeset.Changes.Length > 0 ? changeset.Changes : changeset.VersionControlServer.GetChangesForChangeset(changeset.ChangesetId, false, int.MaxValue, null);

        foreach (Change change in changes)
        {
            bool matchingFileToCheck = DoesChangeRequireReview(change, filesTypesRequiringReview);

            if (matchingFileToCheck)
            {
                bool hasPassingCodeReview = DoesChangesetHavePassingReview(workItemStore, changeset);

                if (!hasPassingCodeReview)
                {
                    yield return change;
                }
            }
        }
    }
}

Determining if the Change Requires a Review

 A change requires a review if the file type matches the file types passed in (or if none were passed in, then every file requires a review).

/// <summary>
/// Determines if the change requires review
/// </summary>
/// <param name="change">Change</param>
/// <param name="fileTypesRequiringReview">File types requiring review</param>
/// <returns>True if a passing review is required, else false</returns>
private static bool DoesChangeRequireReview(Change change, ICollection<string> fileTypesRequiringReview)
{
    bool matchingFileToCheck = fileTypesRequiringReview.Count == 0;

    foreach (string fileType in fileTypesRequiringReview)
    {
        if (change.Item.ServerItem.EndsWith(fileType, StringComparison.CurrentCultureIgnoreCase))
        {
            matchingFileToCheck = true;
        }
    }

    return matchingFileToCheck;
}

Determining if the Change Set Requires a Review

This is the crux of the code.  To determine if the change set has a passing review, we query the work item store based on the change set ID.  In Visual Studio / TFS 2012, code reviews aren’t linked to the change set as one might expect.  This is because code reviews can be associated with a change set or a shelve set.  As a result, the change set objects passed in to the code won’t have the associated code review work items.  Instead, we have to check the context field.  Here’s the code:

/// <summary>
/// Determines if the changeset has a passing code review associated with it
/// </summary>
/// <param name="workItemStore">Work item store</param>
/// <param name="changeset">Changeset</param>
/// <returns>True if the changeset has a passing review, else false</returns>
private static bool DoesChangesetHavePassingReview(WorkItemStore workItemStore, Changeset changeset)
{
    Query query = new Query(workItemStore,
        string.Format(CultureInfo.InvariantCulture,
        "SELECT [Id] FROM WorkItemLinks WHERE "
        + "[Source].[System.WorkItemType] = 'Code Review Request' "
        + "AND [Source].[Microsoft.VSTS.CodeReview.Context] = '{0}' "
        + "AND [System.Links.LinkType] = 'Child' "
        + "AND [Target].[System.WorkItemType] = 'Code Review Response' "
        + "AND ([Target].[Microsoft.VSTS.CodeReview.ClosedStatusCode] = 1 OR [Target].[Microsoft.VSTS.CodeReview.ClosedStatusCode] = 2) " // 1 = Looks Good, 2 = With Comments
        + "mode(MustContain)",
        changeset.ChangesetId)
        );

    return query.RunCountQuery() > 0;
}

Outputting Files without a Review

If the build fails because there is code without a passing review, it’s extremely helpful to know what files still need to be reviewed.  The DoesBuildHaveNonReviewedCode method returns the list of non-reviewed changes.  Depending on whether or not we’ll be failing the build, the code outputs those files accordingly:

/// <summary>
/// Takes the appropriate actions when a changeset does not have a passing review
/// </summary>
/// <param name="context">Context</param>
/// <param name="treatAsError">True if the message should be treated as an error, else it will be a warning</param>
/// <param name="change">Change</param>
private static void HandleChangeWithoutPassingReview(CodeActivityContext context, bool treatAsError, Change change)
{
    if (treatAsError)
    {
        WriteBuildError(context, string.Format(CultureInfo.CurrentCulture, UnreviewedFileMessageTemplate, change.Item.ServerItem));
    }
    else
    {
        WriteBuildWarning(context, string.Format(CultureInfo.CurrentCulture, UnreviewedFileMessageTemplate, change.Item.ServerItem));
    }
}

Adding the Activity to the Build Template

Next we need to place the custom activity in our build definition.  The “Associate Changesets and Work Items” activity produces a list of change sets in the build.  We’ll need that along with a GetTeamProjectCollection activity.  Here’s the placement:

Passed Parameters

I made file types and Boolean to fail the build with non-reviewed code parameters.  This way I can modified what file types require review and if the build should fail or not without having to update the XAML.

Results

Here’s what it looks like when run the build when it’s set to fail on non-reviewed code:

And here’s what it looks like when you treat it as a warning: 

Tags:

ALM | Application Lifecycle Management | development | Team Foundation Server | TFS | TFS 2010 | TFS 2012 | Visual Studio | Visual Studio 2012 | VS 2010

So you accidentally deleted your MTM Test Plan, Now What?

by Angela October 10 2012 04:14

So this week, we had a little bit of fun, by which I mean a day that started with panic and scrambling when someone accidentally deleted a Test Plan (yes, a whole test plan) in MTM in production. A well established test plan with dozens of test suites and over a hundred test cases with a month’s worth of result data no less... Some important things of note:

  • test plans are not work items, they are just a “shell” and so are a bit easier to delete than they should be (in my opinion)
  • there is no super secret command-line only undelete like there is for some artifacts in TFS, so recreate from scratch or TPC recovery are your only options here to get it back
  • when you delete a test plan, you lose every test suite you had created.  Thankfully, not test cases themselves, those are safe in this situation.  Worst case, a plan can be created, although it is tedious and can be time consuming.
  • when you delete a test plan, test results associated with that test plan will be deleted*. Let that sink in – ALL OF THE TEST RESULTS FOR THAT TEST PLAN, EVER, WILL ALSO BE DELETED.  ::this is why there were flailing arms and sweaty brows when it happened::

So at this point, you may be thinking it’s time to update your resume and change your phone number, but hold up. You may have some options to recover that data, so buy some donuts for your TFS admin(I like cinnamon sugar, BTW).  I should mention, there may be a lot of other options but these are the three I was weighing, and due to some things beyond my control we had to go with #2.

1) Best Case Scenario: restore your DETACHED (this is required) team project collection database from a backup, cause you’re totally taking nightly backups and using the TFS Power Tool right? You lose a little data depending on how old that backup is, but it may be more important to get back your test runs than have to redo a few hours of work.

2) Second Best Case Scenario: If you cannot lose other data, and are willing to sacrifice some test run data, then restore the TFS instance from a traditional SQL backup to a separate TFS instance (so, NOT your production instance), open up your test plan in that secondary environment, and recreate your test plan in production.  Not ideal, but if you didn’t have a ton of test runs this may be faster and you don’t sacrifice anything in SCM or WIT that was changed since the backup was taken.

3) Worst Case Scenario: if your backups were not detached when you did your last backup, cry a little, then use the recover command to re-attach them. The gist is to use the TFSConfig Recover command on the collection to make it “attachable” again, then attach it to your collection. I have written a separate post on this because it can be complicated…

Once you are back up and running, make sure rights to managing test plans is locked down!  It might not be obvious that you can even do this, or where to find it, since it is an “Areas and Iterations” level permission. But do it, do it now!  This permission controls the ability to create and delete Test Plans, so be aware of that. But for the most part, anyone with authority and knowledge to delete entire Test Plans, considering what they contain, should be the only person creating them.  If everyone needs the ability to create/delete these willy-nilly, then you are doing it wrong, in my opinion anyway.

I am still in the midst of getting this back up and running so will update once we’re finished. There is an MSDN forum post out there regarding one bug I seem to have uncovered, if anyone wants to look at it and maybe fix my world by answering it Smile I am sure I’ll be able to add some more tips and tricks by then.

Visual Studio 2012 Launch Event Coming to Chicago in September!

by Angela August 29 2012 04:50

You might have heard that the official launch of Visual Studio 2012 is coming soon! Alas we cannot all afford to hop on a plane and head out to Washington State to party with the product team. BUT, lucky for you, there are also going to be local launches held at major cities across the U.S. You might not have noticed because all the marketing jazz has been heavily focusing on the Windows Azure part of that event, but there is going to be some great content around the development tools as well. Now you know!

Join Polaris Solutions at this free launch in Oak Brook, IL (about 20 miles west of Chicago) event to check out some of Microsoft’s newest leading-edge tools, including Microsoft Visual Studio 2012, Windows Azure, Windows Server 2012, and Microsoft System Center 2012. You'll get the opportunity to engage with the experts (like me), get hands on with the new technology, and learn how to build modern applications both on-premises or in the cloud using the Microsoft platform.

A special Visual Studio 2012 launch track was recently added to the CHICAGO event with a keynote from Brian Harry himself. I know, cool right?! Smile In his talk, you will learn about how Visual Studio 2012 can help you evolve your development practices to maintain relevancy, adapt to change and deliver on the needs of the business, rise to the challenge of the “New Normal”, and elevate your skills to keep pace with the fast changing world of application development and delivery. Be sure to stop by after the keynote and visit us at the Polaris Solutions booth as well!

At the event, you will also be able to participate in a raffle for a chance to win an Xbox 360 + Kinect Bundle.  Get registered soon before it sells out:  https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032521310&Culture=en-US&community=0

Tags:

ALM | Application Lifecycle Management | Microsoft Test Manager | Microsoft Test Professional | SDLC | TFS 2012 | TFS | Team Foundation Server | Visual Studio | Visual Studio 2012

August Chicago ALM User Group - Announcing Git Integration with TFS

by Angela August 16 2012 10:43

I know, Microsoft supporting non-.NET developers and non-Windows folks? Inconceivable! ::gasp:: 

OK, so if you’ve been paying attention for the past couple of years, you might already know that this has been happening slowly. But recently there have been some seriously MAJOR developments. First, Microsoft made Entity Framework open source, and now they have added MVC, ASP.NET and more to that list. Dogs and cats, living together, mass hysteria…and all that.  Then when you thought it couldn’t get crazier, they announced TFS integration with Git!  My head just exploded a little, how about yours?

Come to the Chicago Microsoft office on August 29th and meet one of the TFS product team members, you heard it, ONE OF THE DUDES WHO WRITES CODE FOR TFS ITSELF! Edward Thomson will be discussing how to take advantage of the new git-tf tool to synchronize a local git repository with Team Foundation Server.  This cross platform bridging tool is especially useful for cross-platform developers, such as iOS developers on Xcode.

Edward Thomson is a Software Development Engineer at Microsoft, where he works on cross-platform version control tools for Team Foundation Server.  Before joining Microsoft, Edward worked on numerous source code control tools for Microsoft and Unix platforms.

Register now to make sure you get a spot. Building security also requires it, and it helps me not order gobs of food no one will show up to eat.  So help a girl out huh?

Tags:

ALM | Application Lifecycle Management | MSDN | SDLC | TFS | Team Foundation Server | VS 11 Beta | Visual Studio | Open Source | git | TFS 2012