tag:blogger.com,1999:blog-51278937594166101612024-02-19T07:30:56.917+01:00Wouter de Kort: The Art of CodingThis blog is about all the new things in software development with a focus on .NET. It's mostly about the things I learn through my day-to-day job as an architect at Ordina and a freelance author and trainer.Anonymoushttp://www.blogger.com/profile/05470355439791004016noreply@blogger.comBlogger71125tag:blogger.com,1999:blog-5127893759416610161.post-52288713405529025302015-07-03T09:28:00.000+02:002015-07-03T09:29:16.817+02:00My first Visual Studio Online Extension is live!<div style="margin-bottom: .0001pt; margin: 0cm;">
<span lang="EN-US" style="font-size: 13.5pt;">One of the many privileges of being
an ALM Ranger is that you get the chance to participate in private preview
programs where you work closely with the product group.<o:p></o:p></span></div>
<div style="margin-bottom: .0001pt; margin: 0cm;">
<br /></div>
<div style="margin-bottom: .0001pt; margin: 0cm;">
<span lang="EN-US" style="font-size: 13.5pt;">The latest opportunity was around
the new Visual Studio Online Extension model. The new Extension model allows
you to create your own extensions that plug directly into the VSO web access.<o:p></o:p></span></div>
<div style="margin-bottom: .0001pt; margin: 0cm;">
<br /></div>
<div style="margin-bottom: .0001pt; margin: 0cm;">
<span lang="EN-US" style="font-size: 13.5pt;">I started out with a simple
extension: Folder Management. This extension allows you to create new folders
directly from Web Access in both TFVC and Git repositories.<o:p></o:p></span></div>
<div style="margin-bottom: .0001pt; margin: 0cm;">
<br /></div>
<div style="margin-bottom: .0001pt; margin: 0cm;">
<span lang="EN-US" style="font-size: 13.5pt;">And I’m very pleased to announce that
my new extension is now live! The code is at <a href="https://aka.ms/vsoext1">GitHub </a>and will be completely open
source from now on. There is also a<a href="http://blogs.msdn.com/b/visualstudioalmrangers/archive/2015/07/01/folder-management-visual-studio-online-extension-by-wouter-de-kort.aspx"> blog post at the ALM Rangers account</a> with
some more details.<o:p></o:p></span></div>
<div style="margin-bottom: .0001pt; margin: 0cm;">
<br /></div>
<div style="margin-bottom: .0001pt; margin: 0cm;">
<span lang="EN-US" style="font-size: 13.5pt;">If you want to install the
extension on your account, please join the <a href="https://vsipprogram.com/Join">Visual Studio Industry Partner Program</a>.
This is completely free at the basic level and will give you access to the new Extension
model.<o:p></o:p></span></div>
<div style="margin-bottom: .0001pt; margin: 0cm;">
<br /></div>
<div style="margin-bottom: .0001pt; margin: 0cm;">
<span style="font-size: 18px;"><i>Questions? Feedback? Please leave a comment!</i></span></div>
<div style="margin: 0cm 0cm 0.0001pt;">
<br /></div>
<br />
<div class="MsoNormal">
<br /></div>
Anonymoushttp://www.blogger.com/profile/05470355439791004016noreply@blogger.com0tag:blogger.com,1999:blog-5127893759416610161.post-25169758989127675092015-06-01T17:51:00.002+02:002015-06-01T17:51:37.803+02:00Slides from my TechDays 2015 sessionsLast week we had the TechDays here in the Netherlands. I was asked to deliver
two sessions and two Ask me Anything sessions. A lot of attendees asked me if
they could find my slides somewhere.<br />
<br />
For those of you, here they are:<br />
<ul>
<li><a href="http://1drv.ms/1KyffWD">Making the move to Visual Studio
Online</a></li>
<li><a href="http://1drv.ms/1JeorlE">Going DevOps on the Microsoft
Stack</a></li>
</ul>
<div>
<br /></div>
The two Ask me Anything sessions where recorded and will hopefully be
available on Channel 9 later this week (I’ll post the links when they’re
online). I love the concept of the AMA sessions and I hope to see them again
next year.<br />
<br />
<em>If you have any questions on my sessions or would love to have them
delivered at your place sometime (in person or online) just leave a
comment!</em>Anonymoushttp://www.blogger.com/profile/05470355439791004016noreply@blogger.com0tag:blogger.com,1999:blog-5127893759416610161.post-15885637222091241112015-05-23T10:14:00.001+02:002015-05-23T10:14:23.469+02:00Azure Dev/Test labs preview is getting startedToday I woke up to an email inviting me to the new Azure Dev/Test Lab preview program. The preview program can start any moment now!<br />
<br />
I’m really excited about this new feature. Especially when it comes to Application Lifecycle Management and Azure, Dev/Test is something a lot of my customers are interested in. <br />
<br />
While working in the preview program, you get to directly interact with the product group and the team who’s building the new features. This means you learn from the people who really know it and you have a change to influence the direction of the product!<br />
<br />
If you want to know more about Dev/Test labs checkout <a href="http://wouterdekort.blogspot.nl/2015/05/have-you-seen-new-devtest-labs-on-azure.html">my previous blog post</a> or <a href="https://channel9.msdn.com/Events/Build/2015/3-721">Claude Remillards talk on Build</a> (at 18:30). And of course you can also <a href="http://azure.microsoft.com/en-gb/campaigns/devtest-lab/">apply for the preview program</a>.<br />
<br />
<i>Questions? Anything you would love to see in the Dev/Test labs? Please leave a comment!</i>Anonymoushttp://www.blogger.com/profile/05470355439791004016noreply@blogger.com0tag:blogger.com,1999:blog-5127893759416610161.post-54995331586829632412015-05-18T21:14:00.001+02:002015-05-18T21:14:40.786+02:00Have you seen Build vNext?Build is an important part of Application Lifecycle Management. Every DevOps pipeline starts with a Build. Visual Studio Online and Team Foundation Server use the XAML based build system for some time now. I’ve used this system in a lot of scenarios, ranging from small applications to complex scenarios with a multitude of customized builds working together.<br />
<br />
But now that I’ve seen the new build system and had some time to play with it I’m completely sold. In this post I want to give you a quick intro to Build vNext and show you what it’s all about. <br />
<b><br /></b>
<b>Why a new Build system?</b> <br />
<br />
The old build system is based on Windows Workflow Foundation. Microsoft created a set of components that you can use to create build templates. You can also create your own components (such as <a href="http://wouterdekort.blogspot.nl/2014/09/adding-code-metrics-to-your-team.html">the Code Metrics I blogged about</a>) and add these to your templates. A template could become very long. The following image shows you the outline of the default template that ships with TFS 2013. <br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFvCTVn-6_w99xhGIKmgteBEI6Voc6sye080JcnP1mWGis3R7tpF1G1K1XxWb5ntOARidvUFvJLnCaliNDyYVWktlUTSi1Bf3RpG_nZRFGoP9Z10AiC3naHrQGLdPlTzhuGgd-XSvOQip8/s1600-h/image%25255B19%25255D.png"><img alt="An outline for the Default XAML build template" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5yfHj088I6yhDkzyvvj_ey1Fp92q5ONgnyUjqnnLhPGX1guZHu8UYIahgN9_Hsd1xPOUEBUN42dmRDuQm8H7y9CmpaTmq5n0mK7HPqaEPJt-7LMYD2NaDrtkDOlvxKf6qGKEdGEFV_cT6/?imgmax=800" height="402" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="An outline for the Default XAML build template" width="304" /></a> <br />
<br />
These Windows Workflow Foundation builds are run by what’s called a Build Controller and a Build Agent. The Agent does the actual work, the Controller manages one or more Agents and distributes the work to them. The Controller and Agent can only run on Windows. This means that cross platform builds, for example build an Xamarin app on Linux and Mac, are not possible out of the box. <br />
<br />
Another limitation is that a Controller is linked to one, and only one, Team Project Collection. This means that sharing a build infrastructure between different collections is impossible. This required careful planning and sometimes resulted in customers having multiple build controllers without any real need for it. <br />
<br />
Builds are configured by a build definition that uses a specific build template. These build definitions contain all the settings for your build such as which code to build, which tests to run and what do to with the results. The build definitions are not stored in version control. This means there is no audit trail and no way to go back to a previous version. <br />
<br />
That’s enough info on the old build system. Let’s look at how the new Build system solves all those<br />
issues. <br />
<b><br /></b>
<b>Introducing Build vNext</b> <br />
<br />
While working on this post, Build vNext is now available in public preview on Visual Studio Online. If you go to your VSO account (and if you don’t have one, please create one! It’s free) and select a project you will see a new tab in your menu: Build Preview. This Build System will also be the default build system that’s shipped with Team Foundation Server 2015. Of course the XAML builds will be there for backwards compatibility but whenever possible, the new build system is recommended. <br />
<br />
Configuring everything that has to do with your build definitions is now done from Web Access. This means you don’t have to use Visual Studio anymore for configuring builds, immediately making the build system configuration cross platform. Everyone with a browser can create a build. <br />
<br />
Builds are no longer based on complex build templates. Instead, a build is simply a list of tasks. Tasks can be anything from running a Visual Studio build, executing a set of tests, calling a PowerShell script or even a custom task you create yourself. In the old build system, creating build tasks required a far amount of knowledge (if you look at <a href="https://tfsbuildextensions.codeplex.com/">tfsbuildextension.codeplex.com</a> you find some extensions created by the community). Fortunately, the new build system is very extensible and much easier then the old one. <br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnnRQQxY06s1gChU245QEtDjmqG-yXvqEp6IWLJjAk6auPiQHliuuXh1ZTYNusF567ZKuZUNFE8Snl0D-J9YxwFjXoZ8Q26qM5Z_DczzLfgpAbBqbjtK2nwBftlLf9eiPdTbjynHTp2eFB/s1600-h/image%25255B7%25255D.png"><img alt="A list of tasks that form a new build" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_JpW44YkkwYzg9JeGr7CiNDL81stLCcTX7smus9CxW8jW-ZJ5_XHxt6ZE5KNsHddfenb0ufrdINQaEkjplTwCO8mAjG8wUi7i1I58_siQZqAvPimufqzeFs4lWej8bSO638S1b4ifvivn/?imgmax=800" height="313" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="A list of tasks that form a new build" width="554" /></a> <br />
<br />
Build tasks are essentially a JSON file shipped with other required files (like a PowerShell script). The JSON file describes your tasks with things like a name and description. It defines the parameters that are required to configure the task and finally it contains the actual logic that needs to run when the task is executed. And best of all, there are plenty of examples already! With Microsofts new open-source focus, it shouldn’t surprise you that the build tasks are developed in the open at Github: <a href="https://github.com/Microsoft/vso-agent-tasks" title="https://github.com/Microsoft/vso-agent-tasks">https://github.com/Microsoft/vso-agent-tasks</a>. <br />
<br />
So, a build is a list of tasks. In addition to the tasks and their configuration, you can set numerous other properties on a build definition such as variables that you want to share between tasks, retention policies (meaning how much finished build results need to be kept around) and the triggers that should start a build. If you look at the next figure, you will immediately see a difference with the old build definition: there are checkboxes instead of radio buttons. This means you can now have a single definition with multiple triggers. Previously, you would have to clone your build definition and configure a different trigger each time to achieve this. <br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgj4jtg70aDFB_29pxs3osE0iddK7TEjRP4H7ouLD20Mdcezzwk5OTtHUtR_cBmeT23Dikt8M0_4fq0H7U5lci7PEiOdghnCeS3tipMWzHr6KUa1vV2BsqiGz57-UexpA2WsNb0sTnl3z2-/s1600-h/image%25255B11%25255D.png"><img alt="Selecting multiple triggers for a build" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9tMBETUFpz4BOfOPOey4JArBXopBM8KiSQdCz8n6ENPuLP08JDmvihwZv0eFJZnZI3mx_ONhRfRxRBs86UbO2fFwCljlIlER1lQi5CNUqChZzopggQkrharx6A8CVCqgVXzMBz0_LHKcC/?imgmax=800" height="313" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Selecting multiple triggers for a build" width="554" /></a> <br />
<br />
Build definitions now also keep track of their history. Any change you make will be saved as a new version. You can view the history of a build definition and compare different versions with each other to quickly figure out what has changed. <br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5woakVrX_uHrBPk0_ZxMFb6Rv3dsutwHz0bXra_lqk9JMIB3qZ_7IWFl0qz-lmfMk9VwUB-i9kDfGLtz6z-BaxNqgazhis-Q57wWw7_Jo9Mcmpg6IYDzRnzRJWMoVv2z_KvZ_Cl_xUvv8/s1600-h/image%25255B15%25255D.png"><img alt="A diff showing the changes made to a build definition" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5yEbF_6MTuol9oroEpu_YlGLIp-7Fb9WUFhEr0irjPGbRzjT9zWnkMbyRXH41AByi8jeMK-vMEjuZpLyS1kPlENm1oDypXO8w_ftOw6-NbGKQFf7fXmpc7ebTyIvij4QFocctM3nRzoy-/?imgmax=800" height="313" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="A diff showing the changes made to a build definition" width="554" /></a> <br />
<br />
There are also changes in the way a build runs. Web Access will give you a live view of the output a build produces. This output is grouped in steps that you can easily navigate and is stored with the build result. <br />
<br />
And of course there is something that has to run a build. This is done by the new build agent. A cross-platform, Node.js based runner that can be installed with a simple script on Linux, Mac and Windows. This way. Microsoft has taken the build system completely cross platform, allowing you to have a farm of different build machines that can all be used together. <br />
<br />
How does the build system figure out which agent to use? This is done by setting Capabilities on the agent and Demands on the build. Capabilities are automatically discovered by an agent. So installing Visual Studio on a build machine will let the agent know that it can run Visual Studio Builds. This removes the need to manually tag build agents and then add those tags to your build definitions to make sure that a build ends up on the correct machine (if required you can add custom capabilities and demands). There is no concept of a Controller linked to a Team Project Collection anymore. So agents can finally be shared across collections! Does this mean there is no way to restrict agents or have some form of prioritization? <br />
<br />
Fortunately, there is. Microsoft introduced the new idea of Pools and Queues. A Pool is defined at the level of your VSO account or TFS Application Tier. Pools can be shared across Team Project Collections. They are used to define permission boundaries. Queues are scoped to the Team Project level and belong to a Pool. This way, a build can be assigned to a queue and then run on Agent. <br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDkbJFslgbtr5B4HAEJnnL7kdWKtBBcFwd7SgeyJinJZukfY3RIz75KGRJWWMvyYBuJJ6WyIE_LzAfKHELXHBOfAzrRS475wBMKdYXn-A3DqgnJaRtv6TDy0XQQgRxLpo3tXIQFEvKL26K/s1600-h/image%25255B2%25255D.png"><img alt="Configuring Queues and Pools" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs2Ia6zk49JWwj5DehWGa8jjAsZ5XE0q9QiYMw4DfDGh23pYlJMBZh5NcjgzI-thaxSuimmh2Nww4YQwS6RiAcJCEQjmu77wLl0KGZaSHnI1vcdObbGkrK5UhKB9eXsHW8zNLBPurkk4YI/?imgmax=800" height="222" style="background-image: none; border: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="Configuring Queues and Pools" width="400" /></a> <br />
<h3>
How can I start?!</h3>
Since Build vNext is in public preview on Visual Studio Online, the easiest way to get started is by using your VSO account. Here are some resources to get you started:<br />
<ul>
<li>Chris Patterson (the guy behind all the new build stuff) gave an <a href="http://channel9.msdn.com/Events/Build/2015/3-671">excellent talk at Build that’s available on Channel9</a></li>
<li>The preview documentation for Build vNext can be found on the <a href="http://vsalmdocs.azurewebsites.net/library/vs/alm/build/overview">vsalmdocs website</a>.</li>
<li>If you have an MSDN subscription you should <a href="http://azure.microsoft.com/en-us/pricing/member-offers/msdn-benefits-details/">activate your free Azure credits</a> so you can easily spin up a Linux VM to run a cross platform build agent.</li>
</ul>
<em>And that’s it for now! I encourage you to start using the new build system and if you have any questions or comments, you know where to find me!</em><br />Anonymoushttp://www.blogger.com/profile/05470355439791004016noreply@blogger.com0tag:blogger.com,1999:blog-5127893759416610161.post-7855507391497722132015-05-04T20:16:00.002+02:002015-05-04T20:56:44.894+02:00Things to do after BuildDo you know about the phony feeling when being a developer? That feeling that you actually don’t know anything and that you’re only pretending? Scott Hanselman wrote a post on this ’<a href="http://www.hanselman.com/blog/exploringimpostorsyndromeintechnologysxsw15.aspx">Exploring imposter syndrome in technology</a>’ and apparently the feeling is not uncommon.<br />
<br />
And I suffer from it. Especially after visiting Build! There are so many great things discussed and new features released that I left Build with the feeling that I should really study up on some stuff.<br />
<br />
So without further ado!<br />
<br />
<h3>
My list of things do after Build</h3>
<ul>
<li><a href="http://channel9.msdn.com/Events/Build/2015/2-724">Run Windows 10 on a Raspberry Pi and deploy a universal app to it</a> </li>
<li>Create and deploy an <a href="http://channel9.msdn.com/Events/Build/2015/2-726">ASP.NET 5</a> website (preferably in <a href="http://channel9.msdn.com/Events/Build/2015/3-680">Visual Studio Code</a>!) to a <a href="http://channel9.msdn.com/Events/Build/2015/2-683">Docker container running on Azure</a> </li>
<li>Setup continuous delivery for a website to Linux with the new <a href="http://channel9.msdn.com/Events/Build/2015/3-649">Release Management Service</a></li>
<li>Create a <a href="http://channel9.msdn.com/Events/Build/2015/3-725">Roslyn analyzer</a> </li>
<li>Create a <a href="http://channel9.msdn.com/Events/Build/2015/2-772">Visual Studio Online extension</a> </li>
<li>Run a <a href="http://channel9.msdn.com/Events/Build/2015/3-671">Build vNext</a> agent on Linux and a Mac </li>
<li>Convert a <a href="http://channel9.msdn.com/Events/Build/2015/2-692">Win32</a>, <a href="http://channel9.msdn.com/Events/Build/2015/2-627">Web, Android</a> and <a href="http://channel9.msdn.com/Events/Build/2015/3-610">iOS</a> app to a Universal Windows app </li>
<li>Learn (the basics of) <a href="http://channel9.msdn.com/Events/Build/2015/2-690">Azure Machine Learning</a> </li>
<li>Learn the basics of <a href="http://channel9.msdn.com/Events/Build/2015/2-648">Unity</a> to prepare for <a href="http://channel9.msdn.com/Events/Build/2015/2-744">Hololens</a> </li>
<li>Create an <a href="http://channel9.msdn.com/Events/Build/2015/3-694">Outlook extension</a> using the new Office Graph </li>
<li>Create an <a href="http://wouterdekort.blogspot.nl/2015/05/have-you-seen-new-devtest-labs-on-azure.html">Azure dev/test lab</a> based on <a href="http://channel9.msdn.com/Events/Build/2015/2-659">Azure Resource Manager</a></li>
</ul>
<br />
And finally: Get a Hololens! But that one is going have to wait a bit. I think after doing all those things I’m a little bit less of a phony.<br />
<em><br /></em>
<em>What is on your todo list? Anything I’ve missed or that you would love to learn? Please leave a comment!</em>Anonymoushttp://www.blogger.com/profile/05470355439791004016noreply@blogger.com0tag:blogger.com,1999:blog-5127893759416610161.post-15337652480328035972015-05-02T19:17:00.000+02:002015-05-02T19:19:00.880+02:00Have you seen the new dev/test labs on Azure?One of the great scenarios for Azure is dev/test. Having the ability to quickly setup an environment in Azure and run your automatic or manual tests on them gives you an extreme flexibility. You pay per minute and you can have as many machines as you want in a couple of minutes.<br />
<br />
But there are some challenges.<br />
<br />
One thing I notice while working with customers is that they often want to limit how much money can be spent on Azure. Often customers asks for a cost calculation so they know beforehand how much Azure is going to cost them. Of course the whole idea of Azure is that you pay for what you use so giving of an exact amount is hard.<br />
<br />
Another thing that teams sometimes struggle with is the amount of choice on Azure. You have different sizes of virtual machines, ranging from simple A-series to Godzilla machines. And add to that the number of virtyual machine images you can use, network settings and security configurations and a team can suddenly be overwhelmed with all the options they have.<br />
<br />
<h3>
Dev/Tests labs to the rescue!</h3>
<br />
During Build this week Claude Remillard announced a new Azure service: Dev/Test labs. You can now create one or multiple labs in your subscriptions. These labs can have a quota on how much can be spent. This means that a team can never go over the amount you configure, giving managers and others a nice and secure feeling.<br />
<br />
But that’s not all. You can also configure which virtual machine sizes can be used, which templates are accessible and you can easily create custom base images for your team. The developer division at Microsoft uses this themselves. They have base images that contain stuff like the correct Windows version, Office and other standard tooling. Then each night they run a scheduled build that takes a base image, adds the newest version of Visual Studio to it and create a new image ready to go the next day. You can configure your lab to automatically shut down VMs at the end of the day to save on costs.<br />
<br />
Now integrate this with the new Release Management service (a topic for another blog!) and you have a great new tool to automatically setup and break down environments on Azure.<br />
<h3>
<br /></h3>
<h3>
Want to know more?</h3>
<br />
On Channel 9 you can find the recording of the session with demos showing the new lab features: <a href="http://channel9.msdn.com/Events/Build/2015/3-721">http://channel9.msdn.com/Events/Build/2015/3-721</a>. Currently this feature is in private preview but you can request to join: <a href="http://azure.microsoft.com/en-us/campaigns/devtest-lab/" title="http://azure.microsoft.com/en-us/campaigns/devtest-lab/">http://azure.microsoft.com/en-us/campaigns/devtest-lab/</a><br />
<br />
I’ve requested to join the private preview. As soon as I’m up and running I'll post more details on this promising new feature.<br />
<em><br /></em>
<em>What do you think? Is this useful? Anything you like to see? Please leave a comment!</em>Anonymoushttp://www.blogger.com/profile/05470355439791004016noreply@blogger.com0tag:blogger.com,1999:blog-5127893759416610161.post-46036216168964271182015-03-31T10:08:00.000+02:002015-03-31T10:13:32.797+02:00Drag and drop your way to team collaborationLately I find myself explaining more and more how to use version control to non-developers. Teams implementing DevOps often ask me the question how the operations people can store their scripts and other stuff in version control. They don’t have Visual Studio installed and have no idea what a checkin/checkout is. <br />
<br />
Previously, I showed them tools like Team Explorer Everywhere and the Team Foundation Server Power Tools (for the Explorer integration!). This works but it’s not ideal. <br />
<br />
Recently I was at a conference where Martin Woodward had a talk on how Microsoft implemented Agile and DevOps. One of the things he showed was a very small end of sprint video he created. In that video I saw a new feature that I didn’t know existed!<br />
<br />
<h3>
Meet Drag and Drop</h3>
<div>
<br /></div>
What if someone from the operations team could just drag and drop his scripts into the Web UI of TFS. What if this drag and drop would be smart enough to know when to add an item or update an existing one. And what if this functionality would allow you to do all of this without installing anything.<br />
<br />
Well, that functionality is here! At the time of writing this only works on Visual Studio Online but you can expect it to move to on-premises with one of the future updates.<br />
Let’s say you have an empty TFVC project shown in your browser and a PowerShell file on your computer.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhFBYXaJqoutklDpzTQKN8Li1lbnoSm36-gHAbQWwDEcqCO79mmU1NT4BPl2TN_OsMb-JtfSQJpalA9DZX4dUBnqa6CoFCixp5_w3-7dNTBmeqwJ7OOO5WnikvZaLTbnsDB4dpUFQf9_Bs/s1600-h/image%25255B8%25255D.png"><img align="left" alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8i-UJN-vMm08WekXn5aTOx0EEQ02TKOZ7Mh7fQ9xveZxQSsKJpv9bR-4n5zcskJj1UJZj_y1CFQnF20s8KUXVsBC8I3ekKab6gI2509VXb4oB2avX4yQ-kxZcoh_LNX8LIZeSR3kq1iF7/?imgmax=800" height="324" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; float: left; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="570" /></a><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Now all you have to do to add the file to your project is drag and drop it to the right part of your code view in the browser.<br />
<em><br /></em>
<em>Note: dropping it in the left part (the tree view of your code) won’t add the file!</em><br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmA2VdvSnrQ_BZpcQocUtlAcmmr6ngwWJFqXgYl-iv_O4jMpMBIJqG9cm9ddqnrlV8ZbwpjIn9VX1rwurN5BDNbsho4pNyLM2TSMn-U9UjqgvJ6wvga-3Cn72H5rRe8R64DprwpPyOptZT/s1600-h/image%25255B13%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiCZPrmMNxu-INd7vlveFSU0TG-oLKc69SmkDwibztAhkUq1xrlkPGpsGvJ0MYRx_DE_ae4_PmJQT0vXM88IkgnR5lqZ8GG8Fu3GnIc-3ZWzkf8zwdehAPvAPSCbn6Lz_xujh1naOoePo2/?imgmax=800" height="593" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="573" /></a><br />
<br />
And voila! A new dialog where you can add a file (or multiple files), leave a comment and commit everything in one go.<br />
<br />
If the file already exists, VSO will recognize this and replace the file with a new version. This will keep your history in tact and make sure that you don’t end up with things like <em>MyScript1.ps1</em>, <em>MyScript2.ps1</em>.<br />
<br />
This also works when you have a Git repository. The only difference is that you first need to push something to VSO before you get the actual Code Explorer. After this, you can drag and drop all you want. This will do a commit and push in one go.<br />
<br />
<h3>
</h3>
<h3>
How about deleting a file?</h3>
<div>
<br /></div>
Have you ever had to map a workspace or clone a repository only to delete a file and commit the change? That’s over now. In the Web UI you can also right click a file and select Delete.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtfyBRvC-7NblSXBmAULUPreQgH5aXwpKlexRyNRhdcxGEaechSC7j8V9wgNfeXjpPpSJtAt9L9jwqJxoF4RNcnyeUqGl8TFmK-j-bqdpPnNWmCWKJWfkbJm-oRSjfaONHV8gn3BM8F8qT/s1600-h/image%25255B22%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwHkOZckFJrR0fUlliarlztp7GHNi4tPC6f8-YdUOJ75UWrAn2_MU9LXq389Vx9DIHNDL5uALgiV2mZmAaWIdaEEhF2in6b67aNe9LA5dxyuAjm6qk5ehU2mgaB-DTNLJW5-xEvNNfB_y_/?imgmax=800" height="466" style="background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="524" /></a><br />
<br />
After hitting Delete you can add a comment and push your change to VSO.<br />
<br />
Obviously this is not the next big thing for VSO but I find this feature very handy and I’m definitely going to show it to IT people, designers and others who want a quick and easy way to work with version control.<br />
<em><br /></em>
<em>What you think? Do you know of any other features that are still in the unknown? What’s your favorite VSO feature? Please leave a comment!</em>Anonymoushttp://www.blogger.com/profile/05470355439791004016noreply@blogger.com0tag:blogger.com,1999:blog-5127893759416610161.post-43262295825833220282015-02-25T11:16:00.001+01:002015-02-25T11:16:28.367+01:00What do you want to know about ALM?<p>Have you ever visited an Ask The Experts event? For those of you who haven’t, ATE are session held at events where you can connect to experts in certain areas and ask the question you want.</p> <p>For example, at a recent event I spoke at I also did an ATE session. People could just walk in and ask questions. I received questions about optimizing build performance, choosing a branching strategy and the idea behind Release Management and Continuous Deployment just to name a couple.</p> <p>I did this event together with <a href="https://mvp.microsoft.com/en-us/mvp/Hassan%20Fadili-4024457">Hassan Fadili</a> and after that we discussed if it would benefit the community to run ATE sessions online as a webinar.</p> <h3>ATE with the ALM Rangers and MVPs</h3> <p>So we want your feedback. Do you think it’s valuable to have online ATE events around ALM, DevOps and Agile?</p> <p>We think the best way to find out is to just get started.</p> <p>If you have any questions around ALM please leave them as a comment on this post. We will collect all questions and then schedule an online Webinar where Hassan and I and other experts will answer your questions.</p> <p>One important thing to understand is that we can’t discuss anything that’s under NDA. So questions like <em>when is feature x going to be released?</em> <em>When is the next version of TFS or Visual Studio coming? </em>are not going to be answered.</p> <p>If there is enough response, we would love to host these sessions once a month for about 30 minutes each time.</p> <p><em><strong>So now it’s up to you. If you have any questions or feedback please leave them as a comment. When the questions start to come in we will schedule our first webinar and invite you all to join.</strong></em></p> Anonymoushttp://www.blogger.com/profile/05470355439791004016noreply@blogger.com0tag:blogger.com,1999:blog-5127893759416610161.post-10772882777257163012015-02-05T08:51:00.001+01:002015-02-05T08:51:43.376+01:00Learning Git<p>As you may have noticed: Team Foundation Server not only supports TFVC but also supports Git. Now the big question is: why? Microsoft says that TFVC is <em>not </em>going away but that there are scenarios where one or the other is a better choice.</p> <p>I’m by no means a Git expert so after reading a very interesting email discussion within the <a href="http://aka.ms/vsarrangers">ALM Rangers</a> on Git I realized I need to know more about Git.</p> <p>So here are a couple of links to get you started if you want to learn Git:</p> <ul> <li>Ry’s Git Tutorial: <a href="http://rypress.com/tutorials/git/index">http://rypress.com/tutorials/git/index</a></li> <li>Learn Git Branching: <a href="https://pcottle.github.io/learnGitBranching/">https://pcottle.github.io/learnGitBranching/</a></li> <li>Using Git with Visual Studio 2013 Jump Start: <a href="http://www.microsoftvirtualacademy.com/training-courses/using-git-with-visual-studio-2013-jump-start">http://www.microsoftvirtualacademy.com/training-courses/using-git-with-visual-studio-2013-jump-start</a></li> <li>Pro Git Book: <a title="https://progit.org/" href="https://progit.org/">https://progit.org/</a></li></ul> <p>Is Git going to be the future? I don’t know. But Git is definitely popular in some circles and an extra tool in your belt is always a good idea.</p> <p><em>What is your take on Git? Do you like it? Use it? Hate it? How have you learned to use Git?</em></p> Anonymoushttp://www.blogger.com/profile/05470355439791004016noreply@blogger.com0tag:blogger.com,1999:blog-5127893759416610161.post-21700840056716961622015-01-06T11:36:00.000+01:002015-01-06T11:36:52.815+01:00My favorite books: The Phoenix ProjectHave you ever read a computer book that was a real page turner? Well, although I love to read, reading technical books is mostly not a real page turner event.<br />
But the Phoenix Project is different! While working with the <a href="http://blogs.msdn.com/b/willy-peter_schaub/archive/2012/03/31/understanding-the-visual-studio-alm-rangers.aspx">ALM Rangers</a> on a new project, Sam Guckenheimer mentioned the Phoenix Project as a great book so I ordered my copy and couldn’t stop reading.<br />
<br />
<h3>
The Phoenix Project: A Novel about IT, DevOps, and Helping Your Business Win</h3>
<div>
<br /></div>
<img align="left" src="http://ecx.images-amazon.com/images/I/914-sUgELZL.jpg" height="297" style="display: inline; float: left;" width="200" /><br />
The Phoenix Project is a novel about a company that, if you work in the IT or in a company that uses IT (so practically everyone) will recognize.<br />
<br />
It shows the struggles of Parts Unlimited to keep up with competition in a world that keeps changing. In the end, Parts Unlimited adopts a DevOps way of working and learns quite while implementing it.<br />
<br />
What I found surprising about this book was how much I can relate to everything that’s happening. You almost feel the pain of another deployment going wrong or a manager trying to push his little side project to the top of the line.<br />
<br />
And then you see how they turn things around and you start feeling better.<br />
<br />
<br />
If you work in an IT company that resembles the way Parts Unlimited works, this book is a must read. Not only for yourself but for your manager and every other person in your company.<br />
<br />
Now the interesting question is, how can you apply all the principles from this book while working with products like Visual Studio, Team Foundation Server and Azure but that’s for another blog <img alt="Winking smile" class="wlEmoticon wlEmoticon-winkingsmile" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWOa9BZsNvK2y7TUdbkqB1pXzbVmyoJHDc4wAxWgDiCF5Vg5_Dye6HPZtv6xHX6ilYZYxo3lzKCTXYRZy-mW_Tho_DdZtaWzsKmIM59gmpbsj1JKNA50fTDtOEF3p1dTM46BhHObUWPeOq/?imgmax=800" style="border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none;" /><br />
<br />
<em>Have you read the Phoenix Project? Did you like it? Or do you know of similar books that are worth reading? Please leave a comment!</em>Anonymoushttp://www.blogger.com/profile/05470355439791004016noreply@blogger.com0tag:blogger.com,1999:blog-5127893759416610161.post-44448538956994567632014-11-25T12:58:00.000+01:002014-11-25T13:01:13.360+01:00What I learned at the Microsoft ALM SummitLast week I had the privilege of visiting Barcelona. A beautiful city with some great places to visit, nice weather and really nice food. But that wasn’t the goal of my visit. <br />
Microsoft organized the West European ALM Summit in Barcelona last week. The ALM Summit is a partner event where all ALM partners have a change to get the latest ALM news and meet there fellow colleagues. <br />
<br />
So from breakfast with Sam Guckenheimer to drinks with Craig Kitterman, the ALM summit is a great place to meet people and learn directly from Microsoft.<br />
<h3>
<br /></h3>
<h3>
Cloud </h3>
The summit took two days. One day was focused on Cloud, the other day on Mobile. Which isn’t strange since Microsoft is a ‘Mobile first, Cloud first’ company.<br />
<br />
Microsoft is really targeting the Cloud with its ALM innovations. From the new Cloud Deployment Projects to Dev/Test, ALM and Cloud go hand in hand as far as Microsoft is concerned.<br />
Although I understand their goals, this sometimes means that new features have no value to customers who are solely on-premises. Of course Microsoft hopes that ALM Partners help customers move to Azure.<br />
<br />
This is why Microsoft is pushing on using Azure for Dev/Test scenarios. And to be clear, Dev/Test on Azure is a great scenario. It’s cheap and flexible and with the Virtual Network support Azure offers, it’s also secure. <br />
<br />
One particular area that was discussed are the MSDN benefits for Azure. Did you know that as a developer with an MSDN subscription you have free monthly credits for Azure? Depending on if you have a Professional, Premium or Ultimate subscription you get between $50 and $150 Azure credits a month that you can use to experiment with Azure and run small workloads.<br />
<br />
In addition to Dev/Test scenarios, Visual Studio Online is also complimentary to your on-premises TFS environment. For example, Application Insights and Cloud Load Testing are features that you can use without storing any code in VSO but that really complement your on-premises TFS.<br />
<h3>
<br /></h3>
<h3>
Mobile</h3>
The second day was all about Mobile. What I found particularly interesting was the comparison between Cordova and Xamarin. For example, Microsoft said they used Cordova for the Connect() event app. This app is only used for one or two days and is mostly about displaying data. Cordova is a great solution for apps that don’t require a great performance or deep interaction with the device.<br />
<br />
Especially with the new Cordova support for Visual Studio, Cordova is something you should<br />
consider for ‘quick and dirty’ apps. Xamarin is on a whole other level. This is if you want to invest in a quality app that runs natively on a device. <br />
<h3>
<br /></h3>
<h3>
DevOps</h3>
What is totally clear is that MIcrosoft is focusing on DevOps with their ALM platform. This means that Microsoft invests in tooling that makes DevOps practices easier. <br />
<br />
If you understand this focus it’s easier to understand why tooling like Smart Unit Tests is being released instead of investments in Coded UI. <br />
<br />
Forrester gave a presentation where they showed that DevOps is required for succeeding in developing modern applications. For example, the most popular apps in the different app stores are all updated on a daily to weekly basis. This can’t be done without a good DevOps implementation.<br />
<br />
So Microsofts vision is clear. They are really pushing on Mobile and Cloud and are underpinning this with their ALM tooling. Visual Studio 2015, Visual Studio Online and Azure will be the future of their investments and if we want to stay up to date as ALM consultants that’s where we should focus.<br />
<em><br /></em>
<em>All in all, it where a nice couple of days and I’m looking forward to the summit next year! Are you looking into Cloud, Mobile and DevOps on the Microsoft stack? Please let me know!</em><br />
<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/05470355439791004016noreply@blogger.com0tag:blogger.com,1999:blog-5127893759416610161.post-16317307791461340842014-11-04T08:55:00.001+01:002014-11-04T08:57:44.870+01:00My favorite books: Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation<p>Lately I often get the question: “Which books do you suggest?”. So since I have only have a <a href="http://www.hanselman.com/blog/DoTheyDeserveTheGiftOfYourKeystrokes.aspx">finite number of key strokes left</a>, I’m starting a list of books on my blog that I recommend.</p>
<p>The focus of the books I read are on ALM/DevOps and Microsoft technology in general. For me, reading is one of the best ways to learn. I use Twitter and blogs to stay up to date with new developments but if I really want to learn something, I love a good book.</p>
<p>So without further ado, here is a book I definitely recommend:</p>
<h3>Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation</h3>
<p><img style="margin: 0px 10px 0px 0px; display: inline" src="data:image/jpeg;base64,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" width="152" align="left" height="216"></p>
<p>The fact that this book is in the Martin Fowler series should be a trigger for reading it. The Fowler series has some great books and this is no exception. </p>
<p>The book is all about moving a project to adopt Continuous Delivery. Focusing on the concept of a delivery pipeline it discusses the different phases in your pipeline and shows ways how to implement them.</p>
<p>The book does not specifically focus on Microsoft technology but the concepts discussed are technology agnostic so you can apply in whatever environment you’re working.</p>
<p>The book is not perfect. Some content is repeated quite often and I found the later chapters a little less interesting. However, if you are serious about ALM and DevOps, <a href="http://www.amazon.com/Continuous-Delivery-Deployment-Automation-Addison-Wesley/dp/0321601912">go get it now</a>!</p>
<p><em>Did you read this book? Did you like it? Or do you have any other books that you recommend? Please leave a comment!</em></p>Anonymoushttp://www.blogger.com/profile/05470355439791004016noreply@blogger.com0tag:blogger.com,1999:blog-5127893759416610161.post-2270976901484805712014-10-07T10:41:00.000+02:002014-10-07T10:41:54.679+02:00Optimizing Team Foundation Server Build TimeFast feedback is important. Knowing you broke something a month ago or just a few minutes ago can make a huge difference.<br />
<br />
More and more teams use a build server to compile the code and run a variety of checks on each check in. This is often referred to as the commit stage. One nice feature of TFS to make sure the quality of your code base is guarded, is a Gated Check-in. A Gated Check-means the whole commit stage is executed on some code a developer wants to check in. Only when the commit stage succeeds, the check in is allowed.<br />
<br />
This way, you can be sure that the code on your server is always in a good state. An important characteristic of successful gated check-ins is that they are fast. If developers have to wait a long time, they will start checking in less regularly and find ways around your build server to share code with other developers.<br />
<br />
How can you optimize the build time of your Gated check-in?<br />
<h3>
<br /></h3>
<h3>
What’s acceptable?</h3>
<br />
An acceptable build time depends on your team. However, from experience you should aim for a Gated Check-in build of less then five minutes. Somewhere around one to two minutes would be perfect but that’s often hard to realize. It’s important to regularly check your build time and make sure you constantly optimize whenever necessary.<br />
<h3>
<br /></h3>
<h3>
1. Check your hardware</h3>
<br />
The Team Foundation Server build architecture consists of two important parts:<br />
<ul>
<li>Build Controllers </li>
<li>Build Agents</li>
</ul>
A Build Controller connect to Team Foundation Server. They monitor your build queue and contain the logic of executing the build workflow. The actual build runs on a Build Agent. This means that Build Controllers and Build Agents have different resource needs.<br />
<br />
A Controller is memory intensive. An Agent is both CPU and Disk intensive. When you do a default installation of a TFS Build Server, both the Agent and the Controller are installed on the same machine. This is an easy setup and requires less servers but if build speed becomes an issue, an easy solution is just to scale out your build hardware. Moving your agents to a different server then your controller is a first and easy step. <br />
<br />
Instead of scaling out you can also scale up by using a machine with more CPU cores, more memory and faster disks. I was at a customer once where their Build took 90 minutes to run. Because they where constrained on their on-premises hardware, we moved the build server to Azure. By using a larger VM size on Azure the build time dropped to 15 minutes. That’s a very quick win. <br />
<h3>
<br /></h3>
<h3>
2. What are you building?</h3>
<br />
When you create a new standard Build Definition in Visual Studio, you get a build that monitors all the code in your team project. This is easy to get started since you probably only have a single source tree with one solution file in it that contains your code. <br />
<br />
This is defined in your Source Settings in your Build Definition file as you can see in the following image:<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKXDGjVFYXURwu6WjMfFyibeBo0Hkt069hA66g_4XEymcvv0DHpFi6lw3II69hbhJYflpkl6v8fh85eS-ZGOoyJpCnQ5T5pVEGJWx6y8P61cCzBaJSqblAsFY5iFX1UaQ6Oqw8i0_Xouw5/s1600-h/image%25255B6%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUq3p5B3Zlr_feS8xHsHYWMCxaeQ-u8Sz4e8MvYPNUXROZtN1qGL_rNFVJDxhug9JXTAFfMCe1DdfMmbYCvUEhQZhwFUGf_2WrVhZgsxVUXtB2g2g75zC0TuILhVrjPvMC_ziUpBJ8_IEi/?imgmax=800" height="226" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="554" /></a> <br />
<br />
Here you see there are two work folders defined. One points to your source code and is marked as Active. The Cloaked working folder makes sure that your Drops folder (which is created by a build that copies the resulting binaries to the TFS server) is not monitored.<br />
<br />
When the Build server starts a new Build it will get a fresh copy (in the following section you will see if this is incremental or from scratch) of all the source files beneath your work folder mapping. <br />
If you start getting multiple branches or other folders that contain documentation or other non-essential stuff for your build, the build server will download all those files every time a build runs.<br />
<br />
Modifying your Source Settings to only include the files you really need can speed up your build time quite substantially. <br />
<h3>
<br /></h3>
<h3>
3. How are you getting your sources?</h3>
<br />
If you create a new Build Definition you will see the following setting in the Process tab:<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFjde_DqfJvKfbq79YYTtmvUPdZwFkQYeIAHLVMgjZBiUf70WnOh-xl-kFhatpbADXX3gMYN4EVRXa2927W6NSvi65RVVKo6Gpkp2G9x67gDsD67epqsryFJBh-bG4JMZXifLrNQx7o_3b/s1600-h/image%25255B10%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE6H1H9bZovUfgmNgWE2TKCzz7_q3PnRHW0t5OwGAZY0uVXxtlR2bcHUoR373tF8rmqS_qKIZIB3aTHwvgwvLCLfLEa1SCCum79SDuTAi6KxEWG5rfX0WE-xMst0iDuXIPIDabZvl2_aaH/?imgmax=800" height="226" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="554" /></a> <br />
<br />
What’s important to note is that the Clean workspace property is set to true. This means that every time a build runs, all the source files are first removed from the Build Server and then the whole source tree is downloaded. <br />
<br />
By setting this value to false, you will do an incremental get, just as you would in Visual Studio. The Build Server will only download the files that have changed since the last build.<br />
<br />
Now of course, this is a nice default. Having a clean slate every time you run a build makes sure you won’t have any artifacts left from previous builds. <br />
<br />
But you know your code and your team best. You can experiment with setting this value to false and checking what it does to your build time.<br />
<h3>
<br /></h3>
<h3>
4. Where are you getting your sources from?</h3>
<br />
Normally you connect your Build Server directly to Team Foundation Server. This means that when the Build Server needs to download a newer version of a file, it will go directly to the TFS server and download it from their. <br />
<br />
By using a Team Foundation Server Proxy you can use an in-between cache that sits between your Build Server and the TFS Server. The proxy will cache source files and optimizes getting files from TFS. Especially when your Build Server and TFS Server are not co-located, a proxy can save you huge amounts of time by installing it nearby your Build Server (on a controller machine or on a separate server in the same location as your Build infrastructure).<br />
<br />
See the following MSDN article for configuration details: <a href="http://msdn.microsoft.com/en-us/library/cc716770.aspx">Configure Team Foundation Build Service to Use Team Foundation Server Proxy</a><br />
<h3>
<br /></h3>
<h3>
5. How are you building?</h3>
<br />
There is a huge change your Build Agent is running on a multi-core machine. MSBuild, which is used in the Build Template to do the actual compiling of your code, has an option to start using multiple cores and parallelizing your build process.<br />
<br />
If you look at <a href="http://msdn.microsoft.com/en-us/library/ms164311.aspx">MSDN</a> you will see the following documentation:<br />
<table border="0" cellpadding="2" cellspacing="0" style="width: 550px;"> <tbody>
<tr> <td valign="top" width="100">/maxcpucount[:number] <br />
</td> <td valign="top" width="75">/m[:number]</td> <td valign="top" width="275">Specifies the maximum number of concurrent processes to use when building. If you don't include this switch, the default value is 1. If you include this switch without specifying a value, MSBuild will use up to the number of processors in the computer. For more information, see <a href="http://msdn.microsoft.com/en-us/library/bb651793.aspx">Building Multiple Projects in Parallel with MSBuild</a>. <br />
The following example instructs MSBuild to build using three MSBuild processes, which allows three projects to build at the same time: <br />
msbuild myproject.proj /maxcpucount:3<br />
<br /></td></tr>
</tbody></table>
<br />
By adding the /m option to your TFS Build you will start utilizing multiple cores to execute your build. You can add this option in your Process tab for the MSBuild arguments property. This is also a setting you have to test and make sure it works for you. Sometimes you will get Access Denied errors because multiple processes are trying to write to the same folder.<br />
<h3>
<br /></h3>
<h3>
6. Building less</h3>
<br />
When you are dealing with a huge application that maybe exists of several sub applications, you can start splitting your application in distinct parts that can be build separately. By using NuGet and your own NuGet repository you can then have those subparts publish a precompiled and ready to go NuGet package. This package can then be used by other applications that depend on it.<br />
<br />
This means that you won’t have to build all your source code every time you run a build. Instead you only build those parts that have changed and reuse the resulting NuGet packages in other parts of your build.<br />
<br />
If you have a look at the <a href="http://docs.nuget.org/">NuGet documentation</a> you will find some easy steps that allow you to create a package and setup your own NuGet server.<br />
<em><br /></em>
<em>And these are my favorite steps for optimizing a TFS build. What are your favorite steps? Anything that I missed? Please leave a comment!</em>Anonymoushttp://www.blogger.com/profile/05470355439791004016noreply@blogger.com0tag:blogger.com,1999:blog-5127893759416610161.post-62354354027123706752014-09-23T11:31:00.000+02:002014-09-23T11:31:05.661+02:00My SDN presentationsLast week I had two presentations and one ask the experts at <a href="http://www.sdn.nl/">SDN</a>. If you are in the Netherlands, SDN is a great event to visit!<br />
<br />
<h3>
What you may have missed in C#</h3>
<div>
<br /></div>
C# 6 is coming with a bunch of new features that are pretty exciting. However, have you already mastered all the previous versions of C#? In this session you will take a swift tour across all versions of C# first, making sure that you’re up to date on everything, followed by an in-depth focus on the new features of C# 6. Finally you will learn how Roslyn, the new C# compiler, will change your live as a C# developer.<br />
<br />
<a href="http://1drv.ms/1v3kd6R">Slides</a><br />
<h3>
<br /></h3>
<h3>
Getting some Insight with Application Insight</h3>
<div>
<br /></div>
Do you know what your customers are doing? Can you respond quickly to incidents? Do you know the favorite features of your customer? This session will show you how to get insight into these things and more. You will learn how to use Application Insight to monitor your web, native and desktop applications. Through code examples and real world scenarios you will see what Application Insights can offer you and how you can start using it right away. <br />
<br />
<a href="http://1drv.ms/1v3kiaJ">Slides</a><br />
<br />
<h3>
Ask the experts</h3>
<div>
<br /></div>
At the end of the day <a href="https://twitter.com/HassanFad">Hassan Fadili</a> (my friend and fellow ALM enthusiast) had an hour of Ask The Experts. We had some interesting discussions ranging from PowerShell Desired State Configuration and Release Management to build server optimizations. <br />
All in all, it was a great day!<br />
<br />
<em>If you are interested in having a .NET or ALM session at your company, send me a mail or leave a comment!</em>Anonymoushttp://www.blogger.com/profile/05470355439791004016noreply@blogger.com0tag:blogger.com,1999:blog-5127893759416610161.post-69079722697211348182014-09-16T15:34:00.000+02:002014-09-16T15:34:40.579+02:00Have you already heard about PowerShell Desired State Configuration?What?! PowerShell, isn’t that for IT pro’s? I thought this was a blog by a <em>developer</em>. Well, it’s true that I am a software developer at heart. But that doesn’t mean you should ignore what’s going on in the IT pro world.<br />
<br />
<h3>
Why should I care: meet Bob and Joe</h3>
<div>
<br /></div>
Meet Bob the Developer. Bob works on a great new application: project Unicorn. He uses cool techniques like Angular, ASP.NET MVC, WebAPI and Entity Framework to build a stunning SPA. But in essence his application is a web based app with a SQL Server database. <br />
<br />
Bob has a great team of developers and they are producing quite some code. After a couple of weeks, a tester joins the team and asks if there is a testing environment available. So Bob goes of to the IT guys and asks them for a new machine. Fortunate as Bob is, it only takes a couple of days before his machine is ready! He gets the credentials to remotely access his Windows Server. Now as a true developer, Bob knows how to install IIS and SQL Server by clicking next –> next –> finish. After doing this, he copies his website and database to the machine, fiddles with some configuration settings and he’s good to go.<br />
<br />
All of this is done through a set of GUIs like the Control Panel and Microsoft Management Console. Now that’s not a big problem for Bob. He knows how to do this. And while doing this, he installs his favorite tools and plugins for Windows. Who likes that new start menu on Windows Server? And having Visual Studio locally on the test environment is much easier to debug some stuff.<br />
Meet Joe, the IT pro. Joe is given the job to prepare a production environment for Unicorn. He looks at Bobs test environment, shudders and starts working on a production environment with all the bells and whistles that are required to get a stable and secure environment that’s up to <em>his</em> standards.<br />
Joe uses PowerShell. He needs to configure a lot of machines and he doesn’t want to do it by hand. Instead he has collected a great amount of scripts over time that he stores on his hard drive and shares with some of his colleagues. <br />
<br />
<h3>
Things start breaking down</h3>
<div>
<br /></div>
Until now, this doesn’t sound to bad. Maybe you have been a Bob or a Joe in a situation like this. But then, Joe calls Bob.<br />
<br />
Joe: Your application doesn’t work<br />
Bob: Yes it does. It not only works on my machine but also on the test environment<br />
Joe: But it doesn’t work in production and that’s the only thing that matters<br />
<br />
Bob who clicked through all his GUIs has no idea what changes he made. And so the search begins. After a long and heated search, Bob and Joe decide they really don’t like each other. Eventually the problem is found: a permission setting is required for a logs folder.<br />
<br />
<h3>
So what does this have to do with PowerShell Desired State Configuration?</h3>
<div>
<br /></div>
Can you explain what the following scripts does?<br />
<br />
<pre class="brush: csharp;">Configuration ContosoWebsite
{
param ($MachineName)
Node $MachineName
{
#Install the IIS Role
WindowsFeature IIS
{
Ensure = “Present”
Name = “Web-Server”
}
#Install ASP.NET 4.5
WindowsFeature ASP
{
Ensure = “Present”
Name = “Web-Asp-Net45”
}
}
}</pre>
<br />
It’s not too hard is it? This is a PowerShell DSC script. It instructs a server to make sure that IIS and ASP.NET are installed. <br />
<br />
This script is plain text. It can be read by a developer and an IT pro. Now imagine that Bob would have set down with Joe when he started preparing a test environment. Instead of clicking through a GUI, Bob asked Joe to help him create a DSC script. This script describes exactly what state the server should be in.<br />
<br />
Since it’s just a script, it can be added to version control. Now that it is in version control, it can be added to the package that Continuous Integration build creates. <br />
<br />
Release Management Update 3 has support for DSC. This means that after your build finishes, Release Management takes your DSC files and applies them to the set of servers you have in your environment. At the start, these machines can be completely clean. Everything is configured automatically when the DSC script gets applied. Whenever someone makes a manual change to a machine, the script reruns and the machine autocorrects itself.<br />
<br />
<strong>Now that the script is finished, can you imagine how Joe setups the new production environment?</strong><br />
<strong><br /></strong>
If you want to know more about PowerShell DSC, have a look at <a href="http://powershell.org/">http://powershell.org</a>. They have some great resources on DSC.<br />
<br />
<em>Feedback? Questions? Please leave a comment</em>Anonymoushttp://www.blogger.com/profile/05470355439791004016noreply@blogger.com0tag:blogger.com,1999:blog-5127893759416610161.post-57422198665075580132014-09-09T11:33:00.000+02:002014-09-09T11:33:52.182+02:00Adding Code Metrics to your Team Foundation Server 2013 BuildWhen implementing a Deployment Pipeline for your application, the first step is the Commit phase. This step should do as many sanity checks on your code as possible in the shortest amount of time.Later steps will actually deploy your application and start running all kinds of other tests. <br />
<br />
One check I wanted to add to a Commit phase was calculating the Code Metrics for the code base. Code Metrics do a static analysis on the quality of your code and help you pinpoint those types or methods that have potential problems. You can <a href="http://msdn.microsoft.com/en-us/library/bb385914.aspx">find more info on Code Metrics at MSDN</a>.<br />
<br />
<h3>
Extending your Team Foundation Server Build</h3>
<div>
<br /></div>
Fortunately for us, TFS uses a workflow based process template to orchestrate builds. This workflow is based on Windows Workflow Foundation and you can extend it by adding your own (custom) activities to it.<br />
<br />
If you have a look at <a href="https://github.com/tfsbuildextensions/CustomActivities">GitHub</a> you’ll find a lot of custom created activities that you can use in your own templates. One of those is the Code Metric activity that uses the <a href="http://www.microsoft.com/en-us/download/details.aspx?id=41647">Code Metric Powertool</a> to calculate Code Metrics from the command line.<br />
<br />
If you <a href="https://tfsbuildextensions.codeplex.com/wikipage?title=How%20to%20integrate%20the%20codemetric%20build%20activity&referringTitle=Documentation">check the documentation</a>, using the Code Metric activity comes down to downloading the assemblies, storing them in version control and then adding the custom activity to your build template.<br />
<br />
And that would be true if you wouldn’t be running on Visual Studio/Team Foundation Server 2013. For example, check the following <a href="https://github.com/tfsbuildextensions/CustomActivities/blob/master/Source/Activities/CodeQuality/CodeMetrics/CodeMetrics.cs#L559">line of code on GitHub</a>:<br />
<br />
<pre class="brush: csharp">string metricsExePath = Path.Combine(ProgramFilesX86(),
@"Microsoft Visual Studio 11.0\Team Tools\
Static Analysis Tools\FxCop\metrics.exe");</pre>
<pre class="brush: csharp">
</pre>
<br />
This code still points to the old version of the Code Metrics Powertool. There where also some other errors in the Activity. For example, setting FailBuildOnError to false won’t have any effect. <br />
<br />
Fortunately, all the activities are open source. Changing the path was easy. Fixing the FailBuildOnError bug was a little harder since it’s impossible (to my knowledge) to debug the custom activities directly on the Build server.<br />
<br />
<h3>
But there is a NuGet package for that!</h3>
<div>
<br /></div>
But as a good developer, we first create a unit test that shows the bug really exist. By fixing the unit test, we then fix our bug. Unit testing Workflow activities is made a lot easier with the <a href="https://www.nuget.org/packages/Microsoft.Activities.UnitTesting">Microsoft.Activities.UnitTesting</a> NuGet package.<br />
<br />
Using this NuGet package I came up with the following ‘integration’ test:<br />
<pre class="brush: csharp;">[TestMethod]
[DeploymentItem("Activities.CodeMetrics.DummyProject.dll")]
public void MakeSureABuildDoesNoFailWhenFailBuildOnErrorIsFalse()
{
var activity = new CodeMetrics();
var buildDetailMock = new Mock<IBuildDetail>();
buildDetailMock.SetupAllProperties();
var buildLoggingExtensionMock = new Mock<IBuildLoggingExtension>();
var host = WorkflowInvokerTest.Create(activity);
host.Extensions.Add<IBuildDetail>(() => buildDetailMock.Object);
host.Extensions.Add<IBuildLoggingExtension>(() =>
buildLoggingExtensionMock.Object);
host.InArguments.BinariesDirectory =
TestContext.DeploymentDirectory;
host.InArguments.FilesToProcess = new List<string>
{
"Activities.CodeMetrics.DummyProject.dll"
};
host.InArguments.LinesOfCodeErrorThreshold = 25;
host.InArguments.LinesOfCodeWarningThreshold = 20;
host.InArguments.MaintainabilityIndexErrorThreshold = 60;
host.InArguments.MaintainabilityIndexWarningThreshold = 80;
host.InArguments.FailBuildOnError = false;
try
{
// Act
host.TestActivity();
Assert.AreEqual(BuildStatus.PartiallySucceeded,
buildDetailMock.Object.Status);
}
finally
{
host.Tracking.Trace();
}
}</pre>
<br />
I’ve configured the Code Metrics activity to run the analysis against a Dummy project dll with some threshold settings and of course the FailBuildOnError set to false. Fixing the test is left as an exercise to the reader ;)<br />
<br />
<h3>
Extending the Build Template</h3>
<br />
As a final step I’ve added parameters to configure the different thresholds and some other important settings to the Build workflow. That way, a user can configure the Code Metrics activity by editing the Build Definition:<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_xWzcsXZIwM9Y5Pl4dmU20JFSYS8eYkqu8c9jzjJmwcqk9kMg8gQ4481nzNgEPtEcs4i16Fsd3D41cgiUmpBz7d-cAdyFD43-c-rNX1yvjsAoudkqyoTop-sSZScwS9oQR2AMZoFkfA5a/s1600-h/image%25255B3%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoFuNPtwCL4vVi5LTsat_AmLmbQeIsrJQz95SR7i31gHzekzStEUlmE1M-NYGrMIWb5rpl5jWFnAHvYmLYUd6F9bVktZNkiu2L4xa9LRzhfQ76-ZEmzw16-34UKrgagHcEB-XFK1VO_Vma/?imgmax=800" height="329" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="image" width="554" /></a> <br />
<br />
And that’s it! You can download the code with the modified activity code, the workflow unit test and a copy of an implemented build workflow template <a href="http://1drv.ms/YsOf98">here</a>.<br />
<br />
<em>Useful? Feedback? Please leave a comment!</em>Anonymoushttp://www.blogger.com/profile/05470355439791004016noreply@blogger.com0tag:blogger.com,1999:blog-5127893759416610161.post-60814899623913779342014-09-02T12:14:00.001+02:002014-09-02T12:14:00.087+02:00To version control, or to source control: that’s the question<p>One of the hardest things in software development is naming things. When designing your architecture, creating a method or adding a new variable: naming it correctly is half the work. This is why design patterns that create a shared vocabulary is so important.</p> <p>But naming doesn’t only apply to our code and designs. We use all kinds of tools,. techniques and practices that need to have a name and some are around for quite a while.</p> <p>However, that doesn’t mean there isn’t any confusion on naming those things.</p> <h3>Version control or source control?</h3> <p>One particular area of naming problems is around source or version control. If you think about it for a moment, what term are the people around you using? What do you use? And can you describe the differences between those two terms?</p> <p>For example, I was privileged to hear the following discussion at a customer:</p> <p><strong><em>Developer</em></strong>: we would like a way to bring the environment configuration under source control so we can version and test them<br><strong><em>Ops</em></strong>: You don’t have to test our environment configuration. That’s our job. Our configuration scripts are not code so we don’t want to store them in source control.</p> <p>Is it true that your source control can only be used for actual source code? Is that the reason we started using source control? Or do you use it for all your artifacts like documentation and configuration, build and deployment scripts?</p> <p>When moving to a DevOps culture discussions like these are not uncommon. Making sure that you have a shared vocabulary with all stakeholders really helps in getting your communication running smoothly. </p> <p>Switching from source control to version control is a small and simple step in that direction.</p> Anonymoushttp://www.blogger.com/profile/05470355439791004016noreply@blogger.com0tag:blogger.com,1999:blog-5127893759416610161.post-5717241317556426512014-08-26T14:29:00.002+02:002014-08-26T14:29:58.720+02:00Do you know Microsoft Test Manager?Application Lifecycle Management is all about getting traceability, visibility and automation into your software development process. When I see customers implementing ALM, they start with things like source control, project management tooling and build servers. Some of the more advanced development teams start looking at release management to automate their deployments.
One area however that's often overlooked is testing. All to often I see companies use Excel to track their test cases. Testers spent a lot of time executing there tests manually and tracking their progress. When it comes to goals such as continuous delivery, a non-efficient testing process can be a big obstacle.
<br />
<br />
One of the better kept secrets of the Microsoft ALM implementation is Microsoft Test Manager. MTM can help testers with their work and integrate them fully into the ALM process of the overall team.
<br />
<br />
In this blog post I want to highlight a few options that got me enthusiastic about using MTM.<br />
<div>
<br /></div>
<h3 __vstttracked="1">
Meet Microsoft Test Manager</h3>
<div>
<br /></div>
<img __vstttracked="1" align="right" alt="vs test professional 2013 with msdn" src="http://cdn1.visualstudio.com/dynimg/IC693380.jpg" style="display: inline; margin-left: 0px; margin-right: 0px;" />
As developers we use Visual Studio. Project managers use the web interface of TFS and Excel.
Testers use Microsoft Test Manager. MTM is specifically created for testers. The application is a lot easier to use than Visual Studio and really helps testers in getting their work done.
<br />
<blockquote __vstttracked="1">
You can download a free, <a __vstttracked="1" href="http://www.visualstudio.com/en-us/products/visual-studio-test-professional-with-msdn-vs">90 day trial of Visual Studio Test Professional to checkout all the capabilities of MTM</a>.
</blockquote>
<br />
<h3 __vstttracked="1">
Fast forwarding your tests</h3>
<div>
<br /></div>
MTM lets testers create test cases that record the steps to test some functionality. A typical test case is shown in the following screenshot of MTM.<br />
<a __vstttracked="1" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhntodCeK1yxpzHam_69bqWp0dV_q5dCx5uXKpQDFTPUL8IaW7ZUI9pMIbTdt9X0CkFxC09cGs6r8AJn08D-kme3lzNDJP8RG4aOfriL3SH21ePcEQ8KTmfQ0fXoXIjxaybXzWw9Z7rDEiV/s1600-h/image%25255B3%25255D.png"><img __vstttracked="1" alt="Test Case in MTM" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhusdIha2e8AbTxsqIzYfzDbybCHQqn0ZNVk57ds1FoDRECFNAa_X1MMvwuKhyphenhyphenWrCIvNntVot_vNEovK6s0H2ttzQchiNgvWa4Q865Jfi3wtHuO9QN8vdjF7wsjwOM8WYyC1NPecasHmRKf/?imgmax=800" height="382" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="Test Case in MTM" width="554" /></a><br />
<br />
Here you see a test case with a couple of test actions and an expected result. One of the coolest features of MTM is the ability to record your test steps while manually running the test. The next time you execute the test case, you can fast forward through the steps and only pause on the interesting steps. Recording steps works in a lot of applications.
The following screenshot shows how a previously recorded test case is automatically played back. In this case, you will see MTM automatically open your browser, navigate to the correct website, perform some actions on the site and then pause so you can decide if the outcome is correct.<br />
<br />
<a __vstttracked="1" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirflOnEd5iPWUjweB65bripvAPBTqAoFdtKglPmNPsNMcRZKqI2YaTKguzjPreipnJEN52daCBfa18kmmBSmk1-hsP7jJTH5nTdoEhskoRnYn_6b4sgdcsPnSP04iikvzoRI9erVp-sNr_/s1600-h/image%25255B13%25255D.png"><img __vstttracked="1" alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGxOYh3Xwhp9YUSB4Jdc5Wkl_xSbF9fOPp56G7q5zV9DnUWVZ4P-Lu7kFG3PVPXIiP8_9U-AHlhQp62Cz_vkd04vFPpvxCpeNTXlWKiIExrTm_xEEL1x8I-gdytGo9DdH6PDPU9zHDqT6Z/?imgmax=800" height="604" style="border: 0px; display: inline;" title="image" width="254" /></a><br />
<br />
Imagine how much time this can save your testers! Instead of having to manually repeat all steps for every test case they are executing, they can automatically fast forward to the interesting steps in their test.
<br />
<br />
<h3 __vstttracked="1">
Data Collection</h3>
<div>
<br /></div>
When running a test case, MTM helps you by automatically collecting all kinds of data that can help in reproducing and fixing bugs. This is done by using so called Data Collectors. By default, you can collect System Information like Windows version, resolution, language settings and much more. But as you can see in the following screenshot this list can easily be expanded:<br />
<a __vstttracked="1" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9-miT-5pw7SUJJO5avR6MNGvgyN9xkBpUknJhicijtkU5G2rBGA8OOE-HUnMqFQLlj5jbzBkS8CMVviYZhhgYmEfyU12ENeYAr8qTsnNya2G_UmM9XyH7azRvX_8l7QOBAj3UwK4uEwXW/s1600-h/image%25255B17%25255D.png"><img __vstttracked="1" alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEHEbBC1aaD6cxQQc1iAL-nelLjrz6V4_N-RYFHBX7X9zCjUBkoOqLbbAkw6uOQeI39mpMLBB11ccxjkYaU_gfdeOgxcpEIE_AAQn9f8MjK_wtDEb4mCVR1uOnwK6gw_7knbW0MGvbW3K2/?imgmax=800" height="478" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="image" width="554" /></a><br />
<br />
One of the options is to record your testers screen and voice. Or what about IntelliTrace data? When data is collected, it gets automatically attached to the test case or any bugs created by the tester. No more struggling with testers to get all the information you need to fix a bug. Just configure a Data Collector for them and let them run their tests while you get all the data you want.<br />
<br />
One notable option is Test Impact analysis. When you go full ALM with TFS, you can configure your build servers to deploy to test environments. The build server can analyze what has changed in a certain build and map this to the test cases that your testers are running. By combining this data, MTM can do a pretty good prediction of which test cases need to run on a new version of your application.
<br />
<br />
<h3 __vstttracked="1">
Exploratory Testing</h3>
<div>
<br /></div>
What if you have no formal test cases or you don’t have any testers on your team? What if you want to do some testing work as a developer or let a stakeholder go through your application while making sure you can reproduce what he's done? Meet Exploratory Testing. By starting an Exploratory Testing session from MTM you can follow your own intuition and test whatever looks important to you. In the mean time, the full power of MTM helps you by recording your actions, allowing you to easily create screenshots and add comments to your testing session. Whenever you encounter a bug, you can attach all relevant recorded data to your bug and put in TFS.
For example, the following bug is created while running an exploratory testing session. Do you notice the steps automatically recorded in the Steps to reproduce panel? You can edit those steps, add extra information and combine this with the automatically collected video or IntelliTrace data.<br />
<a __vstttracked="1" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_BuTTwiklXUwvW0dE4iTVZV_8qtpa6qYJc5-yE8hwJLtFVXsNz6kK4WIZAoLsAdlEZ99SmASnjzmGah9mx-j817L45ja8pL0vTS-d1yujeKz2696hXUNw24KpMsHYAcGVpfNSFLiy_Uw0/s1600-h/image%25255B21%25255D.png"><img __vstttracked="1" alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1_ZyyXenAbgbyQYoCJdb4ZkU6xwN8JJHK2yTtCfKTISEkzrKSLj83S12Fpnl_M2c_xcTnNcFSUbjKdRZIR2oJgAtXhAlRUxICCEy2snpGOmm_t-G6QsV0EhUqJ-ZO0Z2sjUwbE1MCCoOx/?imgmax=800" height="476" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="image" width="554" /></a><br />
<br />
<h3 __vstttracked="1">
MTM is cool!</h3>
<div>
<br /></div>
These are only three of the features that get me enthusiastic about MTM. However, there is a lot more. Using parameters, tracking progress, using different configurations, using the web interface and much more.
If you want to experiment with MTM, you can download the <a __vstttracked="1" href="http://www.visualstudio.com/en-us/products/visual-studio-test-professional-with-msdn-vs">90 day trial of Visual Studio Test Professional </a>or get the <a __vstttracked="1" href="http://blogs.msdn.com/b/briankel/archive/2013/04/17/list-of-all-visual-studio-alm-virtual-machines.aspx">Brian Keller VM with a couple of Hands On Labs</a> to quickly get a tour of all MTM has to offer you.<br />
<br />
Let me know what you think of it!<br />
<br />
<em __vstttracked="1">Questions? Feedback? Please leave a comment!</em>Anonymoushttp://www.blogger.com/profile/05470355439791004016noreply@blogger.com1tag:blogger.com,1999:blog-5127893759416610161.post-30073644963582653532014-08-19T10:52:00.001+02:002014-08-19T11:02:29.110+02:00Accessing TFS from behind a proxyLately I’ve been working with a client with very strict security rules. One of their policies is that all internet traffic runs through a proxy. This causes some problems when accessing a remote Team Foundation Server over HTTP.<br />
<br />
One of the issues we ran into was using Excel to connect to Team Foundation Server to select queries and edit work items.<br />
<br />
Excel gave the following error:<br />
<br />
<img alt="enter image description here" src="http://i.stack.imgur.com/v44qx.jpg" height="374" width="500" /><br />
<br />
As you can see, at the bottom a <i>407 Proxy Authentication </i>error is mentioned. This error happens because by default programs like Excel and Visual Studio are not configured to use your proxy settings when connecting to another application.<br />
<br />
<h3>
Proxy settings</h3>
<div>
<br /></div>
Configuring a .NET application can be done by editing the <em>app.config </em>file. If you look at the <a href="http://msdn.microsoft.com/en-us/library/dkwyc043.aspx">MSDN documentation</a> you’ll see that you can use the <em>defaultProxy</em> attribute:<br />
<br />
<pre><defaultProxy enabled="true|false" useDefaultCredentials="true|false"
<bypasslist> … </bypasslist>
<proxy> … </proxy>
<module> … </module>
/></pre>
<pre></pre>
The most important settings for our situation are the <em>enabled </em>and <em>useDefaultCredentials </em>attribute. Both should be set to true to make sure that Excel uses the proxy settings when connecting to TFS.<br />
<br />
You can also specify a <em>proxy </em>element that specifies which proxy can be used:
<br />
<br />
<pre><proxy usesystemdefault="True" bypassonlocal="True"/></pre>
<pre></pre>
By setting <em>usesystemdefault</em> to <em>True</em>, your application will use the proxy settings that are configured in Internet Explorer. In corporate environments these settings are most often configured through a group policy so all computers have the correct settings.<br />
<br />
Combining these will give you the following:<br />
<br />
<pre><?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.net>
<defaultProxy enabled="true"
useDefaultCredentials="true">
<proxy usesystemdefault="True"
bypassonlocal="True"/>
</defaultProxy>
</system.net>
</configuration></pre>
<h3>
Configuring Excel</h3>
<div>
<br /></div>
When you have a 32bit version of Excel 2013 installed, your executable file can be found in:<br />
<br />
<em>C:\Program Files (x86)\Microsoft Office\Office15</em><br />
<em><br /></em>
If you have a different version of Excel (like 2007), you have to look in your Microsoft Office folder for the correct version number.<br />
<br />
To add the proxy configuration, add a new text file named: <i>excel.app.config </i>with the following content:<br />
<br />
<pre><?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.net>
<defaultProxy enabled="true"
useDefaultCredentials="true">
<proxy usesystemdefault="True"
bypassonlocal="True"/>
</defaultProxy>
</system.net>
</configuration></pre>
<pre></pre>
Make sure you restart Excel so that it loads the new settings. And that’s all you have to do. After these settings, Excel will use your proxy configuration and allow you to connect to Team Foundation Server.<br />
<br />
<em>Questions? Feedback? Please leave a comment!</em>Anonymoushttp://www.blogger.com/profile/05470355439791004016noreply@blogger.com3tag:blogger.com,1999:blog-5127893759416610161.post-36935940112084180112014-08-12T12:00:00.001+02:002014-08-12T12:04:32.167+02:00Continuously deploying your database with Release Management - Part 2In <a href="http://wouterdekort.blogspot.nl/2014/08/continuously-deploying-your-database.html">Continuously deploying your database with Release Management – Part 1</a>, we looked at how to use the Sql Server Data Tools to bring your database under source control. By using the Publish wizard you can easily deploy your changes to a target database. <br />
<br />
But this process was still manual. In this blog post, you’ll use Release Management to deploy both your database and web application to a target server.<br />
<br />
<h3>
Configuring your target environment</h3>
<div>
<br /></div>
When using Release Management you need a couple of components:<br />
<br />
<ul>
<li>Team Foundation Server with Release Management installed and configured </li>
<li>Build server </li>
<li>Deployment Agent </li>
<li>Release Management Client</li>
</ul>
<br />
In my scenario, I have TFS running on a virtual machine in Azure (a great way to setup a demo environment!). I’ve installed both the Deployment Agent and the Client at my local development pc (if you have problems connecting your client and agent to the server see <a href="http://wouterdekort.blogspot.nl/2014/07/connecting-release-management-clients.html">Connecting release management clients and deployment agents across domains</a>). I’ve configured Release Management to link to my TFS instance.<br />
<br />
<h3>
Configuring your release path</h3>
<div>
<br /></div>
After you have installed the deployment agent and client on your development machine, you can start configuring your release path.<br />
<br />
First you need to add a new server that points to your local PC. By going to <em>Configure Paths –> Servers –> Scan for New</em> you can select your local PC and add it as a new server.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0asqqwTsxiVzzWeaaekkCQiuJOClBtTdCaScaNoPiB1bXcr7BuyzUJQz9GtY1kbYEW4GKgXRxRzadpKVKuFEH9wFS2wrLbHj1RwvEN3TsVkCoi-MVrVgtViieMix4rgko1RWerKLn9Iww/s1600-h/image11.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBTy_QQwQ8ofu1FBlZTvNWXK0raBgOmTR2GyxIQyPUUZ6eI0i6Ru3_QXIBoHG9HYRsiVAM-HezdLTlqhldOqjU70OpyTdlOqMkvcMBqd359QIcYprxEtlxIWOm0up94lfSe13xvSh_lIlL/?imgmax=800" height="128" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="554" /></a> <br />
<br />
Make sure that you configure the <em>Drop Location Access</em> correctly for your server. If your Agent is part of the Team Foundation Server domain and can access the Build drop location of your build server by UNC Path, you can select the left option. If you’re Agent is outside of the Build domain, you can select the HTTP option. This means that all sources and tools will be copied to your target machine over HTTP(S).<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfL3U7Z-SjkPOyD4Kw6vycYw4OMyC0CEH892S-zypYuYuzhuQm1eqs1rhyuxobjoDKHOIlr_9bZoRk3kI23UEzlbQkBlvoAGDNjyGFfcpTCfJXycnntWfC2xZl79rnUk64gm5AHkj99s56/s1600-h/image19.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5vNyJ7psbyEmUBfqrmQS3yoiad-ou4Qwpruk-IU1Ca-JHNjcfjon75TKe512IWzfMa0uGjZa1Oml-fYx6LmJymK0-zNCDo91pT-ajw9T5wRvkwobmdD4VjoXy1wU7DBFILnE12HDyxDzB/?imgmax=800" height="341" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="554" /></a> <br />
<br />
In Release Management, you link your servers together in an <em>Environment</em>. Maybe your application uses both a database and a web server and you want to link those two servers together. In this sample we use only one server that will host both the database and the website.<br />
<br />
By going to<em> Configure Paths –> Environments</em> you can create a new <em>Environment</em>. By choosing <em>Link Existing </em>you can pick the server you just added to your environment.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhT-B6Te7bI3Q8Qr8_wh8kl_-wCaj0FklRoMfxzFQ92EpoJz7FawxDLUTJRhjwSLco0FeH_G9mbvjmiuXKgsFTwvjBcFd6qqXffNElUfwS_U4aerB92Fna4vGEZFpBW_QSIvmktgWLY6HW/s1600-h/image23.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjnDgl9_xg68INUISKec20ajUubJAiA7eQqK6IJqVn7TwP8AIRMt-ZiDEXopYJyL0ilu7jkRjP3Kqt_DrURrNmivHvG2GusE-bE7YxXV8q4yTu3ETLlfjr1J2u2tu428ux0gGFqHKkYTRj/?imgmax=800" height="348" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="554" /></a> <br />
<br />
Now that you have a server that’s part of an environment it’s time to create your<em> Release Path</em>. A <em>Release Path </em>is the workflow that your application will go through. For example, maybe you are running a DTAP (Development, Test, Acceptance, Production). Your <em>Release Path </em>will determine the order in which you want to deploy to those environments, who’s responsible for which environment and what steps are manual (like verifying a deployment) and which are automated (like running tests).<br />
<br />
If you don’t have any <em>Stage</em> types defined, first go to <em>Administration –> Manage Pick Lists </em>and <em>Add </em>a new <em>Stage Type</em>.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoYY5RQInHbIMAFoNnmP1UxxCbrAyEX0bF40aMG8N7wRFb18w76iEZWgAuyK02w5JjTk9g2mbSSoyJyFzmkXm8oF0GYRJTM6C38wWi-LE1k6NnKSwQWd6XvfJ_jDt3pXtHa6SApMAHrqnJ/s1600-h/image31.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCvIQ6xRZ6Kc5n2HgKT3A0aS1gKrGPelAvDv6pWK0OVwWJkA1iuQWS37u6ytkcrSLRHc418egNzyEe4enIXsrtF7gtneuDct-DGMNjF81kcNsHuGjkMZfdMeFba5cmUt5JiVO9wUN7Daht/?imgmax=800" height="435" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="554" /></a><br />
<br />
You can now create a new <em>Release Path </em>by going to <em>Configure Paths –> Release Paths</em> and choosing <em>New</em>. In this case, your <em>Release Path </em>only has one <em>Stage </em>since we’re using only one environment. If you would have multiple environments you can add multiple stages.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKNzw9IlCqq63JUcxGtM-n2g55nSFIg8JimwtfLw8BgskkoFLfT_nzaq8dsPtGi43ys4zPkLuZ82oa97jwU_sPj0otk5F_yt6BNalUSKH_hTyiyUa4pux3fFYoXXcFOPMecL-b4cKAJywS/s1600-h/image39.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidoR3E_U60vH3axsvpSHxid07bdpxV4SYop_YguVAsMRgvWY8s5zk3YaguWMttEkT68X2JHMg4O5xsVbOijuEsHmqE4yMlutXXDuZVYwhQFgz4M1Ord-J7sprUi2tgmqW5wb8q-_LiVrch/?imgmax=800" height="430" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="554" /></a> <br />
<br />
<h3>
Configuring your Build </h3>
<div>
<br /></div>
Before getting into creating your actual release template, you need to make sure that there is something to deploy. You do so by creating a build that runs on your TFS Build Server and creates the required packages for deploying your application.<br />
<br />
To connect your build to Release Management you need a special<em> Build Template</em>. You can download the correct version <a href="http://1drv.ms/1q6dMLx">here</a>. You need to copy this file to the <em>BuildProcessTemplates</em> folder in your source control (create the folder if it doesn’t exist).<br />
<br />
After checking in the template file, you can now create a build that uses this template. You create a new template by navigation to your <em>Team Explorer –> Builds</em> and selecting <em>New Build Definition</em>.<br />
<br />
You can configure a name for your template and some trigger settings but that’s not really important for now. <br />
<br />
What is important is the tab <em>Build Defaults</em>. Here you should select the option <em>Copy build output to the following drop folder</em>. This drop folder should be accessible by your Build Server and the Release Management Server.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAa1306J-faS9Nra5NcKA0Scs3OkEImJMN7sRAglHi6Br-9JewyrHZDCC22SMQYTqECtv9YtaaZPyzXkYLHu7x2-waZjfm2lSWaQzfBs_CIXojLPQWUWC9qzxYX1bRR_N9wJduOJHpzvpV/s1600-h/image46.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd0eBYpSt9dARPGqclYBjHtrLPZix6xME6X97T87lit9CjMw7de6wlhpt3MHduDwoKdX9XmsoAP1s3MUY6om1DHZYfAyM4150wv80AszDfnAPWMEE1amVYoIjC3t-F3AODmdE7RIsQ3g9b/?imgmax=800" height="384" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="554" /></a> <br />
<br />
On your <em>Process</em> tab, you need to select the <em>ReleaseTfvcTemplate.12.xaml</em> file that you just added to source control. By selecting the <em>New</em> button you can browse source control and find your file in the <em>BuildProcessTemplates </em>folder.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhYeRnsKGTfieYaFQwC8r796ix0DQ42Hl5dV39OechFgYuLYbmULAw_OygpB3WTlT7ypn5HdgOxwqUebr03IFtEPa8C6a-4pgUxMwwIhO_Cr_H13GD2KxKz7176HwuZ_tcckhy3tLuEjkk/s1600-h/image50.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFaxs13EzJNd8OhRjvKmP7pvXzu1k_-fE0Rce-lP6l-RAwwP6aV307bT6voYOO93MPD2r2aPcQtmDogoSWSdQvsh0PogmtX4m7nXnQ2Ohi8k4X4rtrCW3krDJ9CGxpNnGqegJqPP564Ds9/?imgmax=800" height="373" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="554" /></a> <br />
<br />
In the bottom part of the process tab you need to configure your build process. You should specify the solution you want to build and add the build and release configurations.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8btBGS6MAF55_-tSFCoGY7pAxGOmjhCln-xvt_U8Q9c8YQNiI2GvV8steDhLQSxOTECcgEARLUlspisPVOLrLA-jKvSmXeXu2pu5ztSlsy5t725MFqNlciZ6hpnGorYIS46p9vpXyyN6R/s1600-h/image54.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCL1wnljG_88Ea2BTHLeW9KyyzyQkbKz8pJjTga28oXuu-6VV0t1WDZfmJfJVZCHGc8I3HvxMulaS62FbIMidERzlCy2wlbeV-goebD0L6MrNcOqB2RW0jYGVZUFYdFK6s1hQisRG5uVas/?imgmax=800" height="327" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="554" /></a><br />
<br />
Now you can save your <em>Build Definition </em>and fire off a new build! This build will fail because it can’t release your application yet. After your build has failed you can navigate to the drop folder that you configured on your Build Defaults tab. Here you will see a new folder showing up that contains a bunch of files and folders.<br />
<br />
One of those files should be your <em>MyDatabase.dacpac </em>file. Your website will be stored in the folder <em>_PublishedWebsites\GettingStartedWithSSDT.</em><br />
<em><br /></em>
Both the location of your dacpac and website are required for configuring your release template.<br />
<br />
<h3>
Configuring your Release Template</h3>
<div>
<br /></div>
Now you can switch back to the Release Management client and take the final steps in setting up Release Management.<br />
<br />
At the moment you have the following:<br />
<br />
<ul>
<li>A Visual Studio Solution with a website and database project </li>
<li>A Build Definition based on Release Management </li>
<li>A Release Path with one environment that consists of one server</li>
</ul>
<br />
The final step is creating your Release Template. Your application has two parts: the website and your database. For those parts, you need to create a <em>Component</em> in Release Management.<br />
<br />
If you go to <em>Configure Apps –> Components –> New </em>you can create a new <em>Component</em>. To create a component for your website you need to first specify the location in your <em>Build Drop Location</em>.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBIcZDPcL9l99zbmH16MnTngOWTDDC1D6RkQmRSbT-wTg0M8gCxW8GmHHVddByCQzJ5BfozHmU66a6B1kvVF23VDpd2ouDbqcUtvA2xTy7WenwqPs_0uNPVYE1tojcacYtY23yh7nb8ltH/s1600-h/image58.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5g75uyX_WjBkfWeClUsTYM2WiQDXAFj5Xbt4E5F8oXeyVH6WWdkuMehYsULA4_m1sXxf9uAeBBFRIktskfelFDWDeRHl8CJ8Y88MTs5ORl5-ZXZW25Iwn48ETOkHIFLD0j7dD7D8dDCaZ/?imgmax=800" height="430" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="554" /></a> <br />
<br />
And on the <em>Deployment</em> tab you should configure how your website needs to be deployed. One of the easiest options in Release Management is to choose <em>XCopy</em>. This will just copy your website to a specified location (probably an IIS folder) on your target server.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGpixmepXkp1Hm2xdcv93NRUJ2C4UgRAZUWMeU-p6veBzfYm99NMLLLTAlreOwTk1Fwr0mReY5926T02EK9g0v5DcBbYRRKsXx8jl_3LPZDuUo9JkTZ1gxd-D15CdCPnsfC1GGlwYiuHmB/s1600-h/image62.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhV66WO8PrzLliwTR-h-se0Wjzq_AJmtCSajouJbBq9XZ7yigGS68bxhhhhE0fs9b18F_EbO0SvW2p2B40O4RhR8JmfO9ntV8PdndqYxpPOcdkM7wHlyvsVnFn5HwFNuDR_USY-m6v_BLKY/?imgmax=800" height="435" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="554" /></a> <br />
<br />
To create a component for your database specify <em>\ </em>as the <em>Build Drop Location </em>to signal that your <em>dacpac </em>is located at the root of your build drop.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt8sugO59lb3mJ8GNhQ-O3C3fJ4_Pw0s6HzHW_lp0lOBo58rNz4u2uCBcbTqDo4R0plnxlOp78ml25mNPCUy05AUfE2sc68OZvkMInkb8AEU9iqMHExSehO8THAshL3ikiIM4ue0duyxCp/s1600-h/image66.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVZxB4krFzzLziT8NrVtwKx6Xdpg3rQeREu1Lgb4m9dE3_PNk-1t5CQhcJGBPVjgUfaDJdAy0ZHx1Qo5Ipvz5e16d9IYHdJ1-CpVGAlU4hXx4SRChMYFR9xc5BZt4n7rz1pJyu45KieBS8/?imgmax=800" height="430" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="554" /></a> <br />
<br />
And for your Deployment Tool you can select the <em>DACPAC Database Deployer</em>. In my case, I’ve used a custom component called DACPAC Database Deployer v12 to deploy to SQL Server 2014. You can find instructions on how to add this component yourself here: <a href="http://blogs.like10.com/2014/06/10/release-management-for-visual-studio-2013-and-sql-server-2014-database-deployments/">Release Management for Visual Studio 2013 and SQL Server 2014 Database Deployments</a>.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinlanT5x1LelKy5sfgGYADfNsnY-jFzePGZxdJH6HWhht4Ze-92IkL33j-xg8DrlZ6ETYDgDJWbWSye26PpH-IzQAcJzT69FEmX6C8Oqj7VrcR7Poy565OYKUMuMJDMZCvhf4JbMJ0Wqr2/s1600-h/image70.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQwunmh-u5xfiDgodZVJURISRdj0LB2jVayqUjLQy3qlD5l2I-Sqqv2J27llKrpts8UBUa7TK2gUXDN_VK_DsT13EFkysMgnSH3A_W7FkR3KOE8v2EId9qg49hIVOVlJ2AJFQCjdOZqPjR/?imgmax=800" height="430" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="554" /></a> <br />
<br />
<h3>
Creating your Release Template</h3>
<div>
<br /></div>
Now that you have your components, you can use them in your actual <em>Release Template</em>. You start by going to <em>Configure Apps –> Release Templates –> New.</em><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFtQdsnnfsnc9Wdq9fnvsaFLQk23HJibjRgKLFCMFemerGmho7Y52MTXkY-ly1iJlzzQL5r29vBCZm9j4IBmAhwQiVdMI54S4cOXgn-c3ICg7_DM1P8j4mM__BZJVHK1O2P948kX-aSSRx/s1600-h/image75.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVyMzM_QEA9r9ZK7CTGVBFjj40-mFfC8TUok300FX1hS31mrCslZIwdoGej_5ZlmNdkGz25mNInzsM342tII87QIpovUxw7jOM_Ef6XcDHwRoAR3u6O9tgmpM21PJ8-EP1D2QPaFA3m4FW/?imgmax=800" height="422" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="554" /></a> <br />
<br />
Here you map your <em>Release Template </em>to the <em>Release Path </em>you created and to the <em>Build Definition </em>on your TFS server. As you can see, everything is starting to come together.<br />
<br />
In your <em>Toolbox</em> you will see a category called <em>Components</em>. By right clicking here and selecting <em>Add</em> you can link your database and website component to this template.<br />
<br />
You can now drag your target server and the two components you have created to your workflow.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikBOcCrpV0USQRsUt-2eqBjx2EXHI_bmZoL5RluxMJVxIhH7fMPRJeF2061dRlzTcyKGwIwqEpH6v_KnU1SdQT4lABodRs9Av5HbFbmduBcncIU1CO05TRciCWxbOLw8izuUvvqcBWFF-J/s1600-h/image81.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnkYTj6zsIktBCO_fmu7OnmDQUck5TD0Xa13Ut8-L-3w9j9-N2B7WDRfun4VvH3PiD6-WRGmQx0zSh1bEtMoCIz8aCOYTmWyjS848BNRm1DG3qrGJFcLG1_IFn0N7D2NRO4YrQpRnhF4PU/?imgmax=800" height="466" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="354" /></a> <br />
<br />
This template will deploy the dacpac to your localdb instance and copy the website to a local folder on your pc. Of course this template is not production ready yet! You should add backup and rollback steps to make sure that your server stays in a good state when a deployment fails.<br />
<br />
But for this demo, you have setup continuous deployment of your database and website!<br />
<br />
<h3>
Running a Release</h3>
<div>
<br /></div>
If you now switch back to Visual Studio and queue a new build you will trigger the release template you just created.<br />
<br />
Your build will now succeed and you will have a new database <em>MyReleasedDatabase </em>on your localdb instance. If you check your <em>c:\temp </em>folder you should also find your published website there.<br />
<br />
<h3>
Configuring your connection string</h3>
<div>
<br /></div>
One thing you haven’t taken care of is making sure that the connection string of your website points to your newly configured database. <br />
<br />
Release Management supports a process called <em>tokenizing</em> where you define values in your code that you want to be changed during deployment. <br />
<br />
You start by making a copy of your <em>web.config</em> file and naming it <em>web.config.token</em>. Make sure that your file is copied to your output directory.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0okKZ3Ic-VjIzCtO2BQ_9hL97WDK9BW6L5z5ghtc8RpDGryLTchZMAxn6U029gd0pbYwzluQJKSgLChx_QDEEhlPRUMAwJStgpqtCh85uIll5a8dtPn7fSlD7UgRui3fZCxMJAwu6iWTd/s1600-h/image%25255B3%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnN44dx-fnKNyy9IpbzDSrnlKfRKP_V1eahRM19L5dLGNuYJok5XDWPiZaUtqb_f0zMqsyaXoXdo3v5nLV1wkK9ioIDzS-0mVCcdx02jrr88Bh_0-d_rvYL7QDqfsu6KmwfI-_RLL1NUq4/?imgmax=800" height="285" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="354" /></a> <br />
<br />
In the token file you will see that your connection string is:<br />
<br />
<pre><add name="MyModelContainer" connectionString="metadata=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=(localdb)\v11.0;initial catalog=SSDTSample;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /></pre>
<br />
To create a token you change your connection string to:<br />
<br />
<pre><add name="MyModelContainer" connectionString="metadata=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl;provider=System.Data.SqlClient; provider connection string=&quot;__ConnectionString__&quot;" providerName="System.Data.EntityClient" /></pre>
<br />
By replacing the provider connection string with <em>__ConnectionString__</em> you’ve introduced a token called <em>ConnectionString</em>. After adding this file to source control you can configure your token further in your Release Management Client.<br />
<br />
By going to your Website component you can add your tokens on the <em>Configuration Variables</em> tab.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh7uN2MlOgzgcN_mWwbZp2A4ilEJgNS-OnQ9hmibdhBwJRRvXZ2-t6ViaLOjusspUw6zN_G4uHQvWsu5UA_gYjZlaH_2aeIB2JA0jSBJtkchWDkMKuSVKXvJenWaAJxsJ1ZQ3LMBMA0fwl/s1600-h/image89.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidMlLsg_FSROz5g77hIsa5R2mOWPhDcnWgAqWMLFVdOOT5iyb16T3YXrpSrsIrhTfSo8mV8rOxVEMnibAwOm33XGpuSvVPgUhTQfE64LcjGgxFXCYir_4Hwc9YwVwoemJwm9U00vkzGwNE/?imgmax=800" height="430" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="554" /></a> <br />
<br />
<br />
Now when you navigate to your Release Template you see that your Website component has an extra configuration variable named <em><u>ConnectionString</u></em>. Here you can specify the value you want to use for the <em>ConnectionString</em> at deployment.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitnRGu3cR38uy35TDPS-nPoRI6ypgX8HSOu1xvha1gQDronpxlk5Gb5MNOPsWoAgwGLoMiX7bJsn2wU11M6Lj7y-R9fESFQtbtbUk7CB6Thh4lNPYA8tmlOHw5KXq7WxTYomuPY-g_e5DP/s1600-h/image93.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu-e4shPjBqBHigl7ZvB893w1tlP9YQWEbYV79HGmVlJTzwWeJsGNeHlMcmNHH9B_x2krFkwshxSfiJ5P-OZHPV99PmFWbe5-4RLVj1RL8Fm4WgARpHMVw69Oui-OOvVD_pGuRr0H3WjLx/?imgmax=800" height="135" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="354" /></a> <br />
<br />
And that’s it. Queue a new Build and watch how your web.config now has the correct connection string.<br />
<br />
You now have automatic deployment of your website and database with Release Management!<br />
<br />
<em>Questions? Feedback? Please leave a comment</em>Anonymoushttp://www.blogger.com/profile/05470355439791004016noreply@blogger.com1tag:blogger.com,1999:blog-5127893759416610161.post-17138556432258445972014-08-08T10:17:00.001+02:002014-08-08T10:17:36.030+02:00Please restart your PC<p>When a friend calls you with a computer problem, probably one of the first things you say is:</p> <blockquote> <p align="center"><strong>Have you already restarted your PC?</strong></p></blockquote> <p>Well, today I fell into the same trap. I’m currently in the process of installing a Team Foundation Server environment on Azure as a demo environment (If you’ve never done this, a great place to get started is the ALM Ranger guidance found at <a title="http://vsarplanningguide.codeplex.com/" href="http://vsarplanningguide.codeplex.com/">http://vsarplanningguide.codeplex.com/</a> which now has a new supplement on installing TFS on Azure IaaS).</p> <p>So my environment now consists of a TFS Application Tier, a SQL Server 2014 Data Tier and a Build Server.</p> <p>While in the process of installing SQL Server Reporting Services I ran into the following error when viewing the Test Case Readiness report:</p> <blockquote> <p>An error has occurred during report processing. (rsProcessingAborted) <br> Query execution failed for dataset 'dsArea'. (rsErrorExecutingCommand)<br> The Team System cube either does not exist or has not been processed. </p></blockquote> <p>So I started my analysis by running the <a href="http://msdn.microsoft.com/en-us/library/ee248630(v=vs.100).aspx">Team Foundation Server Best Practice Analyzer tool</a>. This gave me the following Reports:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFwm9z_t8gARd0xnooMMuHvyV1ILbO0mEapVqu-PBP1Uz9XlioD424-7_Ih25L6Qk-40d9IK2HP-91SDr9RQ-sPvMoNCiZpqY7ITjEFWXtrHiZmPe7apUwN7svU30Z1-tpJfaj_OTCuFbi/s1600-h/image%25255B3%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-xX1oi8JOtlt2LMwFIeqLrTJrmr4-PppFtoXQExsftmPy82LWFi-NT9H7nCz3kgsyiyJNoFVnbvYnjafUs1Up7NwU5ECQ3ydP7pzHmWpbkzDC3oAXszLjMkXn9fEfMfG7PYdl-z846Zcl/?imgmax=800" width="554" height="247"></a> </p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbiOTjgz2Ujh561RUV-MgfsSghs8_U3rk-7Ek7EIABx2ixNqT_oKfosyUtjMtGk4dj5PsB4RYMTONoqqZ819bekJudW8Y2rL49Kgd51FUjfTCH5lGl5zZkxQvg5CD5KVhCi7F7CZrtKwIg/s1600-h/image%25255B7%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1qUeUw4CAtgQifL87AnFDvVuAvA5AUq00NIVJ29GAj82cfWy_LPRFuE3ix73gLpfYaPn9vtyvoRcUtP1X2q1n_46mxePe0TIpzwCVe-QaYlP_49bDzeqWTy6c175GaJ4Sx9-vknWbuSeh/?imgmax=800" width="554" height="316"></a> As you can see, there are some errors regarding the Analysis Cube processing. So I tried to run a manual processing job of the Analysis Cube server.</p> <p>This <a href="http://blog.accentient.com/manually-processing-the-team-foundation-server-2010-data-warehouse-and-analysis-services-database/">great walkthrough</a> helps you in doing a manual start of the warehouse and analysis cube processing.</p> <p>What it comes down to is navigating to <a href="http://localhost:8080/tfs/TeamFoundation/Administration/v3.0/WarehouseControlService.asmx">http://localhost:8080/tfs/TeamFoundation/Administration/v3.0/WarehouseControlService.asmx</a> on your application tier and then using ProcessWarehouse, ProcessAnalysisDatabase and GetProcessingStatus to check what’s going one. </p> <p>One thing to be aware of is that the walkthrough is a little outdated. When you call GetProcessingStatus on a TFS 2013 installation you will get the following screen:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPBMf5PD9Ga7nJDLZiRYAVnqVIOfY6FXb8zstCUyuJtQKC-cOOL31WxWrVJZ0orxvoVc9AojwmzFQGj9gZn3nt0Ba2_IWAf7eKAAuQEWCecAU7yPibMqjrtXfLFxWSUT_tB0m5CIFFidrg/s1600-h/image%25255B11%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOhpwHYHQKsF82uhAicT5nww6v1m__-1lUz4_XVtxkMit4eM14qmP5rh95rLtlyOVQw9H0m6CdXuG060CHYrFAUSCHifdXshU6rzmKq0xM0nHMwWmACNxKigdb08cJAq7NOlfQvQsoY0ln/?imgmax=800" width="554" height="336"></a> </p> <p>A new option <em>includeOnlineHostsOnly </em>is added. You need to pass TRUE for this field otherwise you will get a 500 error when checking the status of your jobs.</p> <p>Now when checking my job status I found the following:</p> <p><a href="http://localhost:8080/tfs/TeamFoundation/Administration/v3.0/WarehouseControlService.asmx/GetProcessingStatus"><<span style="color: #990000">Job</span> <span style="color: #990000">JobProcessingStatus</span>="<b><span style="color: black">Idle</span></b>" <span style="color: #990000">Name</span>="<b><span style="color: black">Incremental Analysis Database Sync</span></b>"></a><br><lastrun result="Failed" endtimeutc="2014-08-07T15:06:42.29Z" executionstarttimeutc="2014-08-07T15:06:38.747Z" queuetimeutc="2014-08-07T15:06:38.217Z"><span style="mso-spacerun: yes"> </span><a href="http://localhost:8080/tfs/TeamFoundation/Administration/v3.0/WarehouseControlService.asmx/GetProcessingStatus"><<span style="color: #990000">LastRun</span> <span style="color: #990000">Result</span>="<b><span style="color: black">Failed</span></b>" <span style="color: #990000">EndTimeUtc</span>="<b><span style="color: black">2014-08-07T15:06:42.29Z</span></b>" <span style="color: #990000">ExecutionStartTimeUtc</span>="<b><span style="color: black">2014-08-07T15:06:38.747Z</span></b>" <span style="color: #990000">QueueTimeUtc</span>="<b><span style="color: black">2014-08-07T15:06:38.217Z</span></b>"></a><br><resultmessage><span style="mso-spacerun: yes"> </span><span style="mso-spacerun: yes"> </span><<span style="color: #990000">ResultMessage</span>>[Incremental Analysis Database Sync]: ---> Microsoft.TeamFoundation.Warehouse.WarehouseException: TF221122: An error occurred running job Incremental Analysis Database Sync for team project collection or Team Foundation server TEAM FOUNDATION. ---> Microsoft.TeamFoundation.Warehouse.WarehouseException: TF255040: Install SQL Reporting Services or at a minimum SQL Client Connectivity Tools on the application tier to ensure Analysis Services object model is present for warehouse processing. at Microsoft.TeamFoundation.Warehouse.AnalysisDatabaseSyncJobExtension.RunInternal(TeamFoundationRequestContext requestContext, TeamFoundationJobDefinition jobDefinition, DateTime queueTime, String& resultMessage) at Microsoft.TeamFoundation.Warehouse.WarehouseJobExtension.Run(TeamFoundationRequestContext requestContext, TeamFoundationJobDefinition jobDefinition, DateTime queueTime, String& resultMessage) --- End of inner exception stack trace ---<br><span xmlns="http://www.w3.org/1999/xhtml"><span style="mso-spacerun: yes"> </span><span style="mso-spacerun: yes"> </span><span style="mso-spacerun: yes"> </span><span style="color: blue"></</span><span style="color: #990000">ResultMessage</span><span style="color: blue">></span><br></resultmessage><span xmlns="http://www.w3.org/1999/xhtml"><span style="mso-spacerun: yes"> </span><span class="block"></</span></span><span class="block"><span style="color: #990000">LastRun</span><span style="color: blue">></span><br></lastrun><nextrun queuetimeutc="2014-08-08T09:06:38.217Z" jobstate="QueuedScheduled"><span style="mso-spacerun: yes"> </span></span></span><<span style="color: #990000">NextRun</span> <span style="color: #990000">QueueTimeUtc</span>="<b><span style="color: black">2014-08-08T09:06:38.217Z</span></b>" <span style="color: #990000">JobState</span>="<b><span style="color: black">QueuedScheduled</span></b>"/><br></nextrun><span xmlns="http://www.w3.org/1999/xhtml"><span class="block"><span style="color: blue"></</span><span style="color: #990000">Job</span><span style="color: blue">></span></span></span><span style="color: blue"><?xml:namespace prefix = "o" /><o:p></o:p></span></p></job></jobs></instance></warehouseprocessingstatus> <p>So somehow I get an error that the SQL Client Connectivity Tools are missing on the Application Tier. But since I have no idea what to do else, I’ve rerun the SQL Server Installation to make sure.</p> <p>And that’s when I noticed:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJupkcHmuXlo40i_hTi-yAwn8FuKN3WaV0CZWx8_ynpzHl6Cl8WStTb47diCaPsV9r7d7MptTYbSPgFoL6g-IqkoMP1K4sSbENI_ppLHu3WTvez-XH0ZAznqZuVsT8USix4LAvStmkl-wB/s1600-h/image%25255B15%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs-JVDWpiKddwWJQp5Th9q2vaH94VPmfLmYXrJeqyR2m9AzE8GFog0nYyK_Ph1BC8JgWM3Rhad3xeAQQ2sTqW0T-34JIqXsVveAg6ECKeBbkpd1H5MPa2Pycy_1GiY2gShRMmcbYcS_e2n/?imgmax=800" width="554" height="25"></a> </p> <p>And that’s it. Apparently I forgot to restart after installing the SQL Server Client Connectivity Tools. After restarting the Application Tier the Analysis Job ran perfectly and my reports are functioning just as you would expect.</p> <p><em>Question? Feedback? Please leave a comment!</em></p> Anonymoushttp://www.blogger.com/profile/05470355439791004016noreply@blogger.com0tag:blogger.com,1999:blog-5127893759416610161.post-22208236838023875962014-08-04T14:28:00.001+02:002014-08-12T12:05:16.830+02:00Continuously deploying your database with Release Management- Part 1When it comes to automating the deployment of an application, I always see customers struggling when it comes to the database. Updating a web application with Web Deploy or even with a simple XCopy isn’t that hard. But a database with schema changes is not a simple XCopy.<br />
Fortunately, Microsoft released a great tool for dealing with database updates. Unfortunately, this tool isn’t widely used yet. This blog series will help you in getting started with SQL Server Data Tools and setting up continuous deployment of your database with Release Management.<br />
<br />
<strong>Part 1 Meet SSDT</strong><br />
<br />
<strong><a href="http://wouterdekort.blogspot.nl/2014/08/continuously-deploying-your-database_12.html">Part 2 Using Release Management to deploy your database</a></strong><br />
<br />
<h3>
Part 1: Meet SSDT</h3>
<br />
With Visual Studio 2012 Microsoft released a big update to what was previously known as the Database Project. Starting with VS2012, SQL Server Data Tools overhauled the database project and gives you all you need to bring your database into source control and enable continuous deployment scenarios.<br />
<br />
The newest version at the time of writing is SDDT July 2014. If you are running Visual Studio 2013, you will automatically get notified of any new updates in your IDE. If you’re running 2012 you can download the update <a href="http://msdn.microsoft.com/en-us/hh297027.aspx">here</a>.<br />
<br />
Now let’s start with a simple web application and add a database project to it.<br />
<br />
<h3>
Adding SSDT to your application</h3>
<br />
The sample application is a simple website that uses Entity Framework Database First to access a table called People. <br />
<br />
You can <a href="http://1drv.ms/1lscdGd">download the source code for the final application here</a> or you can create the project with the following easy steps:
<br />
<ul>
<li>Create a database SSDTSample on your LocalDB instance. Add the following table:</li>
</ul>
<pre class="csharpcode"><span class="rem">-- Creating table 'PersonSet'</span>
<span class="kwrd">CREATE</span> <span class="kwrd">TABLE</span> [dbo].[PersonSet] (
[Id] <span class="kwrd">int</span> <span class="kwrd">IDENTITY</span>(1,1) <span class="kwrd">NOT</span> <span class="kwrd">NULL</span>,
[FirstName] nvarchar(<span class="kwrd">max</span>) <span class="kwrd">NULL</span>
);
<span class="kwrd">GO</span>
<span class="rem">-- Creating primary key on [Id] in table 'PersonSet'</span>
<span class="kwrd">ALTER</span> <span class="kwrd">TABLE</span> [dbo].[PersonSet]
<span class="kwrd">ADD</span> <span class="kwrd">CONSTRAINT</span> [PK_PersonSet]
<span class="kwrd">PRIMARY</span> <span class="kwrd">KEY</span> <span class="kwrd">CLUSTERED</span> ([Id] <span class="kwrd">ASC</span>);
<span class="kwrd">GO</span> </pre>
<ul>
<li>Create a new ASP.NET Web project for MVC named <em>GettingStartedWithSSDT</em> and add this project to source control. In this sample we will use TFVC in a Team Project called <em>SSDTTestProject (</em>for more information on creating a Team Project see <a href="http://msdn.microsoft.com/en-us/library/ms181477.aspx">Create a team project</a>) </li>
<li>Add an Entity Framework Database First model that points to your <em>SSDTSample </em>database </li>
<li>Add a <em>MVC5 Controller with views, using Entity Framework</em> </li>
</ul>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjMPlSW8DYAhkrOhMzPOWcub6cDSIPQlgCLJzqGMeplddMM4XrXDm6SiUtRIns8XIQvWY4PVE0PoCEfq6twrVC8fbdekdRJIP6Npq4q0q8KNcaZsmPYSLqMolyd9KRN1tCLVEclhZ_nF9I/s1600-h/image%25255B42%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfBbCn6REGLKtsrS-dfUviYOtpmU7h3vjYu4IHooloTRAbc45HbLxEEMPUEn7WmUwalTLoZOgVX0kuJEGUYyknu0pEVyZh4NN7vtYPYSB58EhvJs7x6ioDxALCVIMreQK2PBV4O3BaLdDy/?imgmax=800" height="423" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="600" /></a> <br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgN-T9_T89VUV6BbUy1cVAAMXXFoGf333UxU87uzSBXafVgHcJ_jPa49lmTRysBnGsCm8g9dL98sjQp3sh_5hdfx084EXb9dsAsCGnYBHr7aVtDYgBcQpLhx-8qzJIVbg6oh_Nu5AHyIcJ_/s1600-h/image3%25255B2%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfATbYBsrvOlTr2zCHR5PYPvhwnC4ELsUEQPW27eVfNoAeafxGOTTcPyi0MCMNNrQWfNWYmqoe6dvv0JRFK0vUyGapFZsVdlovhRG-Rr0Ipj8gZQtPhO3H0KjftMvgnzgyKnY8u5Qvl78K/?imgmax=800" height="394" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="600" /></a>
<br />
<ul>
<li>Run your application and navigate to <em>/People</em></li>
</ul>
And that’s it for your sample application. You now have a web application that points to a database on your LocalDB. Because you’ve scaffolded the controller, you can now view, create, edit and delete items from your database through your web application. <br />
<br />
<h3>
Add a database project</h3>
<br />
The following step is to add a Database project to your solution. If you have SSDT installed you can find this project template in the SQL Server folder.<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjSIyMUHJwbcKcHsKc0kJaJnYVaYzVyHfCFc4jJA4cyI5TujU7ZgjAfmmd04F5ejdF7wG39KjZGvO7ooTzGkas7D3dv68vjRLrkcH8s7dF5puN1NBkgsrb4H18ClB2KpUsTEw_3E8oUxh4/s1600-h/image%25255B41%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf9ZQvWSe8fCvimFaFizth3Ql8XZ8fR4dyyPMwEBUGPUg7KfbYSTjHyhGOWw9MmHc1ID_vUakgVyrcdL5ZAxGGYfdBK0HZutC8cmMOAtftnzoQzmgYhnesDoWxJruk_h5fVi85DJJqOGk0/?imgmax=800" height="423" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="600" /></a> <br />
<br />
By default, this will create an empty project that you can then use to develop your database from scratch or you can start with an existing database.<br />
<br />
In this case, you already have a database so you can choose to import the database in your project.<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKU8f2IvS5bez0a9-HW1JkELMU0YPxiOG_L_r97eQ77ghM0RThYpFETeBsKnFmGEaawYB71YSdYrMLAr6Ic_R3bScEx7CzcbyNzXsTpQ0YY6dRCRYPKM04nrZxdlKolv-qx0ArupEDl5wq/s1600-h/image%25255B38%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU_7uE_lpG6_o51DZ9D2411rm9lZ2HhW8vakv5_0wApczmtKSu5jaBzIX88B9ybZ2kB1GjONx2DAxFLQmX7RCPUhDElrpuFZ3hUaaeghethzTClzti3VkVp9v7jPqpqXihD-rWCsZNTMn6/?imgmax=800" height="724" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="600" /></a><br />
All you have to do now is select the database you want to import. You can leave the other settings at their default values.<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHTPdk2D4DVGjdNydFSV_6Dy0ecBqVoDVEW6f8CNbNave_7kbGzV_Or9UGIYV4PfmqHmkOzHiUKr7Cq5PWYXwTz2Owaso3QC4p3li3WBXB1dVgtvww0QVCE0AjbRGdFNHpOHg5MnWEgXNE/s1600-h/image%25255B40%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgORHdm0wXhtCdWIGH4jSEKqJjzF4myw9-_tat2EHkB7RJsaVitowvOfjHST8rGPl9CFNnirpN5eu8J3QqAP0vpaqN-uqFmKsoLmucSifWZ3cDjKrajSK4QCmN-nKatF71PMtEDhkwwwph-/?imgmax=800" height="515" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="600" /></a> <br />
After the import process finishes the database project contains the files that describe all your tables, relationships, stored procedures and views. If you build this project you will see that the output folder now contains three files:
<br />
<ul>
<li>MyDatabase.dacpac </li>
<li>MyDatabase.dll </li>
<li>MyDatabase.pdb</li>
</ul>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVsrGGlgQVWBO9Pj4bcRY7nKuzU7yN0pADoxBKf1X2cSnHBueUV4e5tUj4CL1kgJaz545ASHEv8QW3T-aB7WLgmu-x2CTLQeG7atZ-Sd7li84K_TpeBhSxKpO0qsJU6tekMRoRqFENxNPr/s1600-h/image%25255B39%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnWjjs1r93bYwpI-fBAPmXM8llcEauKo7qk_mSDUPa-oFtKJfzTCGxrpJaeeVrajtnxzXQA_64oq5-m-HrAQo2Ok8EhY4IH0V9YMjQTBZq5peDZqeiWrwT8Pu3rIjQrdcU8OEOen_XPlVn/?imgmax=800" height="396" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="300" /></a> <br />
<br />
The most interesting one is the <em>dacpac</em> file. This a complete self-containing description of your database. This is the file that you can deploy to update an existing database.<br />
<br />
<h3>
Manually publishing your database</h3>
<br />
Now that you have your database project you can use this project to create new or update existing databases. This is very easy to do from Visual Studio. Just right click your project and choose publish.
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhr0pPebE5rqQMrUAqMeO91620YqIBN9D1e_QlKdns7XPQmH_q9AxkKkgaRPT33hov1e-Qh5QgPpEFcqq5t0-pORGagL5tmWl2yVpsJRkLaREHlNQvESwMvEvEn04RO5N5vvXCCYSnjkKFw/s1600-h/image%25255B64%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVbz3YE9kgUXxX6bWk8D5aTaRfsZHLN5XLS5HKxY1BTGYBCSwV3Tj3KaPQz0EXP9RzFydidLXYeIeRuNZzrsq5tm20RUBv85gJ_PvMWtReb-aMAEsZSD_Y8vPKud-mTkGoipcEfUbHEc9q/?imgmax=800" height="309" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="604" /></a> <br />
<br />
In this dialog you specify the connection to your server and the name of the database you want to update. If you use a database name that doesn’t exist, the database will be created for you. Now just hit Publish to create your database!<br />
<br />
After a couple of seconds you will see the following log:
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpoFtRHerOeLir-DyKRaUg1uLg20o7JnhcpqqHC-Re9ZmJMJBM4-9ZaPZMP02A2P9jpFbJTr4OZn3ZxKqmEvulRhNLhx8FGYfPmmrZgtNoSSmJRZTjZ5W_5-sgHnqvXFOl6tdo2M1SCbV3/s1600-h/image%25255B68%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaEgSlQ0-VFOqLLnitxdFqC-UdiSMnvPWKCA8dteA3VrHUfYOrxuogA8VhPVPzX6HiB0rFJEmNs0gJZ1V9ZgiURyXet8tFNCffSOzxFjDFECfmmww1dm4Suf2WoJlc9A3fOM8lsudzajxQ/?imgmax=800" height="294" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="604" /></a> <br />
If you now open SQL Server Management Studio (or the SQL Server Object Explorer in Visual Studio) you will see that the database is created with your table in it.
<br />
<blockquote>
<em>If you get an error regarding your SQL Server version make sure that the version defined in your Database projects properties matches the version of the SQL Server that you are trying to deploy to.</em></blockquote>
<h3>
Making a change to your database</h3>
<br />
Now let’s say you want to add a column <em>LastName</em> to your database. You can use the Database Project, make your changes in the project and then update your local database. Or if you’re trying to make as less changes to your process as possible, you can add the column through SQL Server Management studio and then update your database project.<br />
<br />
Let’s say you’ve chosen to use SQL Server Management studio and added a column <em>LastName nvarchar(<span class="kwrd">max</span>) <span class="kwrd">NULL</span></em> to your table. Now you want to update your database project so it knows about the schema change. Normally, you would force your developers to create scripts for every change they make. But not with SSDT. SSDT can easily pickup the changes you’ve made and keep a record of those changes.<br />
<br />
To do this, right click your project in the solution explorer and choose <em>Schema Compare</em>.
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBzvy67nlZAKSWWpZRgoTfUbtIhyphenhyphen5EoPrnp5giwM8yqm2QkRoJtL0RWipxLy9taE_tkRkwDDLZv00pJY0upRawZ6hJ5sFJbzyy3_X88-Kz_MGAKcFbNd8vCgzoO4Dc4YVewJCtPgIx2SY7/s1600-h/image%25255B56%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi59gNLFt1_YHknpaTi1AOJyg-T0ZCi5J0cCCJ5A4bHUdlT_7ysOandyU4WSKZgDwpLYThhJ6RurZKPCyOBR1t6WkRZ3xPgi_lokp08WsKXa4Vzz1iMgn4QqLJ_uUPSjCcx3GSmZiJPPaNM/?imgmax=800" height="558" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="600" /></a> <br />
<br />
This will load a new Schema Compare. If you set the source to your database and the target to your project, you can now run a compare operation to see if there where any changes.
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAjSm-ZqiZKykKSNgPAKgRZ9H40u2zHHExs3vodxKPamE-nbTLw33pj-yNQ_7GWeEumXoHFhQgdpY6WnuBRoxr9NCXyK5QLDmmxWzOzcLhfobSRfe5ZZIUehq6YYiu1nTRbGJHNzbWQOve/s1600-h/image%25255B60%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI5iOzIH_uwRd4rGDUI8v25uVNg0BLKkNOf-PENZsJMUALcAJo-Y08zZc_9q47culZmwduicY8IYI_WNMobcU7acmH0RuSuXR24mmHAo5iHEkeQcLukLkZBOZUS32z1yScKOLh-7zrac4n/?imgmax=800" height="364" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="image" width="604" /></a> <br />
<br />
As you can see, the compare process found the change where you added a column called <em>LastName</em>. On the left it shows the current state of your database, on the right the state of your database project.<br />
<br />
By hitting the <em>Update</em> button you can write the new found changes to your database project.<br />
<br />
<h3>
Updating a database</h3>
<br />
The previously deployed <em>MyDatabaseDeploy </em>database does not yet have the newly added column. However, this can be easily done by publishing your database project to the now already existing <em>MyDatabaseDeploy</em>.<br />
<br />
All you have to do is right click your database project and select Publish. Now target the MyDatabaseDeploy Database and click Publish. This will automatically apply any changes made in your Database project to your target database.<br />
<br />
If there is a change on data loss (such as dropping or truncating a column), you need to explicitly allow this. If you’re still not sure on what’s happening you can let the Publish wizard create a set of scripts that you can manually inspect and adapt to your situation.<br />
<br />
That’s it for SSDT. Next time we’ll look at using Release Management to automate the deployment of a dacpac to your servers.<br />
<br />
<em>Feedback? Questions? Comments? Please let me know!</em>Anonymoushttp://www.blogger.com/profile/05470355439791004016noreply@blogger.com0tag:blogger.com,1999:blog-5127893759416610161.post-41324806992250011842014-07-31T15:13:00.001+02:002014-07-31T15:13:44.131+02:00Release Management: The specified path, file name, or both are too long<p>While working with Release Management a new deployment suddenly gave an error:</p> <p><em>ERROR: The deployment for release template 'XXXX' has not been completed successfully. Check the releases history for more details.<br>Exit: 1</em> <p>The release history didn’t gave much information but the Event Viewer showed the following:</p> <p><em>The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.: \r\n\r\n at System.IO.PathHelper.GetFullPathName()</em> <p> <h3>So what’s happening here?</h3> <p>When a new release starts, the Deployment Agent on your server copies all required data from your Release Management server to a local folder on your deployment server. For example, if you have a component <em>MyDatabase</em> that is located in the root of your build package, you can use a forward slash in your component configuration to tell Release Management to look for the component at the root of your build drop location. <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSsV3iFFcXZ8aAbdXHBk9_NtoSjqgOkm37JjHPlHiT5k7X5UFvejdmpYhsaC-yUtK8qIxgKBr11GJcBe2GZeQMxa3-rMW1g3ILeIPMEd7fAMxbcD_gYNfJirEirP3deRTxGA98pt_XQa5Q/s1600-h/image%25255B16%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5n7mV7DKGdkvwBI0bCKFQIOwqX4iPCAXuBNuYAEdsbirwL6voqmPbudSwliEpSIFIttcJjypEUtrVTVrNfEmKbqZ3wS2zoYOx5jLNbL3k9D8eMTC6LhHhPXrdIv5-oCpshueeNj2D9ufq/?imgmax=800" width="546" height="353"></a> <p>Now all the data in your build folder gets copied over to the deployment server and gets stored at: <p><em>C:\Users\<UserNameForDeploymenyAgent>\AppData\Local\Temp\ReleaseManagement\<ComponentName>\<VersionNumber></em> <p>The problem I was having was that the customer not only had a database project but also a really long path and filename in a web project. The website got published to <em>_PublishedWebsites\WebsiteName </em>and got copied to the deployment server. That together with the temp folder and the component name was way to long. <p>Now off course we could have shortened the path name. But the underlying problem was that not only our database was copied but the complete build package. This is a waist of time and resources. <p> <h3></h3> <h3>Splitting the build package</h3> <p>To resolve the issue, you can change the build to output each project in his own folder. This way, the build drop location would contain a folder <em>MyDatabase </em>with only the database files. It would also contain a specific folder for the website with the published website files. <p>You can configure this by adding the following MSBuild argument to your Build Definition: <p><em>/p:GenerateProjectSpecificOutputFolder=true</em> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhj2So1h3PkthxhA__tHsREzhjWSU9XRUkExwGLlWo7Oo03M0ogPukSuF-jPXBF_LWBM6yteiSnZapL3_qJozT6umerhY6hy-H_t2Eye4rmWK2MriLBJLI_lIdOmIqjFIY_mioDHhnuSeet/s1600-h/image%25255B8%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkqWXMFPwUpZUiC7T2lb4Jxu5yIArnlDX3sDzwksUADtECBCfcoyUxiomwZKumRSqPS-gOfdhjZmDfakA5DCw45Dbh0lZ2-h0LHCPFtTfcWqsX3rsBp_DNrwGqXaHwAf-VRYNY2wXJk-E5/?imgmax=800" width="620" height="468"></a> <p>Now the structure of your build drop location changes and contains a separate folder for each project. This means that a folder <em>MyDatabase</em> is created with all the database files in it. Changing your component to point to <em>\MyDatabase</em> now makes sure that only the required data gets copied to your deployment server.</p> <h3>What about Output location?</h3> <p>In TFS 2013 a new option Output location was added to the Build Definition. This property can be set to:</p> <ul> <li>SingleFolder</li> <li>PerProject</li> <li>AsConfigured</li></ul> <p><em>PerProject</em> does not do what you initially think. The <em>PerProject</em> option creates a single folder for each project that you specify under the Build –> Projects option at 2.1. This means that if you build two solutions as part of your build, <em>SingleFolder</em> will combine the results of those two solutions into one folder while <em>PerProject</em> will output a folder for each solution.</p> <p><em>AsConfigured</em> won’t copy the build output anywhere. Instead, you can attach your own scripts that copy the build output from your build location to your drop folder. This gives you total freedom. In this case however, using the <em>GenerateProjectSpecificOutputFolder</em> MSBuild argument did the trick.</p> <p><em>Comments? Feedback? Questions? Please leave a comment!</em></p> Anonymoushttp://www.blogger.com/profile/05470355439791004016noreply@blogger.com5tag:blogger.com,1999:blog-5127893759416610161.post-63830684239121117872014-07-29T12:05:00.000+02:002014-08-08T08:54:19.273+02:00Connecting release management clients and deployment agents across domainsMicrosoft Release Management is a great tool.Where the ALM workflow previously ended with a Build server package, Release Management now brings the tools to move that package to your environments and deploy it automatically.<br />
<blockquote>
If you haven’t seen it yet <a href="http://www.visualstudio.com/explore/release-management-vs">go check it out</a> and give it a try with the <a href="http://blogs.msdn.com/b/briankel/archive/2013/08/02/visual-studio-2013-application-lifecycle-management-virtual-machine-and-hands-on-labs-demo-scripts.aspx">Brian Keller VM</a>.</blockquote>
However, running Release Management in a production environment is different from running it installed on one single virtual machine. In this blog I want to share some info I found while trying to install Release Management in more complex environments.<br />
<br />
<h3>
Release Management Architecture</h3>
<div>
<br /></div>
Release Management has a couple of different parts:<br />
<ul>
<li><em>Release Management Server</em>. This component is installed on your TFS server and is the main part of Release Management.</li>
<li><em>Release Management Client</em>. The client tool is for DevOps what Visual Studio is for developers or Microsoft Test Manager for testers. You run it at your local pc and use it to setup deployments and monitor releases.</li>
<li><em>Deployment Agent</em>. This tool is installed at the servers you are targeting with your deployments. The Deployment Agent uses a pull model where it contacts the Release Management Server at a specified interval to check if there are new releases. This is done over HTTP(S) to avoid firewall problems.</li>
</ul>
<div>
<br /></div>
If all components are installed in the same Windows Domain you won’t have any problems. You can add users that can access the Release Management Client and Service Users for the deployment agents to Release Management and you’re all done.<br />
However, when working with multiple domains things can get tricky. Fortunately, Microsoft has some great people working on Release Management who helped me out. <br />
<br />
<h3>
Connecting the Release Management Client from a different domain</h3>
<div>
<br /></div>
The first thing you should always check whenever you have any connection problems is if you can access the Web UI for Release Management at: <a href="http://%3Crm_sever%3E:<port>/releasemanagement"><em>http://<rm_sever>:<port>/releasemanagement</em></a><strong><em>. </em></strong>It’s no problem if this URL gives you an access denied error, just make sure you can reach it.<br />
Now let’s get started with the Release Management client. If you have external customers or internal employees that are not connected to your companies Active Directory Domain, you have two options when connecting a user.<br />
<br />
<b>The first option </b>is to use the domain account of the user and add that to Release Management together with the local username:<br />
<br />
<ul>
<li>Add the domain account for the user to Release Management as both a Release Manager and a Service User.</li>
<li>Add the username that the user is using on his local pc to Release Management as a Service User (and as a Release Manager if the user should be a Release Manager).</li>
</ul>
<div>
<br /></div>
So for example, my local pc is running under an account named Wouter and my domain account is WdK1111. This means that I need to add both WdK1111 and Wouter to Release Management. Make sure to add Wouter without any machine name in front of it. Just add it as a plain username. You also don’t have to create a local shadow account named Wouter.<br />
<br />
After configuring these two users, the Release Management server knows about your local machine account and about your domain account. Now you need to configure the client to know about both.<br />
<br />
On the client machine, the user needs to add his domain account to the Credential Manager for the URL of your Release Management Server (like <em>tfsrm.<yourdomain>.com</em>)<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcz2lGv-joX3OFLVYtjD4ynD0r2C-AnaKHTt9918RbfJTJXHaUu2kFjmHJsps_zvhkqsW8Z4-ITJ9OSpBCkmimUhmvmdOjIQbXbOD8t9iehEtrXtwK47S80jBzA3sQ9cd5jJvt90PH-g90/s1600-h/image%25255B8%25255D.png"><img alt="image" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGMtnhySEInG9P0-FqS2PXRJLMXFmdpy53ZLiM9ScPdKhG0Z1QyukWoWHLXaJfqPt-GrNtfmmJEfD3Vn8p_IwYf9FY7gCx8o8QkVAeAGubIhQbwzMGtR_9H_B7V8uifpTZXpIyWdGJ7Tsg/?imgmax=800" height="238" style="border: 0px; display: inline;" title="image" width="397" /></a> <br />
<br />
And that’s it. After launching your client it will use the credentials from your credential manager and connect to Release Management with your local, non-domain account. <br />
<br />
A <b>second option </b>you have is creating a shadow account on the Release Management machine. This shadow account should have the same username and password as your local pc account. This shadow account can then be added to Release Management and you can give it the appropriate permissions. This option is easier to configure since you don't need to configure the Credential Manager or use the domain account of the user. A problem with this option is that you need the password of the users local account. If that's a problem, you could have the user create a second account on their PC that's solely used for connecting the Release Management client.<br />
<br />
<h3>
Connecting the Release Management Deployment Agent from a different domain</h3>
<div>
<br /></div>
The steps for the deployment agent are similar to those for connecting the client. But instead of using a domain account that’s mapped to a real user, you can create a local account on your TFS machine that can be used as the shadow account for your deployment agent.<br />
<br />
<ul>
<li>Create an account on your TFS server. For example: DeploymentAgentXXX with a strong password.</li>
<li>Create the same account on your deployment server and make the account a local administrator.</li>
<li>Add DeploymentAgentXXX to Release Management as a Service User.</li>
<li>On the server where you want to install the deployment agent add the DeploymentAgentXXX account to your Credential Manager. Use the URL for your Release Management Server.</li>
<li>Install the agent and use the DeploymentAgentXXX account in the configuration screen.</li>
</ul>
<div>
<br /></div>
And that’s it! Now both your Deployment agent and client can connect even when they’re not in the same domain.<br />
<br />
<h3>
What about a proxy?</h3>
<div>
<br /></div>
There was one other situation I ran into. A customer was trying to run the Deployment Agent from behind a proxy. Since the Deployment Agent is initiating the HTTP Request, this is still allowed. However, you can still get the error <br />
<br />
<blockquote>
“<em>Failed to configure Release management service user. Error: The remote server returned an error: (407) Proxy Authentication Required</em>”.</blockquote>
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEil7YqBzlfwTTKEnzQe_FfEJnssBgThbJtc5X41lQEmylqmpQADmAL6OsfXmbesu1lNVE419Vc-B1Fxyt-js2_7_tMbjmLwWA-wiU6KLd8qVWa1ER3iglGuuUg821SHC1X9IIxNV6d41wR7/s1600-h/clip_image002%25255B7%25255D.jpg"><img alt="clip_image002" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZJDIQFWHhNYjyg8TXPFwcWod-78s7HT4JWCgna4qc0n31HtCv_MaZ8y7JuaUZedDib8uT6Mc3bBhg-JfRWEtku2vrBm_vaNgKRjPevimJOlVR2wNqWRn8s1eO5ua-SABZ_c0QLSQvnZWP/?imgmax=800" height="299" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline;" title="clip_image002" width="359" /></a><br />
<br />
You can fix this error by adding the following snippet to your app.config file located at <em>Program Files (x86)\Microsoft Visual Studio 12.0\Release Management\bin\DeploymentAgent.exe.config:</em><br />
<em><br /></em>
<em><system.net><br /> <defaultProxy useDefaultCredentials="true" /><br /></system.net></em><br />
<em><br /></em>
And that’s it! When you get the hang of it, it’s quite easy to setup Release Management and configure all the authentication settings.<br />
<br />
<em>Comments? Feedback? Any problems with getting Release Management up and running? Please leave a comment!</em>Anonymoushttp://www.blogger.com/profile/05470355439791004016noreply@blogger.com10tag:blogger.com,1999:blog-5127893759416610161.post-5911401342699285072014-07-21T10:27:00.001+02:002014-07-21T10:27:26.925+02:00TFS Best Practice Analyzer fails with “Cannot validate the URL provided”<p>The <a href="http://visualstudiogallery.msdn.microsoft.com/f017b10c-02b4-4d6d-9845-58a06545627f">Team Foundation Server Power Tools</a> contain a great tool called the Best Practice Analyzer. This tool helps you in automatically checking your Team Foundation Server installation and advising you on any problems that it may find.</p> <p>So every time I install a new TFS environment, I use the BPA tool to validate any prerequisites and make sure the TFS environment is functioning correctly. </p> <h3>Running into some problems</h3> <p>After running BPA on a Windows Azure VM running Windows Server 2012 R2, the scan finished very quickly and showed the following:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2RSCYkg7HWZvmpbacSvvUwoG_LUdJL1ACC04_RSzwFLRtomnLzK8pwtwdpyL1nF1p3CB6RsXyjtXxla_yNbnoZLdzd1WVWcmxDOjOcneUXgcjqJZQp3IDYPbIMSCJDFPdlgydsgEFxg9t/s1600-h/BPA%252520TFSServerURLValidated%25255B22%25255D.png"><img title="BPA TFSServerURLValidated" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="BPA TFSServerURLValidated" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEje0rDQZVMrTQ5sFnHsOFhODa06EaPVD45WvDDpt8Nxe_wHgaRhBnPTu7gBL82vNrZdz7BvuQ-Kg10H2WYp-YE4KTeETLDzo2uhf_LROeV5GYD68vrCzI_pNQHIPPLjc71mAQqaX-9Enhdu/?imgmax=800" width="518" height="397"></a> </p> <p>To view more details, you can click on <em>View a report of the Best Practices scan</em>. This will generate a report that clearly shows something is wrong:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVyYs8SfBgl9hHVvFf-w3lTE-f9pHnCy2eLi_H0gN7UMxPmjxqFTdPLs364URP68VUr62kC_SNYAJXPHrJytNzD_1RFU2V3kPN4SDekQ5aqBGl9gmmsEaKVYJnqO8at5HSofzSN78PqtiE/s1600-h/BPA%252520Cannot%252520validate%252520the%252520URL%252520provided%25255B13%25255D.png"><img title="BPA Cannot validate the URL provided" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="BPA Cannot validate the URL provided" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcTFamx1bRpEktzhoCCIV6tVnbnhFhvOku97584lvsl7XvLVpHZMVW8Er0QXpSqb-ouQqFDyHT0d_sX6_58VRlK24EfajcCnym4oCNGFVJkaY0ReJngLj3AbqJCLi5UZhZzTVFgJKjVpBD/?imgmax=800" width="515" height="406"></a> </p> <p></p> <p>To view a detailed log of what’s going wrong you can click on Other Reports. This will show you a Run-Time log that contains detailed information on the error BPA is encountering:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgf73EjSMEKDqVof0k1ti-TvMFYrc3h9m9Dgt43yOhp7zJFgRyHJPAdUa6FK4dLWQszESnI5_gxIlkiotueqbfWneDfAtgDNrg3IrUI5S9UvW0cE0yyoO25AMIjXJxH_Hobgcz34gKCvc7/s1600-h/BPA%252520Error%252520Log%25255B9%25255D.png"><img title="BPA Error Log" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="BPA Error Log" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyJmcm6m4RMYevzFMO55V0rXZCVp8r0BHGolfzUSRXtoO6GqCezjVOCAjpMrlnjyYK-3CRr3LlIZs3OceY4U32inShTMM5OiK161EndE91BPlJdXX2PyZU9mPJjTMP5LM7M5NCZ7Vuu4zE/?imgmax=800" width="542" height="419"></a> </p> <p>As you can see in the log file, there is an error stating that you are running the incorrect version of PowerShell. It’s looking for version 2.0, but Windows Server is running version 4.0.</p> <h3>Fixing the TFSServerURLValidated error</h3> <p>So how you can make sure that the BPA runs on a machine with a newer version of PowerShell?</p> <p>You can add a configuration file that makes sure the supported runtime is set to .NET 4.0. Switching to .NET 4.0 also switches PowerShell to version 3 or later. Since BPA is a .NET application, adding a configuration file is easy. Just create a file <em><NameOfExe>.exe.config. </em>When running the application, .NET will automatically load the config file with a corresponding name and apply any configuration settings in it to your application.</p> <p>By default, BPA is installed in <em>C:\Program Files(x86)\Microsoft Team Foundation Server 2013 Power Tools\Best Practices Analyzer. </em>In here, you’ll find <em>TfsBpa.exe </em>which is the executable file that runs the BPA.</p> <p>Now you need to create a corresponding config file called <em>TfsBpa.exe.config</em>. If User Account Control kicks in and doesn’t allow you to create a file, the easiest solution is to run Notepad as an administrator and save the file directly to the correct location.</p> <p>Inside your new configuration file you put the following:</p> <p><em><configuration><br> <startup><br> <supportedRuntime version=”v4.0.30319″/><br> </startup><br></configuration></em></p> <p>And that’s it. Now BPA will run great operating systems like Windows 8 and Windows Server 2012.</p> <p><em>Feedback? Questions? Please leave a comment!</em></p> Anonymoushttp://www.blogger.com/profile/05470355439791004016noreply@blogger.com7