Quantcast
Channel: Scrum Bug
Viewing all 216 articles
Browse latest View live

Clean up your Team Project Collection prior to migrating to VSTS

$
0
0

To prepare your TFS Project Collection for migration, you may want to remove (stale) old data to reduce the database size first.

Most actions are already documented here. Queries that can aid in detecting where your space is allocated are also found in this recent support ticket.

Delete old workspaces

Deleting workspaces and shelvesets can reduce your migration and upgrade times considerably. either use the tf commandline or leverage a tool like the TFS SideKicks to identify and delete these.

Build results

Not just build results, but often overlooked the actual build records can take up a considerable amount of data. Use tfsbuild destroy (XAML) to permanently delete the build records. In the past, I've encountered clients who had 1.8 million "hidden" builds in their database and removing them shaved off quite a considerable amount of data. These records were kept around for the warehouse.

Old team projects

Of course, destroying old team projects can give back a lot of data. Anything you don't need to send to azure helps. You could also consider splitting the collection and to leave behind the old projects. That will give you the option to detach that collection and store it somewhere, should you ever need that data again.

Redundant files

Deleted branches are a very common hidden size hog. When deleting things in TFVC, they are not actually deleted, they're just hidden. Finding deleted files and especially old development or feature branches can give you back a lot of data. Use tf destroy to get rid of them.

You may also want to look for checked in nuget package folders, those can quickly rack up a lot of space as well.

Test Attachments

Ohh yes, especially when you use test attachments, these can grow like crazy, depending on your TFS version either use the built-in test attachment cleanup features or use the Test Attachment Cleaner from the TFS power tools.

XAML Builds

The build definitions themselves won't take a lot of database space, but the build results may. But those have been covered in a previous section.

In the past, I've had to patch tfbuid.exe to handle (very) large amounts of build records, as it tends to try and fetch all build data locally before proceeding with the delete action. You may need to rely on the TFS Client Object Model to achieve a similar result.

Git Repositories

You may have data in your git repositories that are no longer accessible due to force pushes or deleted branches. It's also possible that certain data in Git could be packed more efficiently. To clean your repositories you have to clone them locally, clean them up, delete the remote repo from TFS and push the cleaned copy to a new repository (you can use the same name as the old one). Doing this will break references with existing build definitions and you will have to fix these up. While you're at it, you could also run the BFG repo Cleaner and convert the repositories to enable Git-LFS support to handle large binary files in your repositories more elegantly.


git clone --mirror https://tfs/project/repo
# optionally run BFG repo cleaner at this point
git reflog expire --expire=now --all 
git gc --prune=now --aggressive
git repack -adf
# Delete and recreate the remote repository with the same name
git push origin --all
git push origin --tags

Work item (attachments)

Work items can gather up a considerable amount of data, especially when people start attaching large attachments to them. You can use witadmin destroywi to delete work items with unreasonably large attachments. To retain the work item, but delete its attachments you can delete the attachments from the current work item and then clone it. After cloning, destroy the old work item to allow the attachments to be cleaned up.

Old work items that you no longer need (say the sprint items from 6 years ago) can also be deleted. My colleague René has a nice tool that allows you to bulk-destroy by first creating the appropriate work item query.

Be sure to run the cleanup jobs

TFS often doesn't directly prune data from the database, in many cases, it just marks stuff as deleted for latest processing. To force the cleanup to happen immediately, run the following stored procedures on your Project Collection database:


EXEC prc_CleanupDeletedFileContent 1
# You may have to run the following command multiple times, the last
# parameter is the batch size, if there are more items to prune than the 
# passed in number, you will have to run it multiple times
EXEC prc_DeleteUnusedFiles 1, 0, 100000

Other useful queries

To identify how much data is stored in each section, there are a few useful queries you can run. The actual query depends on your TFS version, but since you're preparing for migration I suspect you're on TFS 2017 or 2018 at the moment.

Find the largest tables:

SELECT TOP 10 
    o.name, 
    SUM(reserved_page_count) * 8.0 / 1024 SizeInMB,
    SUM(
        CASE 
              WHEN p.index_id <= 1 THEN p.row_count
              ELSE 0
        END) Row_Count
FROM sys.dm_db_partition_stats p
JOIN sys.objects o
    ON p.object_id = o.object_id
GROUP BY o.name
ORDER BY SUM(reserved_page_count) DESC

Find the largest content contributors:

SELECT Owner = 
    CASE
        WHEN OwnerId = 0 THEN 'Generic' 
        WHEN OwnerId = 1 THEN 'VersionControl'
        WHEN OwnerId = 2 THEN 'WorkItemTracking'
        WHEN OwnerId = 3 THEN 'TeamBuild'
        WHEN OwnerId = 4 THEN 'TeamTest'
        WHEN OwnerId = 5 THEN 'Servicing'
        WHEN OwnerId = 6 THEN 'UnitTest'
        WHEN OwnerId = 7 THEN 'WebAccess'
        WHEN OwnerId = 8 THEN 'ProcessTemplate'
        WHEN OwnerId = 9 THEN 'StrongBox'
        WHEN OwnerId = 10 THEN 'FileContainer'
        WHEN OwnerId = 11 THEN 'CodeSense'
        WHEN OwnerId = 12 THEN 'Profile'
        WHEN OwnerId = 13 THEN 'Aad'
        WHEN OwnerId = 14 THEN 'Gallery'
        WHEN OwnerId = 15 THEN 'BlobStore'
        WHEN OwnerId = 255 THEN 'PendingDeletion'
    END,
    SUM(CompressedLength) / 1024.0 / 1024.0 AS BlobSizeInMB
FROM tbl_FileReference AS r
JOIN tbl_FileMetadata AS m
    ON r.ResourceId = m.ResourceId
    AND r.PartitionId = m.PartitionId
WHERE r.PartitionId = 1
GROUP BY OwnerId
ORDER BY 2 DESC

If file containers are the issue:

SELECT 
    CASE 
        WHEN Container = 'vstfs:///Buil' THEN 'Build'
        WHEN Container = 'vstfs:///Git/' THEN 'Git'
        WHEN Container = 'vstfs:///Dist' THEN 'DistributedTask'
        ELSE Container 
    END AS FileContainerOwner,
    SUM(fm.CompressedLength) / 1024.0 / 1024.0 AS TotalSizeInMB
FROM 
    (SELECT DISTINCT LEFT(c.ArtifactUri, 13) AS Container,
    fr.ResourceId,
    ci.PartitionId
FROM tbl_Container c
INNER JOIN tbl_ContainerItem ci
    ON c.ContainerId = ci.ContainerId
    AND c.PartitionId = ci.PartitionId
INNER JOIN tbl_FileReference fr
    ON ci.fileId = fr.fileId
    AND ci.DataspaceId = fr.DataspaceId
    AND ci.PartitionId = fr.PartitionId) c
INNER JOIN tbl_FileMetadata fm
    ON fm.ResourceId = c.ResourceId
    AND fm.PartitionId = c.PartitionId
GROUP BY c.Container
ORDER BY TotalSizeInMB DESC

Are there other ways to clean and prepare your projects prior to upgrade or migration that I may have missed, leave a comment below!

Original


New versions of TFS/VSTS build tasks

$
0
0

I just pushed out new versions of the following tasks:

  • MsBuild Helper Task

    • Fixed a number of bugs when the Agent's work folder has a space in it somewhere.
  • Snyk

    • Fixed auto-update of built-in Snyk version
    • Added support for Path parameter to scan NuGet packages among other package types.
    • Added support for Severity Threshold parameter.
    • Updated built-in Snyk version to 1.70.2
  • Variable toolbox

    • Fixed PadLeft and PadRight
    • Fixed Regex search & replace
    • Upgraded to PowerShell3 handler to improve task performance

In the meantime I've been working on a number of other build-task related things, more to come soon:

  • TFVC Tasks

    • Upgrading to PowerShell3 hander
    • Using tf.exe instead of custom Client Object Model code
    • Consolidate separate tasks into a single task (like nuget task)
  • CI/CD tasks for Extensions

    • ServerGate support continue after validation has succeeded
    • Automatic versioning of extensions containing multiple build tasks
    • Moving tfx installation to a separate Tool Installer task

If you like my extensions, please leave a review or a donation. If you'd like to see a feature I haven't built, file an issue or, better yet, send me a pull request.

Fixing Edge, Start Menu and Cortana slowness

$
0
0

I've had issues with my machine for months now and it was very hard to pinpoint the culprit. It resulted in:

  • Start menu freezing
  • Cortana/explorer bar search staying black for up to 30 seconds
  • Edge not wanting to open or regularly freezing

I had tried all the tricks out there, none worked:

  • DISM /Online /Cleanup-Image /CheckHealth
  • DISM /Online /Cleanup-Image /ScanHealth
  • DISM /Online /Cleanup-Image /RestoreHealth
  • sfc /scannow
  • Windows 10 app troubleshooter
  • Windows 10 search & indexing troubleshooter
  • Windows 10 windows update troubleshooter
  • Reset Edge from the Apps & Features in Settings
  • Delete edge data in the user profile folder (%userprofile%\AppData\Local\Packages\Microsoft.MicrosoftEdge_8wekyb3d8bbwe)
  • Reinstall Intel and Nvidia graphics drivers
  • Install Nvidia driver without the nView extensions
  • Uninstall 3rd party virus scanner.
  • Reinstall all store apps: Get-AppxPackage -AllUsers| Foreach {Add-AppxPackage -DisableDevelopmentMode -Register “$($_.InstallLocation)\AppXManifest.xml”}

Technically the issue appeared in a few ways:

  • After starting edge the following processes would cause high-CPU and edge would crash:

    • browser_broker
    • runtime_broker
  • After opening the start menu or Cortana the following process would cause high-CPU and would freeze the start menu or Cortana for up to 30 seconds:

    • dllhost.exe
    • com surrogate
  • The event viewer would list a number of DCOM errors:

    • The server {0002DF02-0000-0000-C000-000000000046} did not register with DCOM within the required timeout.
    • The server {2593F8B9-4EAF-457C-B68A-50F6B8EA6B54} did not register with DCOM within the required timeout.
    • The server {973D20D7-562D-44B9-B70B-5A0F49CCDF3F} did not register with DCOM within the required timeout.

One of the tips to remove this problem was to uninstall the Intel and Nvidia graphics drivers and have Windows reinstall them. This didn't help either but did expose me to the culprit. After reinstalling the video drivers my machine was unable to start causing a blue screen on the following driver: vdd2hookkmode.sys. To solve the blue screen issue I had to delete the following registry key:


HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VDD2HookKmode

This driver ships with the Barco ClickShare Extension Pack, a set of drivers I use to share my screen to Barco's otherwise wonderful screen sharing devices we use in our training rooms. These drivers aren't updated through Windows Update or come with an update notification of any sort and removing them solves all my issues.

Their latest driver supposedly fixes some of these issues as well. But for me Edge becomes unusable the moment I install the latest version. For now I'll have to do without presenter view when using ClickShare together with PowerPoint.

Barco has released a KB Article to respond to this issue. For now this is a work in progress.

Disambiguate MSA and AAD accounts

$
0
0

Microsoft is finally closing the loophole that allowed you to create an MSA account (LiveId) with the same unique name as your AAD (Azure Active Directory) account. While it has been very useful in many cases to use the same ID for both the MSA and the AAD account, most services that relied on only MSA are finally shipping updates to also support AAD.

I've always had my MSA and AAD account share the same identity ever since I created my Microsoft Account almost 15 years ago. And every since Microsoft introduced Azure Active Directory I've had to choose between a "work and school account" or a "personal account". It helps that I have a pretty good understanding of the difference, so for me it never really posed more than a minor inconvenience, but I see a lot of clients confused and frustrated by the, in their eyes, useless question:

Because of it's age a lot of profiles were associated to it, and changing the sign-in address of my MSA felt a bit scary. Just to give you an idea of the services linked to my MSA (jhouwing@xpirit.com):

  • Microsoft Certification Portal
  • Microsoft Most Valuable Professional Portal
  • Microsoft Partner Portal and Partner link to Xpirit
  • Microsoft Visual Studio Marketplace Publisher account
  • XBox Live account
  • Windows Phone Marketplace
  • Windows Developer Account
  • MSDN subscription (from MVP)
  • Azure Subscription (multiple)
  • Visual Studio Team Services (multiple)
  • Visual Studio Enterprise license in Visual Studio 2017 (through MSDN)
  • Azure AD Guest user in a number of partner directories
  • Windows Store
  • Groove Music
  • Family Office 365 subscription
  • OneDrive
  • Windows Insider
  • Skype
  • My personal laptop
  • My work laptop
  • My personal Xbox

At the same time a number of things were associated to my AAD account sharing the same identity (jhouwing@xpirit.com):

  • Microsoft Visual Studio Marketplace Publisher account
  • MSDN Subscription (from work)
  • Azure Subscription
  • Visual Studio Team Services (access to Microsoft owned accounts)
  • Azure AD Guest in the Microsoft directory
  • Work Office 365 subscription
  • Ondrive for Business
  • Skype for Business
  • Windows Insider
  • My work laptop

I'd switched identities on my Microsoft account before, when I left my previous employer and joined Xpirit, so I was accustomed to the process of re-associating in the Microsoft Partner Portal and switching the primary identity in my MSA account, but I'd always hit a few problems and over the years the number of additional devices and services has steadily grown.

To start the disambigiation process I first added a new secondary identity to my MSA account (jesse.houwing@gmail.com). This option is pretty hard to find if you don't' know what you're looking for. You can find it in the Microsoft Account portal:

Click the "Manage your sign-in email or phone number" link and there you can add additional sign-in addresses to your account. In my case I added a secondary sign-in address for my gmail account:

After confirming you own this address through your chosen method of security, you can now sign in to most services using either address. A few won't work through, as I found out:

  • Visual Studio Team Services won't allow to sign in with a secondary identity. It will however automatically swap you to your new identity once you make it primary. Account ownership will also be updated automatically nowadays. That was a great relief.

Form there I clicked the "Make Primary" link on my new primary identity and after that I checked whether I could still access all my accounts. Switching my primary identity had a few unexpected side-effects:

  • I had to update my MSA account information on my windows devices.
  • I had to sign into my Xbox again
  • I had to restore my Windows Insider details
  • I had to uninstall the Windows Feedback app and install it again (should be fixed in a later version)
  • I had to sign out fo Visual Studio completely and sign in again so refresh my license and to connect to Visual Studio Team Services.

After confirming I could still access all my services I crossed my fingers and went on to remove my old primary identity.

After clearing all cookies in my browsers I am now no longer greeted by disambigution prompts, which makes me very happy. I'd still love it if Microsoft would make this process simpler and if they'd be able to remove the issues I encountered, but the process was a lot easier than I had been dreading.

Ohh and while you're at it, you may as well update your security preferences, enable 2-factor authentication and set a stronger password ;).

If you're wondering whether a company could solve this problem for their users, the answer is no. There is no way for an organisation to query which users have the same ID for their AAD and their MSA account and there is no way for a company to change the primary identity on behalf of their employees. The MSA account is owned by the individual and privacy and legal reasons prevent Microsoft from solvign this on behalf of a company.

Crafting complex Release Gate conditions in VSTS

$
0
0

A recent addition to VSTS is the ability to run a quick check prior to triggering a release to an environment. These checks can be used to check that there are no new customer complaints, no mad users on twitter, no important jobs running in the environment etc.

I wanted to make use of this feature as part of the CI/CD Tasks for Extensions. With the recent introduction of validation of the extension, it's possible that your newly uploaded extension isn't immediately available. So before kicking off tests for your extension, you may want to wait for the validation to succeed.

This resulted in two tasks, the first is a Server Gate task that can wait for the extension validation to finish before triggering a release. The second does the same thing, but runs on the build agent. They both rely on the Marketplace REST API.

To check the status of an extension, one can call the Marketplace REST API. It will return a list of versions of the extension and their validation status:


GET https://marketplace.visualstudio.com/_apis/gallery/publishers/jessehouwing/extensions/vsts-snyk?flags=1
Response Code: OK
Response: 
{
     "publisher":{
         "publisherId":"c68591c6-8fbd-413b-b7fb-b921737f4f9f",
         "publisherName":"jessehouwing",
         "displayName":"Jesse Houwing",
         "flags":"verified"
     },
     "extensionId":"252ad2b4-a2c5-43fc-bba5-17e631896091",
     "extensionName":"vsts-snyk",
     "displayName":"Snyk Task",
     "flags":"validated, public",
     "versions":[
         {"version":"1.1.12","flags":"validated","lastUpdated":"2018-03-16T18:58:53.133Z"},
         {"version":"1.1.11","flags":"validated","lastUpdated":"2018-02-18T13:53:47.83Z"},
         {"version":"1.1.9","flags":"validated","lastUpdated":"2017-03-14T09:40:40.75Z"}
     ],
     "deploymentType":0
}

To ensure the latest version is valid, you can use jsonpath to retrieve this information from the reply:


eq(
  count(
    jsonpath(
      '$.versions[?(@.version==''1.1.12'' && @.flags==''validated'')]'
    )
  ), 
  1
)

To configure the call and the expression, you need to go into your release pipeline and enable Gates on the environment. Then add an Invoke REST API  gate and configure it:

If the API call requires authentication, you can supply these through a basic credential.

Once you've configured your gate you can test it by triggering a release. It took me a while to get the expression right and after triggering 8 releases I'd reached a critical frustration level. Before using the Invoke REST API release gate I had been testing my expressions through publishing an extension and that ook even longer. I decided to build a small tool to quickly test the release conditions locally, without having to queue a build.

As you can see, the expression tester allows you to test an expression and provides direct feedback. I've added support for simple Build and Release variables as well, they're automatically detected when you type the expression.

With this little tool, your time to create and validate complex expressions will drop from multiple minutes per iteration to multiple iterations per minute. The expression parser used by the server tries to do a couple of clever things and short-circuits the validation of expressions. This caused me to detect issues in the second jsonpath only after triggering the second condition ($(extensionVersion) = 'latest').

Once you have a working Release Gate, it's easy to take the configuration and turn it into a reusable Task that can be published as part of an extension:


{
  "id": "231decda-22cb-4e83-b2f4-31fc86a0de1f",
  "name": "Check Marketplace validation status.",
  "category": "Deploy",
  "runsOn": [
    "Server",
    "ServerGate"
  ],
  "inputs": [
    {
      "name": "connectedServiceName",
      "type": "connectedService:VstsMarketplacePublishing",
      "label": "VSTS Marketplace connection",
      "required": true,
    },
    {
      "name": "publisherId",
      "type": "string",
      "label": "Publisher ID",
    },
    {
      "name": "extensionId",
      "type": "string",
      "label": "Extension ID",
    },
    {
      "name": "extensionVersion",
      "type": "string",
      "label": "Extension Version",
    }
  ],
  "execution": {
    "HttpRequest": {
      "Execute": {
        "EndpointId": "$(connectedServiceName)",
        "EndpointUrl": "$(endpoint.url)_apis/gallery/publishers/$(publisherId)/extensions/$(extensionId)?flags=1",
        "Method": "GET",
        "Body": "",
        "Headers": "{\"Content-Type\":\"application/json\"}",
        "Expression": "or(eq(count(jsonpath('$.versions[?(@.version==''$(extensionVersion)'' && @.flags==''validated'')]')), 1), and(in('$(extensionVersion)', 'latest', ''), eq(jsonpath('$.versions[0].flags')[0], 'validated')))"
      }
    }
  }
}

After publishing this task as an extension it shows up in the Release Gate section and will ask for a couple of variables you're probably already familiar with:

If you've configured your BuildNumber to be just the version you want to publish (default for my pipelines) and made the extension your primary artefact, then you can pass in the $(Build.BuildNumber) variable to wait for that specific version.

The tool I created to test the expression is available as a download on GitHub. The tool requires a local installation of Team Foundation Server 2018 Update 2 (due to the fact that I can't distribute the server binaries). The server doesn't need to be running, so you can skip the configure phase after installation, plus it won't use any resources. Even an expired trial version will do.

To help discover how to build and the release gates, I used the following examples:

Do you have specific types of gates in mind for your pipelines? How would you like the release gate feature to be improved? Leave a comment below, I'd love to hear.

Connect any version of Visual Studio to Visual Studio Team Services or Team Foundation Server.

$
0
0

I've written a couple of blog posts on this subject before and thought it would  be nice to consolidate them into one big post now that Visual Studio 2013 is about to be released. There are 3 major things to consider when connecting to TFS from an older version of Visual Studio.

  • The version of TFS you want to connect to
  • The version of Visual Studio you're connecting from
  • The version of Windows you're running

In this blog post:

  1. Connecting to Team Foundation Server 2015, 2017, 2018 or Visual Studio Team Services.
  2. Connecting to Team Foundation Server 2013.
  3. Connecting to Team Foundation Server 2012.
  4. Connecting to Team Foundation Server 2010.
  5. Configuring the MSSCCI provider for Visual Studio
  6. Connecting from Visual Studio 2005, 2008 or the MSSCCI provider

Since writing this post, Microsoft has produced an updated piece of documentation (which is already behind in some aspects) that describes most of the client/server combinations. One thing it adds which I haven't described, is the list of features that are available depending on your version of Visual Studio/TFS.

If you're having issues connecting after updating, it might be required to clear your local client cache to clear up certain issues like this one. Either the official way or the hard way.

If you also want to install the Team Foundation Server Power tools to match your Visual Studio/TFS version, check out this separate post.

The official compatibility guidance can be found here.

Connecting to Team Foundation Server 2015, 2017, 2018 or Visual Studio Team Services

Visual Basic 6, Visual Studio .NET and Visual Studio 2003 on Windows XP

  1. Install Visual Basic 6, Visual Studio .NET or Visual Studio 2003
  2. Team Explorer 2010
  3. Visual Studio 2010 SP1
  4. Visual Studio 2010  GDR
  5. Visual Studio 2010 Compatibility Update for Windows 8 and Visual Studio 2012
  6. Microsoft MSSCCI Provider for Visual Studio 2010

Visual Studio 2005 or Business Intelligence Development Studio 2008 on Windows XP

Install or repair the following items on your system in the specified order

  1. Install Visual Studio 2005
  2. Visual Studio 2005 SP1
  3. Visual Studio Team System 2005 Service Pack 1 Forward Compatibility Update for Team Foundation Server 2010
  4. (Optional) BIDS 2008
  5. Team Explorer 2010
  6. Visual Studio 2010 SP1
  7. Visual Studio 2010 GDR
  8. Visual Studio 2010 Compatibility Update for Windows 8 and Visual Studio 2012
  9. Microsoft MSSCCI Provider for Visual Studio 2010

Visual Studio 2005 or Business Intelligence Development Studio 2008 on Windows Vista

Install or repair the following items on your system in the specified order

  1. Visual Studio 2005
  2. Visual Studio 2005 SP1
  3. Visual Studio Team System 2005 Service Pack 1 Forward Compatibility Update for Team Foundation Server 2010
  4. (Optional) BIDS 2008
  5. Visual Studio 2005 Update for Vista
  6. Team Explorer 2012
  7. Visual Studio 2012 update 5
  8. Microsoft MSSCCI Provider for Visual Studio 2012

Visual Studio 2005 or Business Intelligence Development Studio 2008 on Windows 7, 8, 8.1 or 10

Install or repair the following items on your system in the specified order

  1. Visual Studio 2005
  2. Visual Studio 2005 SP1
  3. Visual Studio Team System 2005 Service Pack 1 Forward Compatibility Update for Team Foundation Server 2010
  4. (Optional) BIDS 2008
  5. Visual Studio 2005 Update for Vista
  6. Team explorer 2013
    1. Team Explorer 2013
    2. Visual Studio 2013 update 5
  7. (Optionally) Visual Studio 2015
  8. Microsoft MSSCCI Provider for Visual Studio Team Foundation Server 2013 and 2015

Visual Studio 2008  or Business Intelligence Development Studio 2008r2 on Windows XP, Vista, 7, 8, 8.1 or 10

Install or repair the following items on your system in the specified order

This setup is not officially supported, but it is supposed to work just fine. The MSSCCI provider route is the officially supported story, see right below. You may receive an occasional error message here and there.

  1. Visual Studio 2008
  2. Team Explorer 2008
  3. Visual Studio 2008 SP1
  4. (Optional) BIDS 2008r2
  5. Visual Studio 2008 GDR for Team Foundation Service
  • Connect using the http://server:port/tfs/ url format for on premise servers
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services
  • Connecting to VS Team Services is no longer supported using Azure Active Directory accounts when connecting using a machine which is running Windows XP, 2013 or Windows Vista, 7, 2008 or 2008r2 when running Internet Explorer 8.

Visual Studio 2008  or Business Intelligence Development Studio 2008r2 on Windows XP and Vista (Alternative)

Install or repair the following items on your system in the specified order

  1. Visual Studio 2008
  2. Visual Studio 2008 SP1
  3. (Optional) BIDS 2008r2
  4. Team Explorer 2010
  5. Visual Studio 2010 SP1
  6. Visual Studio 2010  GDR
  7. Visual Studio 2010 Compatibility Update for Windows 8 and Visual Studio 2012
  8. Microsoft MSSCCI Provider for Visual Studio 2010

Visual Studio 2008  or Business Intelligence Development Studio 2008r2 on Windows 7, 8, 8.1 or 10 (Alternative)

Install or repair the following items on your system in the specified order.
Since there is no stand-alone installation of Team Explorer 2015, I've opted for the 2013 version instead.

  1. Visual Studio 2008
  2. Visual Studio 2008 SP1
  3. (Optional) BIDS 2008r2
  4. Visual Studio 2008 GDR for Team Foundation Service
  5. Team explorer 2013
    1. Team Explorer 2013
    2. Visual Studio 2013 update 5
  6. (Optionally) Visual Studio 2015
  7. Microsoft MSSCCI Provider for Visual Studio Team Foundation Server 2013 and 2015

Visual Studio 2010 on Windows XP, Vista, 7, 8, 8.1 or 10

  1. Visual Studio 2010
  2. Team Explorer 2010
  3. Visual Studio 2010 SP1
  4. Visual Studio 2010 GDR for Team Foundation Service
  5. Visual Studio 2010 Compatibility Update for Windows 8 and Visual Studio 2012
  • Connect using the http://server:port/tfs/ url format for on premise servers.
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services
  • Connecting to VS Team Services is no longer supported using Azure Active Directory accounts when connecting using a machine which is running Windows XP, 2013 or Windows Vista, 7, 2008 or 2008r2 when running Internet Explorer 8.
  • Connecting to VS Team Services is no longer supported when using Internet Explorer 9 and 10.

Visual Studio 2012 on Window 7, 8, 8.1 or 10

  1. Visual Studio 2012
  2. Team Explorer 2012
  3. Visual Studio 2012 update 5
  4. (Optional) Visual Studio Tools for Git
  • Connect using the http://server:port/tfs/ url format for on premise servers.
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services
  • Connecting to VS Team Services is no longer supported using Azure Active Directory accounts when connecting using a machine which is running Internet Explorer 8.
  • Connecting to VS Team Services is no longer supported when using Internet Explorer 9 and 10.

Visual Studio 2013 on Windows 7, 8, 8.1 or 10

  1. Visual Studio 2013
  2. Team Explorer 2013
  3. Visual Studio 2013 update 5
  • Connect using the http://server:port/tfs/ url format for on premise servers.
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services
  • Connecting to VS Team Services is no longer supported using Azure Active Directory accounts when connecting using a machine which is running Internet Explorer 8.
  • Connecting to VS Team Services is no longer supported when using Internet Explorer 9 and 10.

Visual Studio 2015 on Windows 7, 8, 8.1 or 10

  1. Visual Studio 2015
  2. Visual Studio 2015 Update 3

Note: Team Explorer for Visual Studio 2015 is not available as a stand-alone download. Users who just want to use the Team Explorer features, install:

  1. Team Explorer 2013
  2. Visual Studio 2013 update 5
  • Connect using the http://server:port/tfs/ url format for on premise servers.
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.
  • Connecting to VS Team Services is no longer supported using Azure Active Directory accounts when connecting using a machine which is running Internet Explorer 8.
  • Connecting to VS Team Services is no longer supported when using Internet Explorer 9 and 10.

Visual Studio 2017 on Windows 8.1 or 10

  1. Visual Studio 2015
  • Connect using the http://server:port/tfs/ url format for on premise servers.
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Eclipse on Windows XP, Vista, 7, 8, 8.1 or 10

  1. Eclipse
  2. Team Explorer Everywhere for Team Foundation Server
  • Connect using the http://server:port/tfs/ url format for on premise servers.
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services (formerly known as Team Foundation Service)

IntelliJ on Windows XP, Vista, 7, 8, 8.1 or 10

  1. IntelliJ IDEA, RubyMine, WebStorm, PhpStorm, PyCharm, AppCode, MPS, Android Studio, 0xDBE or CLion
  2. Visual Studio IntelliJ Plugin
  • Connect using the http://server:port/tfs/ url format for on premise servers.
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services (formerly known as Team Foundation Service)

Connecting to Team Foundation Server 2013.

Visual Basic 6, Visual Studio .NET and Visual Studio 2003 on Windows XP

  1. Install Visual Basic 6, Visual Studio .NET or Visual Studio 2003
  2. Team Explorer 2010
  3. Visual Studio 2010 SP1
  4. Visual Studio 2010  GDR
  5. Visual Studio 2010 Compatibility Update for Windows 8 and Visual Studio 2012
  6. Microsoft MSSCCI Provider for Visual Studio 2010

Visual Studio 2005 or Business Intelligence Development Studio 2008 on Windows XP

Install or repair the following items on your system in the specified order

  1. Install Visual Studio 2005
  2. Visual Studio 2005 SP1
  3. Visual Studio Team System 2005 Service Pack 1 Forward Compatibility Update for Team Foundation Server 2010
  4. Optional BIDS 2008
  5. Team Explorer 2010
  6. Visual Studio 2010 SP1
  7. Visual Studio 2010  GDR
  8. Visual Studio 2010 Compatibility Update for Windows 8 and Visual Studio 2012
  9. Microsoft MSSCCI Provider for Visual Studio 2010

Visual Studio 2005 or Business Intelligence Development Studio 2008 on Windows Vista

Install or repair the following items on your system in the specified order

  1. Visual Studio 2005
  2. Visual Studio 2005 SP1
  3. Visual Studio Team System 2005 Service Pack 1 Forward Compatibility Update for Team Foundation Server 2010
  4. (Optional) BIDS 2008
  5. Visual Studio 2005 Update for Vista
  6. Team Explorer 2012
  7. Visual Studio 2012 update 5
  8. Microsoft MSSCCI Provider for Visual Studio 2012

Visual Studio 2005 or Business Intelligence Development Studio 2008 on Windows 7, 8, 8.1 or 10

Install or repair the following items on your system in the specified order

  1. Visual Studio 2005
  2. Visual Studio 2005 SP1
  3. Visual Studio Team System 2005 Service Pack 1 Forward Compatibility Update for Team Foundation Server 2010
  4. (Optional) BIDS 2008
  5. Visual Studio 2005 Update for Vista
  6. Team explorer 2013
    1. Team Explorer 2013
    2. Visual Studio 2013 update 5
  7. (Optionally) Visual Studio 2015
  8. Microsoft MSSCCI Provider for Visual Studio Team Foundation Server 2013 and 2015

Visual Studio 2008  or Business Intelligence Development Studio 2008r2 on Windows XP, Vista, 7, 8, 8.1 or 10

Install or repair the following items on your system in the specified order

If I understand correctly, this setup is not officially supported, but it is supposed to work just fine. The MSSCCI provider route is the officially supported story, see right below.

  1. Visual Studio 2008
  2. Team Explorer 2008
  3. Visual Studio 2008 SP1
  4. (optional) BIDS 2008r2
  5. Visual Studio 2008 GDR for Team Foundation Service
  • Connect using the http://server:port/tfs/ url format for on premise servers
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Visual Studio 2008  or Business Intelligence Development Studio 2008r2 on Windows XP and Vista (Alternative)

Install or repair the following items on your system in the specified order

  1. Visual Studio 2008
  2. Visual Studio 2008 SP1
  3. (optional) BIDS 2008r2
  4. Team Explorer 2010
  5. Visual Studio 2010 SP1
  6. Visual Studio 2010  GDR
  7. Visual Studio 2010 Compatibility Update for Windows 8 and Visual Studio 2012
  8. Microsoft MSSCCI Provider for Visual Studio 2010

Visual Studio 2008  or Business Intelligence Development Studio 2008r2 on Windows 7, 8, 8.1 or 10 (Alternative)

Install or repair the following items on your system in the specified order

  1. Visual Studio 2008
  2. Visual Studio 2008 SP1
  3. (optional) BIDS 2008r2
  4. Visual Studio 2008 GDR for Team Foundation Service
  5. Team explorer 2013
    1. Team Explorer 2013
    2. Visual Studio 2013 update 5
  6. (Optionally) Visual Studio 2015
  7. (Optionally) Visual Studio 2015 Update 3
  8. Microsoft MSSCCI Provider for Visual Studio Team Foundation Server 2013 and 2015

Visual Studio 2010 on Windows XP, Vista, 7, 8, 8.1 or 10

  1. Visual Studio 2010
  2. Team Explorer 2010
  3. Visual Studio 2010 SP1
  4. Visual Studio 2010 GDR for Team Foundation Service
  5. Visual Studio 2010 Compatibility Update for Windows 8 and Visual Studio 2012
  • Connect using the http://server:port/tfs/ url format for on premise servers.
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Visual Studio 2012 on Window 7, 8, 8.1 or 10

  1. Visual Studio 2012
  2. Team Explorer 2012
  3. Visual Studio 2012 update 5
  4. (optional) Visual Studio Tools for Git
  • Connect using the http://server:port/tfs/ url format for on premise servers.
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Visual Studio 2013 on Windows 7, 8, 8.1 or 10

Note: Update to at least Visual Studio Update 2 to enable Tag editing inside Visual Studio and Microsoft Test Manager.

  1. Visual Studio 2013
  2. Team Explorer 2013
  3. Visual Studio 2013 update 5
  • Connect using the http://server:port/tfs/ url format for on premise servers.
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Visual Studio 2015 on Windows 7, 8, 8.1 or 10

  1. Visual Studio 2015
  2. Visual Studio 2015 Update 3
  • Connect using the http://server:port/tfs/ url format for on premise servers.
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Visual Studio 2017 on Windows 8.1 or 10

  1. Visual Studio 2017
  • Connect using the http://server:port/tfs/ url format for on premise servers.
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.
  • Connecting to VS Team Services is no longer supported using Azure Active Directory accounts when connecting using a machine which is running Internet Explorer 8.
  • Connecting to VS Team Services is no longer supported when using Internet Explorer 9 and 10.

Eclipse on Windows XP, Vista, 7, 8 or 8.1

  1. Eclipse
  2. Team Explorer Everywhere for Team Foundation Server
  • Connect using the http://server:port/tfs/ url format for on premise servers.
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

IntelliJ on Windows XP, Vista, 7, 8, 8.1 or 10

  1. IntelliJ IDEA, RubyMine, WebStorm, PhpStorm, PyCharm, AppCode, MPS, Android Studio, 0xDBE or CLion
  2. Visual Studio IntelliJ Plugin
  • Connect using the http://server:port/tfs/ url format for on premise servers.
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Connecting to Team Foundation Server 2012

Visual Basic 6, Visual Studio .NET or Visual Studio 2003 on Windows XP

  1. Install Visual Basic 6, Visual Studio .NET or Visual Studio 2003
  2. Team Explorer 2010
  3. Visual Studio 2010 SP1
  4. Visual Studio 2010  GDR
  5. Visual Studio 2010 Compatibility Update for Windows 8 and Visual Studio 2012
  6. Microsoft MSSCCI Provider for Visual Studio 2010

Visual Studio 2005 or Business Intelligence Development Studio 2008 on Windows XP and Vista

Install or repair the following items on your system in the specified order

  1. Install Visual Studio 2005
  2. Visual Studio 2005 SP1
  3. Visual Studio Team System 2005 Service Pack 1 Forward Compatibility Update for Team Foundation Server 2010
  4. (Optional) BIDS 2008
  5. Team Explorer 2010
  6. Visual Studio 2010 SP1
  7. Visual Studio 2010  GDR
  8. Visual Studio 2010 Compatibility Update for Windows 8 and Visual Studio 2012
  9. Microsoft MSSCCI Provider for Visual Studio 2010

Visual Studio 2005 or Business Intelligence Development Studio 2008 on Windows 7, 8 , 8.1 or 10

Install or repair the following items on your system in the specified order

  1. Visual Studio 2005
  2. Visual Studio 2005 SP1
  3. Visual Studio Team System 2005 Service Pack 1 Forward Compatibility Update for Team Foundation Server 2010
  4. (Optional) BIDS 2008
  5. Visual Studio 2005 Update for Vista
  6. Team explorer 2013
    1. Team Explorer 2013
    2. Visual Studio 2013 update 5
  7. (Optionally) Visual Studio 2015
  8. Microsoft MSSCCI Provider for Visual Studio Team Foundation Server 2013 and 2015

Visual Studio 2008  or Business Intelligence Development Studio 2008r2 on Windows XP, Vista, 7, 8, 8.1 or 10

Install or repair the following items on your system in the specified order

  1. Visual Studio 2008
  2. Team Explorer 2008
  3. Visual Studio 2008 SP1
  4. (optional) BIDS 2008r2
  5. Visual Studio 2008 GDR for Team Foundation Service
  • Connect using the http://server:port/tfs/ url format for on premise servers
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Visual Studio 2010 on Windows XP, Vista, 7, 8, 8.1 or 10

Install or repair the following items on your system in the specified order

  1. Visual Studio 2010
  2. Team Explorer 2010
  3. Visual Studio 2010 SP1
  4. Visual Studio 2010 GDR for Team Foundation Service
  5. Visual Studio 2010 Compatibility Update for Windows 8 and Visual Studio 2012
  • Connect using the http://server:port/tfs/ url format for on premise servers
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Visual Studio 2012 on Window 7, 8, 8.1 or 10

Install or repair the following items on your system in the specified order

  1. Visual Studio 2012
  2. Team Explorer 2012
  3. (optional) Visual Studio 2012 update 5
  • Connect using the http://server:port/tfs/ url format for on premise servers
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Visual Studio 2013 on Windows 7, 8, 8.1 or 10

Install or repair the following items on your system in the specified order

  1. Visual Studio 2013
  2. Team Explorer 2013
  3. (optional) Visual Studio 2013 update 5
  • Connect using the http://server:port/tfs/ url format for on premise servers
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Visual Studio 2015 on Windows 7, 8, 8.1 or 10

  1. Visual Studio 2015
  2. Visual Studio 2015 Update 3
  • Connect using the http://server:port/tfs/ url format for on premise servers.
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Visual Studio 2017 on Windows 8.1 or 10

  1. Visual Studio 2017
  • Connect using the http://server:port/tfs/ url format for on premise servers.
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Eclipse on Windows XP, Vista, 7, 8, 8.1 or 10

  1. Eclipse
  2. Team Explorer Everywhere for Team Foundation Server
  • Connect using the http://server:port/tfs/ url format for on premise servers
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

IntelliJ on Windows XP, Vista, 7, 8, 8.1 or 10

  1. IntelliJ IDEA, RubyMine, WebStorm, PhpStorm, PyCharm, AppCode, MPS, Android Studio, 0xDBE or CLion
  2. Visual Studio IntelliJ Plugin
  • Connect using the http://server:port/tfs/ url format for on premise servers.
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Connecting to Team Foundation Server 2010

Visual Basic 6, Visual Studio .NET or Visual Studio 2003 on Windows XP

  1. Install Visual Basic 6, Visual Studio .NET or Visual Studio 2003
  2. Team Explorer 2010
  3. Visual Studio 2010 SP1
  4. Visual Studio 2010  GDR
  5. Microsoft MSSCCI Provider for Visual Studio 2010

Visual Studio 2005 or Business Intelligence Development Studio 2008 on Windows XP, Windows 7, 8, 8.1 or 10

Install or repair the following items on your system in the specified order

  1. Visual Studio 2005
  2. Team Explorer 2005
  3. Visual Studio 2005 SP1
  4. Optional BIDS 2008
  5. (not on XP) Visual Studio 2005 Update for Vista
  6. Visual Studio 2005 SP1 Forward Compatibility update for Team Foundation Server 2010
  • Connect using the http://server:port/tfs/ url format for on premise servers
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Visual Studio 2008  or Business Intelligence Development Studio 2008r2 on Windows XP, Vista, 7, 8, 8.1 or 10

Install or repair the following items on your system in the specified order

  1. Visual Studio 2008
  2. Team Explorer 2008
  3. Visual Studio 2008 SP1
  4. (optional) BIDS 2008r2
  5. Visual Studio 2008 GDR for Team Foundation Service
  • Connect using the http://server:port/tfs/ url format for on premise servers
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Visual Studio 2010 on Windows XP, Vista, 7, 8, 8.1 or 10

Install or repair the following items on your system in the specified order

  1. Visual Studio 2010
  2. Team Explorer 2010
  3. Visual Studio 2010 SP1
  4. Visual Studio 2010 GDR for Team Foundation Service
  • Connect using the http://server:port/tfs/ url format for on premise servers
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Visual Studio 2012 on Window 7, 8, 8.1 or 10

Install or repair the following items on your system in the specified order

  1. Visual Studio 2012
  2. Team Explorer 2012
  3. (Optional) Visual Studio 2012 update 5
  • Connect using the http://server:port/tfs/ url format for on premise servers
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Visual Studio 2013 on Windows 7, 8, 8.1 or 10

Install or repair the following items on your system in the specified order

  1. Visual Studio 2013
  2. Team Explorer 2013
  3. (optional) Visual Studio 2013 update 5
  • Connect using the http://server:port/tfs/ url format for on premise servers
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Visual Studio 2015 on Windows 7, 8, 8.1 or 10

  1. Visual Studio 2015
  2. Visual Studio 2015 Update 3
  • Connect using the http://server:port/tfs/ url format for on premise servers.
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Visual Studio 2017 on Windows 8.1 or 10

  1. Visual Studio 2017
  • Connect using the http://server:port/tfs/ url format for on premise servers.
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Eclipse on Windows XP, Vista, 7, 8, 8.1 or 10

  1. Eclipse
  2. Team Explorer Everywhere for Team Foundation Server
  • Connect using the http://server:port/tfs/ url format for on premise servers
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

IntelliJ on Windows XP, Vista, 7, 8, 8.1 or 10

  1. IntelliJ IDEA, RubyMine, WebStorm, PhpStorm, PyCharm, AppCode, MPS, Android Studio, 0xDBE or CLion
  2. Visual Studio IntelliJ Plugin
  • Connect using the http://server:port/tfs/ url format for on premise servers.
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Configuring the MSSCCI provider for Visual Studio

To use the MSSCCI provider in Visual Studio you must make sure you have the correct Source Control provider selected. In your version of Visual Studio go to Tools, Options, Source Control and select the MSSCCI provider:

Then go to File, Source Control to open a project from source control.

You won't be able to trigger builds or access work items using the version of Visual Studio you are now using. Instead you must start Team Explorer 2010 or higher to interact with these features from Visual Studio.

When you use Visual Studio 2012 or higher to configure your Version Control mappings, you need to make sure you select a "Server Workspace".

Connecting from Visual Studio 2005, 2008 or the MSSCCI provider

To connect to Visual Studio 2010 or higher from an older version of Visual Studio, you need to use a different URI format to add your server. Before Visual Studio 2010 was released, there was no such thing as a Project Collection.

Instead of the now standard format:

On-premise: http[s]://{yourserver}[:{port}]?/tfs/

Team Foundation Service: https://{yourprofile}.visualstudio.com/

You need to add the Project Collection to the URI, so that it becomes:

On-premise: http[s]://{yourserver}[:{port}]/tfs/{ProjectCollection}

Team Foundation Service: https://{yourprofile}.visualstudio.com/

Otherwise you will get the following error message:

TF30335: The server name cannot contain the characters '/' or ':', or start with 'http://' or 'https://'

Xpirit awarded Microsoft Global DevOps Partner of the year 2018

$
0
0
Xpirit awarded Microsoft Global DevOps Partner of the year 2018

Wow! Just wow! Three and a half years ago our company didn't even exist yet. When I joined about 3 years ago our office was a small room on the 2nd floor with 3 desks and we sat on the floor doing our team meets. Shortly after that we achieved our Gold DevOps Partnership and we've grown slowly and steady. We still have a room on the 2nd floor, it looks a lot nicer though. And we have just been awarded the Global Microsoft DevOps Partner of the year award through the shared effort of our complete team.

It's an honour to be part of this team and I wonder what's to come in the future. If you want to know more about how we help people, check out our customer stories. But more importantly, we're still growing. Maybe you are a good fit for our team? Drop us a note, there's always good coffee or a cold beer at our office!

Here's the official press release.

Install Team Foundation Server Power Tools side-by-side

$
0
0
Install Team Foundation Server Power Tools side-by-side

If you're like me, then you probably have more than one version of Visual Studio installed on your system. And you might be connecting to multiple versions of TFS as well. When I orginally write this I had Visual Studio 2010, 2012 and 2013 installed on my laptop and I connect to TFS 2010, 2012, 2013 and Visual Studio Team Services on a regular basis.

I've found that the Visual Studio Power Tools add a lot of valuable tricks to Team Explorer and offer some features on the commandline that you'd otherwise need to build your own custom tools for. However, some of the commands must be executed from the TFS Application Tier and some of the items that are installed are specifically targeting a specific version of TFS.

As long as you install the Power Tools for "all users" on your machine and have installed the matching Team Explorer version (and patches), you can install them side-by-side, except for one feature: the Windows Explorer Extensions.

You can download the Visual Studio TFS Power Tools for your client and/or server version here:

  1. Microsoft Visual Studio 2005 Team Foundation Server Power Tools - September 2007 release
  2. Visual Studio Team System 2008 Team Foundation Server Power Tools - October 2008 Release
  3. Team Foundation Server Power Tools December 2011
  4. Microsoft Visual Studio Team Foundation Server 2012 Power Tools
  5. Microsoft Visual Studio Team Foundation Server 2013 Power Tools
  6. Microsoft Visual Studio Team Foundation Server 2013 Power Tools
  7. Microsoft Team Foundation Version Control Windows Shell Extension

If in doubt which version of the Visual Studio to use or which version of the Visual Studio Developer Command Line to open, have a look at the table below (created based on experience, this table doesn't list what Microsoft does or does not support).

Some features are marked with "Use Matching server version". These need to be used from the same Visual Studio and Power Tools version as your TFS server.

 

Feature Action
Best Practices Analyzer Install on server, match server version [1]
Check-in policies Install for each client version [2]
Process Template Editor Use matching server version [1:1]
Storyboard Shapes Use matching server version [1:2]
Team Explorer Enhancements Install for each client version
- Team Collaboration Tools 2012 and 2013 version won't work with TFS 2010 and below. [1:3]
Team Foundation Power Tool Command Line (tfpt.exe) Install for each client version [1:4]
- addprojectportal Use matching server version
- addprojectreports Use matching server version
- annotate
- bind
- Branches
- Builddefinition Use matching server version
- buildprocesstemplate Use matching server version
- Connections
- Createteamproject Use matching server version
- Getcs
- Online
- Query
- Review
- Scorch
- Searchcs
- Treeclean
- Unshelve
- Uu
- Workitem
Test Attachment Cleaner Use matching server version [3][1:5]
Windows PowerShell Cmdlets Install only highest client version [1:6]
Windows Shell Extensions Install only highest client version
Work Item Templates Install for each client version [1:7]
TFS Backup Plan wizard Install on server, match server version [4]

  1. Not available in 2017 and above. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  2. Integrated into Visual Studio since 2017. ↩︎

  3. Replaced by Test Result Retention settings since TFS 2015 update 1 ↩︎

  4. Integrated into TFS since 2013 update 2. ↩︎


Connect any version of Visual Studio to Visual Studio Team Services or Team Foundation Server.

$
0
0
Connect any version of Visual Studio to Visual Studio Team Services or Team Foundation Server.

Visual Studio has been around for a long time and there are still people developing in Visual Basic 6 or Visual Studio 2008. I sincerely hope these people store their sources securely, because these old IDEs and codebases will be causing them enough headaches. Even if you're using a more recent IDE, you could need one or more hotfixes and/or service packs.

To connect your IDE to Visual Studio Team Services you usually need to make sure you have Team Explorer or an extension to your IDE installed. Team Explorer ships with Visual Studio in recent versions, but in older versions it was a separate installation.

The following variables make up what you need to install in order to be able to connect:

  • Your IDE and version
  • Your operating system and version
  • Whether connecting to VSTS or TFS (and which version)

Note that for many of the items listed below, the order of installation is important. If you've previously installed any of the packages you'll need to uninstall them first or repair all packages in the order listed.

Microsoft has an official Client Compatiblity matrix. In addition to it, this post also lists the required hotfixes to make everything work.

If you also want to install the Team Foundation Server Power tools to match your Visual Studio/TFS version, check out this separate post.

Client compatibility matrix

See download instructions in the Installation section.

Visual Studio 2017

Supported operating system: Windows 10, Windows 8.1

Connects Git TFVC Install instructions
VSTS yes yes yes Team Explorer 2017
TFS 2018 yes yes yes Team Explorer 2017
TFS 2017 yes yes yes Team Explorer 2017
TFS 2015 yes yes yes Team Explorer 2017
TFS 2013 yes no yes Team Explorer 2017
TFS 2012 yes no yes Team Explorer 2017
TFS 2010 yes no yes Team Explorer 2017
TFS 2008 no no no
TFS 2005 no no no

Visual Studio Code

Supported operating system: Windows 10, Windows 8.1, Linux, Mac

Connects Git TFVC Install instructions
VSTS yes yes yes* Visual Studio Team Sevices extension
Team Explorer 2017 or Team Explorer Everywhere
TFS 2018 yes yes yes* Visual Studio Team Sevices extension
Team Explorer 2017 or Team Explorer Everywhere
TFS 2017 yes yes yes* Visual Studio Team Sevices extension
Team Explorer 2017 or Team Explorer Everywhere
TFS 2015 yes yes yes* Visual Studio Team Sevices extension
Team Explorer 2017 or Team Explorer Everywhere
TFS 2013 yes no yes* Visual Studio Team Sevices extension
Team Explorer 2017 or Team Explorer Everywhere
TFS 2012 yes no yes* Visual Studio Team Sevices extension
Team Explorer 2017 or Team Explorer Everywhere
TFS 2010 yes no yes* Visual Studio Team Sevices extension
Team Explorer 2017 or Team Explorer Everywhere
TFS 2008 no no no
TFS 2005 no no no

Jetbrains / IntelliJ

Supported operating system: Windows 10, Windows 8.1, Linux, Mac

Connects Git TFVC Install instructions
VSTS yes yes yes* Visual Studio IntelliJ Plugin
TFS 2018 yes yes yes* Visual Studio IntelliJ Plugin
TFS 2017 yes yes yes* Visual Studio IntelliJ Plugin
TFS 2015 yes yes yes* Visual Studio IntelliJ Plugin
TFS 2013 yes no yes* Visual Studio IntelliJ Plugin
TFS 2012 yes no yes* Visual Studio IntelliJ Plugin
TFS 2010 yes no yes* Visual Studio IntelliJ Plugin
TFS 2008 no no no
TFS 2005 no no no

Eclipse

Supported operating system: Windows 10, Windows 8.1, Linux, Mac

Connects Git TFVC Install instructions
VSTS yes yes* yes* Team Explorer Everywhere
egit
TFS 2018 yes yes* yes* Team Explorer Everywhere
egit
TFS 2017 yes yes* yes* Team Explorer Everywhere
egit
TFS 2015 yes yes* yes* Team Explorer Everywhere
egit
TFS 2013 yes no yes* Team Explorer Everywhere
TFS 2012 yes no yes* Team Explorer Everywhere
TFS 2010 yes no yes* Team Explorer Everywhere
TFS 2008 no no no
TFS 2005 no no no

Visual Studio 2015

Supported operating system: Windows 10, Windows 8.1, Windows 8

Connects Git TFVC Install instructions
VSTS yes yes yes Team Explorer 2015
TFS 2018 yes yes yes Team Explorer 2015
TFS 2017 yes yes yes Team Explorer 2015
TFS 2015 yes yes yes Team Explorer 2015
TFS 2013 yes no yes Team Explorer 2015
TFS 2012 yes no yes Team Explorer 2015
TFS 2010 yes no yes Team Explorer 2015
TFS 2008 no no no
TFS 2005 no no no

Visual Studio 2013

Supported operating system: Windows 10, Windows 8.1, Windows 8, Windows 7, Windows Vista, Windows XP

Connects Git TFVC Install instructions
VSTS yes yes
- Windows 10, 8.1, 8, 7 yes IE11
Team Explorer 2013
TFS 2018 yes yes yes Team Explorer 2013
TFS 2017 yes yes yes Team Explorer 2013
TFS 2015 yes yes yes Team Explorer 2013
TFS 2013 yes no yes Team Explorer 2013
TFS 2012 yes no yes Team Explorer 2013
TFS 2010 yes no yes Team Explorer 2013
TFS 2008 no no no
TFS 2005 no no no

Visual Studio 2012

Supported operating system: Windows 10, Windows 8.1, Windows 8, Windows 7, Windows Vista, Windows XP

Connects Git TFVC Install instructions
VSTS yes* yes
- Windows 10, 8.1, 8, 7 yes IE11
Team Explorer 2012
Visual Studio Tools for Git
TFS 2018 yes yes* yes Team Explorer 2012
Visual Studio Tools for Git
TFS 2017 yes yes* yes Team Explorer 2012
Visual Studio Tools for Git
TFS 2015 yes yes* yes Team Explorer 2012
Visual Studio Tools for Git
TFS 2013 yes no yes Team Explorer 2012
TFS 2012 yes no yes Team Explorer 2012
TFS 2010 yes no yes Team Explorer 2012
TFS 2008 no no no
TFS 2005 no no no

Visual Studio 2010

Supported operating system: Windows 10, Windows 8.1, Windows 8, Windows 7, Windows Vista, Windows XP

Connects Git TFVC Install instructions
VSTS no yes
- Windows 10, 8.1, 8, 7 yes IE11
Team Explorer 2010
TFS 2018 yes no yes Team Explorer 2010
TFS 2017 yes no yes Team Explorer 2010
TFS 2015 yes no yes Team Explorer 2010
TFS 2013 yes no yes Team Explorer 2010
TFS 2012 yes no yes Team Explorer 2010
TFS 2010 yes no yes Team Explorer 2010
TFS 2008 yes no yes Team Explorer 2010
TFS 2005 yes no yes Team Explorer 2010

Visual Studio 2008

Supported operating system: Windows 10, Windows 8.1, Windows 8, Windows 7, Windows Vista, Windows XP

Connects Git TFVC Additional requiremenrs
VSTS no yes*
- Windows 10, 8.1, 8, 7 yes IE11
Team Explorer 2013
+ MSSCCI
TFS 2018 yes no yes*
- Windows 10, 8.1, 8, 7, Vista yes Team Explorer 2013
+ MSSCCI
TFS 2017 yes no yes*
- Windows 10, 8.1, 8, 7, Vista yes Team Explorer 2013
+ MSSCCI
- Windows XP yes Team Explorer 2010
+ MSSCCI
TFS 2015 yes no yes*
- Windows 10, 8.1, 8, 7, Vista yes Team Explorer 2013
+ MSSCCI
- Windows XP yes Team Explorer 2010
+ MSSCCI
TFS 2013 yes no yes*
- Windows 10, 8.1, 8, 7, Vista yes Team Explorer 2013
+ MSSCCI
- Windows XP yes Team Explorer 2010
+ MSSCCI
TFS 2012 yes no yes Team Explorer 2008
TFS 2010 yes no yes Team Explorer 2008
TFS 2008 yes no yes Team Explorer 2008
TFS 2005 yes no yes Team Explorer 2008

Visual Studio 2005

Supported operating system: Windows 10, Windows 8.1, Windows 8, Windows 7, Windows Vista, Windows XP

Connects Git TFVC Additional requiremenrs
VSTS no yes*
- Windows 10, 8.1, 8, 7 yes IE11
Team Explorer 2012
+ MSSCCI
TFS 2018 yes no yes*
- Windows 10, 8.1, 8, 7, Vista yes Team Explorer 2012
+ MSSCCI
- Windows XP yes Team Explorer 2010
+ MSSCCI
TFS 2017 yes no yes*
- Windows 10, 8.1, 8, 7, Vista yes Team Explorer 2012
+ MSSCCI
- Windows XP yes Team Explorer 2010
+ MSSCCI
TFS 2015 yes no yes*
- Windows 10, 8.1, 8, 7, Vista yes Team Explorer 2012
+ MSSCCI
- Windows XP yes Team Explorer 2010
+ MSSCCI
TFS 2013 yes no yes*
- Windows 10, 8.1, 8, 7, Vista yes Team Explorer 2012
+ MSSCCI
- Windows XP yes Team Explorer 2010
+ MSSCCI
TFS 2012 yes no yes*
- Windows 10, 8.1, 8, 7, Vista yes Team Explorer 2012
+ MSSCCI
- Windows XP yes Team Explorer 2010
+ MSSCCI
TFS 2010 yes no yes Team Explorer 2005
TFS 2008 yes no yes Team Explorer 2005
TFS 2005 yes no yes Team Explorer 2005

Visual Studio 2003, .NET, 6

Supported operating system: Windows XP

Connects Git TFVC Additional requiremenrs
VSTS no no no
TFS 2017 yes no yes* Team Explorer 2010
+ MSSCCI
TFS 2015 yes no yes* Team Explorer 2010
+ MSSCCI
TFS 2013 yes no yes* Team Explorer 2010
+ MSSCCI
TFS 2012 yes no yes* Team Explorer 2010
+ MSSCCI
TFS 2010 yes no yes* Team Explorer 2010
+ MSSCCI
TFS 2008 yes no yes* Team Explorer 2010
+ MSSCCI
TFS 2005 yes no yes* Team Explorer 2010
+ MSSCCI

Installation

Code

Eclipse

JetBrains / IntelliJ

Team Explorer 2017

Team Explorer 2015

Team Explorer 2013

Install (or repair) in the following order:

Team Explorer 2012 + Visual Studio Tools for Git

Install (or repair) in the following order:

Team Explorer 2010

Install (or repair) in the following order:

Team Explorer 2013 + MSSCCI 2013

Install (or repair) in the following order:

Notes:

  • Do not use the Team Explorer tab or the Team sub menu to connect to TFS, instead use File, Source Control.
  • Connect using the http://server:port/tfs/ProjectCollection url format for Team Foundation Server.
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Team Explorer 2012 + MSSCCI 2012

Install (or repair) in the following order:

Notes:

  • Do not use the Team Explorer tab or the Team sub menu to connect to TFS, instead use File, Source Control.
  • Connect using the http://server:port/tfs/ProjectCollection url format for Team Foundation Server.
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Team Explorer 2010 + MSSCCI 2010

Install (or repair) in the following order:

Notes:

  • Do not use the Team Explorer tab or the Team sub menu to connect to TFS, instead use File, Source Control.
  • Connect using the http://server:port/tfs/ProjectCollection url format for Team Foundation Server.
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Team Explorer 2008

Install (or repair) in the following order:

Notes:

  • Connect using the http://server:port/tfs/ProjectCollection url format for Team Foundation Server.
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Team Explorer 2005

Install (or repair) in the following order:

Notes:

  • Connect using the http://server:port/tfs/ProjectCollection url format for Team Foundation Server.
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Team Explorer 2008 + MSSCCI

Install (or repair) in the following order:

Notes:

  • Do not use the Team Explorer tab or the Team sub menu to connect to TFS, instead use File, Source Control.
  • Connect using the http://server:port/tfs/ProjectCollection url format for Team Foundation Server.
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Team Explorer 2005 + MSSCCI 2005

Install (or repair) in the following order:

Notes:

  • Do not use the Team Explorer tab or the Team sub menu to connect to TFS, instead use File, Source Control.
  • Connect using the http://server:port/tfs/ProjectCollection url format for Team Foundation Server.
  • Connect using the https://[account].visualstudio.com/ url format for Visual Studio Team Services.

Configuration

Configuring the MSSCCI provider for Visual Studio

To use the MSSCCI provider in Visual Studio you must make sure you have the correct
Source Control provider selected. In your version of Visual Studio go to Tools,
Options, Source Control and select the MSSCCI provider:

Connect any version of Visual Studio to Visual Studio Team Services or Team Foundation Server.
Select the Team Foundation Server MSSCCI Provider

Then go to File, Source Control to open a project from source control.

You won't be able to trigger builds or access work items using the version of Visual
Studio you are now using. Instead you must start Team Explorer 2010 or higher to
interact with these features from Visual Studio.

When you use Visual Studio 2012 or higher to configure your Version Control mappings, you need to make sure you select a "Server Workspace".

Connect any version of Visual Studio to Visual Studio Team Services or Team Foundation Server.
Change workspace location to Server.

Picture used under Ceative Commons. Thanks to XKCD.

Use Mob Programing to maximize your learning

$
0
0
Use Mob Programing to maximize your learning

In every Scrum.org Professional Scrum Development class we touch upon both technical and collaboration practices to help improve the development teams explore new options. In a recent class we had two teams that, after two sprints, hadn't been able to deliver any "Done" increment to show at the Sprint Review. They were plagued by all kinds of issues, merge conflicts, refactoring gone bad, lack of automated tests and everything else that happens in real life. I decided to introduce Mob Programming to see whether that could help them.

The first experience with Mob Programming is usually total chaos and I tried to prepare the team accordingly. Trying out any new technique, anything that's out of your comfort zone, can result in initial chaos, it requires a bit of courage to move onward. For those of you that don't have any idea what Mob Programming is, I recommend reading our recent article in XPRT magazine which gives an overview of it or watching a recent recording of Woody Zuill's presentation:

The first attempt of these teams didn't feel successful to them. In a retrospective setting we dug a little into the issues that they encountered. It's good to know that these people had already been working together for a longer period of time, some of the issues that surfaced were pretty surprising.

  1. Disagreement on which coding style/standards to follow. Up to the point where one of the developers said: "I wanted to be the next person to take the driver seat, first thing I would have done was to remove all the code from the previous person". That's pretty harsh!
  2. They didn't like getting immediate feedback from team members. Normally they would request a code review when the work was done. That review would only critique the current end-state. Not how you got there, which decisions you had taken along the way, what "stupid" alternatives you'd tried. When working behind the same screen with the whole team, everyone sees it, and many people have an opinion about it. Pair Programming works similarly, but then with 4 eyes on the code. With Mob Programming the number of eyes multiplies and so does the feedback.
  3. It felt in-productive to the people not doing the coding. They hadn't figured out how to be most effective in helping to solve the problem at hand while not directly being able to change the code.

We introduced the Mob Programming Role Playing Game roles to the teams, just the role cards, not the whole game. And had them talk about each role end whether some of these contained contributions they could have made to the development process. This led to an interesting discussion and the desire to try anew.

Use Mob Programing to maximize your learning
Roles in the Mob Programming RPG. Game icons CC-BY their respective authors. CC-BY-SA-NC 2015 Willem Larsen

The second time the teams took on a sprint, they were finally successful. Not only did they try Mob Programming, but they decided to approach this sprint Test Driven as well. It was the first time they were able to live up to their self-imposed Definition of "Done" and they had a lot of fun doing it.

The team identified a number of positive things about the whole experience they hadn't imagined before we started:

  1. Because the entire team was working on the same code at the same time, no time (zero seconds) was spent on merging code.
  2. The team had exchanged a long list of tips, tricks, keyboard shortcuts, alternative approaches to coding etc. Everyone felt they had not only delivered code, but learned from each other wile doing it.
  3. Every team member felt comfortable having to maintain the code or having to do an emergency bugfix in the middle of the night. Partially due to the unit tests providing a safety net and automatically validated documentation, but also because they had been part of the creation of the code. Truly working together greatly improved the sense of shared ownership.
  4. There was very little time spent on "overhead", coordination, meeting, status sharing. The teams still practiced their daily scrum, but the focus shifted from "what we've done and what's blocking us" to the impact in the goal and higher level concerns. Not one developer felt the need to explain exactly what they did and why. So the time-box got a lot shorter, but the value went up considerably.

The final conclusion of the team: They'd probably be 6 times more productive, but would all be dead tired by lunchtime. Not bad actually for one and a half hours of really trying to collaborate.

Have you tried Pair Programming or even Mob Programming? I'd love to hear your thoughts, frustrations and successes.

This blog is based on a excerpt of the article I wrote together with Martijn van der Sijde. You can read the whole article as well as other interesting articles in XPRT Magazine #6.

Use Mob Programing to maximize your learning
Available as digital download as well as a printed version.

Image source: The Godfather I

Global DevOps Bootcamp 2018 recap

$
0
0
Global DevOps Bootcamp 2018 recap

Today was the day of the Global DevOps Bootcamp. And it was a blast. Last evening Central European Time the first teams started their learning journey towards DevOps in New Zealand and Australia and the #gdbc traveled like a wave across the globe.

Global DevOps Bootcamp 2018 recap
Buck Hodges introducing the Global DevOps bootcamp and explaining the journey of the @vsts team.

We started out with an introduction by Buck Hodges, explaining that for many DevOps is a journey and that it takes a while to accelerate. I love how the Visual Studio Team Services team can be so open and transparent about their challenges and learning along the way. I've personally learned so much from reading their post-mortems.

Our very own Marcel de Vries took over taking the directions from Buck and turning it into a roadmap for the participants. The Global Devops Bootcamp has challenges for many of the issues that Buck referred to which will allowed the participants to experience these hands-on.

Global DevOps Bootcamp 2018 recap
Marcel explaining each challenge and providing guiding directions.

In our venue we had quite a few participants and many didn't yet know each other. Organizing random groups into teams is something we encounter a lot when delivering scrum training, so we let Self-Organisation perform its magic. While it may feel a bit chaotic, it yields quick results and gives people a chance to self-select who they want to learn from.

With the teams assembled people got serious. Builds to succeed, releases to release, monitoring to arrange and especially a lot of things to learning!

Global DevOps Bootcamp 2018 recap
Collaboration happened almost instantly. It's amazing what a common goal and a good backlog can accomplish!

Some wonderful observations:

  • Since the primary reason for the event is learning, people are collaborating a lot. Working together behind a single machine and putting their common goal above individual accomplishments. It helps the teams launch so much more quickly and they're accomplishing so much more together!
  • Since each venue is virtually competing with other venues, we had the best team help out the one that were going a bit slower. The "system" somehow automatically became more important than the individual team or their team members.
  • With enough mixed skills in the room, no challenge seems to hard. While teams could request help or even a step-by-step guide, very few did. They didn't need to :D.
Global DevOps Bootcamp 2018 recap
Sharing is caring, truly earning the learning

Knowledge sharing is an important part of any tech culture, during the mid-sprint review tips and tricks were exchanged, accomplishments shared and it was interesting to see that different teams had come to different solutions for the same problems. This just goes to show that there may be multiple roads that lead to Rome.

Global DevOps Bootcamp 2018 recap
When things break, help is always nearby! Please... please... please... may the next build succeed ;).

As with any event, not everything went 100% right, I think we learned a lot as organizers as well and while the participants may not have really noticed it, our own build servers have been churning too, pushing out updates to the leader board and the help-system in the background.

Global DevOps Bootcamp 2018 recap
Global DevOps Bootcamp 2018 recap
Global DevOps Bootcamp 2018 recap
Red-alert! DevOps in progress!

Organizers kept in touch over a busy slack channel in the background where tips and tricks, tricks and workarounds were shared whenever an issue was encountered.

Tips shared between venues

Of course waiting for the build to complete allows you to learn some wonderful skills, we have limited hosted agents available, so the build and release times were quickly raising.

Global DevOps Bootcamp 2018 recap
Source: xkcd compiling (https://xkcd.com/303/)

Empowered teams can solve this themselves, also in real-life. It's wonderful when you can provision your own agents, (temporary) test environments and request the extensions you need. You can clearly see that some of us have lived in organisations where that wasn't possible. Where else will you learn how to make shadow puppets?

Shadow puppetry talents. A skill learned while waiting for builds to complete and machines to provision themselves.

Thanks to René, Marcel, Rob, Geert, Kees, Sander, Mathias, Brian, Buck, Peter, Microsoft, Walls.io, Xebia, Solidify, DuoMyth, Xpirit the League of Extraordinary Devops Cloud Advocates and all of the MVP's world wide contributing to the this great event.

Global DevOps Bootcamp 2018 recap
Thank you!

It's almost time for the final demonstrations and then time for a glass of wine or beer and a small snack.

Global DevOps Bootcamp 2018 recap
Final presentations

And time for the United States to wake up to start their journey and another 8 hours before Vancouver and Seattle have the honer to finish this wonderful wave!

Global DevOps Bootcamp 2018 recap

Cheers!

Global DevOps Bootcamp 2018 recap
Team Xpirit Hilversum

We hope to see you all next year! And if you've missed it, the labs will be available shortly for yourself to try in your own time.

Like what you see on Windows Spotlight? Save it!

$
0
0
Like what you see on Windows Spotlight? Save it!

Have you turned on Windows Spotlight in Windows 10? It's a new Lockscreen background every few days and so far I've been enjoying the pictures tremendously.

If you haven't tried Spotlight before, try turning it on:

Like what you see on Windows Spotlight? Save it!

In Windows 10 (1511) open the settings panel and navigate to Personalization and then Lock screen. Select Windows spotlight in the dropdown for Background. Scroll all the way down and hit Apply.

Then you either install this Windows app which allows you to save the current lock screen image to your pictures library.
Like what you see on Windows Spotlight? Save it!

Or you open up the folder which contains all images and pick the ones you like:

Now, whenever you see a picture you love, unlock your machine, hit [win]+r on your keyboard and paste the following location:


%userprofile%\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets

This will open up a folder with a bunch of files, each with a random file name. One of these files is your current lockscreen background. What I generally do is that I type cmd in the location bar of explorer en hit enter, this opens a commandline prompt in the current folder.

Then copy all the files to a temporary location and then rename them to *.jpg in one go:


C:\Users\me\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets> copy *.* c:\temp\Images\*.jpg

And then you can navigate to that folder, check the image preview in explorer and pick the backgrounds you like. Of most backgrounds you'll find both a portrait and a landscape version.

Like what you see on Windows Spotlight? Save it!

Force uninstall Visual Studio 2017 Release candidates

$
0
0

If you, like me, are stuck trying to upgrade Visual Studio 2017, then you may only get unblocked by removing everything and starting afresh. Since Visual Studio 2017 is still in Release Candidate and not final, this is something we may have to deal with from time to time.

But when the "uninstall" button in the ui fails, you may end up stuck. In that case, you'll be happy to find:


C:\Program Files (x86)\Microsoft Visual Studio\Installer\resources\app\layout\installcleanup.exe

Which will perform the same actions as the good old "vssetup.exe /uninstall /force". If that doesn't get you unstuck, there is an even more forceful way:

Delete everything under:

  • C:\ProgramData\Microsoft\VisualStudio\15.0
  • C:\ProgramData\Microsoft\VisualStudio\Packages
  • %appdata%\Microsoft\VisualStudio\15.0*
  • %appdata%\Microsoft\VisualStudio\Packages
  • C:\Program Files (x86)\Microsoft Visual Studio\2017
  • HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\15.0*
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\15.0*

TFS 2018 update 1 is available. So is the TFS Aggregator

$
0
0

Brian Harry just announced the Release to Web of Team Foundation Server 2018 update 1. With mostly bug fixes and a few very small functional features. Luckily it shipped with no breaking changes in the server object model, so we were able to quickly ship a compatible version of the TFS Aggregator.

We had updated our solution structure and build process to make it easier to support multiple TFS versions. The TFS Aggregator solution now supports the following TFS versions:

  • Team Foundation Server 2013 update 5
  • Team Foundation Server 2015
  • Team Foundation Server 2015 update 1
  • Team Foundation Server 2015 update 2
  • Team Foundation Server 2015 update 3
  • Team Foundation Server 2017 and update 1
  • Team Foundation Server 2017 update 2 and update 3
  • Team Foundation Server 2018 and update 1

All from a single solution. To support this we've upgraded to Visual Studio 2017 15.5. Its support for packageReferences in the project files allows us to dynamically switch between Nuget packages and to switch between different versions of the same NuGet packages. This greatly simplifies building a single codebase against a large number of dependent package versions.

You can find Beta 4 of the TFS Aggregator on the GitHub releases page.

Migrate from Blogger to Ghost

$
0
0
Migrate from Blogger to Ghost

My long time readers may have seen a huge number of changes to the look and feel of my blog recently. After so many years on Blogger I finally took the plunge and moved to a new platform, a new domain, a new comment system and a new look. Say "hi" to Ghost!

My old blog has served me for a long time and the Blogger platform was relatively simple, free and it has always "just worked", mostly.

Migrate from Blogger to Ghost
The old blog looked a bit dated.

There were a few issues with the old blog as well, the library I used for Code Formatting was a major version behind, the theme and layout engine was very hard to tame, I let my tags become a mess over the years and many of my page urls were far from Search Engine friendly.

While digging into my options I created a list of desirements:

  • I must be able to clean up my tags
  • I want to move to a new domain name
  • I want to be able to clean up my page urls
  • I want to replace the code formatting library
  • I want to consolidate a few pages into one
  • I want to keep my SEO ranking
  • I'm willing to pay a bit of money to get what I want
  • I need to keep the old RSS/ATOM feed urls for aggregators
  • I wanted to keep the old comments on my old posts
  • I needed to take my blog images from blogger to the new platform

I wanted my migration to support for most of those things. Initially I tried Hugo and Jekyll. But the whole Python|Ruby|Node on Windows is still just a mess. The migration tools wouldn't work and relied on the old ATOM+RSS feed from Blogger which was ham-stringed by Google over time. The migration tools were all written in languages I do not master fully.

We're using Wordpress at Xpirit to host our website and I always get lost in all the control panel options, fields and tabs.

Then I found Ghost Pro. The hosted version of Ghost. It's simple, looks great and offered a powerful import/export module which gives full control over the content you're bringing into the platform. There was even an existing Import/Export tool for Blogger. So I decided to give it a try.

Trying out Ghost

First thing I did was setup a trial account and playing around. I manually copied over a few blog posts, and tried out a few things to see if I could get my Google+ comments to move over, add it to Google analytics and such. I didn't bump into any major issues. Then I exported my test site to analyze the structure of the export file to weigh my options.

Trial Migration

Next step was to try the existing Migration tool which was written in Node. A very, very old version of Node. Unfortunately I couldn't get the migration tool to play nice and while it did migrate over some of the content, it butchered most of it. So I took a brave step... I decided to build my own migration tool: Blogger2Ghost.NET. Written in C#, my most comfortable language. This step of course took a bit of time, but it also gave me full control over the migration process.

Getting the data out

The first thing I needed for the migration was a reliable method to get my data out. Step one was to get the RAW page contents. Luckily Blogger has added a "Export Data" option which gives you a file with the full XML contents of the blog as well as a XSD schema which describes the data. This provided a great place to start. The next step was to parse all the HTML content to grab the Image URLs, which - with the help of the HTML Agility Pack, was a breeze as well. I created a simple command line tool to host the migration.

blogger2ghost images -i bloggerbackup.xml -o .\migration

This parses the blogger backup file and finds all the image urls. Then downloads them to a single images subfolder.

At this stage I found out that I had quite a few broken image links in old blog posts. The migration tools provides a list of broken images, but of course these will have to be fixed manually.

Later I found out that the <img> tag for a blogger hosted image links to a thumbnailed version of the image. A bit of extra code also grabs the larger image which can be found in the enclosing <a> tag.

Mapping things

Of course Blogger and Ghost don't use the exact same file format and I also wanted to clean up a few things. This meant generating a number of mapping files:

  • Image mappings. Based on the previously downloaded images it contains a list of all the original blogger image urls and the relative url to the Ghost blog root.
  • Url mappings. It contains a list of all the urls on blogger and their target slug on Ghost. This will later be used to change post urls, consolidate pages and a few other things.
  • User mappings. In order to map the Blogger author(s) to Ghost users.
  • Tag mappings. Blogger has a fewer restrictions on tags, so in order to import the blog I had to rename a few. I also use this file to delete and consolidate some tags.

The skeleton for these mapping files can easily be generated based on the Blogger export, so I built a feature in the migration tool to do this:

blogger2ghost mapping -i bloggerbackup.xml -o .\migration --all

After running it you'll find a number of mapping files in the migration folder which will need to be edited by hand:

In the authors.json add your to_email and slug. If your admin user is blog author (which is the case for me), make sure the data matches the existing user data. Other users will be created on import.

[
  {
    "id": "1",
    "name": "Jesse Houwing",
    "from_google_plus_url": "https://plus.google.com/108560985897799710937",
    "to_email": "jesse.houwing@gmail.com",
    "slug": "jesse-houwing"
  }
]

In the tags.json you'll be able to set the target slug and consolidate the tags in blogger through the blogger_tag list. You'll need to duplicate that to aliases unfortunately due to some incomplete refactoring.

[
  {
    "blogger_tag": [
      "Agile",
      "agile olympics"
    ],
    "slug": "agile",
    "name": "Agile",
    "description": null,
    "order": 1,
    "aliases": [
      "Agile",
      "agile olympics"
    ],
    "child_tags": [
      {
        "blogger_tag": [
          "Teams"
        ],
        "slug": "teams",
        "name": "Agile teams",
        "description": null,
        "order": 2,
        "aliases": [
          "Teams"
        ],
        "child_tags": []
      }
    ]
  }
]  

To remove a tag completely, simply remove it from the tags.json. To influence the order in which tags are assigned, change the value of order. Higher numbers will be assigned to posts first on import.

Ghost supports parent/child tags on import, though I haven't found a reliable way to change this later.

The urls.json file is used to map the blogger urls to their new location on Ghost. This file is also used to fix internal links between pages on your blog (Blogger by default always uses absolute urls for everything.

[
  {
    "from_url": "http://blog.jessehouwing.nl/2013/10/connecting-to-tfs-from-any-version-of.html",
    "to_url": "vsts-tfs-connect-any-visual-studio-version"
  }
]

The final mapping file is not generated as part of the preparation stage but is generated as part of the conversion. I'll discuss the redirects.json later.

Resizing images

If you want to make sure your images are similar in size or smaller than a certain dimension, this is the right time to do that. I did not build this as a feature of the migration tool, but it's pretty straightforward to use an image editing tool to resize your images on disk. There are even a number of free bulk-comversion tools available.

I used Adobe Photoshop's batch processing feature to reduce the size of my images. Just save the images in-place and they'll be the ones that are imported into Ghost.

Generating your Ghost import

When you've edited all of the mapping files, it's time for your first trial migration. Run the convert command to generate a ghost.json and then package that together with all of the images into a single zip file

If you want to keep your Google+ comments copy post.hbs to custom-blogger.hbs and add --template blogger to the command below.
blogger2ghost convert -i bloggerbackup.xml -o .\migration --zip --markdown

The convert command may find a few issues (such as misspelled tags, missing authors, etc) so you may need to go back to fix your mapping files. Once it generates a zip file successfully it's time to import it into Ghost to see what it looks like.

Migrate from Blogger to Ghost
Import the ghost.zip using the Import Content option

It took me a few rounds and a couple of manual tweaks to get to a reasonable result. There are still a few things that get lost in the migration though. I decided to fix these after the migration.

Setting up your redirects

The convert command also spits out a redirects.json which can be loaded into Ghost to make sure all of your old urls are still working. It will include:

  • All of your manually mapped urls from urls.json
  • Map your Atom and RSS feed urls to the correct Ghost endpoints
  • Map your Tags to the original Tag search urls

You can manually tweak the file to add more redirects. I personally added the following to redirect all the old /year/ and /year/month/ urls to the root as well as catch requests for index.html.

  {
    "from": "\\/\\d{4}\\/?(\\d{2}\\/?)?$",
    "to": "/",
    "permanent": true
  },
  {
    "from": "\\/index\\.html$",
    "to": "/",
    "permanent": true
  }

Finally, import the redirects.json using the Redirects feature which can also be found under Labs in Ghost:

Migrate from Blogger to Ghost
Import redirects.json using the Redirects feature

Spot check to complete

I finally clicked through the most visited pages of my blog (the Blogger Stats page comes in handy) and had to correct a few issues.

Migrate from Blogger to Ghost
The Blogger stats page will give you a good overview of important pages to check

Things that didn't migrate over well were:

In future blogs I'll walk through the other things I did:

  • Migrate your domain to Ghost and setup redirects using Cloudflare
  • Setup Disqus
  • Integrate Google Analytics & Fix Search Console issues
  • Integrate the Google+ comments from Blogger (link)
  • Using VSTS Build to publish my customized default Casper theme (link)
  • Integrate Google Custom Search (link)


Continuous Delivery of customized Ghost themes using VSTS

$
0
0
Continuous Delivery of customized Ghost themes using VSTS

In order to migrate my Ghost blog I needed to customize the default theme to support some of the features I'm relying on:

  • Disqus comments
  • Google Analytics
  • Integrating Google+ comments in old blog posts

In the mean time Ghost is working on their new Koenig editor, causing a steady stream of small changes to the default Casper theme. To be able to quickly integrate updates without too much fuss I'm maintaining a forked version of the Casper theme containing all my changes.

This raises two questions:

  1. How do I integrate the changes from the main Casper repo without overwriting my own changes.
  2. How do I deploy my changes from GitHub to my blog without hassle.

Integrating changes from the main Casper Theme

I created my own fork of the Casper theme by forking the main repository to my own GitHub account. In that repo I've created a new branch called Customized. This is where I keep all my own changes. After cloning the repository I added the original repo as a remote:

git remote add ghost https://github.com/TryGhost/Casper.git

This will allow me to pull in changes to my own repository using

git checkout master
git pull ghost master

And then integrate these changes to my customized version:

git checkout customized
git merge master -m "Updating to Casper-2.3.3"

And then resolving the conflicts, testing on a local Ghost Development instance and pushing back to GitHub.

Deploy Ghost theme using VSTS

The next step is to get these changes from GitHub back to Ghost. I'm using Visual Studio Team Services to automate this workflow. The steps were pretty straight forward:

  1. Link VSTS to GitHub.
  2. Install the Ghost extension from the marketplace.
  3. Setup a CI pipeline to push the changes from GitHub to Ghost.

The Ghost extension for VSTS is still a bit rough around the edges, but the developer is quickly responding to feedback, removing my initial issues with the task. It's now very fast and does what it needs to do.

Next step is to create a new Build Definition in Visual Studio Team service and to link it to your GitHub account. Make sure you select the customized branch, as this is going to be the version of the theme we want to publish.

Continuous Delivery of customized Ghost themes using VSTS
Create a Build Definition and link it to the GitHub repository.

Depending on the level of customization, you may need to build the theme. In my case I haven't ventured that deep into customization yet, so it suffices to just zip up the archive:

Continuous Delivery of customized Ghost themes using VSTS
Zip up the theme in order to prepare it for publishing

The final required step is to let the Ghost Task publish the theme to your Ghost instance. I found out that the name of the theme is important, as Ghost may decide to create a new theme or overwrite the existing one depending on the name.

Continuous Delivery of customized Ghost themes using VSTS

Click the Manage link next to Blog connection to create a new Generic Credential:

Continuous Delivery of customized Ghost themes using VSTS
Add a generic credential with your Ghost url and admin credentials.

While debugging you may want to use the Take Screenshots option to see what the Ghost extension is up to. It relies on controlling a browser instance to upload the theme. Because of this, your Agent must also run interactive, luckily the VSTS Hosted Agents all run interactive, so selecting the Hosted Visual Studio 2017 agent will satisfy that requirement. The Hosted Agent also has Chrome installed and the Ghost task should detect it automatically, meaning you won't have to download Chromium.

Continuous Delivery of customized Ghost themes using VSTS
Use the Hosted VS2017 agents to satisfy the requirement for interactive agents.
Continuous Delivery of customized Ghost themes using VSTS
If Chromium isn't detected automatically, add the chromium.bin variable and point it to chrome.exe.

That's all! Queue your build, if needed analyze the logs and the screenshots, but if all was well your theme should now be versioned in GitHub and auto-deploy through Visual Studio Team Services!

Continuous Delivery of customized Ghost themes using VSTS
The Ghost task in action.

Are you using Ghost to blog? Is your customized Theme easy to upgrade whenever Ghost releases a new version? If not, there really is no excuse :).

Use Visual Studio 2017 as merge tool in Tower

$
0
0
Use Visual Studio 2017 as merge tool in Tower

I recently started using Tower as my Git client in Windows, it's great in many aspects, but it doesn't ship with any Diff/Merge capabilities. It relies on 3rd party tool to supply that feature. It comes with a long list of supported tools, but my two default editors aren't part of that list. Visual Studio and Visual Studio Code.

To enable Visual Studio 2017 in Tower all you need to do is put the following file here: %LOCALAPPDATA%\fournova\Tower\Settings\CompareTools\vs2017.json:

{
  "DisplayName":           "Visual Studio 2017",
  "MinimumVersion":        "",
  "SupportsDiffChangeset": true,
  "SupportsDirectoryDiff": false,
  "DiffToolArguments":     "\"$LOCAL\" $REMOTE /t",
  "MergeToolArguments":    "\"$REMOTE\" \"$LOCAL\" \"$BASE\" \"$MERGED\" /m",
  "ApplicationRegistryIdentifiers": [
  ],
  "ApplicationPaths": [
      "%ProgramFiles(x86)%\\Microsoft Visual Studio\\Preview\\Enterprise\\Common7\\IDE\\CommonExtensions\\Microsoft\\TeamFoundation\\Team Explorer\\vsDiffMerge.exe",
      "%ProgramFiles(x86)%\\Microsoft Visual Studio\\Preview\\Professional\\Common7\\IDE\\CommonExtensions\\Microsoft\\TeamFoundation\\Team Explorer\\vsDiffMerge.exe",
      "%ProgramFiles(x86)%\\Microsoft Visual Studio\\Preview\\Community\\Common7\\IDE\\CommonExtensions\\Microsoft\\TeamFoundation\\Team Explorer\\vsDiffMerge.exe",  
      "%ProgramFiles(x86)%\\Microsoft Visual Studio\\Preview\\TeamExplorer\\Common7\\IDE\\CommonExtensions\\Microsoft\\TeamFoundation\\Team Explorer\\vsDiffMerge.exe",  
      "%ProgramFiles(x86)%\\Microsoft Visual Studio\\2017\\Enterprise\\Common7\\IDE\\CommonExtensions\\Microsoft\\TeamFoundation\\Team Explorer\\vsDiffMerge.exe",
      "%ProgramFiles(x86)%\\Microsoft Visual Studio\\2017\\Professional\\Common7\\IDE\\CommonExtensions\\Microsoft\\TeamFoundation\\Team Explorer\\vsDiffMerge.exe",
      "%ProgramFiles(x86)%\\Microsoft Visual Studio\\2017\\Community\\Common7\\IDE\\CommonExtensions\\Microsoft\\TeamFoundation\\Team Explorer\\vsDiffMerge.exe",
      "%ProgramFiles(x86)%\\Microsoft Visual Studio\\2017\\TeamExplorer\\Common7\\IDE\\CommonExtensions\\Microsoft\\TeamFoundation\\Team Explorer\\vsDiffMerge.exe"
  ]
}

It should automatically detect the Enterprise, Professional or Community Edition of Visual Studio 2017 and 2017 Preview, or the stand-alone installation of Team Explorer.

Make sure you update your preferences in Tower to select it (you need to restart Tower to detect your custom merge tool changes):

Use Visual Studio 2017 as merge tool in Tower
Select Visual Studio 2017 as your Diff and Merge tool.

Due to changes in how Microsoft stores the Installation Path it's not easy to grab this from the registry, so if you're not using the default installation path, you may need to update the search paths above.

Photo Credits: Phil Dolby.

Show Google+ comments from Blogger in Ghost

$
0
0
Show Google+ comments from Blogger in Ghost

You may have already read about the migration of  my blog from Blogger to Ghost. I left out a few things in there to be addressed later:

In this post I'll explain how I've added my old Google+ comments from blogger to the pages that were migrated to Ghost.

Blogger has two types of comment systems. The first one is part of Blogger itself and the second one was introduced with Google+. Disqus can import the old comments, but it doesn't handle the Google+ comments. I haven't found a way to import those (that would be ideal), but I did find an easy way to show them on pages other than Blogger.

To show the old comments you need three things:

  1. The original url of the post on blogger
  2. A bit of Javascript
  3. A custom ghost template

Original post url

My Blogger2Ghost.NET migration tool will automatically store the original post url in the code injection section of each migrated blog post:

Show Google+ comments from Blogger in Ghost
The original post url will automatically be added to your posts when using Blogger2Ghost.NET

If you've migrated in a different way it's pretty easy to setup yourself:

<script>var bloggerUrl="http://blog.jessehouwing.nl/2018/04/crafting-complex-release-gate.html";</script>

A bit of JavaScript

The second bit is a bit harder. In order to show the blogger comments you'll need to inject a small snippet of JavaScript in your page template. The script you'll need is the following:

<section class="post-full-comments">
    <script src="https://apis.google.com/js/plusone.js"></script>
    <a name="comments"></a>
    <div id="comments"></div>
    <script>
        if (bloggerUrl){
            gapi.comments.render('comments', {
                href: bloggerUrl,
                width: '624',
                first_party_property: 'BLOGGER',
                view_type: 'FILTERED_POSTMOD'
            });
        }
    </script>
</section>

Source: https://floaternet.com/gcomments

You can see the script above checks the existence of the bloggerUrl variable, if it finds it it will try to load the Google+ comments passing in the original location.

Custom Ghost template

I've added a custom-blogger.hbs file to my Ghost theme, it's a copy of the standard post.hbs with the above mentioned script injected into it. If you haven't customized your theme yet, use the download option in Ghost to retrieve a copy and extract it to a folder.

Show Google+ comments from Blogger in Ghost
Download your existing theme

Copy the post.hbs to custom-blogger.hbs and use your favorite editor to replace the post-full-comments section with the script code to make it look like this.

Zip up the theme and rename the zipfile to {yourthemename}-custom.zip you'll have to re-apply these changes whenever your theme author releases a new version. You can read how I've automated that process in a separate post.

Now upload and activate your changed theme then head over to your posts and select the new custom theme:

Show Google+ comments from Blogger in Ghost
Select the customized Blogger template in your post settings.

Or use Blogger2Ghost.NET to automatically set the custom theme during the conversion step:

blogger2ghost convert -i bloggerbackup.xml -o .\migration -template=blogger

I'm still hoping there will be an easy way to import these comments straight into Disqus, but for now this will suffice :).

Photo credit: Brian Jeffery Beggerly

Use Google Search Console to optimize your Ghost blog

$
0
0
Use Google Search Console to optimize your Ghost blog

I've moved my blog from Blogger to Ghost and I changed the domain at the same time. To make sure everything went according to plan and that my old links kept working, I turned on the Google Search Console. It turned out to provide me with a couple of additional nice benefits as well.

This post is part of a series:

If you've read the original article you've read that I switched from blog.jessehouwing.nl to jessehouwing.net and at the same time rewrote the urls (slugs in Ghost terms) of my posts. Of course, after 6 years of blogging my posts were linked all over the internet and I didn't want to break all these people.

The Blogger2Ghost.NET tool generates two files I've used to make sure all old links are still working:

  • urlmapping.json - a mapping file which translates the old Blogger urls to the new Ghost slugs. This is used during the conversion to fix internal links between posts and to create the new post structures.
  • redirects.json - a set of redirects based on Regular Expressions to automatically redirect users from one location to another. The file is mostly generated during the conversion process based on the contents of the urlmapping.json and the tagmapping.json. These redirects ensure that external links to the old Blogger urls keep working.
    {
        "from": "^\\/2014\\/01\\/[Ii]nstall-[Tt]eam-[Ff]oundation-[Ss]erver-[Pp]ower-[Tt]ools-side-by-side\\.html$",
        "to": "/tfs-power-tools-install-side-by-side/",
        "permanent": true
    },
    {
        "from": "^\\/2013\\/12\\/installing-windows-81-to-samsung-series\\.html$",
        "to": "/windows-devices-install-to-samsung-series-slate/",
        "permanent": true
    },
    {
        "from": "^\\/2013\\/12\\/resolving-test-run-issues-in-visual\\.html$",
        "to": "/visual-studio-vstest-fix-identity-references/",
        "permanent": true
    }

After importing all content into Ghost I registered the new domain (jessehouwing.net) in Google Search Console:

Use Google Search Console to optimize your Ghost blog

You may be prompted to prove ownership, in my case, since I had already verified my ownership to Google through Google Analytics this step was performed automatically.

The next step is to register your sitemap. Ghost automatically generates that file for you, so you don't really have to do anything other than tell google it exists, the sitemap will be used by Google to quickly index new posts:

Use Google Search Console to optimize your Ghost blog
Add your sitemap in Search Console to trigger a full site crawl

It may take a couple of hours for the indexer to crawl the site, and I was quite surprised by what it found:

  1. A number of pages with faulty links
  2. Pages with structured data errors
  3. Pages referencing my blog with typos
  4. The fact that Ghost redirect Regular Expressions aren't case sensitive
  5. The fact that Ghost redirect Regular Expressions match on the Url Encoded urls

When Google indexes your Ghost blog and when you have Accelerated Mobile Pages enabled, it does a couple of extra checks on the contents of your pages. This is both a blessing and a curse. As long as you have error, Google will lower your search rank. But at least now you know where these errors are:

Use Google Search Console to optimize your Ghost blog
As you can see I started out with 108 pages with issues and quickly worked my way down to 0.

When you click on an Issue, Google will tell you what the issue is and allows you to verify you've fixed it. I went through the broken links one-by-one and fixed images, external links and a couple of internal links.

Pages with Structured Data errors

As you can see on the AMP issues list I still have 83 non-critical issues in my Structured Data. All 83 of those are a missing primary image, when I started out I had other issues as well and Google helps you to resolve those.

The one that had the biggest impact was the Publication Logo. Google is very sensitive to the dimensions and file size of that image. The image must be exactly 600px wide or 60px high and not be larger than 600x60px. It took me a while to figure that one out.

Use Google Search Console to optimize your Ghost blog
To satisfy Google, the image must be exactly 600px wide or 60px high and not be larger than 600x60px.

Pages referencing my blog with typos

It also turns out that people don't always copy/paste links from one place to another. Google finds and reports links to your domain that hit an error page and quite a few of these were caused by people making mistakes when linking to your blog:

Use Google Search Console to optimize your Ghost blog
You can see a number of pages that link to 2016/01/upgrading-from-xaml-to-build-2015-with.html/

When you click the link you can see where it ends up currently:

Use Google Search Console to optimize your Ghost blog
Click the link to see where it goes to
Use Google Search Console to optimize your Ghost blog

Instead of chasing each of these mistakes and asking the authors to fix the url, I've added/updated the redirects.json to catch these mistakes and point them to the correct location (in this case I added .* at the end of the regex):

    {
        "from": "^\\/2016\\/01\\/upgrading-from-xaml-to-build-2015-with\\.html\\.*$",
        "to": "/vsts-buid-upgrading-from-xaml-with-minimal-changes/",
        "permanent": true
    }

After uploading the updated redirects.json you can quickly verify the link is now working:

Use Google Search Console to optimize your Ghost blog

And tell Google the issue has been fixed:

Use Google Search Console to optimize your Ghost blog
Mark the issue Fixed.

The fact that Ghost redirect Regular Expressions aren't case sensitive

It turns out that Blogger links and tags are case insensitive. Ghost redirect expressions aren't (for now, I submitted a Pull Request). And given the number of errors that were found, I suppose that Blogger hasn't been consistent with the generated links in RSS/Atom feeds in the past.

I've updated the Blogger2Ghost.NET tool to make sure that the Regular Expressions work on both the original case of Blogger as well as the all-lower-case version:

    {
        "from": "^\\/2014\\/01\\/[Ii]nstall-[Tt]eam-[Ff]oundation-[Ss]erver-[Pp]ower-[Tt]ools-side-by-side\\.html$",
        "to": "/tfs-power-tools-install-side-by-side/",
        "permanent": true
    }

Once I'd figured out the fixes that needed to be made, I updated Blogger2Ghost.NET to be able to take a mixed case redirects.json and to optimize it:

The fact that Ghost redirect Regular Expressions match on the Url Encoded urls

Similar to the case sensitivity issues, I ran into a couple of broken tag redirects.  I had assumed the Regular Expression would run against the decoded URL, but in fact Ghost will run the expression against the URL Encoded version of the URL.

This means that spaces have to be replaces wit h %20 among other things. The same optimize-redirects command will fix your existing redirects.

When you run blogger2ghost convert with a recent version these issues will not occur as the conversion tool now generates the correct redirects from the get-go.

Have you ever checked your blog?

Not until I started to look into the migration did I learn of the Google Search Console. Since my fixes and telling about it a number of friends have also updated their sites. Have you?

Photo credit: Brad Smithson

Scaling Scrum to the limit

$
0
0
Scaling Scrum to the limit

You’re likely to have been asked the question: “we need to go faster, how many more people do we need?” Most people naturally understand that just adding a random number of people isn’t likely to make us any faster in the short run. So how do you scale Scrum to the limit? And what are those limits?

Meet Peter, he’s a product owner of a new team starting on the greatest invention since sliced bread. It’s going to be huge. It’s going to be the best. Peter has started on this new product with a small team, six of his best friends and it has really taken off. In order to meet demands while adding new features, Peter needs to either get more value out of his teams and if that is no longer possible, add more team members.

He and his teams have worked a number of sprints to get better at Scrum, implemented Continuous Integration even to deliver to production multiple times per day. It is amazing what you can do with a dedicated team willing to improve. But since their product was featured in the Google Play Store they’ve found themselves stretched to their limits. Peter has found himself in the classical situation in which many product owners and project managers find themselves. How do you replicate the capabilities of your existing team without destroying current high-performance teams? He contacts a good friend, Anna, who has dealt with this situation before and asks for her advice.

Anna explains that there are two options of gradual growth that have a very high chance of succeeding with limited risk to his productive team.

1. Grow and split model

In this model, new team members are added to the existing team, one team member at a time and taking enough time to let the new member settle before adding the next. Once the team reaches a critical point, a natural split is bound to happen and you’ll end up with two or more smaller teams. Peter remains the sole Product Owner (a product is always owned by a single owner in Scrum), but as they grow they may add an additional scrum master to help facilitate and help the teams to keep improving.

Scaling Scrum to the limit
Grow-and-split model

Most often the split happens naturally when a team grows beyond a certain size. This allows the team to self-manage their new composition. However, the new teams may never perform as well as the original team.

2. The apprentice model

The second model, Anna explains, uses an age-old model to train new people on the job. In the apprentice model the existing team takes on two apprentices who are trained in the ways of working and the functional domain. After a couple of sprints these apprentices reach their journeyman status and start a team of their own.

The biggest advantage of this model is that the original team stays together. They do have to onboard and teach the apprentices, which is likely to impact the way they work together, but this model has a much higher chance of retaining the productivity of the original team.

It may take a few sprints for the new team to reach the same level of productivity as the original team had, but you’ll have a higher chance of keeping your first team stable and productive. Unfortunately, in this model there are no guarantees either. Adding new people to an existing team can have lasting effects, even after these people leave.

These effects can be both positive and negative. E.g. they may bring along a new testing technique that helps everyone become more productive, or they may involve new insights that cause division among the original team. Depending on the team, they may be able to benefit from both, but it may also tear them apart.

It’s always the case that the original team will now have to learn to cooperate with the newly formed team, which will likely have a massive impact on their productivity.

Scaling Scrum to the limit
Apprentice model

Knowing when to stop scaling

Peter asks his team which model they feel most comfortable with and the team decides to start with the grow-and-split model, and after they’ve split off into two teams, adopt the apprentice model to grow further if needed.

He also asks Anna to join his company. She takes up the mantle of Scrum Master and focuses on helping the teams improve and helps them discover solutions for many of the problems introduced by working with multiple teams.

Meanwhile, Peter keeps asking the teams to train new team members and steadily the number of teams grows.

One afternoon Anna comes knocking on Peter’s door and shows him a couple of statistics she has kept for as long as she has been working in the company. According to her statistics, she had been tracking the value delivered per sprint as well as each team’s velocity - the latest additions haven’t been able to really deliver more. She argues that the overhead of working together with so many teams has reached the maximum sustainable by the current architecture. She asked the teams and found out that people are tripping over each other’s work, integration regularly fails, and people are spending too much time in meetings and not enough time on “real work”. Despite the practices she has introduced, such as cross team refinement and visualization of dependencies, it seems that they have reached the maximum size for the product.

While Peter is a bit disappointed, he has to admit that Anna warned him that he couldn’t just keep adding people and expect an ever-increasing amount of work to be delivered.

Scaling Scrum to the limit
The sky may not be the first limit

Useful metrics while scaling

While velocity (story points delivered), hours spent and number of tests passed are all viable ways of tracking progress for a development team, it’s easy to measure the speed at which worthless junk is being delivered to production.

This is why Anna also kept track of other metrics, such as value delivered, customer satisfaction (through app store reviews), incidents in production (through the monitoring tools they have in place) and more.[1]

Keeping statistics about the amount of value delivered while you’re scaling is important. You will probably find that while the total number of teams increases, each new team adds less and less value. This is a sort of glass ceiling that you may hit sooner or later. Breaking through it may require drastic changes to the application’s architecture or to the way the teams work together.

As Peter and the original team never expected the product to take off this fast, the architecture of the application was put together a bit haphazardly. And under the pressure to deliver, they cut a few corners left and right. He calls all of his teams into the company canteen and explains his predicament. Each team selects one or two of their most experienced team members and they form a temporary team of experts to figure out how to break up their little architectural monster. After peeling off a few functional areas and refactoring them into smaller, individually deployable parts of a cohesive functional unit, it quickly becomes apparent that this new architecture prevents them from tripping over each other’s toes.

You may have heard of this model before: small functional cohesive units of code that maintain their own data and that are called Microservices. These small units are ideal to form teams around and give these teams a lot of freedom.

Scaling Scrum to the limit
Drastic changes enable new growth

Could we have done it differently?

Sometime later Peter finds Anna in the company coffee corner and asks her whether they could have taken another approach, one that would have shown the issues in their original architecture at an earlier stage of their product’s development. He also wonders whether they could have scaled faster by hiring experienced teams.

Anna explains that there was a third option she never explained to Peter, because it carried a much higher risk, and she didn’t dare risking the product. The third option was to quickly add a number of teams all at once, preferably teams of people who had already had some experience working together and that had experience working at such scale. At the same time, the original team members would be scattered among the newly formed teams, optionally rotating to share their specific knowledge of the domain or processes, and to explain the architecture and infrastructure In this model, given that you hit the problems in the established processes and in the architecture head-on, everyone needs to work together to quickly find solutions to all of the problems they encounter. If they manage this, they may be able to quickly find a way to work together. They may, however, also completely come to a stand-still or the amount of conflict may reach levels unimagined before.

3. Scatter and rotate model

Scaling Scrum to the limit
Scatter and rotate model

To ensure the new teams have equal access to the knowledge and skills of the original team, the original team members often rotate among the newly formed teams or they are not dedicated to any team for a few sprints, before everything settles down.

If this model had succeeded, they may have been able to scale much faster. However, they could also have been out of business.

Peter reflects that had they had a direct competitor in the market who was able to deliver much faster, they could have taken this risk. But it would have been an all-in gamble. He's glad they weren’t in that situation.

Conclusion

There isn’t really a hard limit in terms of how many people can contribute to an agile product or organization. But clearly there are limits to the pace at which you can grow, to the amount of control you can have over what is going on in every team, and to what the product’s or organization’s architecture and processes can sustain.

There are multiple models to grow your ability to deliver value. While adding teams may seem the easiest solution, investing in continuous integration, automated deployments, and a flexible architecture may deliver more sustainable value faster.

When you do need to scale beyond what’s possible with a single team, remember that if you’re not ready for it, you’ll exponentially scale your team’s dysfunctions.

To be very blunt, if you scale shit, you end up with heaps of it. When you’re able to deliver quickly, efficiently and professionally, you can scale your teams. Keep measuring while you scale and keep evaluating your way of working, collaboration and architecture. Using your statistics, you can make an informed decision whether to scale further. Without them, you may be degrading your ability to deliver value without ever knowing it. Keep inspecting your processes, tools, architecture and team composition regularly. Your team will probably know what to improve in order to deliver more of the right things more efficiently.

Would you like to know more? Join a Scaled Professional Scrum class to experience Scrum with Nexus hands-on.

Viewing all 216 articles
Browse latest View live