<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Dapper DevOps</title>
    <description>Matteo&apos;s blog</description>
    <link>https://mattvsts.github.io//</link>
    <atom:link href="https://mattvsts.github.io//feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Sun, 22 Mar 2026 16:55:52 +0000</pubDate>
    <lastBuildDate>Sun, 22 Mar 2026 16:55:52 +0000</lastBuildDate>
    <generator>Jekyll v3.10.0</generator>

    
      <item>
        <title>From agent to fleet, the next step in Agentic Engineering</title>
        <description>&lt;p&gt;The next logical step in Agentic Engineering happens when teams move from individual developer augmentation to agentic delegation. That’s where two key patterns start emerging: full delegation and local parallelisation.&lt;/p&gt;

&lt;h3 id=&quot;full-delegation&quot;&gt;Full delegation&lt;/h3&gt;
&lt;p&gt;This is the easiest one, and it usually involves agents both local and remote: you choose a requirement and hand it off to an agent entirely, remaining involved only for review and comments. Have a look at this example:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2026-03-22-16-11-53.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This is a typical example of full delegation: the discrete requirement is handed-off to the agent, which works on its own. Once the session is over, a developer can review the output and comment or even change model (like I did, moving from Codex to Sonnet). The agent continues to iterate.&lt;/p&gt;

&lt;p&gt;The other interesting thing is that in this case my agent is going to provide me with evidence of the result. This is a super useful behavior which started recently: all I have to do is to check the output and validate.&lt;/p&gt;

&lt;p&gt;This is obviously not applicable to everything, but in many cases it’s a very easy way of checking and allowing for quick iterations.&lt;/p&gt;

&lt;h3 id=&quot;local-parallelisation&quot;&gt;Local parallelisation&lt;/h3&gt;
&lt;p&gt;Local parallelisation gives me the ability of running multiple agents against the same requirement, eventually merging these changes. The big thing here is that agents will run in parallel in their own &lt;a href=&quot;https://git-scm.com/docs/git-worktree&quot;&gt;worktrees&lt;/a&gt; so they are independent of each other without a sprawling number of branches.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2026-03-22-16-41-18.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Phase 6 here comes from a SDD session I launched to implement some API changes, whilst the UI was being worked on in parallel by another agent. These changes are implemented via the Copilot CLI:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2026-03-22-16-43-06.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Using the CLI means that these sessions will run in unattended fashion, surfacing information in the chat window as always but without a continuous interaction (except for authorising tasks and commands, which remains up to you).&lt;/p&gt;

&lt;h3 id=&quot;fleet-of-agents&quot;&gt;Fleet of agents&lt;/h3&gt;
&lt;p&gt;The Copilot CLI natively support fleets of agents, via a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/fleet&lt;/code&gt; &lt;a href=&quot;https://docs.github.com/en/copilot/concepts/agents/copilot-cli/fleet&quot;&gt;command&lt;/a&gt;. This will orchestrate the set of agents from a single session and drive execution with the specified models, commands, etc. It allows for complete parallelisation of work done via agents.&lt;/p&gt;

&lt;h3 id=&quot;whats-next&quot;&gt;What’s next?&lt;/h3&gt;
&lt;p&gt;The next logical step would be running agent-friendly backlogs with a built-in persistence system acting as memory. &lt;a href=&quot;https://mattvsts.github.io/2026/02/28/agentic-memory/&quot;&gt;I already said&lt;/a&gt; it’s going to be the next big thing didn’t I? 😀&lt;/p&gt;

&lt;p&gt;An early example of this is &lt;a href=&quot;https://github.com/steveyegge/beads&quot;&gt;Beads&lt;/a&gt;, which replaces the manual plan stage of each requirement with a fully-automated dependency graph, enabling multiple agents to work on a single, larger piece of work.&lt;/p&gt;
</description>
        <pubDate>Sun, 22 Mar 2026 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2026/03/22/agent-to-fleet/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2026/03/22/agent-to-fleet/</guid>
      </item>
    
      <item>
        <title>Agentic Memory is the next big thing</title>
        <description>&lt;p&gt;I am on the way to &lt;a href=&quot;https://www.dddnorth.co.uk&quot;&gt;DDD North&lt;/a&gt; where I am going to talk about Agentic Engineering, and one of the key aspects of my talk is the generational evolution of GenAI tools for developers. Given the pace of change in our industry I believe we are already bsing a second generation of tools and assistants, and we are just about to leap on a third one - the reason being Agentic Memory.&lt;/p&gt;

&lt;p&gt;With the current crop of tools, you are instructing agents via multiple layers of coding instructions, a constitution when it comes to SDD, etc. These are all artifacts you (or your team) need to maintain at all times to ensure the best results. Guardrails are implemented, practices described, etc. All because today your tools cannot learn directly from usage, expecting instructions or waivers before execution. Some workaround existed with tools like &lt;a href=&quot;https://docs.basicmemory.com/integrations/codex&quot;&gt;Basic Memory&lt;/a&gt; to persist memory files to be fed back to agents, but it was neither smooth nor fully integrated.&lt;/p&gt;

&lt;p&gt;This changes with the implementation of Agentic Memory.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://docs.github.com/en/copilot/concepts/agents/copilot-memory&quot;&gt;GitHub&lt;/a&gt; and &lt;a href=&quot;https://code.claude.com/docs/en/memory&quot;&gt;Anthropic&lt;/a&gt; have them already, and there are signs of this being imminent for &lt;a href=&quot;https://github.com/openai/codex/pull/11569&quot;&gt;OpenAI&lt;/a&gt; too. This will lead to a new fundamental shift in maturity, leading to better interactions with models and agents.&lt;/p&gt;

&lt;p&gt;Think about it this way: today you are telling what to do to an agent all the time. Correcting mistakes over and over again. You become more and more prescriptive, extending coding instructions to a potentially large and hard to maintain artifact.&lt;/p&gt;

&lt;p&gt;With Agentic Memory, your corrections will stick. Agents will learn. And in enterprise environments this will lead to a much higher level of predictability, which is super valuable for heterogeneous teams.&lt;/p&gt;

&lt;p&gt;It’s not early stages or something in a far distant future. If you have it enabled in your GitHub organisation, you will see a section in your repository settings (empty as I just enabled it for my repos):&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2026-02-28-09-28-35.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://docs.github.com/en/copilot/how-tos/use-copilot-agents/copilot-memory&quot;&gt;Documentation&lt;/a&gt; tells us they will be available as individual memories per session, so linked to either code reviews or Coding Agents sessions:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://docs.github.com/assets/cb-332961/mw-1440/images/help/copilot/copilot-memory-list.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The most important remark here is that memories will be correlated to code that exists, so they will become part of the context in all intents and purposes, all self-contained in each repository. They will be flushed after a month if unused to prevent staleness, and retained otherwise.&lt;/p&gt;

&lt;p&gt;This will be the next generational jump in DevEx for GenAI, so instructions will remain as guardrails whilst every repository will evolve by its direct usage. 
What becomes fundamental here is codifying enterprise- and organisation-wide instructions that leverage memories explicitly, rather than relying on a proliferation of repo-scoped memories, and it’s something we are already doing today with multi-layered instructions - so the core concept remains the same, with an enhanced execution.&lt;/p&gt;
</description>
        <pubDate>Sat, 28 Feb 2026 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2026/02/28/agentic-memory/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2026/02/28/agentic-memory/</guid>
      </item>
    
      <item>
        <title>The key difference between vertical and horizontal GenAI assistance</title>
        <description>&lt;p&gt;I answer this question at least once a week so I will use this as a more permanent signpost 🙂&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;What is the difference between GitHub Copilot and Claude Code/OpenAI Codex (or any other vertically-integrated GenAI assistants)?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer might be simple, however there are a couple of nuances to think of. Let’s have a look.&lt;/p&gt;

&lt;h3 id=&quot;model-availability&quot;&gt;Model availability&lt;/h3&gt;
&lt;p&gt;This is the obvious one, and we kind of &lt;a href=&quot;https://mattvsts.github.io/2025/12/06/choice-model-matters/&quot;&gt;talked about it&lt;/a&gt; in the past. With GitHub Copilot you have a choice of models you are not going to get with other tools.&lt;/p&gt;

&lt;p&gt;Do you want to mix models from different providers? It’s a selection on a dropdown menu. This flexibility is not available with other providers, and will give you the opportunity to switch, chop and change models as you see fit based on the best experience you get.&lt;/p&gt;

&lt;p&gt;It is a very personal choice in the end, and it’s a unique selling point of a horizontal GenAI assistance.&lt;/p&gt;

&lt;h3 id=&quot;workflow-integration&quot;&gt;Workflow integration&lt;/h3&gt;
&lt;p&gt;In the IDE, the experience is different remarkably different between the two.&lt;/p&gt;

&lt;p&gt;GitHub Copilot is a hands-on assistant, which is very available in your environment no matter which mode you are going to use it with. Most of the experience is centered by default on the single developer, and puts severe importance on context.&lt;/p&gt;

&lt;p&gt;Code completion, inline generation, etc. are all typical use cases for developer augmentation, where having the tool accelerates the unitary task being worked on. Agents can be local or cloud-hosted, however they run in relative proximity to your work even if you delegate tasks to them, as you need to be very prescriptive with the context you provide them.&lt;/p&gt;

&lt;p&gt;GitHub Copilot is also heavily integrated with the GitHub platform, and it’s a unique team advantage. It’s like getting additional capacity out of a magic hat for specific tasks like Pull Request reviews and security remediation via Autofix.&lt;/p&gt;

&lt;p&gt;On the other hand, any vertically-integrated tool has a remarkably different paradigm: even if they might be available in the IDE, they put a lot of effort in repo-wide context and CLI accessibility. They work against the whole repository building a context independently, and the agentic experience is way more delegated and hands-off compared to GitHub Copilot.&lt;/p&gt;

&lt;p&gt;When I work with Claude Code for example, it is still very developer-centric however delegation is more wide-ranging. The CLI is the most powerful tool to use with it and it has high context awareness.&lt;/p&gt;

&lt;p&gt;OpenAI Codex has an even stronger delegation system and runs mostly asynchronously, it’s very task-based and gives its best when performing isolated, wide-ranging implementations or tasks, so the IDE and the interactive experience is almost irrelevant for it.&lt;/p&gt;

&lt;h3 id=&quot;is-there-a-silver-bullet&quot;&gt;Is there a silver bullet?&lt;/h3&gt;
&lt;p&gt;No.&lt;/p&gt;

&lt;p&gt;The level of comfort with innovative ways of working and practices will obviously skew things one way or the other. Platform integration might or might not play a part at all. Repository availability and solution convention can be disruptive either way. There is no clear &lt;em&gt;winner&lt;/em&gt; to be had here, but just the best choice out of a very crowded field.&lt;/p&gt;

&lt;p&gt;Much of the choice also depends on the preferred ways of working of an individual or a team, as well the governance structure in place for developers, which might limit or hamper any of these tools in an expected way.&lt;/p&gt;

&lt;p&gt;Eventually, one does not exclude the other. I saw organisations using both technologies for well-defined, discrete use cases and building a unique multilateral approach.&lt;/p&gt;

&lt;p&gt;So no single winning choice (sorry!) but rather lots to think about in your own context and your own organisation.&lt;/p&gt;
</description>
        <pubDate>Wed, 21 Jan 2026 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2026/01/21/vertical-horizontal-ai/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2026/01/21/vertical-horizontal-ai/</guid>
      </item>
    
      <item>
        <title>Why your choice of model matters</title>
        <description>&lt;p&gt;I am sure you are familiar with the fact GitHub Copilot offers you an incredible amount of models to choose from:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-12-06-12-38-13.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A question I often receive is “&lt;em&gt;so which model should I choose for my day-to-day work?&lt;/em&gt;”&lt;/p&gt;

&lt;p&gt;The answer is not as straightforward as you might think, and here is why.&lt;/p&gt;

&lt;h3 id=&quot;there-is-no-single-model-to-rule-them-all&quot;&gt;There is no single model to rule them all&lt;/h3&gt;
&lt;p&gt;You should not use a model as your singular, go-to, general-purpose solution for every problem.&lt;/p&gt;

&lt;p&gt;Every model will have pros and cons, and there is a nice &lt;a href=&quot;https://docs.github.com/en/copilot/reference/ai-models/model-comparison&quot;&gt;documentation page&lt;/a&gt; showing not only what a model is very good at, but also its system card, where you can find information about the safety assessment and the validation process used during training - something we discussed in a &lt;a href=&quot;https://mattvsts.github.io/2025/11/15/a-reflection-risks-ai/&quot;&gt;previous post&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;take-advantage-of-each-model-strengths&quot;&gt;Take advantage of each model strengths&lt;/h3&gt;
&lt;p&gt;Knowing this, you can break down every task into smaller units, identified by complexity. You don’t have to stick to a single model, and you’ll have to determine what’s the choice based on the type of task you do.&lt;/p&gt;

&lt;p&gt;For example, the first thing I would do with a complex task breakdown is to engage a model with deep reasoning capabilities like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Claude Opus 4.5&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gemini 3 Pro&lt;/code&gt; in Plan Mode, in order to define a list of simpler activities to do. This is where your really need reasoning capabilities, and it should be the first activity to do regardless if you want to be efficient about your Premium Requests quota as well.&lt;/p&gt;

&lt;p&gt;Following that, if something is a pure coding problem, I would go with something lighter and quicker however. still very much code-focused like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Claude Sonnet 4.5&lt;/code&gt;, unless it’s a really deterministic and defined problem where a lightweight model the kind of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Claude Haiku 4.5&lt;/code&gt; or the new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GitHub Raptor Mini&lt;/code&gt; will do.&lt;/p&gt;

&lt;p&gt;If instead we are looking at a verbose documentation task, the best balance comes from the OpenAI models are the ones with the best articulation, however Claude Sonnet will do well in that because of the code-heavy context.&lt;/p&gt;

&lt;h3 id=&quot;you-should-not-switch-all-the-time-find-what-works-for-you&quot;&gt;You should not switch all the time, find what works for you&lt;/h3&gt;
&lt;p&gt;That said, I would not recommend to choose a specific model for each and every task. Over time you will develop a higher level of maturity in prompt and context engineering, and coupled with multi-tiered coding instructions you will get to a point where your model choice will be one-per-type of task.&lt;/p&gt;

&lt;p&gt;It will be important to keep up with the continuous development we see in the field, so whenever something new comes out swapping out models for test runs on well-known type of activities will be the benchmarking exercise you need to find the most suitable model for your workflow. It will become very personal after a while.&lt;/p&gt;

&lt;h3 id=&quot;remember-your-custom-models&quot;&gt;Remember your custom models&lt;/h3&gt;
&lt;p&gt;This is not for everyone, I get it, however don’t forget the models offered by the service are only an ‘as a service’ offering. You can plug your own models, either local or hosted, so to use something that has been tailored on your own needs or codebase.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-12-06-13-32-18.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ollama in particular is the one to look at if you want to run a local model, something we are and we will be doing more frequently than ever.&lt;/p&gt;
</description>
        <pubDate>Sat, 06 Dec 2025 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2025/12/06/choice-model-matters/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2025/12/06/choice-model-matters/</guid>
      </item>
    
      <item>
        <title>A reflection on the risks of GenAI</title>
        <description>&lt;p&gt;Earlier this week, Anthropic shared &lt;a href=&quot;https://www.anthropic.com/news/disrupting-AI-espionage&quot;&gt;details&lt;/a&gt; about how a hacking group used Claude for a highly sophisticated espionage campaign against a number of organisations.&lt;/p&gt;

&lt;p&gt;This obviously sparked a number of conversations around the topic of security of GenAI tools for developers, and I ended-up explaining to some of our clients that even if they wanted to add their own security process and vetting (pointless, we’ll see why) they wouldn’t be able to do anything with the same speed and efficiency as Anthropic.&lt;/p&gt;

&lt;p&gt;This begs the question though… what can an organisation do, realistically, about it?&lt;/p&gt;

&lt;h3 id=&quot;accept-that-complete-prevention-is-not-possible&quot;&gt;Accept that complete prevention is not possible&lt;/h3&gt;
&lt;p&gt;When you are introducing a GenAI-driven tool you must accept a degree of risk. Risk is, specifically, around the speed of execution for malicious intent coming directly from within. Let’s have a look at an example: if you ask GenAI to help you with something, it will really try to help you if you use a somewhat advanced model (Claude Sonnet 4.5 here):&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-11-15-20-33-09.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Note the latter stage of this: “…&lt;strong&gt;&lt;em&gt;let me create a quick start script&lt;/em&gt;&lt;/strong&gt;”. This is not a simple ask-iterate-execute loop, but rather a full-blown reasoning cycle which leads to unexpected actions. In this case the example is positive, the tool created a whole script to aid with a certain piece of work, but it begs the question: can you restrict this? Short and definitive answer: no.&lt;/p&gt;

&lt;p&gt;When I say no, I mean without restricting unnecessarily all the valuable functionalities that you get with more advanced models. Realistically, do you believe you can do &lt;em&gt;better&lt;/em&gt; than your supplier?&lt;/p&gt;

&lt;p&gt;Microsoft, GitHub, Amazon, Anthropic… they all perform extensive testing before releasing models for consumption on their platforms. GitHub talks about it &lt;a href=&quot;https://github.blog/ai-and-ml/generative-ai/how-we-evaluate-models-for-github-copilot/&quot;&gt;here&lt;/a&gt;, covering their AI model evaluation process, and if something is released on their platforms is incredibly unlikely you would be able to find something they didn’t.&lt;/p&gt;

&lt;p&gt;Also, this is a service. If this was your own model you could run something like &lt;a href=&quot;https://github.com/mlcommons/modelbench&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;modelbench&lt;/code&gt;&lt;/a&gt;, however you have to implicitly accept the risk as you cannot really do much more than they do, given you are just a downstream consumer.&lt;/p&gt;

&lt;h3 id=&quot;some-things-dont-really-change&quot;&gt;Some things don’t really change&lt;/h3&gt;
&lt;p&gt;What I always bring up to CTOs, is that the risk here is not new. You have a new vector, not a new threat in itself. The &lt;a href=&quot;https://assets.anthropic.com/m/ec212e6566a0d47/original/Disrupting-the-first-reported-AI-orchestrated-cyber-espionage-campaign.pdf&quot;&gt;full report&lt;/a&gt; is a very interesting read, as the way Claude ended-up being used was to speed-up &lt;del&gt;hacking productivity&lt;/del&gt; tactical execution work (sorry 😆) and it was heavily reliant on jailbreaking and rogue MCP servers.&lt;/p&gt;

&lt;p&gt;The jailbreaking process is novel, as it managed to bypass the safety guardrail Anthropic setup on the model. That’s the core issue, and they moved very quickly.&lt;/p&gt;

&lt;p&gt;Whilst you can’t do anything about jailbreaking (that’s a supplier-managed guardrail and Anthropic already fixed the pattern), what you can do is control MCP servers and, obviously, monitor the environments from where activities are carried out. Nothing that a good, old SOC can’t do, and it will still be linked to one or more users via network traffic.&lt;/p&gt;
</description>
        <pubDate>Sat, 15 Nov 2025 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2025/11/15/a-reflection-risks-ai/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2025/11/15/a-reflection-risks-ai/</guid>
      </item>
    
      <item>
        <title>Do it for real - Agent-driven prototyping</title>
        <description>&lt;blockquote&gt;
  &lt;p&gt;How do you really harness GenAI in an engineering organisation?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I answer to this question at least once a day. And my (long) answer is hard to digest. It involves bottom-up empowerment and, most importantly, disruption. And with disruption, the reaction is always the same:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;But we already have a critical programme of work we cannot slow down! Our engineers can’t get distracted with this.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Well let me tell you… you are on the road to irrelevance. Do you want an example? Let’s do this.&lt;/p&gt;

&lt;h2 id=&quot;my-persona&quot;&gt;My persona&lt;/h2&gt;
&lt;p&gt;I haven’t worn a developer hat (professionally of course) in ages.&lt;/p&gt;

&lt;p&gt;I can write code, I can help and troubleshoot, but ultimately I haven’t been a full-time engineer in over a decade, I would be doing a disservice to developers if I were to call myself one.&lt;/p&gt;

&lt;p&gt;Yet I still dabble with code because I believe it’s critical to be able to remain at the forefront, and every good leader should put their money where their mouth is.&lt;/p&gt;

&lt;p&gt;If I do something more than twice I script the hell out of it. Infrastructure as Code, automation and pipelines are second nature. Backend development is still fun. However I never liked any form of JavaScript, and I tended to avoid it. Until now.&lt;/p&gt;

&lt;h2 id=&quot;my-use-case&quot;&gt;My use case&lt;/h2&gt;
&lt;p&gt;I am an avid retrogamer, to the point I have a CRT TV in my office as well as a number of consoles and a gaming PC. And to go with all of that, obviously, there is a spreadsheet keeping order in my game collection.&lt;/p&gt;

&lt;p&gt;I decided to replace it with a simple web application, and rather than going the usual stack of .NET and my comfort zone, I decided to do things in an entirely different way: GenAI-first.&lt;/p&gt;

&lt;h2 id=&quot;the-initial-prototype&quot;&gt;The initial prototype&lt;/h2&gt;
&lt;p&gt;As I said multiple times, I love GitHub Spark. It gives developers a way of seeing ideas turn to reality quickly and without the burden of scaffolding. So that was my initial choice:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-10-23-21-08-00.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This took less than 30 minutes. It was mostly about explicitly calling out what I wanted, in detail, and iterating on small requests. My initial prompt was very big though, as I had listed out the features I needed.&lt;/p&gt;

&lt;p&gt;This prototype is no small feat: it has CSV-based import and export logic with delta manipulation, category management, search and filtering, proper UI. It’s a real application, not a Hello World of sorts.&lt;/p&gt;

&lt;h2 id=&quot;leave-the-prototype-alone&quot;&gt;Leave the prototype alone!&lt;/h2&gt;
&lt;p&gt;Once you are happy with the result, Spark lets you publish a repository with the content of your Spark:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-10-23-21-11-50.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now, this repo is a fork of the template GitHub uses for a Spark, but most importantly &lt;strong&gt;it is directly linked to your Spark that is running&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-10-23-21-13-22.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;For this reason, you should not work on this repository unless you want to tinker with the frontend. Given we want to get to a real environment, you will need to tear the key-value store apart and replace it with another solution, breaking the Spark.&lt;/p&gt;

&lt;p&gt;You should be doing what any developer in working in a real Agentic Engineering organisation would do: fork it from your local repo to another, organisational one. I happen to have this setup as well (account v organisation) so I forked it as-is into my organisation:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-10-23-21-18-47.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now we are talking! A quick &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;npm run build&lt;/code&gt; confirms it works on my machine. Or it loads, rather.&lt;/p&gt;

&lt;h2 id=&quot;getting-on-azure&quot;&gt;Getting on Azure&lt;/h2&gt;
&lt;p&gt;Infrastructure-wise, we will go for the bare minimum: an Azure Storage Account with Table Storage for &lt;em&gt;my&lt;/em&gt; key-value storage, and an Azure Static Web App for the frontend. Simple enough.&lt;/p&gt;

&lt;p&gt;The first thing to do once you go down this route is to modify the default GitHub Actions workflow that Azure creates when you link the repo to the Web App:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-10-23-21-24-40.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;app_build_command&lt;/code&gt; is needed because Spark uses Vite for building the app, and it’s not the default stack used in Azure. Don’t try any other way, it won’t work (changing the directory, etc.), easy enough though with a reasonable understanding of what you are doing.&lt;/p&gt;

&lt;p&gt;Also remember to change the Node version in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;package.json&lt;/code&gt; file as the packages in use target Node 20+:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-10-23-21-26-33.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This will allow you to get a green pipeline and have an empty Azure application which cannot save data anywhere. Still, it’s outside of Spark now!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-10-23-21-29-12.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;agents-for-the-heavy-lifting&quot;&gt;Agents for the heavy lifting&lt;/h2&gt;
&lt;p&gt;I definitely don’t want to start fiddling with code I haven’t written, especially in an unfamiliar environment: enter my GitHub Copilot Agent Mode, which will replace the key-value storage with the appropriate Table Storage calls:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-10-23-21-37-24.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It worked for a while, and it not only implemented the logic but also generated plenty of documentation supporting everything. Except it did not work at all.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-10-23-21-39-17.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Interestingly enough, the final output was a list of potential troubleshooting steps to take:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-10-23-21-40-46.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;CORS looked like the culprit here. Once configured in the Storage Account, the application magically worked both locally and on Azure.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-10-23-22-44-41.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-10-23-22-46-05.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;how-long-did-it-take&quot;&gt;How long did it take?&lt;/h2&gt;
&lt;p&gt;As insane as it sounds, two hours. It was more the effort of getting the Spark right than anything else.
I had two Pull Requests running 25 minutes from each other, and that was it:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-10-23-21-47-42.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-10-23-21-47-11.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Obviously, an experienced developer would be quicker!&lt;/p&gt;

&lt;h2 id=&quot;whats-next&quot;&gt;What’s next?&lt;/h2&gt;
&lt;p&gt;If this was a real product and not just a one-off experiment, the logical next step would be to build more features using Coding Agents. That would be an extremely quick way of getting onboard with new development (or refactoring/bugfix) exploiting GenAI assistance to the max.&lt;/p&gt;

&lt;p&gt;There might be more fixes or enhancements I can do on the fly with Agent Mode, or even coding them directly myself. The amount of documentation is brilliant and really helpful. Agent Mode even generates diagnostic tools and troubleshooting scripts when prompted correctly, which are super invaluable.&lt;/p&gt;

&lt;p&gt;That is where real &lt;a href=&quot;https://www.microsoft.com/en-us/worklab/work-trend-index/2025-the-year-the-frontier-firm-is-born&quot;&gt;Frontier Firms&lt;/a&gt; are heading, harnessing a new way of working and leveraging change and disruption for industry-altering improvements. This is where we are heading, collectively.&lt;/p&gt;

&lt;p&gt;If you are still worried about your programmes, it might be time to reconsider and trying to foster some experimentation, because if you are not doing it… your competitors surely are.&lt;/p&gt;
</description>
        <pubDate>Thu, 23 Oct 2025 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2025/10/23/agent-driven-prototyping/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2025/10/23/agent-driven-prototyping/</guid>
      </item>
    
      <item>
        <title>If you are down because of the AWS outage, it&apos;s your fault</title>
        <description>&lt;p&gt;So… your systems went down yesterday because of the outage on the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;US-East-1&lt;/code&gt; region. Global impact, massive problem, I agree.&lt;/p&gt;

&lt;p&gt;Now, dear organisation… it’s all your fault. &lt;strong&gt;Especially&lt;/strong&gt; if you claim to be &lt;em&gt;cloud-native&lt;/em&gt; because you use a hyperscaler.&lt;/p&gt;

&lt;h2 id=&quot;why&quot;&gt;Why?&lt;/h2&gt;
&lt;p&gt;Because I saw far too many instances of organisations turning down the right decision, the right design, the right implementation that takes a multi-region implementation seriously.&lt;/p&gt;

&lt;p&gt;You had the option of enabling geo-distribution, using regional replication, designing around Availabilty Zones, anything that gave you true multi-region resiliency, and yet you didn’t. The reason?&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;It’s too expensive&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;the-business-impact-of-penny-pinching-on-your-opex&quot;&gt;The business impact of penny-pinching on your Opex&lt;/h2&gt;
&lt;p&gt;Let me be super clear on this: if you use a hyperscaler as you would use a datacentre, you are not cloud-native. You are just running a more expensive datacentre without a hardware amortisation plan.&lt;/p&gt;

&lt;p&gt;You might be benefiting from the elasticity of the Public Cloud, moving from Capex to Opex, however you have to stick to a financial envelope designed for on-premise kit. So you end-up penny-pinching.&lt;/p&gt;

&lt;p&gt;Not using the real HADR features of Public Cloud. Faking a highly available design that just accounts for component or system failure rather than geographic or catastrophic failure. The list goes on and on…&lt;/p&gt;

&lt;h2 id=&quot;change-your-risk-modelling&quot;&gt;Change your risk modelling&lt;/h2&gt;
&lt;p&gt;You need to accept that using a hyperscaler requires a radically different approach to architecture design, risk modelling and financial estimation.&lt;/p&gt;

&lt;p&gt;Besides the mindset shift required in technology, think about how much risk is actually palatable…&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;If a region goes down, so does your business. Can you accept being &lt;strong&gt;fully offline&lt;/strong&gt; for a variable amount of time?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;SLAs are pointless if they are your only certainty in terms of resilience. Model your risk mitigation based on this answer to start with, and use the Public Cloud as it’s supposed intended to be used if you want to be a true digital organisation.&lt;/p&gt;
</description>
        <pubDate>Tue, 21 Oct 2025 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2025/10/21/aws-outage-your-fault/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2025/10/21/aws-outage-your-fault/</guid>
      </item>
    
      <item>
        <title>Custom personas in GitHub Copilot</title>
        <description>&lt;p&gt;I talked about &lt;a href=&quot;https://mattvsts.github.io/2025/09/17/custom-copilot-chat/&quot;&gt;Custom Instructions&lt;/a&gt; in the past, but can we go further?&lt;/p&gt;

&lt;p&gt;You can build your own persona to pair with when using GitHub Copilot. Think about specific, role-defined activities you need to perform on the regular, which would benefit from a &lt;em&gt;specialist&lt;/em&gt; rather than a generic approach Copilot could have.&lt;/p&gt;

&lt;p&gt;Enter &lt;a href=&quot;https://code.visualstudio.com/docs/copilot/customization/custom-chat-modes#_custom-chat-modes&quot;&gt;Custom Chat Modes&lt;/a&gt;. This is different from the custom command, and it will extend the Modes (think Ask, Edit, Agent) you have in your IDE.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-10-15-18-39-35.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-10-15-18-40-03.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This is where you build your prompt. Be specific, detailed and ensure you cover the behavior you need:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-10-15-18-41-28.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now, there is a lot more you can do. First of all, you can select the MCP tools you want to add (in this example I used all the built-in ones). Crucially, you can also specify the model you want to use.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-10-15-21-49-00.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Once done you can save it in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/chatmodes&lt;/code&gt; folder, using a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;persona&amp;gt;.chatmode.md&lt;/code&gt; name”. This will load it up in Visual Studio Code:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-10-15-21-49-31.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Let’s test it!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-10-15-21-49-50.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-10-15-21-50-34.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can build as many Personas as you need, and having specialised assistants really goes a long way in a GenAI-augmented developer experience.&lt;/p&gt;
</description>
        <pubDate>Wed, 15 Oct 2025 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2025/10/15/custom-personas/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2025/10/15/custom-personas/</guid>
      </item>
    
      <item>
        <title>Moving from vibe coding to Agentic Engineering</title>
        <description>&lt;p&gt;Vibe coding is great. There, I said it.&lt;/p&gt;

&lt;p&gt;You know how much I like GitHub Copilot, GitHub Spark and all the other GenAI tools that allow someone like me, somewhat removed from being on the front row of development action, to actually be really relevant by quickly scaffolding and, eventually, creating new working code that solves someone else’s problem.&lt;/p&gt;

&lt;p&gt;Now… it’s all very nice and well, but it does not work at large scale and it does not work in structured environments where variance is frowned upon and adherence to best practices and standards is vital for code to be shipped to production.&lt;/p&gt;

&lt;p&gt;And that’s the way it should be in order to avoid piles and piles of technical debt from accumulating in your codebase. What if I wanted to leverage AI to do more than just scaffolding, and drastically accelerate my SDLC?&lt;/p&gt;

&lt;h2 id=&quot;spec-driven-development&quot;&gt;Spec-driven Development&lt;/h2&gt;
&lt;p&gt;The answer is &lt;a href=&quot;https://github.com/github/spec-kit&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;spec-kit&lt;/code&gt;&lt;/a&gt;, a lightweight framework that translates specifications into individual chunks of work that can be delegated to one or more Agent.&lt;/p&gt;

&lt;p&gt;This is a particularly sensitive topic in enterprise environments: as of today you had to craft your prompts very carefully otherwise risking a disconnect between your requirements and the code being produced. This is no more.&lt;/p&gt;

&lt;h2 id=&quot;how-does-it-work&quot;&gt;How does it work?&lt;/h2&gt;
&lt;p&gt;You install Specify and you setup a project with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;spec-kit&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-09-24-15-45-32.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You will have three additional commands for GitHub Copilot in Visual Studio Code:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-09-24-15-47-32.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;These are the three fundamental commands of SDD - it follows a &lt;em&gt;why-what-how&lt;/em&gt; paradigm:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Why = &lt;strong&gt;Specify&lt;/strong&gt; the vision&lt;/li&gt;
  &lt;li&gt;What = &lt;strong&gt;Plan&lt;/strong&gt; the technical implementation&lt;/li&gt;
  &lt;li&gt;How = Break down the specification into actual &lt;strong&gt;Tasks&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They will live off a file called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;constitution.md&lt;/code&gt;, which acts as the immutable principles upon which the commands will run, and most importantly, is the de-facto &lt;strong&gt;memory&lt;/strong&gt; for your key commands:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-09-24-16-21-21.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Before diving into details, keep in mind that every command template lives in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/prompts&lt;/code&gt; folder, they are Markdown wrappers towards the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;specify&lt;/code&gt; CLI to be used by GitHub Copilot (or your favourite assistant) and everything can be customised and extended as needed, so these are effectively templates.&lt;/p&gt;

&lt;h3 id=&quot;specify&quot;&gt;Specify&lt;/h3&gt;
&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/specify&lt;/code&gt; will read your requirement and generate a detailed breakdown of your acceptance criteria, the sub-features and components of the requirement, and every functional detail required for a solid implementation.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-09-24-15-57-32.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This &lt;em&gt;specification&lt;/em&gt; is the functional understanding of the requirement from the GenAI perspective:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-09-24-16-04-03.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Your quality gates will be an explicit part of the specification:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-09-24-16-11-59.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;plan&quot;&gt;Plan&lt;/h3&gt;
&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/plan&lt;/code&gt; is the command to be supplied with the technical details of the implementation you want the Agent to follow, so it can generate an execution plan for your Agents:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-09-24-16-13-52.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-09-24-16-22-52.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Something really interesting here: the &lt;em&gt;constitution&lt;/em&gt; is enforced at plan time:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-09-24-16-24-17.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;That’s why that file is central to the whole idea of SDD.&lt;/p&gt;

&lt;h3 id=&quot;tasks&quot;&gt;Tasks&lt;/h3&gt;
&lt;p&gt;Once you are ready to proceed, you can generate the task breakdown:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-09-24-16-25-14.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You will get an interesting list of tasks that can be given to one or more agents:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-09-24-16-25-51.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Here you can add or define any key dependency, library, etc. to remark to the agents for implementation.&lt;/p&gt;

&lt;h3 id=&quot;implement&quot;&gt;Implement&lt;/h3&gt;
&lt;p&gt;As a first timer, I wanted to observe how the tasks were implemented (you can run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/implement&lt;/code&gt; otherwise), so I manually triggered the execution in GitHub Copilot Agent Mode:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-09-24-16-36-33.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It was really interesting to observe the iterations and how it tried to solve problems, including with running tools:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-09-24-16-37-31.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It took a while…&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-09-24-16-43-28.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And eventually, it delivered:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-09-24-16-40-12.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And yes, it actually works 😀&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-09-24-16-48-41.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;so-what&quot;&gt;So what?&lt;/h2&gt;
&lt;p&gt;The key difference between vibe coding and agentic engineering is the repeatability of a solution. The key foundation of Agentic Engineering is giving developers more time to focus on the actual value-added, rather than diluting their flow state with repetitive and sometimes tedious activities.&lt;/p&gt;

&lt;p&gt;For this to happen, developers need to be coordinating a number of agentic processes so that they can then review and augment what is otherwise machine-generated code to the expected standard.&lt;/p&gt;

&lt;p&gt;Spec-driven Development bridges that gap today, giving teams a way of exploiting all the power of GenAI for developers without having to manually keep an eye out for every single execution. It’s quite literally at the frontier of our industry, I could not more excited for future developments!&lt;/p&gt;
</description>
        <pubDate>Wed, 24 Sep 2025 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2025/09/24/vibe-coding-agentic-engineering/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2025/09/24/vibe-coding-agentic-engineering/</guid>
      </item>
    
      <item>
        <title>Build a Custom Copilot Chat command in seconds</title>
        <description>&lt;p&gt;A simple yet underrated way of accelerating standardisation in an enterprise engineering platform is to build custom Copilot instructions to bundle in your repositories.&lt;/p&gt;

&lt;p&gt;Whilst that is very true, we should not just think of them as overarching, standard prompts that give custom information to our developers. That would be true of a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;copilot-instructions.md&lt;/code&gt; file in the root of the repository, however anyone can develop their own, just by adding a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;command&amp;gt;.prompt.md&lt;/code&gt; file in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/prompts&lt;/code&gt; folder.&lt;/p&gt;

&lt;p&gt;Something like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-09-17-13-11-17.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You will be able to invoke it from the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/pirate&lt;/code&gt; command in Copilot Chat:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-09-17-13-13-11.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This would invoke the prompt (&lt;em&gt;“can you help?”&lt;/em&gt;) with my pre-defined context setup for the command:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-09-17-13-21-37.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And it will result in… well, exactly what you’d expect 😂&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-09-17-13-15-29.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It’s not magic, it’s not special, it’s just part of the GitHub Copilot infrastructure in Visual Studio Code, that allows you to &lt;a href=&quot;https://docs.github.com/en/enterprise-cloud@latest/copilot/how-tos/configure-custom-instructions/add-repository-instructions&quot;&gt;create&lt;/a&gt; custom instructions.&lt;/p&gt;

&lt;p&gt;Obviously, being a Markdown-based approach, you can also use it in your coding agents if you have something specific in them - all you have to do is to refer to them as part of your Agent prompt.&lt;/p&gt;

</description>
        <pubDate>Wed, 17 Sep 2025 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2025/09/17/custom-copilot-chat/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2025/09/17/custom-copilot-chat/</guid>
      </item>
    
      <item>
        <title>Why watermarking your code is a bad idea</title>
        <description>&lt;p&gt;The absolute number one request I get from clients rolling out GenAI assistance to their developers is:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I want to know how much code is generated by GenAI, by team, and even by person sometimes&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I think it’s a very bad idea, for a number of reasons. Here is why.&lt;/p&gt;

&lt;h3 id=&quot;it-takes-unnecessary-effort&quot;&gt;It takes unnecessary effort&lt;/h3&gt;
&lt;p&gt;You want to know how much GenAI code is introduced in your codebase? No problem, it’s technically easy: if you want deterministic watermarking in your code (so not just relying on the involuntary patterns your LLM leaves behind), you will find a significant number of &lt;a href=&quot;https://aclanthology.org/2024.acl-long.268.pdf&quot;&gt;academic&lt;/a&gt; &lt;a href=&quot;https://arxiv.org/html/2502.02068v2&quot;&gt;papers&lt;/a&gt; talking about how to add invisible signatures to your code, so you can then use a tool to detect said signatures and report against them. You can already find commercial platforms doing that on your behalf, for a fee.&lt;/p&gt;

&lt;p&gt;You will obviously need to setup runtime automations in your CI pipelines, as well as dashboards, reports, ingestion into a data platform (?) and… you will still fail. Why?&lt;/p&gt;

&lt;p&gt;Think about this: a developer starts writing code and they accept an autocompletion suggestion from GitHub Copilot. Do you:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;consider that line of code AI-generated?&lt;/li&gt;
  &lt;li&gt;discount what the developer did? The suggestion might have been is so marginal it barely makes a dent in the code generated.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What if a developer amends GenAI-generated code? Does it count against your metric or not?&lt;/p&gt;

&lt;p&gt;As you can see it’s a rabbithole you have no benefit from.&lt;/p&gt;

&lt;h3 id=&quot;it-dents-developers-confidence&quot;&gt;It dents developers’ confidence&lt;/h3&gt;
&lt;p&gt;Let’s say you gave up on the idea of running these tools and you just want a surface-level idea of how much code is generated. Lightweight, little effort for reporting. You end up adding a custom instruction to your repos along the lines of this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-08-25-11-38-18.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Congratulations! You will have a bunch of lines watermarked:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-08-25-11-39-45.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now, assume your developers need to work on these lines of code. Do they need to manually remove the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GHCP GEN&lt;/code&gt; comment every time?&lt;/p&gt;

&lt;p&gt;If so, it will cause a loss of productivity at a minimum, without thinking about how they will be incentivised in cheating the system, either by adding extra code themselves with the comment or actively avoiding to show usage of GenAI acceleration.&lt;/p&gt;

&lt;p&gt;Doing this causes a significant loss of trust for developers, and it will have negative effects on developer productivity across the board. Is it really worth it?&lt;/p&gt;

&lt;h3 id=&quot;focus-on-the-best-practices&quot;&gt;Focus on the best practices&lt;/h3&gt;
&lt;p&gt;There is no substitute for &lt;a href=&quot;https://dora.dev/guides/dora-metrics-four-keys/&quot;&gt;DORA metrics&lt;/a&gt;, it’s that simple. You can derive your own, based on DORA’s and adapted to the state of the organisation you work in, and add forms of active measurement around the &lt;a href=&quot;https://queue.acm.org/detail.cfm?id=3454124&quot;&gt;SPACE framework&lt;/a&gt;, however you will always end up gravitating around them because it’s the most non-disruptive and accurate measurement you can use for your teams.&lt;/p&gt;

</description>
        <pubDate>Mon, 25 Aug 2025 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2025/08/25/watermarking-bad-idea/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2025/08/25/watermarking-bad-idea/</guid>
      </item>
    
      <item>
        <title>The current state of Agentic Engineering with GitHub Copilot</title>
        <description>&lt;p&gt;2025 is all about AI with agents, and as always developers are at the forefront. There are layers to it though, and I keep getting confused clients approaching me about some of the possibilities. At the end of the day this is not just about tools, and Agentic Engineering is not about giving all your developers access to GitHub Copilot or Amazon Q Developer, but rather a cohesive approach to the end to end lifecycle.&lt;/p&gt;

&lt;p&gt;We looked at a few things &lt;a href=&quot;https://mattvsts.github.io/2025/05/03/infusing-ai-in-azure-devops/&quot;&gt;here&lt;/a&gt;, but these are just tooling examples. Let’s try to broaden the subject and summarise where we are as an industry point of view.&lt;/p&gt;

&lt;h3 id=&quot;assistants-like-github-copilot-are-a-commodity&quot;&gt;Assistants like GitHub Copilot are a commodity&lt;/h3&gt;
&lt;p&gt;As I said earlier, access to GitHub Copilot does not make your engineering organisation AI-native. In 2025 we should be well past the point of &lt;em&gt;proving value&lt;/em&gt; for a rollout, yet I still talk to clients about it on a daily basis. 
Access to GitHub Copilot (or any other developer assistant) is table stakes if innovation is the top priority, and if you are not doing it, rest assured your competitors are. 
Costs are negligible compared to the value returned, the ability of giving developers an immediate boost pays for itself and there are huge positive implications - essentially every active measurement survey proves that, in each and every rollout I am involved in, so sample size is not one.&lt;/p&gt;

&lt;p&gt;There are different ways a developer gets benefits from using GenAI, and it will ultimately depend by the way you use it. Regardless, it is a no-brainer.&lt;/p&gt;

&lt;h3 id=&quot;supporting-developers&quot;&gt;Supporting developers&lt;/h3&gt;
&lt;p&gt;A developer is supported by GitHub Copilot when they use it in the IDE, regardless of the mode.&lt;/p&gt;

&lt;p&gt;Code completion, Ask Mode, code generation and Agent Mode are all aimed at augmenting the work our teams do so they can add their specific skills and knowledge in the most efficient way, with every tedious, repetitive or otherwise time-consuming operation out of the way.&lt;/p&gt;

&lt;p&gt;An example of this is Agent Mode. Copilot does something for your developer, but still their your direct supervision:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-08-01-10-16-07.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Supervision here is key: with Agent Mode your continuous feedback loop ensures the output is what you actually need. This is not an agent working in unattended fashion:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-08-01-10-18-28.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The immediate impact of using Agent Mode is that developers work on their codebase with significant acceleration, more than just using code completion or generation, and with tangible efficiency benefits.&lt;/p&gt;

&lt;h3 id=&quot;augmenting-developers&quot;&gt;Augmenting developers&lt;/h3&gt;
&lt;p&gt;Augmentation for developers is evident when a developer is able to scale significantly using Coding Agents.&lt;/p&gt;

&lt;p&gt;A Coding Agent is real, unattended delivery where the developer only reviews, leaving the actual implementation to the agent itself. A developer can then start their flow on something else, and once the agent is done they can review, comment, and suggest changes. Look at this example:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-08-01-11-00-07.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This is a super crude user story. There is little context, zero information about NFRs, only a goal outlined: write the Unit Tests against a codebase. Yet, once I assigned it to a Coding Agent, it did that and more:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-08-02-14-41-32.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The interesting thing is that a Coding Agent can and will understand failure and remediation:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-08-01-11-18-59.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The way it works is simple: the Agent analyses the context from scratch, and it uses the whole repository.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-08-01-11-21-07.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;That’s how it can understand &lt;em&gt;the whole thing&lt;/em&gt; and delivers the functionality in roughly 15 minutes and you can still interact with it in a PR to trigger further work:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-08-01-11-27-57.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It could obviously be much more efficient as well, with custom instructions, environment setup or other features, but more on that in a future post 🙂.&lt;/p&gt;

&lt;p&gt;Developer augmentation is not just pure feature generation: you can (and should) leverage Copilot Agents for code review as well, directly in your Pull Requests:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-08-01-11-27-02.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;These two use cases alone are the foundation of Agentic Engineering.&lt;/p&gt;

&lt;h3 id=&quot;whats-next&quot;&gt;What’s next?&lt;/h3&gt;
&lt;p&gt;The biggest difference with other tools or platform is that Agentic Engineering keeps evolving. Today we talk about GitHub Copilot Coding Agents, but Claude Code (to name an example) is emerging at breakneck speed and something else might come up next week or the week after.&lt;/p&gt;

&lt;p&gt;Things will also go beyond the pure coding aspect of the developer workflow, &lt;a href=&quot;https://github.blog/changelog/2025-05-29-introducing-copilot-spaces-a-new-way-to-work-with-code-and-context/&quot;&gt;Copilot Spaces&lt;/a&gt; is an excellent example. Think of it as shared context analysis for small scale (PBI, bug fix) implementations. It’s a brilliant brainstorming aid and it helps shifting left some of the effort required in a Pull Request.&lt;/p&gt;

&lt;p&gt;Ultimately the goal for Agentic Engineering is to settle on practices and approaches where the platform works on your behalf and the developers can express multiples of their potential. Ideally, the platform should be something multimodel and extensible. GitHub Copilot is, frankly, both - so it is perfect ground for future developments. I am excited for what’s next!&lt;/p&gt;
</description>
        <pubDate>Fri, 01 Aug 2025 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2025/08/01/state-agentic-engineering/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2025/08/01/state-agentic-engineering/</guid>
      </item>
    
      <item>
        <title>GitHub Copilot Spaces is your rubber duck</title>
        <description>&lt;p&gt;The GitHub ecosystem keeps growing and GitHub Copilot has got a new, preview feature… that looks like a product. &lt;a href=&quot;https://github.blog/changelog/2025-05-29-introducing-copilot-spaces-a-new-way-to-work-with-code-and-context/&quot;&gt;Copilot Spaces&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It’s a brilliant tool to go beyond code, and use it as a &lt;a href=&quot;https://rubberduckdebugging.com&quot;&gt;rubber duck&lt;/a&gt; in any situation. Think where you need to search large amount of documentation, or code.&lt;/p&gt;

&lt;p&gt;For example, I have 13 years of posts in my blog. I might not need to index all of them, but rather just the past few years. I created a Space just for that…&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-06-05-22-27-43.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I gave it some system instructions to ensure its behavior is very tailored, then ingested the past few years of posts, leaving room for growth:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-06-05-22-30-01.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And that’s all: I can start prompting! With my model of choice, of course:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-06-05-22-33-44.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-06-05-22-34-37.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Of course this is a super-simple scenario. However imagine you need to brainstorm an idea or discuss something with a colleague… Spaces gives you that environment. It’s similar to &lt;a href=&quot;https://mattvsts.github.io/2024/11/09/copilot-workspace-brainstorming/&quot;&gt;Copilot Workspaces&lt;/a&gt; in many ways, but with more flexibility around how you use it.&lt;/p&gt;
</description>
        <pubDate>Thu, 05 Jun 2025 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2025/06/05/copilot-spaces-assistant/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2025/06/05/copilot-spaces-assistant/</guid>
      </item>
    
      <item>
        <title>Extensions approval status in Azure DevOps</title>
        <description>&lt;p&gt;I just noticed it today, it might have been around for a while… however if you are an Azure DevOps Administrator you will like this.&lt;/p&gt;

&lt;p&gt;The Extensions settings page now shows the approval state of each extension:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-05-07-19-03-34.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If an Extension is considered a &lt;strong&gt;High privilege&lt;/strong&gt; one, it will be highlighted, and in the details you can find what is the permission that is flagged as high privilege:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-05-07-19-04-44.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Extensions (and their lifecycle management) are often a time-consuming and critical part of the role of an Azure DevOps Administrator, this is a small yet very welcome quality of life improvement!&lt;/p&gt;
</description>
        <pubDate>Wed, 07 May 2025 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2025/05/07/extension-approval-status/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2025/05/07/extension-approval-status/</guid>
      </item>
    
      <item>
        <title>Infusing GenAI in Azure DevOps</title>
        <description>&lt;p&gt;I lost count of how many people come to me asking for AI features in Azure DevOps, and then seeing being surprised when I tell them that it’s &lt;em&gt;actually&lt;/em&gt; possible to have an AI-enhanced experience with the platform. So this post brings a couple of examples to the table to try and settle the argument once and for all 😀&lt;/p&gt;

&lt;h3 id=&quot;the-ai-model&quot;&gt;The AI model&lt;/h3&gt;
&lt;p&gt;In order to start, all you need is an OpenAI model - I use mine in Azure because it’s handy and convenient for me, especially for platform integrations. You an obviously use other hosting options, and that will introduce more custom work. However it’s all fairly reproducible everywhere.&lt;/p&gt;

&lt;p&gt;I deployed a GPT-4 model, and I will be using it for two specific use cases: an AI Peer Reviewer for Pull Requests and a Custom Copilot.&lt;/p&gt;

&lt;p&gt;The first use case is really simple, as all it’s doing is really just replying to specific prompts with payload data. The second one is more interesting, as it requires adding your own information to the model. Let’s have a look.&lt;/p&gt;

&lt;h3 id=&quot;ai-peer-reviewer&quot;&gt;AI Peer Reviewer&lt;/h3&gt;
&lt;p&gt;There are several extensions in the Marketplace for GPT-powered review, however the majority of them are forked from &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=mustaphalarhrouch.GPTPullRequestReview&quot;&gt;this one&lt;/a&gt;. I like &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=97Saundersj.AIPullRequestReview&amp;amp;targetId=f48ed84a-f011-41dd-a100-78d49cf2ca38&amp;amp;utm_source=vstsproduct&amp;amp;utm_medium=ExtHubManageList&quot;&gt;this particular one&lt;/a&gt; because it gives me the ability to customise the prompt used as input without having to build my own custom extension should I want to do that. This is particularly important if you want to tailor the prompt for specific rules or for larger enterprise usage.&lt;/p&gt;

&lt;p&gt;This is what you need to add to your pipeline:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-05-03-17-02-56.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Remember to use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;API_VERSION&lt;/code&gt; parameter correctly when configuring the extension - use the API Version shown in the endpoint demo in the AI Foundry and you will be fine.&lt;/p&gt;

&lt;p&gt;The result is quite nice - you have an AI Peer Reviewer in your Azure Repos Pull Request!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts//2025-05-03-17-13-29.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;custom-copilot-like-github-enterprise&quot;&gt;Custom Copilot, like GitHub Enterprise&lt;/h3&gt;
&lt;p&gt;This is quite brilliant as it requires little effort in proportion to what you will achieve. GitHub Copilot Enterprise has a feature called Copilot knowledge bases - essentially a Custom Copilot for your documentation:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-05-03-17-21-20.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Why not having the same in Azure DevOps?&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-05-03-18-21-30.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-05-03-18-22-12.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This requires a little more work: you obviously need to have Wikis in Markdown for your project(s), and then you need to upload them to an Azure Storage Account. If you want to get started quickly, just upload your Wiki content via an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AzureFileCopy&lt;/code&gt; task in a pipeline. Once you do that, you can ingest the aggregated content in your model, enabling &lt;em&gt;your own Enterprise Copilot&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-05-03-18-26-57.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It’s all it takes, given Azure OpenAI supports &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.md&lt;/code&gt; files natively.&lt;/p&gt;

&lt;h3 id=&quot;how-a-pet-project-graduates-to-capability&quot;&gt;How a pet project graduates to capability&lt;/h3&gt;
&lt;p&gt;The features themselves are fairly easy to craft and implement. If you want to make them robust enough for your organisation, you will need to use two things:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;A coherent documentation strategy&lt;/li&gt;
  &lt;li&gt;Extensive usage of Pipeline Decorators&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first one is super important. You can have different file types at a stretch (look out on the &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/use-your-data?tabs=web-pages%2Ccopilot#data-formats-and-file-types&quot;&gt;documentation&lt;/a&gt;) however you really need to have a comprehensive coverage of your documentation to make this scale at organisational size, and you need to make sure you can regularly export them. Hence why Azure DevOps Wikis are so handy for this - chances are you already have all your documentation in Markdown there, so a regular export will do the trick.&lt;/p&gt;

&lt;p&gt;For the second one, &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/devops/extend/develop/add-pipeline-decorator?view=azure-devops&quot;&gt;Pipeline Decorators&lt;/a&gt; take away the effort required to make this a compliance requirement.&lt;/p&gt;

&lt;p&gt;Decorators will deploy what you need in every CI/CD pipeline. What you need is to inject a pre-job decorator that uploads the content of the repository to the Storage Account used by the OpenAI Model, and a post-job decorator that adds your chosen extension for GPT-powered code review with an execution condition similar to the one I used in the example above (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;and(variables[&apos;Build.Reason&apos;], &apos;Pull Request&apos;)&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Taking care of these two things will make your Azure DevOps AI-infused with minimal effort.&lt;/p&gt;

&lt;h3 id=&quot;what-else-can-you-do&quot;&gt;What else can you do?&lt;/h3&gt;
&lt;p&gt;Can you do more? Absolutely. It all relies on adding data to the model, so exporting Release Notes, Test Reports, BOMs, even Work Items will give you more data to work with. And as you can see it’s easier than it sounds.&lt;/p&gt;
</description>
        <pubDate>Sat, 03 May 2025 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2025/05/03/infusing-ai-in-azure-devops/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2025/05/03/infusing-ai-in-azure-devops/</guid>
      </item>
    
      <item>
        <title>How I digitalised my analog notetaking framework in ten minutes with GitHub Spark</title>
        <description>&lt;p&gt;Vibe coding. Many people are talking about it, some are practicing it avidly, some are wondering how to actually do it. This post is for you if you are in the latter camp, or if you want to find out more about GitHub Spark.&lt;/p&gt;

&lt;p&gt;GitHub Spark is an experiment from GitHub Next, and I am particularly fond of it. It gives you a development enviroment, an execution environment, a data storage facility powered by a key-value database and access to LLMs all via…prompts. Yes, prompts. All the applications are built upon React, and despite Spark being designed around natural language and prompt engineering, it still gives you access to the code so you can tinker with it as needed.&lt;/p&gt;

&lt;p&gt;I had ten minutes between meetings, so I wanted to try something more than a Hello World or a sample to do list 😀 I tried to replicate my notetaking framework. It’s something I have been using for over 20 years: a notebook I carry with me for day-to-day notes, relatively unstructured besides a topic header and a date, coupled with a second notebook stored in my office where I summarise notes by topic in a much more condensed and analytical way. The latter one has an index, which helps me find topics at a glance.&lt;/p&gt;

&lt;p&gt;With this in mind, I told Spark what I wanted to do:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-04-27-1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And I got my skeleton up and running:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-04-27-2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A couple more things…&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-04-27-3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-04-27-4.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now, with a few more prompts I added extra features such as favourites and notes export, but this is not really the point. GitHub Spark gives you a way of editing your application in a very simple way, either via manual edits or directly within the code:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-04-27-5.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It gives you hints on what else you could add, a theme editor, a data explorer, logs and a way of adding prompts for LLB-backed features. It’s all there! And if you want to look at the code, you can:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-04-27-6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can also choose different LLMs. I used Claude Sonnet 3.5 for most of this application, however it struggled with the data export feature so I switched to GPT-4o and I managed to get what I needed that way.&lt;/p&gt;

&lt;p&gt;The data storage layer is also pretty interesting: it is key-value, but it’s also JSON-based so you can nest things as needed. This is an example from my Formula 1 result tracker:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-04-27-7.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You are not limited to a single level of hierarchy, and it is quite flexible. This is how it would look once in the application itself:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-04-27-8.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I am using it more and more to create simple things that accelerate my day to day, what I like the most is the fact that it does not require any more effort than this, and it is super-personalised. I hope GitHub will make Spark as accessible as possible as I truly believe it changes the way we think of custom applications.&lt;/p&gt;
</description>
        <pubDate>Sun, 27 Apr 2025 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2025/04/27/notetaking-github-spark/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2025/04/27/notetaking-github-spark/</guid>
      </item>
    
      <item>
        <title>How about a Well-Architected (Framework) for Azure DevOps?</title>
        <description>&lt;p&gt;Someone asked me the other day:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;You blogged about GitHub Well-Architected, it’s brilliant. Why is there no Azure DevOps equivalent?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Fair question, and I will try (and surely fail!) to keep the answer short.&lt;/p&gt;

&lt;h3 id=&quot;azure-devops-is-different&quot;&gt;Azure DevOps is different&lt;/h3&gt;
&lt;p&gt;Simply put, Azure DevOps is designed with a logical container (Team Project) segregating a slice of all the services available on the platform. Team Projects have always beem used to define &lt;em&gt;Projects&lt;/em&gt; and store all the data related to them in a single place.&lt;/p&gt;

&lt;p&gt;You always had code repositories in there, a representation for time (Iterations, to be defined in days) and space (Areas, representing logical subsection of your work). Everything is designed around these concepts.&lt;/p&gt;

&lt;p&gt;This also affected the level of access control, which is super granular and allows custom roles to slice and dice access (or visibility) as needed.&lt;/p&gt;

&lt;h3 id=&quot;historically-there-wasnt-much-consideration-for-this&quot;&gt;Historically there wasn’t much consideration for this&lt;/h3&gt;
&lt;p&gt;Bit of a history lesson over here, with the customary nostalgic tear 🥲. Azure DevOps is based off a product called Team Foundation Server.&lt;/p&gt;

&lt;p&gt;All the content sat on a single database for the longest time. Starting from Team Foundation Server 2010, Microsoft introduced the concept of &lt;em&gt;Team Project Collections&lt;/em&gt;, and it started splitting up data storage. Git was not an option until Team Foundation Server 2012, everything was stored in a centralised Version Control System before then.&lt;/p&gt;

&lt;p&gt;Between Team Foundation Server 2010 and 2012 is also where the codebase was forked to develop TFSOnline, which became Visual Studio Online, which became Visual Studio Team Services, which eventually became Azure DevOps Services.&lt;/p&gt;

&lt;h3 id=&quot;one-team-project-to-rule-them-all&quot;&gt;One Team Project to rule them all&lt;/h3&gt;
&lt;p&gt;After so many years, we needed to move away from what we called “&lt;a href=&quot;https://www.amazon.co.uk/Development-Visual-Studio®-Foundation-Server/dp/0735625719&quot;&gt;TFSGuide&lt;/a&gt;” (TFSGuide was the name of the file and the alias to send feedbacks to…) and onto something that was more industrialised. TFSGuide was a large collection of SOPs and designs every ALM consultant knew almost by heart.&lt;/p&gt;

&lt;p&gt;This is where we started defining new best practices, which ultimately resulted in the “One Team Project to rule them all” approach. This is still very much the best practice, as Microsoft continues to update &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/devops/user-guide/plan-your-azure-devops-org-structure?view=azure-devops#how-many-projects-do-you-need&quot;&gt;documentation&lt;/a&gt; on this.&lt;/p&gt;

&lt;p&gt;It is in essence - everything in a single Team Project, as many code repositories, groups, teams, areas and iterations as you need based on your logical structure (teams, squads, products, CoPs, etc.). It works well and it’s considered the golden standard unless you absolutely need to keep things segregated.&lt;/p&gt;

&lt;p&gt;There is one exception though, besides the segregation example above. You remember how much I like Pipelines as a &lt;a href=&quot;https://mattvsts.github.io/2024/04/22/engineering-ingenuity-will-always-prevail/&quot;&gt;dedicated serverless environment&lt;/a&gt; for platform automations, right? Let’s just say &lt;em&gt;Two Team Projects to rule them all&lt;/em&gt; then 😀&lt;/p&gt;
</description>
        <pubDate>Tue, 18 Mar 2025 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2025/03/18/well-architected-azure-devops/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2025/03/18/well-architected-azure-devops/</guid>
      </item>
    
      <item>
        <title>GitHub Well-Architected, the ultimate guide to enterprise-grade GitHub deployments</title>
        <description>&lt;p&gt;Speaking with people the other day I realised so many don’t know about it!&lt;/p&gt;

&lt;p&gt;In January GitHub released their &lt;a href=&quot;https://wellarchitected.github.com/library/overview/layers/&quot;&gt;Well-Architected guide&lt;/a&gt;. Clearly inspired by the Azure Well Architected Framework, it is a proper guide to setting up an enterprise-grade development platform, going well beyond pure tools and rather into design principles and ways of working.&lt;/p&gt;

&lt;p&gt;It is an invaluable piece of documentation, so you can assess where you are against best practices and potentially add or improve some of your practices.&lt;/p&gt;
</description>
        <pubDate>Thu, 13 Mar 2025 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2025/03/13/github-well-architected/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2025/03/13/github-well-architected/</guid>
      </item>
    
      <item>
        <title>A sticky note for myself - enforce a .gitignore file</title>
        <description>&lt;p&gt;No matter how many times I do that, I keep creating new repos and adding a .gitignore file afterwards - so I need to enforce it after the fact (especially after you start bulding and you have the annoying build artifacts in your file system!).&lt;/p&gt;

&lt;p&gt;This is literally a sticky note for myself 😃:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git &lt;span class=&quot;nb&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--cached&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
git add &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
git status &lt;span class=&quot;c&quot;&gt;# to check for missed files&lt;/span&gt;
git commit &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;enforced gitignore&apos;&lt;/span&gt;
git push origin &amp;lt;branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
        <pubDate>Sun, 26 Jan 2025 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2025/01/26/sticky-note-gitignore/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2025/01/26/sticky-note-gitignore/</guid>
      </item>
    
      <item>
        <title>Can I get GitHub Copilot without using GitHub?</title>
        <description>&lt;p&gt;I entertain this question at least once a week so let’s put a reference answer out once and for all 😀&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I want to use GitHub Copilot but I am using a different development platform. Can I use it anyway or do I need to migrate to GitHub?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;short-answer&quot;&gt;Short Answer&lt;/h3&gt;
&lt;p&gt;Yes, you absolutely can. GitHub Copilot primarily lives in the IDE so your code can live anywhere and you can use it.&lt;/p&gt;

&lt;h3 id=&quot;longer-answer&quot;&gt;Long(er) Answer&lt;/h3&gt;
&lt;p&gt;What organisations are mostly interested in are the Copilot Business capabilities, and GitHub Copilot is a developer tool, so it can be used on &lt;em&gt;any code, anywhere&lt;/em&gt;. Even when the code is not in a Git repository at all.&lt;/p&gt;

&lt;p&gt;It is also a SaaS product, so all it requires is somewhere for it to be billed to, which however needs to remain under organisational control for governance and compliance. It is called &lt;a href=&quot;https://docs.github.com/en/enterprise-cloud@latest/admin/copilot-business-only/about-enterprise-accounts-for-copilot-business&quot;&gt;&lt;strong&gt;GitHub Copilot Standalone&lt;/strong&gt;&lt;/a&gt;, and it is essentially a GitHub Enterprise organisation with no enabled features except for Copilot Business.&lt;/p&gt;

&lt;p&gt;In order to get it, you need to contact the lovely sales folks at GitHub, and they will setup this special organisation for you. &lt;br /&gt;
Once done, you need to then connect an Azure Subscription so they can bill the metered usage of the product and you can start setting up teams for licence distribution to your developers. You can do this under the &lt;strong&gt;Billing&lt;/strong&gt; settings in your Enterprise.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2025-01-08-20-41-00.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;That’s all! I hope this helps. Thanks for asking 🙂&lt;/p&gt;
</description>
        <pubDate>Wed, 08 Jan 2025 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2025/01/08/github-copilot-without-github.md/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2025/01/08/github-copilot-without-github.md/</guid>
      </item>
    
      <item>
        <title>Developers in the age of AI</title>
        <description>&lt;p&gt;I just got back from Bucharest, where one of my sessions at &lt;a href=&quot;https://www.gotech.world/build-ai-stage-agenda2024&quot;&gt;GoTech.World&lt;/a&gt; was about what I believe is going to happen to developers in the age of AI.&lt;/p&gt;

&lt;h3 id=&quot;excitement&quot;&gt;Excitement&lt;/h3&gt;
&lt;p&gt;Excitement is really up there. I’ve been discussing AI at large with so many organisation for the past year, and there isn’t a single one of them that’s not excited about what AI can do for developers. They are at the frontline of this new technology, and the results for who embraces it properly are really out there to see.&lt;/p&gt;

&lt;p&gt;My view of the world is very simple: with AI in their workflow developers can focus on what really matters in their day to day job, leaving repeatitive and time-consuming tasks to a Copilot of their choice. The productivity benefits are sizeable. People are happier. It’s a win-win from any angle.&lt;/p&gt;

&lt;p&gt;When it comes to AI in new or existing systems, it’s still exciting. The potential market advantage of disrupting and accelerating existing processes in any industry is there for anyone to exploit, and it’s worth remembering organisations sit on a trove of data, which is essential fuel for a LLM. It’s up to them using this data properly.&lt;/p&gt;

&lt;h3 id=&quot;confusion&quot;&gt;Confusion&lt;/h3&gt;
&lt;p&gt;People are confused about the future, in particular about how development tools and platforms will evolve, potentially removing some skills and tasks from the usual day-to-day work. What’s going to happen when you have tools that today provide advice (GitHub Copilot) and tomorrow will evolve into headless Pull Requests (GitHub Copilot Workspace) for your developers to review?&lt;/p&gt;

&lt;p&gt;Skills will evolve and adapt, undoubtedly. Over the past 12 months, for example, we introduced concepts such as &lt;em&gt;responsible review&lt;/em&gt; and &lt;em&gt;watermarking&lt;/em&gt; in the developer workflow. Prompt Engineering breached from the LLM world and is now essential for the GenAI-assisted developer to bring the most out of their Copilot. There is going to be a lot more permeating the developer space in the coming days and months.&lt;/p&gt;

&lt;h3 id=&quot;unease&quot;&gt;Unease&lt;/h3&gt;
&lt;p&gt;Let’s be frank - the first source of developer resistance is fear of being laid-off due to the impact GenAI has on development teams. There is some risk for some types of developers, of course. But as I mentioned in the &lt;a href=&quot;&quot;&gt;past&lt;/a&gt;, reducing teams by proportion of development productivity impact is a very short-sighted idea that I try to defuse whenever I can. There is simply no direct correlation as every developer is unique and operates in a different way.&lt;/p&gt;

&lt;p&gt;Moreover, even AI needs developers, and not for training or refining. LLMs need to be harnessed and managed like any other resource, bringing DevOps and hyperautomation concepts into the mix. To name an example, a developer writing pipelines and automations for LLMOps is already AI-adjacent and they will be fundamental for any form of development of said system.&lt;/p&gt;

&lt;p&gt;There is a lot on the horizon - patterns, products, services, etc. The world feels in a permament cliff-edge about how roles will evolve. Yet, it’s still early days to predict what’s going to be the future job description of a developer in 5 years’ time. It’s fair to say there is a mixture of excitement, confusion and, for some, even unease. However in my opinion the future is bright - there is going to be so much to do for a developer! I am looking forward to what’s next in the industry 😀&lt;/p&gt;
</description>
        <pubDate>Thu, 14 Nov 2024 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2024/11/14/developers-ai/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2024/11/14/developers-ai/</guid>
      </item>
    
      <item>
        <title>Brainstorming with Copilot Workspace</title>
        <description>&lt;p&gt;AI assistance for developers is not just for executing well-defined tasks - you can get a lot of value out of tools like Copilot by &lt;a href=&quot;https://rubberduckdebugging.com&quot;&gt;rubberducking&lt;/a&gt; or simply by asking explanatory questions to the assistant.&lt;/p&gt;

&lt;p&gt;This is particularly true for new joiners to any codebase, the time it takes for anyone to be up and running is significantly less than what it used to be.&lt;/p&gt;

&lt;p&gt;If you want to try that with Copilot Workspace, click on the &lt;strong&gt;Brainstorm&lt;/strong&gt; button without any context or question:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2024-11-09-17-25-14.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This will give you a starter list of questions Copilot believes are applicable to your codebase:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2024-11-09-17-28-46.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Each question will be answered by an understanding of the code repository by Copilot Workspace - this not not just about a single file (as we got to know) but rather the whole of your code:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2024-11-09-17-32-00.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can use this answer to understand the code at hand, and use it as a starting point for further development:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2024-11-09-17-36-42.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You will get amended code and documentation:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2024-11-09-18-03-31.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now, it does not mean this will achieve exactly what you want. In this case, I don’t want a matrix strategy but rather the choice of running the build in either environmment. So I can ask to revise the answer:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2024-11-09-18-05-33.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Much better!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2024-11-09-18-18-43.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It did not, however, update the documentation. Let’s fix that:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2024-11-09-18-09-07.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2024-11-09-18-09-51.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Done:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2024-11-09-18-20-04.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This is a simple example however it shows how you can start an exploration and then implement something directly from the Copilot Workspace context.&lt;/p&gt;

&lt;p&gt;If you ask broader questions, you will get broader answers:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2024-11-09-18-25-19.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Each will obviously kick-off a new session where you can implement the suggested changes.&lt;/p&gt;

</description>
        <pubDate>Sat, 09 Nov 2024 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2024/11/09/copilot-workspace-brainstorming/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2024/11/09/copilot-workspace-brainstorming/</guid>
      </item>
    
      <item>
        <title>GitHub Copilot Workspace is the true next step in the SDLC</title>
        <description>&lt;h3 id=&quot;supercharging-github-copilot&quot;&gt;Supercharging GitHub Copilot&lt;/h3&gt;
&lt;p&gt;Copilot here, Copilot there… yes, GitHub (and others!) Copilot is brilliant, but it only acts as a sidecar support to the developer experience. You will see a lot of productivity improvement, and you will have a much happier developer population, but it will be fundamentally linked to the team size and the organisation.&lt;/p&gt;

&lt;p&gt;This is where things get interesting - Agents are the next logical step in a GenAI adoption journey. Agents are able to perform operations independently from the user, under supervision, leading to a precise outcome. They significantly help augmenting a capability, and are going to become prevalent in the next few years.&lt;/p&gt;

&lt;p&gt;GitHub Copilot Workspace gives you Agents you can use to significantly grow what your development teams are doing. I think it’s a game changer.&lt;/p&gt;

&lt;h3 id=&quot;an-example&quot;&gt;An example&lt;/h3&gt;
&lt;p&gt;Let’s start with a controlled example: a starter application created with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dotnet new mvc&lt;/code&gt;. Nothing special, nothing fancy, but assume for now that this is your existing codebase you are working with.&lt;/p&gt;

&lt;p&gt;I am going to ask Copilot Workspace to implement a CI pipeline in GitHub Actions based on the code at hand:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20241017.1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This is where the true power of Workspace shines:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20241017.2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Copilot Workspace “understands” (it’s a LLM, it has no reasoning, but it can interpret things based on context as we know) what we are working with and what we need to do. It will generate a number of steps:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20241017.3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Each of these steps is going to be linked to changes to the code:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20241017.4.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;/images/posts/20241017.5.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If I am happy with it, I can open a Pull Request against a branch. This will contain the work done by Copilot Workspace:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20241017.6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now… I might want more. Let’s ask Workspace again:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20241017.7.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I noticed the packaging step created by the agent is not what I want though, as I get an error in my CI workflow:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20241017.8.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I can change it by asking again on the prompt box or by editing the file myself, and it will do what I need with the right level of information:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20241017.9.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now, this is a simple example. Imagine doing this with explorative branches, codebase explanation, etc.&lt;/p&gt;

&lt;p&gt;You now have an Agent which can work independently on relatively complex requests, and you can steer its outputs with a few prompts.&lt;/p&gt;

&lt;h3 id=&quot;the-key-difference&quot;&gt;The key difference&lt;/h3&gt;
&lt;p&gt;Why is it different? Copilot Workspace will break down a prompt into multiple actions, within the same context. So you don’t get a bounded code generation, but rather a series of independent actions which will achieve a complex outcome.&lt;/p&gt;

&lt;p&gt;Agents can live independently as sessions, and you will always be able to track back or initiate new ones from the Development Platform. They are an extremely powerful tool for development teams to significantly improve the impact they can deliver against their backlog!&lt;/p&gt;

&lt;p&gt;The industry is significantly changing, and tools like Workspace were unthinkable even a few yearsa ago. I am looking forward to seeing what else Copilot Workspace will be able to do within GitHub Enterprise!&lt;/p&gt;
</description>
        <pubDate>Thu, 17 Oct 2024 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2024/10/17/copilot-workspace-next-step/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2024/10/17/copilot-workspace-next-step/</guid>
      </item>
    
      <item>
        <title>Measuring the impact of your GitHub Copilot rollout</title>
        <description>&lt;p&gt;GitHub Copilot is amazing… but you can’t just roll it out all of a sudden with no planin a large engineering organisation!&lt;/p&gt;

&lt;p&gt;Flipping the switch on without a proper configuration would be plain dangerous (think about he risk of accepting licensed code without training on triaging), but once this is addressed the most common thing I am asked about is:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;how do I measure the productivity impact of GitHub Copilot?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let me be clear: this not about replacing people with Copilot or reducing teams thanks to the productivity increase. GitHub Copilot is a tool, and I believe in people who can deliver better rather than more. Someone who uses Copilot on average delivers better code, and it happens thanks to the fact that the state of flow is not interrupted and developers can focus on the real, hard problems of engineering today.&lt;/p&gt;

&lt;h3 id=&quot;github-copilot-metrics-viewer&quot;&gt;GitHub Copilot Metrics Viewer&lt;/h3&gt;
&lt;p&gt;Using the &lt;a href=&quot;https://docs.github.com/en/rest/copilot/copilot-usage&quot;&gt;REST APIs&lt;/a&gt; is absolutely fine, but sometimes you need to start quickly and with something visual. The folks at GitHub developed &lt;a href=&quot;https://github.com/github-copilot-resources/copilot-metrics-viewer&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;metrics-viewer&lt;/code&gt;&lt;/a&gt;, an excellent React application you can deploy anywhere. It will be connected to your GitHub Organisation (or Project, if you like) and it will give you a fantastic breakdown of metrics for your teams.&lt;/p&gt;

&lt;p&gt;I use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;metrics-viewer&lt;/code&gt; heavily and I recommend it against alternatives like a custom PowerBI dashboard as there is a significant integration with the service. I think it is an excellent tool.&lt;/p&gt;

&lt;p&gt;You can also find &lt;a href=&quot;https://github.com/jasonmoodie/copilot-metrics-viewer-power-bi&quot;&gt;PowerBI dashboards&lt;/a&gt; if you wanted to, of course!&lt;/p&gt;

&lt;p&gt;In both cases you need a token with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;manage_billing:copilot&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;read:enterprise&lt;/code&gt; scopes.&lt;/p&gt;

&lt;h3 id=&quot;why-it-is-so-important&quot;&gt;Why it is so important&lt;/h3&gt;
&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;metrics-viewer&lt;/code&gt; (have a look at their README, it shows quite a lot!) is a single pane of glass where you can monitor acceptance rates, hotspots, active users, etc.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/martedesco/copilot-metrics-viewer/assets/3329307/b84220ae-fbdc-4503-b50b-4689362bf364&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://github.com/martedesco/copilot-metrics-viewer/assets/3329307/788c9b33-8e63-43a5-9ab9-98d8938dd9d9&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It gives you a breakdown of languages in use, IDEs, etc. but most importantly you can see the plain API responses so you can potentially include the logic in your own systems!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20240927.1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</description>
        <pubDate>Fri, 27 Sep 2024 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2024/09/27/measuring-github-copilot/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2024/09/27/measuring-github-copilot/</guid>
      </item>
    
      <item>
        <title>Simplifying Build Farms with Managed DevOps Pools for Azure DevOps</title>
        <description>&lt;p&gt;Over the course of my career I spent a lot of time optimising and automating Build Farms, since Team Foundation Server 2008. I remember the first time I saw the first bits of what are now Pipelines as Code at the MVP Summit as well as when I had access to an early alpha version just after Christmas a fair few years ago…shipping has always been at the core of what I’ve done.&lt;/p&gt;

&lt;p&gt;Needless to say, I worked on substantial Build Farms, including replicating the seamless experience Hosted Build Agents provide in my clients’ cloud estates. A lot of effort went into creating and customising Virtual Machine Scale Sets, Kubernetes clusters, Packer images, etc.&lt;/p&gt;

&lt;p&gt;However if you don’t want to do that and you need to have &lt;em&gt;your own&lt;/em&gt; Build Farm… the answer is Managed DevOps Pools. I spent some time working on them and I am pretty impressed.&lt;/p&gt;

&lt;h3 id=&quot;first-configuration&quot;&gt;First configuration&lt;/h3&gt;
&lt;p&gt;I ran through the Azure Portal to have an idea of how to configure a MDP and what level of flexibility you have, and it’s a lot.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20240911.8.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;To begin with, you have a dependency with Dev Center but that’s about it. Very interestingly, you can configure the Agent size right away and you can select either the Microsoft images, Marketplace images or (most importantly!) your Azure images.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20240911.2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The next crucial item is your Pool behaviour. These Azure resources will be deployed in a secure Microsoft subscription, and will be exclusively for you. However these will incur cost if not used, so you have a lot of flexibility in defining your behaviours:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20240911.3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;There is a lot of flexibility here, and we will cover this in the next section. Now onto the next big thing…&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20240911.4.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I cannot stress &lt;strong&gt;enough&lt;/strong&gt; how much of a big deal this is. Dealing with the infrastructure requirements of network-injected Agents deployed at runtime with finicky DNS configurations (and more) is more often than not a significant headache to setup. MDP does this for you, seamlessly.&lt;/p&gt;

&lt;p&gt;You can then select an additional data disk if needed:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20240911.5.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Then you can start looking at how to connect this with Azure DevOps. It is really interesting. First of all, you can potentially share a Managed DevOps Pool with multiple organisations, if you want. You can also restrict provisioning and access to specific Team Projects. But most importantly, you can inherit permissions from the Team Project saving a lot of configuration effort if your Azure DevOps Organisation is following best practices. Brilliant.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20240911.6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;my-recommendations&quot;&gt;My recommendations&lt;/h3&gt;
&lt;p&gt;You are still operating within the confines of an Azure subscription, so you cannot deploy a sheer amount of resources without having a high-enough quota for the SKU of VMs you want to run. If you disregard this, you will quickly end up with this error:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20240911.7.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Do an exercise of right-sizing, and understand if and how many agents you can warm-up to keep your teams efficient. It is your infrastructure after all, albeit deployed in a different subscription. You will be billed for it eventually!&lt;/p&gt;

&lt;p&gt;I would also recommend against leaving Standby Agent mode off coupled with with fresh agents at least during office hours (or your peak usage window), as it will add 2-5 minutes to the provisioning of each and every agent used for the execution of your jobs. Of course it enables significant savings in terms of consumption, but unless you are using these agents for very specific circumstances (e.g.: updating production, multi-tenant environments in audited releases with a strict Single Responsibility Principle enforced) there is little benefit in that and performance will suffer.&lt;/p&gt;

&lt;p&gt;Compared to your Build Pools, you won’t have custom capabilities raised directly by your Agent into a Managed Build Pool. What you can do is set environments variables in your Custom Image, but you need to account for that when you build it, so it’s not straightforward.&lt;/p&gt;
</description>
        <pubDate>Wed, 11 Sep 2024 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2024/09/11/managed-devops-pools/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2024/09/11/managed-devops-pools/</guid>
      </item>
    
      <item>
        <title>Abstraction is acceleration</title>
        <description>&lt;p&gt;Something I see far too often is a simple yet foundational mistake: chasing innovation at all costs, for the sake of it, rather than thinking about the key fundamental issues we are yet to solve as an industry.&lt;/p&gt;

&lt;p&gt;Shipping quality software is the most important thing, no matter how cool or boring the underlying technology is. This is by far the most important metric we have, and if you really want to get going on that you need to embrace a simple approach: abstraction is acceleration.&lt;/p&gt;

&lt;h3 id=&quot;what-do-you-mean&quot;&gt;What do you mean?&lt;/h3&gt;
&lt;p&gt;The moment you start abstracting, you are moving complexity away from the narrow path of delivery and onto a different bucket. It does not mean removing it, but rather assessing it as a known quantity and treating it as an acknowledged factor.&lt;/p&gt;

&lt;p&gt;Abstracting means removing yourself from the shackles of repetition for all the must-haves, so you can focus on doing what really matters for your project - it can be about infrastructure, application stacks, configuration, anything. It creates a runway which gives you the focus you need on solving the problem at hand, rather than being diverted onto different things which should be solved by now.&lt;/p&gt;

&lt;h3 id=&quot;an-example&quot;&gt;An example&lt;/h3&gt;
&lt;p&gt;A typical example of this is &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/developer/azure-developer-cli/install-azd?tabs=winget-windows%2Cbrew-mac%2Cscript-linux&amp;amp;pivots=os-windows&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;azd&lt;/code&gt;&lt;/a&gt;. Azure Developer CLI is a pretty advanced form of abstraction, which enormously simplifies developers’ life by aggregating well-known infrastructure, application code and configuration in a single package.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20240817.1.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This package is consumed as-is, giving you certainty about the steps performed during deployment: bringing up the infrastructure (via Bicep or Terraform, pretty standard stuff!), deploying the application correctly, etc.&lt;/p&gt;

&lt;p&gt;Also very importantly, it is independent from any form of orchestrator - all you have to do is to invoke &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;azd up&lt;/code&gt; even if you do not populate the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.azdo&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github&lt;/code&gt; folders. It creates a repeatable experience independent of the execution environment, which is a must nowadays for developers.&lt;/p&gt;

&lt;p&gt;If instead you want to build your pipelines around it, these two folders are the place where you store them so that they are integrated in the package.&lt;/p&gt;

&lt;h3 id=&quot;you-only-accelerate-if-you-are-transparent&quot;&gt;You only accelerate if you are transparent&lt;/h3&gt;
&lt;p&gt;Be careful of an easy fallacy: you do not accelerate anything if the whole thing is not transparent. Abstracting doesn’t mean “yeah submit a manifest and trust me on execution” in an API call, it means encapsulating a number of steps together in a pre-configured yet reviewable process.&lt;/p&gt;

&lt;p&gt;The reason why &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;azd&lt;/code&gt; is a good example is because you have everything aggregated, yet it’s nothing new or opaque: your Infrastructure as Code definitions, your application code, your CI/CD pipelines - they are just kept together by a simple conventio, however they are independent of each other.&lt;/p&gt;
</description>
        <pubDate>Sat, 17 Aug 2024 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2024/08/17/abstraction-is-acceleration/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2024/08/17/abstraction-is-acceleration/</guid>
      </item>
    
      <item>
        <title>Retry logic in Azure DevOps tasks</title>
        <description>&lt;p&gt;Large yet quiet update a couple of months ago in Azure DevOps! One of the most requested features finally hit availability - &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/devops/release-notes/2024/sprint-240-update#retries-for-server-tasks&quot;&gt;retry logic in all server tasks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Every task that runs in a job with a stateful environment (e.g.: anything except agentless tasks) was already supported, however this is now extended to tasks invoking an external service. They will now have an available property named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;retryCountOnTaskFailure&lt;/code&gt;, which can ve used to set a number of retries once execution fails.&lt;/p&gt;

&lt;p&gt;Imagine… you are performing an operation targeting a remote URL/system/etc, and you will be able to retry. It is extremely useful, especially when publishing new bits on Azure resources. It’s not by chance that the Microsoft documentation shows &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AzureFunction&lt;/code&gt; as a sample task supporting this!&lt;/p&gt;

&lt;p&gt;Now, there is an important consideration to make: your task is not idempotent. Do not expect rollbacks or structured retries, only the task (and the external call) is retried in its entirety, not the job or stage. You still need to account for failures etc, however this simplifies your pipeline design if you are using tasks extensively.&lt;/p&gt;
</description>
        <pubDate>Wed, 14 Aug 2024 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2024/08/14/retry-logic-in-azure-devops-tasks/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2024/08/14/retry-logic-in-azure-devops-tasks/</guid>
      </item>
    
      <item>
        <title>Recent improvements in GitHub Advanced Security for Azure DevOps</title>
        <description>&lt;p&gt;Over the past few months a number of good updates were released on GitHub Advanced Security for Azure DevOps, I felt they went a touch under the radar! Let’s see what these are, there are a few key changes worth knowing.&lt;/p&gt;

&lt;h3 id=&quot;overall-security-overview&quot;&gt;Overall security overview&lt;/h3&gt;
&lt;p&gt;You now have a single pane of glass view of your security posture across the organisation, under &lt;strong&gt;Organisation Settings&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20240728.1.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This is a quality of life improvement, however for large organisation it also allows an understanding of hotspots and coverage at a glance. Very useful!&lt;/p&gt;

&lt;h3 id=&quot;enhanced-secrets-scanning&quot;&gt;Enhanced secrets scanning&lt;/h3&gt;
&lt;p&gt;Secrets scanning is now enhanced, able to detect different patterns compared to the original set of vendor patterns. These are non-provider specific (e.g.: connection strings and various private keys!) and are incredibly common sights in scans.&lt;/p&gt;

&lt;p&gt;| New Pattern |
|——————|
ASP.NET Machine Key
DER-endcoded Private Key
Dynatrace Token
GPG Credentials
HTTP Request Headers
JavaScript Web Token
LinkedIn Credentials
MongoDB Connection String
MySQL/MariaDB Connection String
PEM-encoded Private Key
PGP Private Key
PKCS12 Formatted Private Key
PostgreSQL Connection String
Putty Private Key
RabbitMQ Credentials
RSA Private Key
SQL Server Connection String
SSH PrivateKey	OpenSshPrivateKey
SSH PrivateKey	GitHubSshPrivateKey
URL Encoded Credentials&lt;/p&gt;

&lt;p&gt;These are in addition to the long &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/devops/repos/security/github-advanced-security-secret-scanning?view=azure-devops#partner-provider-patterns&quot;&gt;list&lt;/a&gt; of Provider Patterns already supported.&lt;/p&gt;

&lt;h3 id=&quot;automatic-agent-preparation-for-codeql-detection&quot;&gt;Automatic Agent preparation for CodeQL detection&lt;/h3&gt;
&lt;p&gt;I really like this one, especially if you roll it out in a decorator in a self-hosted Build Farm: you can now automatically setup an Agent with the CodeQL extension as part of the Initialize CodeQL task in a Pipeline:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20240728.2.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This will save you the hassle of setting up the CodeQL tools upfront and maintaining them up to date.&lt;/p&gt;
</description>
        <pubDate>Sun, 28 Jul 2024 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2024/07/28/updates-GHAS-AzDO/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2024/07/28/updates-GHAS-AzDO/</guid>
      </item>
    
      <item>
        <title>Continuous assurance, why are you not doing it?</title>
        <description>&lt;p&gt;Baffling conversation today, and a bit of a blast from the past. Mega-massive client has issues with their immutable environments - technical and regulatory. The regulatory stuff is relatively easily to fix once the technology is in place, and the summary of the conversation was: &lt;em&gt;what can you do to remediate, quickly?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The answer is obviously &lt;em&gt;Continuous Assurance&lt;/em&gt; but… we will get there. You need a starting point.&lt;/p&gt;

&lt;p&gt;Let’s ignore development environments, they should be ephemeral and deployable on the fly, and they weren’t. However in this case the issue is deeper: the client is unable to reliably replicate an environment from scratch, or at will, to create a new copy of a production environment because there is drift between the production, pre-production environments and the scripts used to deploy and configure.&lt;/p&gt;

&lt;p&gt;It’s a serious matter, as you cannot guarantee testing integrity, you cannot ensure that the pre-production environment is actually configured as expected, an audit will not succeed, etc. What could you do here?&lt;/p&gt;

&lt;p&gt;Ideally there should be a foundational set of automations doing this on the Landing Zone (look at &lt;a href=&quot;https://aka.ms/devopskit/AzTS&quot;&gt;AzTS&lt;/a&gt;), but if you are starting with dev-driven bottom-up approach, you can do this: besides the expected review of procedures, scripts, etc. the idea is to embed Continuous Assurance as the leftmost step in the deployment procedure so that &lt;em&gt;any&lt;/em&gt; release will validate the environment state.&lt;/p&gt;

&lt;p&gt;And this is where things are simple to start with… if you deployed your environment with a Terraform module, what do you have?&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;a state file!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Exactly. And if you are not using Terraform you can achieve something similar by refreshing (not rebuilding, they are immutable!) the environment every release, and ensuring a re-application of your configuration as the first step.
It sounds incredibly simple, yet you would be surprised by how many times this detail is overlooked. Gotta go back to basics and remember the technologies we are using on a daily basis.&lt;/p&gt;

&lt;p&gt;If you do not have a state file (ARM, Bicep, etc.) then the refresh process for an immutable environment will always start with the infrastructure and configuration refresh. There will always be things to take into account: you might need to backup/re-image/restore/etc an environment, or build an allocation mechanism for finite resources such as API interfaces, but implementing this from the ground-up will give you the confidence you need in your immutable environments.&lt;/p&gt;

&lt;h3 id=&quot;azure-devops&quot;&gt;Azure DevOps&lt;/h3&gt;

&lt;p&gt;Azure DevOps also gives you some strong accelerators for this, and they have been around for a long time! &lt;strong&gt;Environments Checks&lt;/strong&gt; for example:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20240620.1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Alternatively, build a &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/devops/pipelines/process/deployment-jobs?view=azure-devops&quot;&gt;deployment strategy&lt;/a&gt; supporting this proces. A hint: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;preDeploy&lt;/code&gt; hooks are fundamental for this. 
Worst case scenario if you don’t want to use them, Azure Pipelines allows you to create &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;stages&lt;/code&gt; with a few extra lines of code. I am yet to hear a convincing enough answer to why you are not using them 😂&lt;/p&gt;

&lt;h3 id=&quot;github-actions&quot;&gt;GitHub Actions&lt;/h3&gt;

&lt;p&gt;GitHub Actions does not give you these facilities given it is a platform-level orchestrator, however it’s not the end of the world - you can easily build a sequential orchestration leveraging the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;needs&lt;/code&gt; attribute for a job:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;preprod_refresh:
...

preprod_deploy:
    **needs: preprod_refresh**
    ...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is flexible enough to perform any form of operation required for an environment refresh.&lt;/p&gt;

&lt;p&gt;It’s simple stuff, really, and obviously it’s not the end of the topic, but rather the beginning. But following this will allow any team to put these in practice quickly in absence of a platform-wide Continuous Assurance facilitation.&lt;/p&gt;
</description>
        <pubDate>Thu, 20 Jun 2024 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2024/06/20/continuous-assurance-why-not/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2024/06/20/continuous-assurance-why-not/</guid>
      </item>
    
      <item>
        <title>Engineering ingenuity will always prevail</title>
        <description>&lt;p&gt;More a thought rather than anything else… however, if you are still trying to unnecessarily restrict your developers, think again.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;But governance! Compliance! Regulators!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;All valid points, which will inhevitably lead to the same conclusion - unnecessarily restricting developers will only cause them to circumvent your restrictions.&lt;/p&gt;

&lt;p&gt;When I say &lt;em&gt;unnecessarily restricting&lt;/em&gt; I don’t mean not allowing unfettered production access or similar, to the contrary.&lt;/p&gt;

&lt;p&gt;I am of the opinion that anything non-production needs to be as streamlined and light touch as possible. If you are not allowing your developers space to experiment, try out new ideas, innovate and chart the future. Telling them that they cannot use a certain tool, or they need to strictly stick to the User Stories rather than recording spikes and explorations will lead to them getting around your limitations (before leaving for another organisation, that is).&lt;/p&gt;

&lt;p&gt;Do you want an extreme example? Have you ever considered that an Azure DevOps Agent Pool is a free hosting service for pretty much anything a disgruntled developer might want to test? Even better - if you lock everything down client-side and then you let a developer use a Microsoft-hosted Pool you are giving said developer access to a serverless compute platform. How long would you think it’s going to take a good engineer building scripts running in pipelines that can be invoked via the Azure DevOps APIs? BYOA (the A stands for API 😊)&lt;/p&gt;

&lt;p&gt;There are ways of constructively channelling developer creativity and ingenuity, in 2024 it’s not just a nice to have - it’s very much a requirement to let your developers be developers.&lt;/p&gt;

</description>
        <pubDate>Mon, 22 Apr 2024 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2024/04/22/engineering-ingenuity-will-always-prevail/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2024/04/22/engineering-ingenuity-will-always-prevail/</guid>
      </item>
    
      <item>
        <title>What is the difference between Defender for DevOps and GitHub Advanced Security?</title>
        <description>&lt;p&gt;Very interesting question the other day:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;What is the difference between Defender for DevOps and GitHub Advanced Security?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer is simple yet not clear-cut. Let me get there.&lt;/p&gt;

&lt;h3 id=&quot;defender-for-devops&quot;&gt;Defender for DevOps&lt;/h3&gt;
&lt;p&gt;Defender for DevOps is part of Azure Defender - the Cloud Security Posture Management tool for Azure and beyond. It can connect with GitHub and Azure DevOps repositories, and it provides code scanning vulnerabilities, security exposure alerts and supply chain management capabilities.&lt;/p&gt;

&lt;h3 id=&quot;github-advanced-security&quot;&gt;GitHub Advanced Security&lt;/h3&gt;
&lt;p&gt;Regardless of the target platform (GitHub or Azure DevOps), GitHub Advanced Security is a tool designed to integrate with your development platform and help your developers shift security left. It provides code scanning vulnerabilities, security exposure alerts and supply chain management capabilities.&lt;/p&gt;

&lt;h3 id=&quot;the-key-difference&quot;&gt;The key difference&lt;/h3&gt;
&lt;p&gt;Defender for DevOps operates outside-in. It will inspect your codebases, it will raise alerts and will provide recommentations. It is designed to provide data points to consume at enterprise platform level.&lt;/p&gt;

&lt;p&gt;GitHub Advanced Security does the same, however tightly integrated with the development platform, meaning you can integrate it with your development workflows. It is not just a surfacing and aggregation tool - it also provides proactive help to the developers.&lt;/p&gt;

&lt;h3 id=&quot;an-example&quot;&gt;An example&lt;/h3&gt;
&lt;p&gt;A developer tries to commit an Azure Storage Account SAS Key into the Git repository.&lt;/p&gt;

&lt;p&gt;Defender for Cloud will only identify it after it goes through a CI/CD pipeline which uses the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CredScan&lt;/code&gt; task (so the leak will be contained to the code repo and the platform admins or owners will receive an alert), GitHub Advanced Security will simply not allow you to commit the secret.&lt;/p&gt;
</description>
        <pubDate>Fri, 19 Jan 2024 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2024/01/19/what-is-the-difference-defender-for-devops-github/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2024/01/19/what-is-the-difference-defender-for-devops-github/</guid>
      </item>
    
      <item>
        <title>Redeployments should not be difficult</title>
        <description>&lt;p&gt;It’s a topic that comes up fairly frequently with many of my clients - why are redeployments unexpectedly difficult?&lt;/p&gt;

&lt;p&gt;Now that DevOps is as pervasive as it’s ever been, people are (rightly so if you ask me) trying to do as many things &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;as Code&lt;/code&gt;. It’s a testament to how the industry is going in the right direction, however the reality many developers face is that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;initial deployments as Code&lt;/code&gt; are very easy, redeployments… less so.&lt;/p&gt;

&lt;p&gt;More often than not, it’s simple stuff. For example, if you are relying on something as simple as a synchronous interaction with a system, all you might need is a form of &lt;a href=&quot;https://mattvsts.github.io/2021/08/04/on-repeatable-automations/&quot;&gt;retry logic&lt;/a&gt; to solve the problem.&lt;/p&gt;

&lt;p&gt;Some other times, it’s more complex - your system might need a full-fledged set of activities which will inhevitably result in some downtime. The first thing to do here is to leverage features like &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/devops/pipelines/process/deployment-jobs?view=azure-devops&quot;&gt;Deployment Jobs&lt;/a&gt; in Azure DevOps or &lt;a href=&quot;https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment&quot;&gt;Environments&lt;/a&gt; in GitHub Actions.&lt;/p&gt;

&lt;p&gt;Both are almost mandatory tools nowadays, because they expose functionalities you would otherwise need to build manually for quality of life. For example, in Azure DevOps you can inject tasks via decorators or create a canary deployment strategy with a single line of code. In GitHub Actions you have excellent concurrency management as well as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cancel-in-progress&lt;/code&gt;, a brilliant feature which will automatically cancel anything in progress if you need higher priority against other workflows.&lt;/p&gt;

&lt;p&gt;It’s then down to your technology stack and your architecture. These are unfortunately often overlooked, or straight-up impossible to achieve in brownfield enviroments, however there is a general tendency of overlooking papercuts and tolerating certain compromises.&lt;/p&gt;

&lt;p&gt;For example, if you ask me… Zero-touch deployments are a must. Idempotency is a key factor. These should never be compromised upon. If you cannot achieve idempotency you should automatically fall back to Blue-Green deployments as a pattern, as you risk ending up with unusable enviroments. Blue-Green in this instance prevents you from losing a functioning environment, and with zero-touch deployments you can still rebuild an environment.&lt;/p&gt;

&lt;p&gt;It takes a lot of effort to get to a real zero-touch, robust and resilient enterprise systems. However it does not take a lot to start or improve an existing situation.&lt;/p&gt;

</description>
        <pubDate>Sun, 07 Jan 2024 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2024/01/07/redeployments-should-not-be-difficult/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2024/01/07/redeployments-should-not-be-difficult/</guid>
      </item>
    
      <item>
        <title>The role of the Double Diamond in a modern engineering organisation</title>
        <description>&lt;p&gt;I had this in draft for a very long time, especially after a conversation with one of my clients… did you ever notice how the Double Diamond process principle applies &lt;strong&gt;perfectly&lt;/strong&gt; to modern engineering organisations?&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/double_diamond.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;https://www.designcouncil.org.uk/our-resources/the-double-diamond/&quot;&gt;Double Diamond&lt;/a&gt; is a standard description of the design process, created by the Design Council in 2005. It represents the most general and applicable visualisation of a typical exploration and resolution of a given issue, deconstructing the thought process and defining the journey one does to get to the final result.&lt;/p&gt;

&lt;p&gt;Now…this applies, word-by-word, to what we do on a daily basis. Think about this: your teams need to undertake a certain effort. What would they do?&lt;/p&gt;

&lt;p&gt;The first step is embarking on a discovery exercise. This is not a linear endeavour, but rather a wide and large collection of data points and information required in order to have a better understanding of what’s going to happen. You will start at high-level, and narrow down as needed.&lt;/p&gt;

&lt;p&gt;All this information alone is pointless and potentially confusing. The teams will then start defining &lt;em&gt;what&lt;/em&gt; actually needs to happen, and &lt;em&gt;how&lt;/em&gt;. The end result of this is a (relatively) clear view of the required work to be carried out. It brings everyone on the same page and people can start their low-level processes.&lt;/p&gt;

&lt;p&gt;The same cycle repeats between implementation and delivery. If you are a developer, you are going to implement things your way, however the Peer Review process will suggest changes which might or might not align with what you had in mind originally.&lt;/p&gt;

&lt;p&gt;This is the reining-in of the divergence the first phases of the Double Diamond, and they are brought to an agreed, final state where all the parties are ready to either proceed or move on. The process itself never ends, it’s highly repeatable, and it always delivers the same outcome. You are in control of the accuracy and the level of agreement between the parties.&lt;/p&gt;

&lt;p&gt;The Design Council distilled the following framework for applying the Double Diamond:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Discover. The first diamond helps people understand, rather than simply assume, what the problem is. It involves speaking to and spending time with people who are affected by the issues.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Define. The insight gathered from the discovery phase can help you to define the challenge in a different way.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Develop. The second diamond encourages people to give different answers to the clearly defined problem, seeking inspiration from elsewhere and co-designing with a range of different people.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Deliver. Delivery involves testing out different solutions at small-scale, rejecting those that will not work and improving the ones that will.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Does it sound familiar at all?&lt;/p&gt;
</description>
        <pubDate>Wed, 25 Oct 2023 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2023/10/25/role-double-diamond/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2023/10/25/role-double-diamond/</guid>
      </item>
    
      <item>
        <title>Inner Source in an enterprise, measurement is king</title>
        <description>&lt;p&gt;Back on the topic of inner source, we now need to look at how we define &lt;em&gt;success&lt;/em&gt;. Measurement and the right metrics will tell you if you are going in the right direction, and given it’s an internal project this data is going to be priceless in order to understand what to do next.&lt;/p&gt;

&lt;h2 id=&quot;establish-a-good-set-of-metrics&quot;&gt;Establish a good set of metrics&lt;/h2&gt;
&lt;p&gt;The consumer is the most important persona in this scenario, so it’s ever so critical to get the metrics right. Tracking everything is one thing, putting your reading glasses on and analysing this data will be another matter.&lt;/p&gt;

&lt;p&gt;Track actual actions - a deployment being executed, an API being invoked, any material action which makes sense to collect from an interaction point of view. This excludes contributions - they would be tracked separately in the developer platform itself.&lt;/p&gt;

&lt;p&gt;Focus on what you want to understand. Adoption comes in many ways, however ensure you can build a good view of how your product is used.&lt;/p&gt;

&lt;h2 id=&quot;track-everything-only-if-it-makes-sense&quot;&gt;Track everything, only if it makes sense&lt;/h2&gt;
&lt;p&gt;Given it’s an internal project we are talking about, you can take some liberties when it comes to tracking adoption. This doesn’t mean collecting PIIs from your colleagues or scraping the organisation for how many times your code was cloned, but rather having a good granularity of events and interactions collected in total transparency.&lt;/p&gt;

&lt;p&gt;It’s important to avoid getting swarmed with white noise. Getting a list of all &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git clone&lt;/code&gt; commands your users ran against a repository (for example) doesn’t make sense no matter how tempting it might sound. Someone could be cloning a repo to kick the tyres of your codebase, with no further usage. Build runners might be cloning your repo at pace because of several builds running in parallel. It is pointless.&lt;/p&gt;

&lt;p&gt;However be systematic in tracking, user interaction data is what will elicit patterns of usage and potentially raise early signs of issues. Get good quality data.&lt;/p&gt;

&lt;h2 id=&quot;learn-and-iterate&quot;&gt;Learn and iterate&lt;/h2&gt;
&lt;p&gt;You surely want to know who is using your stuff, and what is not going well or causing issues to your users. That would be the most important measurement you can take.&lt;/p&gt;

&lt;p&gt;Once you have this adoption data, iterate quickly on it. Initially you will notice a sea of anomalies and more problems than progress - this is perfectly normal, you won’t get it right first time around. However over time (and Pull Requests) you will quickly be able to identify what is going as expected and what doesn’t.&lt;/p&gt;

&lt;p&gt;This picture will allow you to get a better understanding of your consumer base and how your product is being (mis)used. Early detection of these things is pivotal to proactively engage, given a critical mass. Otherwise it’s all data fundamental for retrospective analysis.&lt;/p&gt;

</description>
        <pubDate>Tue, 03 Oct 2023 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2023/10/03/innersource-enterprise-measurement/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2023/10/03/innersource-enterprise-measurement/</guid>
      </item>
    
      <item>
        <title>Improve your environments with Azure Deployment Stacks</title>
        <description>&lt;p&gt;Are you doing anything like this?&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2023-07-26_21-06-30.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If so, you should try &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/deployment-stacks?tabs=azure-cli&quot;&gt;Azure Deployment Stacks&lt;/a&gt;. The feature was released in Public Preview a few days ago, and it is definitely worth looking at it as soon as possible.&lt;/p&gt;

&lt;p&gt;Azure Deployment Stacks simplifies the resource lifecycle in Azure, it essentially groups together multiple resources under the same &lt;em&gt;stack&lt;/em&gt;, removing the overhead of dealing with dependent resources and also applying effective policies improving governance&lt;/p&gt;

&lt;p&gt;The documentation is heavily oriented towards Bicep, however it definitely works with ARM templates as well. And it works really well.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2023-07-26_21-13-45.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;These are very welcome - the &lt;strong&gt;Update behavior&lt;/strong&gt;  property mimics the ARM Deployment Mode, however taking the Stack into consideration. The &lt;strong&gt;Lock&lt;/strong&gt; property is amazing, potentially putting anything under the Stack in a protected mode, simplifying governance and control. The rest is an unaltered deployment, via an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;az stack&lt;/code&gt; command. Redeployments take into account dependencies and the &lt;strong&gt;Lock&lt;/strong&gt; property.&lt;/p&gt;

&lt;p&gt;It is so simple it is mindblowing. Also… this considerably extends the usefulness of the Environments in Azure DevOps:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2023-07-26_21-22-02.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;While it was true that you could have done that without Azure Deployment Stacks, you now have a repeatable, out-of-the-box command to create a 1:1 map between the Environment on the platform and the target environment in Azure.&lt;/p&gt;

&lt;p&gt;Done at scale, this significantly simplifies the life of Platform Engineering teams.&lt;/p&gt;
</description>
        <pubDate>Wed, 26 Jul 2023 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2023/07/26/improve-your-environments-with-azure-deployment-stacks/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2023/07/26/improve-your-environments-with-azure-deployment-stacks/</guid>
      </item>
    
      <item>
        <title>Linked workflows with GitHub Actions</title>
        <description>&lt;p&gt;This is literally the simplest possible thing, however… I wanted a workflow to be triggered only on successful execution of another workflow in GitHub Actions. I thought it will take somewhat more than the single &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;workflow_run&lt;/code&gt; &lt;a href=&quot;https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_run&quot;&gt;keyword&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;It is one of the many triggeres available under the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;on:&lt;/code&gt; condition, and it will link one or many workflows to a secondary workflow. Beware, it does not act as a logical AND.&lt;/p&gt;

&lt;p&gt;I put together a simple example on my account, &lt;a href=&quot;https://github.com/MattVSTS/Linked-Workflows&quot;&gt;here&lt;/a&gt;, I hope this helps. It helped me, given I wanted exactly that feature!&lt;/p&gt;
</description>
        <pubDate>Thu, 20 Jul 2023 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2023/07/20/linked-workflows-with-github-actions/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2023/07/20/linked-workflows-with-github-actions/</guid>
      </item>
    
      <item>
        <title>Progress is not linear</title>
        <description>&lt;p&gt;Last Thursday I was greeted with the excellent news of my 14th year as a &lt;a href=&quot;https://mvp.microsoft.com/en-us/PublicProfile/4027206&quot;&gt;Microsoft MVP&lt;/a&gt;.&lt;br /&gt;
Thinking about it… 14 years is a long, long time, and my career evolved with it - from being an engineer to looking after almost two hundreds people and contributing to a sizeable business number. Who knows if I will get to 15, either. However the very good news led me to think about the idea of &lt;em&gt;progress&lt;/em&gt;, for more than the usual 30 seconds…&lt;/p&gt;

&lt;p&gt;In this industry there is one thing which is very clear, and it is something I find myself repeating to people on a very regular basis:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Progress is not linear&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Especially in consulting, there is an unhealthy expectation that progress is linear: delivery, promotions, success. All in a straight line, with no allowed diversion from the &lt;em&gt;supposed&lt;/em&gt; golden path. Reality is, however, much different.&lt;/p&gt;

&lt;p&gt;If things were supposed to be linear, we would not be in a world of Cloud and AI. I wouldn’t see the people I helped grow reach the goals and targets they did. I would also not be writing this post, for the record.&lt;/p&gt;

&lt;p&gt;Progress is a consequence of attempting to innovate, to change something. Sometimes it’s a refinement, a minor change which makes something good better. Some other times it’s a proper challenge to the status quo, a complete revamp of something or even better, a brand-new idea which has got no match. Usually the latter is the most common idea of &lt;em&gt;progress&lt;/em&gt;, however never discount the former - quality of life is a big thing, and once an improvement gets tangible people will understand the reasons behind.&lt;/p&gt;

&lt;p&gt;Stuff sometimes just works. Sometimes instead it takes some hammering and multiple attempts to get where you really want to get. The journey matters.&lt;/p&gt;
</description>
        <pubDate>Mon, 10 Jul 2023 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2023/07/10/progress-is-not-linear/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2023/07/10/progress-is-not-linear/</guid>
      </item>
    
      <item>
        <title>No more excuses with App Registrations in Azure DevOps</title>
        <description>&lt;p&gt;It’s not really news, however…you can now &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/devops/integrate/get-started/authentication/service-principal-managed-identity?view=azure-devops&quot;&gt;add&lt;/a&gt; App Registrations and Managed Identities as users in Azure DevOps.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2023-04-24_20-53-14.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;They will cost you a licence, however there is one massive benefit in enterprise environments: you can stop manually managing Personal Access Tokens, and you single-handedly control granular access to your environment(s) via a single identity.&lt;/p&gt;

&lt;p&gt;This is a game-changer, as you can finally stop spending time on handling PATs (monitoring them, sending reminders to owners, etc.) as well as worrying about unfettered access that might leak via a misused token.&lt;/p&gt;

&lt;p&gt;Also, this also means you can now control anything in ~Azure Active Directory~ Entra and you can guarantee unattended or privileged access to singular entities with a single Service Principals in a bidirectional fashion on environments and organization.&lt;/p&gt;

&lt;p&gt;Imagine…&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;An App Registration is the only identity allowed to perform operations more privileged than just Read, directly connected to Azure DevOps and completely managed in Entra.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This, for enterprise environments, is massive.&lt;/p&gt;
</description>
        <pubDate>Mon, 24 Apr 2023 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2023/04/24/no-more-excuses/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2023/04/24/no-more-excuses/</guid>
      </item>
    
      <item>
        <title>Inner Source in an enterprise, the role of testing</title>
        <description>&lt;p&gt;Driving back home tonight I thought it was about time I continued my series on Inner Source… now time to talk about testing.
It is part of the model you must define for contributors as well as embedding it within the validation process the team will enforce. Let’s see how.&lt;/p&gt;

&lt;h2 id=&quot;testing-for-contributors&quot;&gt;Testing for contributors&lt;/h2&gt;
&lt;p&gt;Demand extensive testing as part of your contributions. Testing must be both effortless and extensive, there is no getting around to that.&lt;br /&gt;
If a contribution is not thoroughly tested, it will automatically fail the validation process no matter what.&lt;/p&gt;

&lt;p&gt;How would you define “testing”? Well, first of all you need to test the literal functionality you are delivering.&lt;br /&gt;
Unit testing, assertion-based testing, anything that defines how a single feature is tested is absolutely a must. The hard part comes when you need to test integration with other features or parts of the system. In case of an application, typical integration testing works fine - however consider scenario-based or environment-based testing in order to ensure the contribution doesn’t break any existing functionality. If you are running other forms of testing, remember to ensure they are clearly separated from each other.&lt;/p&gt;

&lt;h2 id=&quot;automating-testing-to-validate-contributions&quot;&gt;Automating testing to validate contributions&lt;/h2&gt;
&lt;p&gt;This is where things get interesting - once your contribution is tested, it needs to be tested again during the review process. So it becomes about &lt;em&gt;how&lt;/em&gt; rather than &lt;em&gt;what&lt;/em&gt;.
You need to ensure end-to-end execution without requiring a single finger being lifted - for all of the tests above. Running them as part of your build validation is key. And it takes time.&lt;/p&gt;

&lt;p&gt;When designing a testing strategy for your product this is the second thing that will take most of your time (the consumption model would be the top one). If testing isn’t seamless, you lose out on contributions. If testing is excessive, the result would be the same.&lt;/p&gt;

&lt;p&gt;It’s not necessarily about &lt;em&gt;how long&lt;/em&gt; it takes to test, but rather &lt;em&gt;how much effort it takes&lt;/em&gt; for someone to run end-to-end and deep testing suites. Getting this right will enable a lot of contributions.&lt;/p&gt;

</description>
        <pubDate>Tue, 28 Mar 2023 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2023/03/28/innersource-enterprise-testing/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2023/03/28/innersource-enterprise-testing/</guid>
      </item>
    
      <item>
        <title>Feature flags and configuration management - are they the same?</title>
        <description>&lt;p&gt;Recently I’ve been dabbling with Azure App Configuration - a very nice technology if you ask me, which allows you to build your applications or services leveraging dynamic exposure control, canary releases, etc.&lt;/p&gt;

&lt;p&gt;I liked it so much that I spoke about that at the &lt;a href=&quot;https://www.youtube.com/watch?v=NGoXTtnWOn0&quot;&gt;London Microsoft DevOps Meetup&lt;/a&gt; this month, with lots of follow-up questions. One of them was pretty tough!&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Do you consider feature toggles and flags part of configuration management?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer is a strong yes. Feature flags, rings, etc. all rely on configuration items being retrieved.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2023-01-22_18-33-03.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It doesn’t really matter what they &lt;em&gt;are&lt;/em&gt;…it’s very much up to you what you use them for: static consumption, environment setup, exposure segmentation. We briefly talked about how to get started with adoption - rather than getting started with a massive refactoring exercise, you can slap a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;legacy&lt;/code&gt; flag on everything already in production, and start building new segmented areas of your application. Or you can start extracting key values used by your application (a configuration string perhaps?) and move them to Azure App Configuration so you can control their lifecycle in an easier fashion.&lt;/p&gt;

&lt;p&gt;What really matters though is the concept of having a centralised database for configuration values. It gives you more control on a single source of truth for key information used by your services, and you can also update that as part of your CI/CD pipelines in a structured way, without relying on files.&lt;/p&gt;

&lt;p&gt;Extensions (&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=AzureAppConfiguration.azure-app-configuration-task&quot;&gt;1&lt;/a&gt;, &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=AzureAppConfiguration.azure-app-configuration-task-push&quot;&gt;2&lt;/a&gt;) for Azure DevOps and &lt;a href=&quot;https://github.com/marketplace/actions/azure-app-configuration-sync&quot;&gt;GitHub&lt;/a&gt; make this very easy, and &lt;a href=&quot;https://learn.microsoft.com/en-us/cli/azure/appconfig?view=azure-cli-latest&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;azure appconfig&lt;/code&gt;&lt;/a&gt; is the cli tool to use.&lt;/p&gt;

</description>
        <pubDate>Sun, 22 Jan 2023 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2023/01/22/feature-flags-and-configuration-management/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2023/01/22/feature-flags-and-configuration-management/</guid>
      </item>
    
      <item>
        <title>Defender for DevOps, or rather enterprise integration...</title>
        <description>&lt;p&gt;Great news at Ignite in the past few days. There is one I am particularly close to: &lt;a href=&quot;https://www.microsoft.com/en-us/security/business/cloud-security/microsoft-defender-devops&quot;&gt;Defender for DevOps&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There are a number of reasons I am excited for it, there is no denying! The most important one is because Defender for DevOps makes your development platform (either Azure DevOps or GitHub) front and centre when it comes to security integration with the rest of the organisation.&lt;/p&gt;

&lt;p&gt;Let me explain: unless tightly integrated, development platforms tend to drift away from enterprise governance - shifting left is twice as hard if nobody outside the engineering department has got visibility of it. That’s when the complex integration journeys begin, products start popping up with no coherent vision, patched together by either custom code or flaky tools. Doing things right in this space is possible, however it’s harder and it requires way more guidance at a strategic level.&lt;/p&gt;

&lt;p&gt;Enter Defender for DevOps - this is all it takes to get going:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2022-10-14_22-12-45.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2022-10-14_21-15-07.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You will need to authorise Defender via a Project Collection Administrator account:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2022-10-14_21-15-28.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2022-10-14_21-15-35.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And you will be done:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2022-10-14_21-15-50.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now, a word of advice. Defender for DevOps is extremely dependent on the tenant the Azure DevOps organisation is connected to, and it is also a preview so a few niggles are to be expected.. 
If the tenants are not aligned, Defender will never be able to find the target organization, so bear it in mind when it comes to multi-tenant situations.&lt;/p&gt;

&lt;p&gt;Should you ever need to switch tenant for an Azure DevOps organization, you can do that under the Azure Active Directory tab in the organisation settings, with the &lt;strong&gt;Switch Directory&lt;/strong&gt; button. It is seamless, nothing is lost if the tenants are configured correctly:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2022-10-14_21-30-37.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The end result will be something like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2022-10-14_21-34-50.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The organisation is now connected and it will be populated. All is left to do now is to install the &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-securitydevops.microsoft-security-devops-azdevops&quot;&gt;Microsoft Security DevOps extension&lt;/a&gt;, and you can start adding the relevant task (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MicrosoftSecurityDevOps@1&lt;/code&gt;) to the pipelines you are interested in. Results!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2022-10-14_21-54-41.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;There is obviously more to do and more potential features to use, however this gives you an idea of why I believe it is so important. It also opens the door to a unified Azure DevOps and GitHub developer platform for enterprise organizations - the steps to configure Defender are the same, all it changes is the use of a GitHub App rather than an Azure DevOps identity.&lt;/p&gt;
</description>
        <pubDate>Fri, 14 Oct 2022 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2022/10/14/defender-for-devops/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2022/10/14/defender-for-devops/</guid>
      </item>
    
      <item>
        <title>Inner Source in an enterprise, the contribution model</title>
        <description>&lt;p&gt;Finally the most important topic to cover: how to build a sustainable contribution model?&lt;/p&gt;

&lt;p&gt;Inner Source is not just some code dropped somewhere so that anyone can use it. Inner Source is about enabling teams to evolve their codebases in an organic fashion, ensuring reuse and synergies wherever possible.&lt;/p&gt;

&lt;h2 id=&quot;decision-making&quot;&gt;Decision making&lt;/h2&gt;

&lt;p&gt;Decision making is very simple in Inner Source: everything is transparent, automatic processes ensure quality, your governance is enforced by design and the consumers naturally align with the objectives of the project. The maintainer team will always be the one dealing with the vision and its transformation into execution, however every Inner Source project will always be transparent because everything happens in pure openness, for everyone.&lt;/p&gt;

&lt;p&gt;In order to do that you need a usable process that allows anyone to get their changes to the main codebase without an excessive amount of friction.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Pull Requests!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You might suggest Pull Requests. Yes, they are part and parcel of the process, but before you get there you need a few extra items along the way. Also remember how documentation plays a key part, because it’s where you define the ground rules: branching strategy, baseline testing, rules for documentation, etc.&lt;/p&gt;

&lt;h2 id=&quot;the-importance-of-a-package&quot;&gt;The importance of a package&lt;/h2&gt;

&lt;p&gt;What are you trying to achieve, exactly? In my past &lt;a href=&quot;https://mattvsts.github.io/2022/09/27/innersource-enterprise-consumption/&quot;&gt;post&lt;/a&gt; I mentioned how important it is to make the end user experience simple enough so they can get going quickly.&lt;br /&gt;
If you want to do it you need to define what is your &lt;em&gt;package&lt;/em&gt;, the artifact that the users will consume. It can be a repository, it can be a binary, anything will do as long as it is consumable.&lt;/p&gt;

&lt;p&gt;Your package (or its content) will need to be versioned in predictable way. Semantic Versioning usually comes to the rescue, however you can also use a simpler version with just &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Major.minor&lt;/code&gt; as values. What really matters is using it right: it will be your contract with the consumers, so make sure to setup some solid ground rules as well as documentation to support that.&lt;/p&gt;

&lt;p&gt;In my latest Inner Source project I settled on a code repository as a package, containing a number of versioned items. With the right documentation in tow users can use it in a simple and straightforward way, easily embedding it into their projects while at the same time ensuring upgrades remain seamless due to the nature of the repository.&lt;/p&gt;

&lt;h2 id=&quot;testing&quot;&gt;Testing&lt;/h2&gt;
&lt;p&gt;Testing will be the most important step to establish when it comes to Inner Source contributions. Yes, there might be a test suite in the codebase, however you need to enforce its execution, together with some extra scans ensuring your quality levels.&lt;/p&gt;

&lt;p&gt;The other side of the coin is that everything must be automated, no matter what. There is absolutely no reason for your quality bar to rrely on human intervention. If you cannot automate things, don’t do Inner Source or it will suck so much time out of your day.&lt;/p&gt;

&lt;p&gt;I say that seriously: an Inner Source product (being open by default) requires a lot of attention, as much if not more than a traditional project, and it really needs a strong set of automations to remain smooth and lightweight. With every contribution there is a new opportunity, however there is also a sizeable risk of overseeing critical stuff. Automate your processes.&lt;/p&gt;

&lt;h2 id=&quot;am-i-mature-enough-for-it&quot;&gt;Am I mature enough for it?&lt;/h2&gt;
&lt;p&gt;Inner Source doesn’t happen overnight - it’s something that takes time to evolve, like every cultural change, you might try and fail a few times, however it’s not necessarily down to a single team or organisation. You might have full organisational backing and no contributors, or many contributors with no outlet for converging.&lt;/p&gt;

&lt;p&gt;Remember to setup a vision for it. It can be speed, it can be reuse of code, it can be collaboration. As long as you have something you are striving for, Inner Source will help your organisation achieve it with the power of decades of Open Source development.&lt;/p&gt;

&lt;p&gt;It is a mindset change that requires exercise and the right balance in place, otherwise it will quickly become overhead.&lt;/p&gt;
</description>
        <pubDate>Wed, 28 Sep 2022 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2022/09/28/innersource-enterprise-contribution/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2022/09/28/innersource-enterprise-contribution/</guid>
      </item>
    
      <item>
        <title>Inner Source in an enterprise, the consumption model</title>
        <description>&lt;p&gt;I wanted to talk about the contribution model first, however I felt it would be important to think about the users first. So after talking about the whys, it’s time to talk about one of the hows: how to consume an Inner Source project. How will your users consume your code? Why is it so important?&lt;/p&gt;

&lt;h2 id=&quot;documentation-is-your-main-enabler&quot;&gt;Documentation is your main enabler&lt;/h2&gt;

&lt;p&gt;The barrier of entry needs to be lowest than ever. It might be a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt; file, a SharePoint or Confluence page, a Wiki, what really matters is that users can get going as soon as possible.&lt;/p&gt;

&lt;p&gt;Low entry barrier doesn’t mean no or little documentation. To the contrary, the more the better. What I found really intuitive is a mix of high-level, getting started documents coupled with deep, low-level pieces detailing every possible parameter, scenario or functionality. An Inner Source project is a product at heart, so it needs to be treated as such.&lt;/p&gt;

&lt;p&gt;Consider automatic documentation generation - it makes your life so much easier. &lt;a href=&quot;https://www.writethedocs.org/guide/docs-as-code/&quot;&gt;Docs as code&lt;/a&gt; also ensures automatic compliance with your contribution model, making it part of a contribution. Technologies like &lt;a href=&quot;https://jinja.palletsprojects.com/en/3.1.x/&quot;&gt;Jinja2&lt;/a&gt; or GitHub Pages make writing documentation so much easier and straightforward. Worst case scenario, a code wiki in Azure DevOps does wonders!&lt;/p&gt;

&lt;h2 id=&quot;make-it-easy-to-use&quot;&gt;Make it easy to use&lt;/h2&gt;
&lt;p&gt;Whatever you are building, make sure to bundle an automatic build script at a minimum. Not just a detailed, step-by-step guide, but rather a one-click-script. A pipeline would be even better. You need to make sure your users will be able to get going with a single interaction, no matter what.&lt;/p&gt;

&lt;p&gt;If you are developing code to be used alongside other code, I would strongly recommend an approach where your code repository becomes a package - doing that means that everybody will get immediate benefit from updates, and it doesn’t require any form of update besides getting it.&lt;/p&gt;

&lt;p&gt;For example, Azure DevOps has a dedicated YAML keyword (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;resources&lt;/code&gt;) which allows you exactly that:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;resources:
  repositories:
  - repository: innersource
    type: git
    name: InnerSourceProject/tool

steps:
- checkout: self
- checkout: innersource
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Your pipeline automatically consumes the latest version of the Inner Source code, with no effort. Easy.&lt;/p&gt;

&lt;p&gt;Why am I pushing so much for it? Well, it’s about one of the main differences compared to Open Source development - you have a fundamentally different audience compared to the outside world.&lt;br /&gt;
Yes, many people will be as passionate and engaged, however some will be less interested and maybe even &lt;em&gt;forced&lt;/em&gt; to use your tool.  Not everybody, unfortunately, cares. By making the consumption experience as seamless as possible you are removing a number of potential support questions to field, and the first contact for someone who is not necessarily excited about the codebase will as positive as it comes.&lt;/p&gt;

&lt;h2 id=&quot;try-to-bring-them-along&quot;&gt;Try to bring them along&lt;/h2&gt;
&lt;p&gt;Don’t forget to include an easy way for a user to engage with the maintainer team, either to request something new or to report a bug, and if they had a smooth and easy experience chances are they would be interested in contributing and enhancing your product with their features! So ensure your documentation covers the contribution model, and you will hopefully be able to get contributions out of them!&lt;/p&gt;

</description>
        <pubDate>Tue, 27 Sep 2022 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2022/09/27/innersource-enterprise-consumption/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2022/09/27/innersource-enterprise-consumption/</guid>
      </item>
    
      <item>
        <title>Inner Source in an enterprise, how to get started</title>
        <description>&lt;p&gt;I want to talk about a project that took a year and a half to get to full speed, now bringing an incredible amount of value to one of my clients: an Inner Source project.&lt;/p&gt;

&lt;p&gt;Before discussing the actual steps required to get started, get comfortable with the definition of Inner Source:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Open source development practices brought within the corporate boundaries&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No, I am not going to quote Wikipedia for once - just look at how messed-up the Inner Source &lt;a href=&quot;https://en.wikipedia.org/wiki/Inner_source&quot;&gt;page&lt;/a&gt; is! And no, I am not referring to the content…&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2022-09-20_21-33-23.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;So, open source practices within an organisation. The first question to ask is “&lt;em&gt;why?&lt;/em&gt;”&lt;/p&gt;

&lt;h2 id=&quot;how-to-get-started&quot;&gt;How to get started&lt;/h2&gt;
&lt;p&gt;Before you write a line of code you need to start drumming-up interest for your project, which is where you will start assembling contributor teams and external members who provide extra value on top of the core maintainer team. Even users count!&lt;/p&gt;

&lt;p&gt;Then let’s address the elephant in the room - why should someone contribute? How are you planning to make it work? Define the vision. Keep goals simple. All you need is removing silos and facilitating communication, after all.
I cannot emphasise it enough: without a transparent way for people to see everything and have access to everything Inner Source won’t work.&lt;/p&gt;

&lt;p&gt;No matter the age of the codebase you need to setup some simple ground rules: how to submit ideas, contribute, review. Make sure roles are loosely defined (e.g.: maintainer team, external contributor, etc.), followed by a definition of the process to follow. It’s not about the details as much as the perceived level of overhead - the lesser the better.&lt;/p&gt;

&lt;p&gt;If you have at least one clear set of contributors and a core team you are ready to start.&lt;/p&gt;

&lt;h2 id=&quot;the-reasons-behind-an-inner-source-model&quot;&gt;The reasons behind an Inner Source model&lt;/h2&gt;
&lt;p&gt;Whoever proposes to use Inner Source, they need to clearly explain the reasons why they want to use it. It’s not as simple as publishing code somewhere and let users fork the repository. Doing that means dumping code in a skip.&lt;/p&gt;

&lt;p&gt;Inner Source at its core is a variation of Open source, adapted to the world of corporate (i.e. internal) software development. The mechanisms do not change, however the conceptual pillars require a degree of change for any corporate culture.&lt;/p&gt;

&lt;p&gt;In theory anyone can make changes, fork, adapt and enhance the codebase - it’s open by default. You build it (literally!), you run it. It’s not a process governed by change management, unless you want it to be, however losing its original meaning.&lt;/p&gt;

&lt;p&gt;So why Inner Source? It’s usually down to two reasons: speed or quality.&lt;/p&gt;

&lt;p&gt;With Inner Source, speed is a well-known quantity. You merge a change, it becomes available to any user. Decision-making happens at the speed of a Pull Request and it allows for an easier, faster cadence of updates.&lt;/p&gt;

&lt;p&gt;More often than not though, the main reason is quality. Given a codebase, Inner Source raises the quality bar by the virtue of the collective review process. Code reuse means better maintainability across the organisation, as well as a leaner experience for any developer Also, it allows contributors from outside a designated &lt;em&gt;core team&lt;/em&gt;, meaning a plurality of ideas will lead to better code.&lt;/p&gt;

&lt;p&gt;Eventually there is also a nice side effect: clarity of relationships between development team(s) and outside actors, including non-technical stakeholders.&lt;/p&gt;

&lt;h2 id=&quot;whats-next&quot;&gt;What’s next?&lt;/h2&gt;
&lt;p&gt;Tools. Next time though.&lt;/p&gt;

</description>
        <pubDate>Tue, 20 Sep 2022 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2022/09/20/innersource-enterprise-get-started/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2022/09/20/innersource-enterprise-get-started/</guid>
      </item>
    
      <item>
        <title>Where Supply Chain Management really matters</title>
        <description>&lt;p&gt;If you use GitHub you are surely used to this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2022-04-06_21-01-08.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Nowadays we are starting to take supply chain management for granted. Unfortunately it is a tendency as an industry - instead of focusing on remediating and improving our existing code, we treat it as a nuisance only focusing on what’s next.&lt;/p&gt;

&lt;p&gt;However new, shiny code doesn’t really matter if you are reading this, and if you are running a full-fledged DevOps practice you will quickly realise that there is so much work fo do when it comes to introducing Supply Chain Management in an organisation. If you are using GitHub then great, Dependabot gives you a great headstart by integrating with the platform and continuously scanning your code. However, what if you use &lt;em&gt;something else&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;There are so many tools on the market for this: Whitesource, Snyk, etc. Even SonarQube can do Software Composition Analysis (another name for Supply Chain Management) via an &lt;a href=&quot;https://github.com/dependency-check/dependency-check-sonar-plugin&quot;&gt;OWASP plugin&lt;/a&gt;. It goes to show how important this topic is and how much choice there is if you want to make things right.&lt;/p&gt;

&lt;p&gt;The reason why it is really important is because your &lt;em&gt;legacy code&lt;/em&gt; is most likely running in production. Like the vast majority of us, I have a number of repositories with legacy code. This sample application was written in .NET Core 1.1, and it’s been last updated in October 2017. If you never ran anything like Snyk or Whitesource, you will naturally find something akin to this state.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2022-04-06_21-18-49.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2022-04-06_21-16-46.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Some of these vulnerabilities can be easily fixed by a version bump, however others would require a complete runtime change, a migration, etc. A Supply Chain Management tool combined with your Engineering Platform will go a long way in making sure that your organisation remains sustainable.&lt;/p&gt;

&lt;p&gt;Personally, I really like &lt;a href=&quot;https://snyk.io&quot;&gt;Snyk&lt;/a&gt;. I used all of the tools above for years, and as of today it is the one that in my view gives the most comprehensive experience with the least amount of friction. You can set it up in minutes, and if you are targeting Azure DevOps it gives you so much power directly into the platform.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2022-04-06_21-23-56.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I really found beneficial having an easy way of raising Pull Requests from outside Team Projects so that development teams can benefit from them. It is also quite smart in understanding what can be easily fixed and what can’t, as well as giving you so much information about the issues at hand:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2022-04-06_21-26-38.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In my case above there is little point in raising a PR this way, however with more recent systems it provides you with an easy way of approaching a remediation without involving too intensive efforts. Of course every time you look at something running in production you might not be able to just update the code dependencies, but that’s a story for another day…&lt;/p&gt;
</description>
        <pubDate>Wed, 06 Apr 2022 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2022/04/06/where-supply-chain-management-really-matters/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2022/04/06/where-supply-chain-management-really-matters/</guid>
      </item>
    
      <item>
        <title>Solving an identity crisis in an Azure and DevOps world</title>
        <description>&lt;p&gt;So… &lt;em&gt;identities&lt;/em&gt;. A cornerstone of any cloud platform and essential in a DevOps world. However I end up talking about these on a daily basis in the Azure space, so I hope this post can act as a cheat sheat for my readers! One disclaimer though: I am not an identity expert, so I might use some simplification here and there.&lt;/p&gt;

&lt;h2 id=&quot;where-it-gets-messy&quot;&gt;Where it gets messy&lt;/h2&gt;
&lt;p&gt;There are two kind of identities we are interested in: interactive and unattended.&lt;/p&gt;

&lt;p&gt;The problem users face is that one of these two categories is actually more complex than it should be - the unattended one. There are several distinctions to make, however let’s clear out what &lt;em&gt;identities&lt;/em&gt; are first…&lt;/p&gt;

&lt;h2 id=&quot;interactive-v-unattended&quot;&gt;Interactive v unattended&lt;/h2&gt;
&lt;p&gt;As you may guess, an interactive identity is anything associated to an actual user: &lt;em&gt;name.surname@tenant.com&lt;/em&gt;, &lt;em&gt;DOMAIN\namesurname&lt;/em&gt;, or anything else that refers back to an actual carbon-based life form (sorry Andy, it makes me chuckle every time!).&lt;/p&gt;

&lt;p&gt;The same is true for something like a PAT token in Azure DevOps too. Yes, it’s a token rather than a &lt;em&gt;username+password&lt;/em&gt; combination, however it still brings authentication back to an interactive user, hence it is an interactive user.&lt;/p&gt;

&lt;p&gt;It’s worth remembering that these are the worst type of users to deal with in a hyperautomated setup, and you should not try to use them in any form of automation unless absolutely necessary. Passwords will expire, 2FA will kick-in, etc. They are unreliable when it comes to automatic interactions.&lt;/p&gt;

&lt;p&gt;An unattended identity is anything that is registered in the directory system however it doesn’t necessarily expose a password, and it is still part of the Role Based Access Control model that ~any cloud provider~ Azure uses.&lt;/p&gt;

&lt;h2 id=&quot;managed-identities&quot;&gt;Managed Identities&lt;/h2&gt;
&lt;p&gt;A Managed Identity is a resource type in Azure. You can create a user-assigned Managed Identity or a system-assigned Managed Identity.&lt;/p&gt;

&lt;p&gt;The difference between the two is in the lifecycle - a user-assigned one is a standalone resource type, and you physically control it. Unless you delete it, it exists. You can assign it to different resources, and explicitly group together multiple resources with it.&lt;/p&gt;

&lt;p&gt;A system-assigned Managed Identity instead is unique to, and tied to the resource it’s part of - once the resource is deleted, the Identity goes too.&lt;/p&gt;

&lt;h2 id=&quot;application-registations-and-enterprise-applications&quot;&gt;Application Registations and Enterprise Applications&lt;/h2&gt;
&lt;p&gt;This is the most common identity-related question I reply to all the time - argh!&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;What is an Enterprise Application?&lt;br /&gt;
How about an Application Registration?&lt;br /&gt;
Isn’t it a Service Principal?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, let’s make it clear - all of these live in Azure Active Directory.&lt;/p&gt;

&lt;p&gt;An Enterprise Application is…an application. Any application registered in AAD, from &lt;strong&gt;any tenant&lt;/strong&gt;. Azure DevOps? Enterprise Application. ServiceNow? Enterprise Application. Teams? Enterprise Application. It’s an entity that represents an application across one or multiple AAD tenants.&lt;/p&gt;

&lt;p&gt;An Application Registration is the representation of an application you &lt;strong&gt;own&lt;/strong&gt; (yours, custom) in Active Directory. It’s also tied to an Enterprise Application - because it is an application.&lt;/p&gt;

&lt;p&gt;The difference? The Application Registration contains all the application settings (authentication, secrets, API permissions, etc.), while the Enterprise Application is used for RBAC and it is the actual entity used for authentication.&lt;/p&gt;

&lt;h2 id=&quot;what-is-a-service-principal&quot;&gt;What is a Service Principal?&lt;/h2&gt;
&lt;p&gt;Service Principals are often used as synonyms for Application Registrations (because that’s where the keys/secrets/passwords are), however it is wrong. The Service Principal is hosted in the Enterprise Application, and it is what you actually use for permissions.&lt;/p&gt;

&lt;p&gt;The confusion is annoying though - let’s say you create a Service Connection in Azure DevOps. What happens there?&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2022-02-28_22-14-02.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ah, it says Service Principal! Brilliant, that’s it then! Even the link says that!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2022-02-28_22-15-04.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;However if you click that link you will end-up in an Application Registration blade of the Azure Portal.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2022-02-28_22-17-11.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The Application Registration and the Enterprise Application will have the same Application ID, however different Object ID in Active Directory.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2022-02-28_22-19-18.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;They are two entities for the same thing.&lt;/p&gt;

&lt;h2 id=&quot;what-do-i-use-in-devops&quot;&gt;What do I use in DevOps?&lt;/h2&gt;
&lt;p&gt;All of them. Managed Identities represent resources, Enterprise Applications any form of service or application requiring an identification and an Application Registration is what you use to generate secrets and contexts of applications you own.&lt;/p&gt;
</description>
        <pubDate>Mon, 28 Feb 2022 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2022/02/28/identity-crisis-in-azure-devops-world/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2022/02/28/identity-crisis-in-azure-devops-world/</guid>
      </item>
    
      <item>
        <title>PAT options for Azure DevOps organisations</title>
        <description>&lt;p&gt;This was a fairly unknown feature, however it’s a very important one when it comes to security in a large-scale Azure DevOps deployment…&lt;/p&gt;

&lt;p&gt;As I am sure you know, PAT tokens are secrets directly bound to an identity - user-managed, easy to consume and very valuable for automations (we’ll talk more about all things identity in the short future). These tokens represent a user, and they can be scoped to the most granular level of access. What unfortunately happens though, is that users will create a full-scope Access Token for the sake of convenience - often with the longest expiration possible.&lt;/p&gt;

&lt;p&gt;This is an incredibly poor security stance, as secrets can leak and they can be a major risk. However I was really please to find out that Azure DevOps allows you to configure three key options at an organisation level:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Enforcing an organisation to scope the PAT onto&lt;/li&gt;
  &lt;li&gt;Enforcing a specific scope rather than Full Access&lt;/li&gt;
  &lt;li&gt;Enforcing a defined lifespan&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These three policies are really easy to configure yet so powerful - you can enable them, and also provide a whitelisted set of users and groups to exclude, for any reason you might have.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2022-01-30_16-27-39.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It’s worth mentioning that some APIs are not consumable if you are not using a full-scoped PAT. Microsoft clearly calls this out in their &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/devops/organizations/accounts/manage-pats-with-policies-for-administrators?view=azure-devops&quot;&gt;documentation&lt;/a&gt;, and hopefully they will provide a list so you know when to whitelist a user.&lt;/p&gt;

</description>
        <pubDate>Sun, 30 Jan 2022 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2022/01/30/PAT-options-for-azure-devops-organisations/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2022/01/30/PAT-options-for-azure-devops-organisations/</guid>
      </item>
    
      <item>
        <title>The most useful tool in Inner Source</title>
        <description>&lt;p&gt;I introduced Inner Source to my current client roughly 18 months ago. It was a big change for a massive 100,000 employees organisation, used to somewhat traditional development practices (not Waterfall - I would have flatout refused!) however quite curious and willing to try out innovative ideas.&lt;/p&gt;

&lt;p&gt;The journey continues uninterrupted, there is always so much going on and the contributions are quite steady - Azure DevOps really shines with Boards, and teams are fully onboard.&lt;/p&gt;

&lt;p&gt;There is however one tool (if you want to call it as such…) that really helped us along the way. It’s not a technology tool, a stack, or even a script, but something rather simpler…&lt;/p&gt;

&lt;h3 id=&quot;immutable-commits&quot;&gt;Immutable commits&lt;/h3&gt;
&lt;p&gt;Defining immutable commits is like defining a package. You know what it is, what it contains, its version. We however work with Git repositories, so the definition becomes cloudy: what would be your &lt;em&gt;package&lt;/em&gt;? Adding further complexity to the question, we ship a &lt;em&gt;product&lt;/em&gt; available to everyone inside the organisation, and the contribution model needs to fit a Git consumption scenario quite easily.&lt;/p&gt;

&lt;p&gt;In our case we settled on the hash of the commit. It’s the option with the lowest friction, and it is a common denominator for everyone. The idea is simple: if you want to contribute something, you work in your own fork. There you can develop however you like (within the framework), however you need to end up in a situation where you have unique commits to push. This is accomplished by Pull Requests.&lt;/p&gt;

&lt;p&gt;These commits are then pushed to the main repository, where they get integrated and eventually made available to the  consumers. Simple, right?&lt;/p&gt;

&lt;h3 id=&quot;the-idea-behind-it&quot;&gt;The idea behind it&lt;/h3&gt;
&lt;p&gt;While now the core development team works on the main repository themselves, contributors need to ensure they are not pushing commits with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;duiqsrbf0quibwri0pufb&lt;/code&gt; as a commit message (or worse!). We also need them to clearly label what they are pushing, and this helps a lot in narrowing down issues down the line.&lt;/p&gt;

&lt;p&gt;Let’s take this as an example:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2022-01-18_18-33-11.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;These can all be external contributions. How? Well, like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2022-01-18_18-35-57.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The commit hashes are the same across the board, despite being different repositories and different team projects altogether! What really matters is that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Core.Department2&lt;/code&gt; ended up pushing a bunch of validated, reviewed commits to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Core&lt;/code&gt; like packages.&lt;/p&gt;

&lt;h3 id=&quot;how-to-put-this-into-practice&quot;&gt;How to put this into practice&lt;/h3&gt;
&lt;p&gt;The implementation can be achieved with any system supporting Pull Requests. When you accept any external contribution using this model you need to ensure the PRs are closed enforcing &lt;strong&gt;rebase and fast-forward&lt;/strong&gt; as a merge strategy:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2022-01-18_18-39-37.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This ensures that only commits really &lt;em&gt;ready-to-go&lt;/em&gt; (imagine a staging area) can be pushed along. This also doesn’t mean that you need to have one commit per PR, or duplicate effort - the name of the PR might be &lt;em&gt;Merged PR 58: Updated README.md&lt;/em&gt;, however that contained the top two commits you see in the history!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2022-01-18_18-42-50.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;enforce-it&quot;&gt;Enforce it&lt;/h3&gt;
&lt;p&gt;It’s all down to good practice. Like I said, the core development team works on the repository directly so they can squash merge all the changes, while the external contributors have to go through their own fork. This is enforced via a simple Branch Policy in Azure Repos:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2022-01-18_18-45-18.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If you want to do the same in GitHub, you need to look at this setting in the repository Options, under Settings:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2022-01-18_18-51-00.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Finally, we used to have the core development team follow the same process as the contributors for over a year. Same game, same rules for everyone. The reason why we moved away from it was simply down to the volume of changes and features delivered, making it slightly impractical.&lt;/p&gt;

&lt;p&gt;If, however, the difference in volume is not massive or there is no core development team then I would recommend going for the same standard across the various teams and remove the squash merge option.&lt;/p&gt;
</description>
        <pubDate>Tue, 18 Jan 2022 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2022/01/18/the-most-useful-tool-in-inner-source/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2022/01/18/the-most-useful-tool-in-inner-source/</guid>
      </item>
    
      <item>
        <title>Triggering the butterfly effect</title>
        <description>&lt;p&gt;An interesting conversation came up a few weeks ago at a conference panel: there is definitely one strong misconception when it comes to Software Engineering, DevOps and transformations in general - if you want to &lt;em&gt;start&lt;/em&gt;, you &lt;em&gt;&lt;strong&gt;need&lt;/strong&gt;&lt;/em&gt; a number of things which might seem necessary.&lt;/p&gt;

&lt;p&gt;That’s why I strongly disagree. The reality is that these &lt;em&gt;things&lt;/em&gt; might actually be overkill, useless or even damaging to your business. In order to &lt;em&gt;start&lt;/em&gt;, you need a catalyst. And for the catalyst to be effective, you need to bring tangible value straight-away.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;What does it take to trigger the &lt;a href=&quot;https://en.wikipedia.org/wiki/Butterfly_effect&quot;&gt;butterfly effect&lt;/a&gt;?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Think about it, for any of the topics above: what do you need to get going? Anyone you ask will give you a different answer, and it usually relies on a technology, a certain flavour of a methodology or even worse a tool. Some will even throw in &lt;em&gt;culture&lt;/em&gt;, for good measure. However I disagree. It’s not &lt;em&gt;just&lt;/em&gt; that. These are all &lt;em&gt;consequences&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Keep things simple. You want to start with DevOps? Don’t think about a tool, or any other substantial change that will bring you to a standstill. The business needs to keep going! Instead, start by introducing &lt;strong&gt;automation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Automate something, and incrementally go from there. Scripting does wonders. Once the automation is in place it will reduce the amount of time a certain operation takes (compared to a manual interaction) and will also reduce the risk of errors. CI/CD is an excellent starting point, but it isn’t necessarily the only one. If you already have CI/CD in place but you want to go further, look into automating configurations, reducing manual maintenance actions, etc.&lt;/p&gt;

&lt;p&gt;Long story short, the goal is to enable you and your team to re-invest that time you are saving into further automations and other (potentially bigger) changes. This is the butterfly effect of DevOps.&lt;/p&gt;
</description>
        <pubDate>Fri, 07 Jan 2022 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2022/01/07/triggering-the-butterfly-effect/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2022/01/07/triggering-the-butterfly-effect/</guid>
      </item>
    
      <item>
        <title>Why I took a break from blogging</title>
        <description>&lt;p&gt;For the past fifteen years I’ve been blogging with regularity, at least once a month. This blog starts with entries from 2012, however I’ve been blogging for far longer.&lt;/p&gt;

&lt;p&gt;I just needed a bit of a break, as this year has been particularly tough: the second year of the COVID-19 pandemic, so much going on at work and even more outside of it.&lt;/p&gt;

&lt;p&gt;Work has been a source of continuous inspiration and kept me fed with challenges and motivation - the type of work I do brings me ever closer to the core business problems we all aim to solve, and one of my core goals is people development. I love working on people’s development and being able to steer organisations to the best possible path they can take.&lt;/p&gt;

&lt;p&gt;Community didn’t take a backseat - I am planning to restart the London Microsoft DevOps Meetup with Tarun, and we are already planning for GDBC 2022. I also managed to (virtually) participate to several events this year, and spending time with the folks organising DDD has been as amazing as always. I slowed down a fair bit, but I didn’t lose touch with the amazing technical communities worldwide. Events have been rescheduled, cancelled, moved - however stuff got done!&lt;/p&gt;

&lt;p&gt;Outside of work, again so much going on. Who is close know how much happened in 2021, and how much effort went into all of these things.&lt;/p&gt;

&lt;p&gt;The result is that, unfortunately, blogging slowed down. I had way less time to do so, and most importantly I just didn’t have the energy to dedicate myself to the amount of experimentation and writing I used to do, as a result for the past three months I didn’t publish anything.&lt;/p&gt;

&lt;p&gt;Things will hopefully change, with a couple of big holidays coming up (to recharge!) and a number of things already listed in my neverending notebook. You will soon hear back from me, and I will start touching on some less beaten topics in the software engineering world. But for now, I am enjoying a little break :-)&lt;/p&gt;
</description>
        <pubDate>Fri, 10 Dec 2021 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2021/12/10/why-i-took-a-break/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2021/12/10/why-i-took-a-break/</guid>
      </item>
    
      <item>
        <title>Why GitHub Issues is different</title>
        <description>&lt;p&gt;The point of this post is not to do a walkthrough of the new &lt;a href=&quot;https://github.com/features/issues/&quot;&gt;GitHub Issues&lt;/a&gt; experience (it’s awesome by the way!), but rather to think about what I believe is the reason and the ethos of the feature. It was inspired by a conversation with colleagues which I believe was worth sharing.&lt;/p&gt;

&lt;p&gt;As developers, we got used to the &lt;em&gt;sticky note experience&lt;/em&gt; - the requirements you are aware of are summarised with a sticky note, with a title, and no other information is brought to the forefront of what you see as the first impact. Hence the Azure Boards experience, in a nutshell, where the complexity of the requirement sits a level below view.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2021-09-24_22-10-50.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The reason why I like Azure Boards so much is that you are &lt;em&gt;just&lt;/em&gt; one level away from all the details, compared with other tools. However, I like it because I am used to go back and forth between backlogs, teams and projects. This experience acts as a common denominator across projects and organisations, with an agreement saying that if I need more information about an item I can click on it and get it all.&lt;/p&gt;

&lt;p&gt;Brilliant, but not really practical from an &lt;strong&gt;individual&lt;/strong&gt; perspective. Why? Because of the context switch between the overall status and the actual progress. If you want to switch from a board to a list (the backlog?) you literally need to move from a place to the other. Context switch is expensive in both computer programming and human behaviour.&lt;/p&gt;

&lt;p&gt;GitHub Issues doesn’t do that - you can customise a tabular view with all the key information:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2021-09-24_22-20-07.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And by clicking on the arrow you can immediately switch to a board view:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2021-09-24_22-22-50.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;which will contain the same information in a different visualisation, without forcing you to context switch between the two:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2021-09-24_22-23-51.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now, there is no &lt;em&gt;better&lt;/em&gt; way. GitHub Issues gives you something different, which you can customise and integrate with other tools. Some people might like it in a way, some others might prefer another one.&lt;/p&gt;
</description>
        <pubDate>Fri, 24 Sep 2021 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2021/09/24/why-github-issues-is-different/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2021/09/24/why-github-issues-is-different/</guid>
      </item>
    
      <item>
        <title>On repeatable automations</title>
        <description>&lt;blockquote&gt;
  &lt;p&gt;Automations are the cornerstone of DevOps, and they allow for a substantial increase in speed and quality.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I say this at least on a monthly basis, which is good because it means there is demand for adopting automations. The industry pushes towards the trend of &lt;em&gt;automating everything&lt;/em&gt;, and I am sure your technical feed is no stranger to advocates of this discipline. It’s great, as this momentum drives collective improvements.&lt;/p&gt;

&lt;p&gt;What we usually do not see is, however, what comes next. You should not just &lt;em&gt;automate&lt;/em&gt;, you should automate &lt;em&gt;in a repeatable fashion&lt;/em&gt;. Let’s take a look at how you can get there.&lt;/p&gt;

&lt;h2 id=&quot;repeatable-automations---what-are-you-talking-about&quot;&gt;Repeatable automations - what are you talking about?&lt;/h2&gt;
&lt;p&gt;An automation &lt;strong&gt;must&lt;/strong&gt; be repeatable. An automation is not just a script. An automation is something you can run any time, and it is going to return a predictable output at all times.&lt;/p&gt;

&lt;p&gt;Let’s take an example familiar to everyone: creating a resource, whatever that is, in a Resource Group. It’s a simple command at the end of the day:&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Create-MyCoolResource&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-ResourceGroup&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$resourceGroup&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now you want to automate it - very good. You (and I) will likely end up running something akin to:&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kr&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$resourceGroup&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Create-MyCoolResource&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-ResourceGroup&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$resourceGroup&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;A simple input of a Resource Group name and off you go with your automation. Nice. The next logical step is to execute this command via a form of unattended environment, like inside an Azure Pipeline or a GitHub Actions workflow, possibly backed by a Service Principal.&lt;/p&gt;

&lt;p&gt;However, this will fail 100% of the times if you run the same command against a multi-subscription environment: if your Resource Group is not in the default subscription for the identity running it, the command will not be successful. Think about the Service Connections in Azure DevOps - they are either scoped to a default Subscription or a default Resource Group, then whatever happens behind the scenes is handled in Azure.&lt;/p&gt;

&lt;p&gt;So what will you do here? Well, easy enough, you will add a parameter to request an explicit Subscription ID:&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kr&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$resourceGroup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$subscriptionId&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Create-MyCoolResource&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-ResourceGroup&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$resourceGroup&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-SubscriptionId&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$subscriptionId&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Doing this ensures that as long as the identity running the command is authorised, it will be able to reach the right subscription and perform &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Create-MyCoolResource&lt;/code&gt;. Thinking upfront about these situations requires awareness and adds very little work to an otherwise simple process, however doing it pays dividends longer term.&lt;/p&gt;

&lt;h2 id=&quot;pre-empting-your-context-and-validating-your-inputs&quot;&gt;Pre-empting your context and validating your inputs&lt;/h2&gt;
&lt;p&gt;Following on from the above example, how can we make sure we are covered from unexpected situations where a command will not support something like an explicit SubscriptionId parameter? It’s critical to think about that scenario, because you might have to integrate your new script with some other existing code, or utilities, which &lt;em&gt;might&lt;/em&gt; not behave as expected.&lt;/p&gt;

&lt;p&gt;Step back, and think about where you are executing this script. How do you ensure you are safe from the condition? Simple: add an explicit &lt;a href=&quot;https://docs.microsoft.com/en-us/powershell/module/az.accounts/set-azcontext?view=azps-6.3.0&quot;&gt;context setup&lt;/a&gt;!&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kr&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$resourceGroup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$subscriptionId&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Set-AzContext&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Subscription&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$subscriptionId&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Create-MyCoolResource&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-ResourceGroup&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$resourceGroup&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-SubscriptionId&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$subscriptionId&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This ensures that whatever you do, you are covered by the context being set at the earliest possible stage.&lt;/p&gt;

&lt;p&gt;Then obviously, you can do more: making your parameters mandatory and type-validated so you are prevented from entering useless inputs, as well as adding some good old &lt;a href=&quot;https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_try_catch_finally?view=powershell-7.1&quot;&gt;try-catch&lt;/a&gt; and text outputs to make sure messages and errors are surfaced nicely:&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kr&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Mandatory&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$resourceGroup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Mandatory&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$subscriptionId&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Set-AzContext&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Subscription&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$subscriptionId&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Create-MyCoolResource&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-ResourceGroup&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$resourceGroup&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-SubscriptionId&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$subscriptionId&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Write-Host&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Resource created&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
&lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Write-Host&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;An error occurred&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Write-Host&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;$_&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;retry-wherever-possible&quot;&gt;Retry wherever possible&lt;/h2&gt;
&lt;p&gt;Call me biased if you like, but I am a big fan of retry logic. It’s simple, and provides so much support in fully unattended situations. Retry logic acts as a safety net for networking and platform issues, ensuring your commands will be automatically rerun in the correct fashion.&lt;/p&gt;

&lt;p&gt;In our case, how does it look like?&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kr&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Mandatory&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$resourceGroup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Mandatory&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$subscriptionId&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Set-AzContext&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Subscription&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$subscriptionId&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$count&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Create-MyCoolResource&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-ResourceGroup&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$resourceGroup&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-SubscriptionId&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$subscriptionId&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Write-Host&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Resource created&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
    &lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$retry&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Write-Host&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;An error occurred&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Write-Host&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;$_&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$retry&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-lt&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;A very simple retry logic here re-runs the command for three times if an error is caught-up, otherwise the resource is created without further ado. This is a very powerful tool as it gives you a way of not wasting time on platform-level issues (a transient network issue can derail processes, let me tell you!) while still giving you a huge amount of control.&lt;/p&gt;

&lt;p&gt;You can also use this approach combined with some waiting time, so that you can actually rule out external environmental issues like service unavailability.&lt;/p&gt;
</description>
        <pubDate>Wed, 04 Aug 2021 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2021/08/04/on-repeatable-automations/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2021/08/04/on-repeatable-automations/</guid>
      </item>
    
      <item>
        <title>Azure DevOps Token Scoping</title>
        <description>&lt;p&gt;Working for a client that does large scale enterprise development &lt;strong&gt;and&lt;/strong&gt; Inner Source means we run into this fairly often with new projects consuming different &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;resources&lt;/code&gt; in a pipeline:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2021-07-20_17-14-08.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It is a well documented behaviour - it’s down to how Azure DevOps authorises consumption when there are permissions in place. In a nutshell, it’s all down to this setting, in either the Team Project or the Organisation:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2021-07-20_17-16-53.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now, why does it happen? The reason is pretty simple - every pipeline is authorised with a dedicated token, and on first run it needs an explicit validation if the above settings are on.&lt;/p&gt;

&lt;h2 id=&quot;what-is-best-practice&quot;&gt;What is best practice?&lt;/h2&gt;
&lt;p&gt;The answer to which is the best approach to use here is the classic &lt;em&gt;it depends&lt;/em&gt;. Do you want any user in your Azure DevOps organisation to be able to get to any repository with a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;checkout&lt;/code&gt; step? If so disabling the settings above might be the best possible option.&lt;/p&gt;

&lt;p&gt;Are you working with multiple parties where you need actual segregation? Enforce them at organisational level in that case.&lt;/p&gt;
</description>
        <pubDate>Tue, 20 Jul 2021 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2021/07/20/azure-devops-token-scoping/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2021/07/20/azure-devops-token-scoping/</guid>
      </item>
    
      <item>
        <title>Unpublishing your latest Git commit</title>
        <description>&lt;p&gt;Sometimes it happens - you pushed a commit to a remote repository and you need to remove it, in a rush and without changing the repository’s history.&lt;/p&gt;

&lt;p&gt;There are so many ways of doing that, but one reliable and easy way I found is this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git push &amp;lt;remote&amp;gt; +&amp;lt;hash&amp;gt;^:&amp;lt;branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This will &lt;strong&gt;force push a removal, for a commit hash, on a certain branch, of a certain remote&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I wrote it this way because it is very easy to explain :-) It’s also easy to automate because it targets a single commit.&lt;/p&gt;
</description>
        <pubDate>Fri, 18 Jun 2021 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2021/06/18/unpublishing-your-latest-git-commit/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2021/06/18/unpublishing-your-latest-git-commit/</guid>
      </item>
    
      <item>
        <title>Just roll-up your backlogs!</title>
        <description>&lt;p&gt;I know - it’s 2021 and Agile methodologies should be used as standard. They are, for the most part, but every now and then I find myself talking to clients that would like to see a proliferation of &lt;em&gt;projects&lt;/em&gt; (Team Projects in Azure DevOps if you like) to keep their teams in the dark about their peers, while at the same time they want to have a portfolio-level view of everything happening at any given time.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I want a pretty cake, I want to devour it, and I want the cake to remain pretty.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is not just a pipe dream, but it’s rather wrong too. Think about it: do you want to move in the direction of obscure boundaries with teams, whilst the whole industry is going in the opposite direction?&lt;/p&gt;

&lt;p&gt;The answer is no, of course. These questions are not intentionally malicious - to the contrary, it’s just a reflection of the comfort zone of an organisation. Moving on is always feasible (being willing of course), and more often than not once &lt;em&gt;the new normal&lt;/em&gt; is demonstrated people are very keen to get on with it.&lt;/p&gt;

&lt;p&gt;Take the above example: team focus and portfolio management at the same time. How can you do that, effectively, and with minimal friction?&lt;/p&gt;

&lt;p&gt;Take Azure DevOps for example. Don’t create a sprawling mass of Team Projects in an organisation. Unless you have regulatory reasons to keep things physically separate (and even then, we should still have a chat), you can easily live with a single Team Project.&lt;/p&gt;

&lt;p&gt;All it takes is a couple of settings to iron out to get what you want:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;the org-level team will contain all your individual teams (and each individual team will have an Area assigned to them)&lt;/li&gt;
  &lt;li&gt;set the org-level Areas setting to include all the subareas from the root one&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Job done. Each team will be able to access their backlog, as well as being able to link their work to the shared Features/Epics that you use for shared priorities. This also enables &lt;a href=&quot;https://devblogs.microsoft.com/devops/delivery-plans-2-0-is-now-ga/&quot;&gt;Delivery Plans&lt;/a&gt; to be easily created, and portfolio management becomes a manageable task without introducing friction.&lt;/p&gt;

&lt;p&gt;Why complicate things if all you need is already out there? Elegance and pragmatism always go a long way.&lt;/p&gt;
</description>
        <pubDate>Sun, 02 May 2021 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2021/05/02/just-roll-up-your-backlogs/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2021/05/02/just-roll-up-your-backlogs/</guid>
      </item>
    
      <item>
        <title>Template extensions in Azure Pipelines</title>
        <description>&lt;p&gt;As part of a project I am working on we have a strong usage of Pipelines templates, and the consumption chain is nested across multiple repositories.&lt;/p&gt;

&lt;p&gt;In my situation, let’s say we have a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Core&lt;/code&gt; repository, that contains a set of baseline assets. There will be another repository in a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Department&lt;/code&gt; Team Project, aggregating multiple assets from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Core&lt;/code&gt; and offering them as &lt;em&gt;templates&lt;/em&gt; for broader consumption. Which will bring you to a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Consumer&lt;/code&gt; which will use these &lt;em&gt;templates&lt;/em&gt; (and potentially do more things).&lt;/p&gt;

&lt;p&gt;The first step is very easy: you define your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;asset.yml&lt;/code&gt; pipeline in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Core&lt;/code&gt; Team Project, which does a number of things. 
That pipeline is then invoked by a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;template.yml&lt;/code&gt; in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Department&lt;/code&gt; Team Project:&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;resources&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;repositories&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;repository&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Assets&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;git&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Core/Core&apos;&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;asset.yml@Assets&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;parameters&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;a&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;b&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is pretty straightforward. But what if you want to consume your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;template.yml&lt;/code&gt; elsewhere, as a nested template? You cannot do the same as between &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Core&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Department&lt;/code&gt;, because it will complain about the pipeline being invalid with an &lt;em&gt;unexpected &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;resources&lt;/code&gt; value&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The answer is in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;extends&lt;/code&gt; keyword: it allows a template to be used as-is, and extended as needed:&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;resources&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;repositories&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;repository&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Templates&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;git&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Department/Department&apos;&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;extends&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;template.yml@Templates&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;With that I am going to be able to consume the templates in the way I expected.&lt;/p&gt;
</description>
        <pubDate>Tue, 23 Feb 2021 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2021/02/23/template-extension-in-azure-pipelines/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2021/02/23/template-extension-in-azure-pipelines/</guid>
      </item>
    
      <item>
        <title>Why I believe Azure Pipelines is still the best orchestrator for Azure Kubernetes Services</title>
        <description>&lt;p&gt;Small confession to make: I don’t get excited by pure technology anymore.&lt;/p&gt;

&lt;p&gt;Gone are the &lt;em&gt;pioneeristic&lt;/em&gt; days of getting something together, as in 2021 we now have such a wealth of technologies, frameworks and documentation that makes it a degree of magnitude easier to do anything compared to even just five years ago.&lt;/p&gt;

&lt;p&gt;Today I spent some time on a pet project of mine on Azure Kubernetes Services, and taking a step back from the code I just realised how much work happens behind the scenes and how easy Azure Pipelines makes it for any AKS user to not only setup the CI/CD process, but also to maintain extreme control while still having accelerators and automations doing things for you.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2021-02-06_20-40-30.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Once the Service Principal is configured with the appropriate permissions (in the real world you usually do :-) ) you can use the Service Connection anywhere within your YAML pipeline - that is extremely handy, and it also enables appropriate usage of Environments:&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;na&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;deployment&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Deploy&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;displayName&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Deploy&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;pool&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;vmImage&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;ubuntu-latest&apos;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;AKS&apos;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;strategy&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;runOnce&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;deploy&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;KubernetesManifest@0&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;displayName&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Create imagePullSecret&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;inputs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
              &lt;span class=&quot;na&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;createSecret&apos;&lt;/span&gt;
              &lt;span class=&quot;na&quot;&gt;kubernetesServiceConnection&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;dev-aks-default&apos;&lt;/span&gt;
              &lt;span class=&quot;na&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;default&apos;&lt;/span&gt;
              &lt;span class=&quot;na&quot;&gt;secretType&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;dockerRegistry&apos;&lt;/span&gt;
              &lt;span class=&quot;na&quot;&gt;secretName&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;$(imagePullSecret)&apos;&lt;/span&gt;
              &lt;span class=&quot;na&quot;&gt;dockerRegistryEndpoint&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;$(dockerRegistryServiceConnection)&apos;&lt;/span&gt;
              
          &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;KubernetesManifest@0&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;displayName&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Deploy to Kubernetes cluster&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;inputs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
              &lt;span class=&quot;na&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;deploy&apos;&lt;/span&gt;
              &lt;span class=&quot;na&quot;&gt;kubernetesServiceConnection&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;dev-aks-default&apos;&lt;/span&gt;
              &lt;span class=&quot;na&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;default&apos;&lt;/span&gt;
              &lt;span class=&quot;na&quot;&gt;manifests&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;|&lt;/span&gt;
                &lt;span class=&quot;s&quot;&gt;$(Pipeline.Workspace)/manifests/deployment.yml&lt;/span&gt;
                &lt;span class=&quot;s&quot;&gt;$(Pipeline.Workspace)/manifests/service.yml&lt;/span&gt;
              &lt;span class=&quot;na&quot;&gt;containers&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;$(containerRegistry)/$(imageRepository):$(tag)&apos;&lt;/span&gt;
              &lt;span class=&quot;na&quot;&gt;imagePullSecrets&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;$(imagePullSecret)&apos;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;That’s where thing get interesting, as you not only get access to a fully traceable set of information about your deployments, but also to key information about the health of the cluster and the related YAML configuration files in actual use.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2021-02-07_13-31-44.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2021-02-07_13-36-30.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2021-02-07_13-41-24.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can even peek into the actual cluster application logs!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2021-02-07_13-42-08.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It’s transparent, yet it provides so much value directly within the Pipelines hub. Now, this might be me being over-enthusiastic, but a good facilitator is always welcome and in this case Azure Pipelines provides a user experience I still consider second to none!&lt;/p&gt;
</description>
        <pubDate>Sun, 07 Feb 2021 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2021/02/07/azure-pipelines-still-is-the-best-orchestrator-for-aks/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2021/02/07/azure-pipelines-still-is-the-best-orchestrator-for-aks/</guid>
      </item>
    
      <item>
        <title>CI and CD with GitHub Actions - what is different from Azure Pipelines?</title>
        <description>&lt;p&gt;Eventually, I did it - I tried an end-to-end CI/CD workflow exclusively on GitHub Actions. Talking about details, I moved my end-to-end demo of an ASP.NET Core application deployed to an Azure Web App (with Deployment Slots), with MSDeploy packaging and infrastructure deployment via Azure Resource Manager.&lt;/p&gt;

&lt;p&gt;Nothing really complex or bleeding edge, but susprisingly commonplace in many organisations. It was neither difficult nor totally plain-saling, so I thought about putting together what I found interesting. If you need one takeaway though, it better be this: YAML is an investment for you. The sooner you are comfortable with it, the sooner you can tackle pretty much anything!&lt;/p&gt;

&lt;h2 id=&quot;look-into-the-environment-variables-before-you-start&quot;&gt;Look into the environment variables before you start&lt;/h2&gt;
&lt;p&gt;Like Azure Pipelines, GitHub Actions has its own set of &lt;a href=&quot;https://docs.github.com/en/actions/reference/environment-variables&quot;&gt;environment variables&lt;/a&gt;. Look into them and make sure it’s all clear for you - you’ll need them!&lt;/p&gt;

&lt;p&gt;One to remember: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GITHUB_WORKSPACE&lt;/code&gt;. It is the folder where your repository is downloaded! In order to use that you need to surround it like that:&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nn&quot;&gt;...&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;${{ github.workspace }}/src/IaC/template.json&lt;/span&gt;
&lt;span class=&quot;nn&quot;&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;github-actions-is-an-agnostic-platform&quot;&gt;GitHub Actions is an agnostic platform&lt;/h2&gt;
&lt;p&gt;GitHub Actions does not have any specific connection or accelerator to any target platform. While this is a big advantage in several situations, it can take you off-guard if you try to move from an orchestrator with service connections like Azure Pipelines.&lt;/p&gt;

&lt;p&gt;If you like me are targeting Azure, you are going to use the &lt;a href=&quot;https://github.com/marketplace/actions/azure-login&quot;&gt;Azure Login&lt;/a&gt; action all the time, and you need to setup one or more dedicated Service Principals in advance so you can actually interact with your tenant.&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Subscription Login&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;azure/login@v1&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;creds&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;${{ secrets.&amp;lt;your secret name&amp;gt; }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Once you have a Service Principal you need to store it - I recommend to create an environment secret, as this is scoped to the target environment like the name suggests. These are encrypted within the GitHub platform, but they cannot be linked to something like Azure Key Vault. You can also use an organisational secret, if you want to share them across multiple repos or environments, but I would rather use permission scoping wherever possible!&lt;/p&gt;

&lt;h2 id=&quot;no-templates-or-stages-in-github-actions&quot;&gt;No templates or stages in GitHub Actions&lt;/h2&gt;
&lt;p&gt;There are no templates in GitHub Actions, plain and simple - this leads to little reuse if you don’t plan it well in advance. Looking at the public &lt;a href=&quot;https://github.com/github/roadmap/projects/1?card_filter_query=templates&quot;&gt;roadmap&lt;/a&gt;, they are targeting Q2 2021 for &lt;a href=&quot;https://github.com/github/roadmap/issues/98&quot;&gt;centrally managed templates&lt;/a&gt; and an undefined future for &lt;a href=&quot;https://github.com/github/roadmap/issues/51&quot;&gt;private templates&lt;/a&gt; as in Azure Pipelines.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2021-01-31_15-22-39.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;There is also no real concept of &lt;em&gt;stage&lt;/em&gt; in GitHub Actions. Your stages will be separate YAML files, and you can invoke them as needed. It’s just different.&lt;/p&gt;

&lt;h2 id=&quot;you-require-a-deeper-knowledge-of-what-you-are-targeting&quot;&gt;You require a deeper knowledge of what you are targeting&lt;/h2&gt;
&lt;p&gt;If you use Azure Pipelines, every time you add a task you can inspect anything related to it via the Task Assistant in your editor, so even if you don’t know all about it you can get an idea about what you can do with it:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2021-01-31_15-07-18.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The closest you can get to that is looking at the GitHub Marketplace listing and at the examples contained in there:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2021-01-31_15-13-39.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2021-01-31_15-14-23.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It’s a different approach - more control at the cost of being less intuitive.&lt;/p&gt;

&lt;h2 id=&quot;running-a-workflow-manually-is-not-as-simple-as-it-should-be&quot;&gt;Running a workflow manually is not as simple as it should be&lt;/h2&gt;
&lt;p&gt;GitHub Actions is a platform orchestrator that &lt;em&gt;happens to do CI/CD&lt;/em&gt;. There is no such thing as a &lt;em&gt;manual run&lt;/em&gt;, so you need to add this snippet to your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;on&lt;/code&gt; condition:&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;nn&quot;&gt;...&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;workflow_dispatch&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;inputs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;logLevel&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Log&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;level&apos;&lt;/span&gt;     
        &lt;span class=&quot;na&quot;&gt;required&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;true&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;warning&apos;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This will enable the relative UI:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2021-01-31_15-35-19.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It’s not out-of-the-box and you need to know what to change - I hope it will become simpler in the future. Sometimes you need to run a workflow manually, and you don’t want to pollute your commit history with whitespace changes…&lt;/p&gt;
</description>
        <pubDate>Sun, 31 Jan 2021 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2021/01/31/CI-and-CD-with-GitHub-Actions-difference-Azure-Pipelines/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2021/01/31/CI-and-CD-with-GitHub-Actions-difference-Azure-Pipelines/</guid>
      </item>
    
      <item>
        <title>Why DevOps won&apos;t save you from struggling during the COVID-19 pandemic</title>
        <description>&lt;p&gt;New year, first new post. This is a reflection I’ve been mumbling over for the past few months.&lt;/p&gt;

&lt;p&gt;I am building up a session about &lt;em&gt;DevOps during the COVID-19 pandemic&lt;/em&gt;, and when researching things I quickly found a trend I frankly disagree with: apparently, DevOps on its own should warrant a boom for technology and quality within teams working within the technology industry.&lt;/p&gt;

&lt;p&gt;Look around &lt;a href=&quot;https://www.google.com/search?q=devops+covid&quot;&gt;yourself&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Solving the DevOps Dilemma in the COVID Era&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;How DevOps Can Save Your Business from COVID-19&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Why DevOps Is Important During the COVID-19 Pandemic&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Work-from-home mandates may be DevOps’ shining moment&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I can go on and on. DevOps as the silver bullet. Don’t get me wrong, it might be right &lt;em&gt;for some&lt;/em&gt;. DevOps is &lt;strong&gt;the best way forward&lt;/strong&gt;, but results coming out of a good adoption plan are not a direct consequence of &lt;em&gt;doing DevOps&lt;/em&gt;. It’s not like you are suddenly going to turn things upside down and adding all the best practices, the automations and the tools you could think of overnight &lt;em&gt;just because you are working from home&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Let’s bring it closer to home: teams are made of people, and we all work remotely now, from our homes. I lead a team on a daily basis, and I am lucky enough to have a dedicated room to work from with all the equipment necessary (even too much of it sometimes…). The struggle is real - no Teams, Slack, Webex can replace our human interactions. All the side-of-desk conversations are now gone, all the random conversations happening in shared spaces stopped, nobody bumps into each other anymore.&lt;/p&gt;

&lt;p&gt;This has got a direct impact on the way people behave and the way they work in a DevOps environment.&lt;br /&gt;
There is an overhead (and in human terms, &lt;em&gt;overhead&lt;/em&gt; means &lt;em&gt;stress increase&lt;/em&gt;) in any activity that requires human interaction - be it open a chat on Teams, starting an impromtu meeting, anything now requires a conscious effort which is inhevitably higher than the in-person equivalent.&lt;br /&gt;
People are naturally blurring boundaries, which is unfortunate to say the least. People are learning new things all the time, and you can see the fight between &lt;em&gt;sticking to the new&lt;/em&gt; versus &lt;em&gt;old and trusted habits&lt;/em&gt;. It’s not easy, and our 24x7 hyperconnected world adds a new variable to it.&lt;/p&gt;

&lt;p&gt;It is taxing, and you can see it day in day out. I take steps every day to make sure people are not just engaged on the technical side but also as part of the broader fabric of the team and the organisation. We are not just connected from our homes to work, we still need to remember the human side of things.
Cultural differences, mistakes, communication misunderstandings will happen no matter what, and they will also be amplified by the partially disconnected nature of the shift towards remote work.&lt;/p&gt;

&lt;p&gt;From a technical perspective you can see that people are more reactive, and it means that the overall quality can either increase &lt;strong&gt;or&lt;/strong&gt; decrease.&lt;/p&gt;

&lt;p&gt;It’s not a one-way system: people can actually suffer from being disconnected from being with &lt;em&gt;one team in a room&lt;/em&gt; and actually decrease the quality of what they do. These people will lack the passive input of colleagues, the ideas brought out of a conversation with a colleague over a cup of coffee. Pull requests will take longer, you could see someone suddenly communicating less and be more isolated on a technical problem. Bugs might pile-up, or become more specific. Someone might just be dropping the ball from time to time. It’s not stuff you sort out by installing or deploying yet another tool, or by adding a stand-up meeting.&lt;/p&gt;

&lt;p&gt;Like i said - teams are made of people, you will never get a constant output or a predictable reaction. Listen, adapt and try to steer accordingly.&lt;/p&gt;
</description>
        <pubDate>Sat, 16 Jan 2021 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2021/01/16/why-devops-wont-save-you-from-struggling/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2021/01/16/why-devops-wont-save-you-from-struggling/</guid>
      </item>
    
      <item>
        <title>How I moved my demo SonarQube server to Azure Container Instance</title>
        <description>&lt;p&gt;Yesterday I realised that the last time I connected via RDP into a server was back in May.&lt;br /&gt;
That talks volumes about how much cloud-native I am doing these days, but it also made me feel the burden of dealing with a Virtual Machine: logging in, dealing with the whole OS, an overall sense of slowness.&lt;/p&gt;

&lt;p&gt;The reason why I logged in that VM is because I wanted to update one of my demo instances of SonarQube, which I use in all sorts of demos due to the amount of data I have in there.&lt;/p&gt;

&lt;p&gt;It’s been a while since I updated that specific one, so it was about time. That is where my issues started - I tried to update to the latest LTS, no luck because of the version of Java I installed on the VM. The latest version of Java is not supported either, and retrieving specific versions of the JRE/JDK is not exactly straightforward. Then ElasticSearch complained, then something else.&lt;/p&gt;

&lt;p&gt;After a while I managed to get to the LTS, but then I had other errors when trying to move to the latest version. It’s not SonarQube’s fault in fairness, as much as mine as I neglected this specific demo instance. It was time to move away from a Virtual Machine and into something nimbler.&lt;/p&gt;

&lt;p&gt;SonarSource now offers SonarQube via a &lt;a href=&quot;https://hub.docker.com/_/sonarqube&quot;&gt;Docker image&lt;/a&gt; - an amazing start. Running it with the H2 database is a breeze - either in a Web App or a container.&lt;/p&gt;

&lt;p&gt;I immediately excluded AKS due to my scenario not requiring the complexity of Kubernetes, so I started looking at Azure Container Instance. This is what you need if you only need to run a container in a lift-and-shift scenario, no need for any extra complexity.&lt;/p&gt;

&lt;p&gt;SonarQube in ACI works a charm, but I wanted to use my own database - and that’s where the problems begin. How do you pass the required information to SonarQube if you are running in ACI? And also - how do you keep control over the instance?&lt;/p&gt;

&lt;p&gt;So, rolling up my sleeves - you can provision an ACI with &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/container-instances/container-instances-environment-variables&quot;&gt;Environment Variables&lt;/a&gt; which allow a user to inject variables into the target container at startup. SonarQube now &lt;a href=&quot;https://docs.sonarqube.org/latest/setup/environment-variables/&quot;&gt;supports&lt;/a&gt; them - so you need to setup your ACI with them:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-11-27_09-21-51.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If you provision this from scratch please use an ARM template like I did, it will allow you to set the SONARQUBE_JDBC_PASSWORD variable as a &lt;strong&gt;secret string&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;So you can run SonarQube with a real database. But it won’t start - you will get an error from &lt;a href=&quot;https://github.com/SonarSource/docker-sonarqube/issues/282&quot;&gt;ElasticSearch&lt;/a&gt;. Long story short, you need real, persistent storage for ElasticSearch as you are now running a non-empty instance of SonarQube.&lt;/p&gt;

&lt;p&gt;The easiest solution here is to create a Storage Account and to setup file shares to be passed to our ACI as &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/container-instances/container-instances-volume-azure-files&quot;&gt;mount points&lt;/a&gt;. I did that for the four folders I was really interested in:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-11-27_09-28-59.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I wanted to keep control of the conf folder, the data folder, the extensions folder and the logs folder. Each one of them is mounted on the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/opt/sonarqube/&amp;lt;folder&amp;gt;&lt;/code&gt; path - hence &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/opt/sonarqube/conf&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/opt/sonarqube/data&lt;/code&gt;, etc.&lt;/p&gt;

&lt;p&gt;For the conf folder, the reason why I wanted to keep it under my control was to upload a sonar.properties file containing properties I am interested in overriding by default (like the port to use, or the dreaded &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sonar.search.javaAdditionalOpts=-Dnode.store.allow_mmapfs=false&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;The data folder is necessary for ElasticSearch, the extensions folder is where you will find all the various installed plugins, and the logs folder contains all the SonarQube logs. This allows me to maintain a degree of control over the container in use, while still allowing the image to be refreshed anytime without worrying about breaking changes.&lt;/p&gt;

&lt;p&gt;You can find my ARM template and deployment script &lt;a href=&quot;https://github.com/mattvsts/SonarQubeACI&quot;&gt;here&lt;/a&gt; - it is very simple, but it works for demo purposes. If you want to make it better, you should tighten the database firewall rules and add a nginx reverse proxy via the sidecar pattern so you can get HTTPS implemented too.&lt;/p&gt;
</description>
        <pubDate>Fri, 27 Nov 2020 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2020/11/27/how-i-moved-sonarqube-to-aci/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2020/11/27/how-i-moved-sonarqube-to-aci/</guid>
      </item>
    
      <item>
        <title>Beware of implicit triggers in Azure Pipelines!</title>
        <description>&lt;p&gt;I was talking with &lt;a href=&quot;https://mohamedradwan.com/&quot;&gt;Mohamed&lt;/a&gt; about this earlier today - it’s something that can make you think you are off the track while in reality there is a much simpler explanation :-)&lt;/p&gt;

&lt;p&gt;Let’s say you have this pipeline - the traditional:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pool:
  vmImage: &apos;ubuntu-latest&apos;

steps:
- script: echo Hello, world!
  displayName: &apos;Run a one-line script&apos;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This is a CI build - you have no trigger, but as per documentation you have an implicit trigger on all branches (as per &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/devops/pipelines/repos/azure-repos-git?view=azure-devops&amp;amp;tabs=yaml#ci-triggers&quot;&gt;documentation&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-11-25_18-54-20.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The main thing to be aware of is that this type of trigger will operate on all branches, and on &lt;strong&gt;all events&lt;/strong&gt;. All events include &lt;strong&gt;branch creation&lt;/strong&gt; as well, so don’t be surprised if you see a slew of pipelines running when you create a branch - chances are you are using an implicit trigger and they are running as expected!&lt;/p&gt;
</description>
        <pubDate>Wed, 25 Nov 2020 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2020/11/25/beware-of-implicit-triggers/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2020/11/25/beware-of-implicit-triggers/</guid>
      </item>
    
      <item>
        <title>No message found for this issue in Azure DevOps</title>
        <description>&lt;p&gt;I am writing this post because I’ve been asked four times within two weeks, so it acts as a public service announcement :-)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-11-10_17-02-54.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The stage is still successful. Looking deeper into the execution by setting &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;System.Debug&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;true&lt;/code&gt;, you can see in the logs that it might have got to do with the Service Principal in the ARM deployment task:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-11-10_17-07-15.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In reality, it doesn’t - there was definitely some change to the out-of-the-box task, as this is not the expected behaviour.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/microsoft/azure-pipelines-tasks/issues/13797&quot;&gt;This&lt;/a&gt; GitHub issue explains what the problem is, and hopefully it will be sorted soon!&lt;/p&gt;
</description>
        <pubDate>Wed, 11 Nov 2020 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2020/11/11/no-message-found-for-this-issue-azure-devops/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2020/11/11/no-message-found-for-this-issue-azure-devops/</guid>
      </item>
    
      <item>
        <title>An API layer of PowerShell-based Function Apps - a few tips</title>
        <description>&lt;p&gt;Something that’s really fascinating for me is how serverless brings new life to existing pieces of technology - in this case, Azure Function Apps. PowerShell-based ones in particular.&lt;/p&gt;

&lt;p&gt;I am sure you are familiar with Function Apps and serverless computing, and the fact that amongst the various runtimes at your disposal you can even use PowerShell to write the logic inside them. When it comes to interacting with Azure and parsing files PowerShell is really second to none, and it makes our lives really easy. Embedding scripts (especially if they interact with an Azure estate) onto an Azure Function transforms them into a lightweight yet powerful API layer.&lt;/p&gt;

&lt;p&gt;Once you start doing that, you will need a CI/CD process, and that’s where things become interesting…&lt;/p&gt;

&lt;h4 id=&quot;getting-started---cicd&quot;&gt;Getting started - CI/CD&lt;/h4&gt;

&lt;p&gt;First of all I would recommend &lt;strong&gt;a repository per App Service Plan&lt;/strong&gt;.&lt;br /&gt;
Azure Functions are simple, nimble pieces of code, and they are designed for being hosted on a single App Service Plan - so it makes sense to actually group them like this.&lt;/p&gt;

&lt;p&gt;Once you have them there, add the ARM template or your favourite Infrastructure as Code equivalent. You need that so it’s all reproducible!&lt;/p&gt;

&lt;p&gt;Eventually, your CI/CD pipeline should have multiple stages - one for the infrastructure to be deploted or refreshed, and another one to deploy your Function(s).&lt;/p&gt;

&lt;p&gt;The deployment itself is the simplest thing ever: PowerShell doesn’t need to be compiled, so you can just zip the code in a package file and push it via the relevant Pipelines task to Azure. All you need to do is to target your Function App, every Function will be loaded independently.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;...
stages:
- stage: Infrastructure Deployment
  jobs:
  - deployment: TargetEnvironment
    environment:
      name: &quot;My target environment&quot;
    strategy:
        runOnce:
          deploy:
              steps:
                ...
- stage: Functions Package and Deployment
  jobs:
  - job: Package and Deployment
    steps:
    - task: ArchiveFiles@2
    inputs:
        rootFolderOrFile: &apos;$(System.DefaultWorkingDirectory)&apos;
        includeRootFolder: false
        archiveType: &apos;zip&apos;
        archiveFile: &apos;$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip&apos;
        replaceExistingArchive: true

    - task: PublishPipelineArtifact@1
    inputs:
        targetPath: &apos;$(Build.ArtifactStagingDirectory)&apos;
        artifact: &apos;Middleware&apos;
        publishLocation: &apos;pipeline&apos;
  
    - task: AzureFunctionApp@1
    inputs:
        azureSubscription: &apos;YourCSN&apos;
        appType: &apos;functionApp&apos;
        appName: &apos;YourFunctionApp&apos;
        package: &apos;$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip&apos;
        deploymentMethod: &apos;auto&apos;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;should-i-group-them&quot;&gt;Should I group them?&lt;/h4&gt;
&lt;p&gt;The one above is just an example, but it gives you an idea. If you package everything in a single zip file, it will work fine. If you want granularity, you can have individual pipelines for individual functions, and as long as you target the Function App you are good to go.&lt;/p&gt;

&lt;h4 id=&quot;pair-them-with-a-managed-identity-for-a-managed-and-powerful-api-layer&quot;&gt;Pair them with a Managed Identity for a managed and powerful API layer&lt;/h4&gt;
&lt;p&gt;You can easily add a Managed Identity to a Function App, and once the AAD Application Registration is secured you can leverage that to provide your users with self-service APIs spanning across your Azure estate.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-10-14_20-24-17.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Remember that you have the full power of the Az commands in PowerShell, so everything you did up to today to automate tasks can be easily ported across. Putting that into an API gives it a whole different exposure.&lt;/p&gt;

&lt;h4 id=&quot;connect-azure-active-directory-to-secure-the-api-layer&quot;&gt;Connect Azure Active Directory to secure the API layer&lt;/h4&gt;
&lt;p&gt;Integrating Azure Active Directory with your Function App is fairly simple, and it gives you control over who can access the API. Integration is straightforward, and it allows you to control access via RBAC.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-10-14_20-27-12.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It’s all very powerful yet easy to setup and integrate, an extremely useful way of extending your automations and ensuring as many users as possible can benefit from them within your organisation.&lt;/p&gt;
</description>
        <pubDate>Wed, 14 Oct 2020 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2020/10/14/API-azure-function-powershell-tips/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2020/10/14/API-azure-function-powershell-tips/</guid>
      </item>
    
      <item>
        <title>DevOps in a Landing Zone, how to run commands across it with Azure Resource Graph</title>
        <description>&lt;p&gt;I am currently working with a client that’s got a very well made &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/cloud-adoption-framework/ready/landing-zone/&quot;&gt;Landing Zone&lt;/a&gt;  (we are talking tens of subscriptions with nested Management Groups), and my team is building Azure Pipelines running automations that need to span across the whole Landing Zone.&lt;/p&gt;

&lt;p&gt;If you ever find yourself in this situation, remember that Azure DevOps is very well equipped for this - you can register Service Connections that span across Management Groups, including the root one:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-09-05_12-36-38.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;That said, even if you build something that can potentially be generalised to the whole Landing Zone, you will quickly realise that you have a problem: &lt;em&gt;scoping&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Scoping&lt;/em&gt; for an Azure command means that whenever you run anything against it you will always be scoped to a subscription. &lt;a href=&quot;https://docs.microsoft.com/en-us/powershell/module/az.accounts/set-azcontext?view=azps-4.6.1&quot;&gt;Set-AzContext&lt;/a&gt; is a very clear example of this, and obviously while you can work around it by looping any command across all the contexts your account or Service Principal has got access to, in a Landing Zone this quickly becomes an unnecessary overhead.&lt;/p&gt;

&lt;p&gt;So how to solve this problem? The answer is &lt;a href=&quot;https://azure.microsoft.com/en-us/features/resource-graph/&quot;&gt;Azure Resource Graph&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;An Azure Resource Graph query can span across the whole Landing Zone. Let’s say you want to deploy an update to every App Service running in a certain location. If you have tens of subscriptions where you need to perform this, it can be a big task. With Resource Graph, you can retrieve the information required like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-09-05_12-51-15.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;and then run the query with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;az graph query -q &quot;&amp;lt;your inline query&amp;gt;&quot;&lt;/code&gt;. The list of Resource IDs can then be used as an input for the many Azure commands you might want to use, and taking away the requirement of scoping to a subscription or a Resource Group.&lt;/p&gt;
</description>
        <pubDate>Sat, 05 Sep 2020 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2020/09/05/devops-in-a-landing-zone-azure-graph/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2020/09/05/devops-in-a-landing-zone-azure-graph/</guid>
      </item>
    
      <item>
        <title>Importing pipelines when the root pipeline has not been imported</title>
        <description>&lt;p&gt;I ran into this interesting bug the other day - let’s say this is our repository:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-08-30_09-57-19.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;All I wanted to do was importing the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;console.yml&lt;/code&gt; pipeline in Azure Pipelines. Well, I quickly learned that if you do not ever import the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;azure-pipelines.yml&lt;/code&gt; file first you are not going to be allowed to do that:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-08-30_10-00-17.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-08-30_10-01-15.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-08-30_10-02-00.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;There is a way around this though - if you use the Classic Editor you will be able to point the import process at an existing YAML pipeline.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-08-30_10-04-28.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-08-30_10-05-08.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Nifty little bug, hopefully it will be fixed soon.&lt;/p&gt;
</description>
        <pubDate>Tue, 01 Sep 2020 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2020/09/01/importing-pipelines-when-root-isnt-imported/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2020/09/01/importing-pipelines-when-root-isnt-imported/</guid>
      </item>
    
      <item>
        <title>Bulk import YAML pipelines in Azure DevOps</title>
        <description>&lt;p&gt;If you import or fork a repository with many YAML pipelines you will soon face this issue…&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;How can I import all these pipelines?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Doing it manually would be quite tedious, so you should use the APIs. Or, even better, the Azure DevOps CLI!&lt;/p&gt;

&lt;p&gt;Assuming you are going to get a list of paths in a standard format, you can run this simple PowerShell script from a local copy of your Git repository…&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$pipelines = &amp;lt;your paths/pipelines/names/etc - something to uniquely identify your pipelines&amp;gt;

foreach ($p in $pipelines){
    az pipelines create --name $p --description &quot;Pipeline for $p&quot; --repository &amp;lt;your clone URL&amp;gt; --branch &amp;lt;branch&amp;gt; --folder-path &amp;lt;folder destination for pipelines&amp;gt; --yaml-path &amp;lt;the path where $p is&amp;gt; --skip-run
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;As simple as this is, it is quite a valuable script. &lt;br /&gt;
Given a source of standard paths or pipeline names (you need to build it as you like), it is going to create new pipelines importing the existing YAML files, sorting them into the destination folders you like in Azure Pipelines and skipping the initial run so you are not going to overwhelm your agent pool.&lt;/p&gt;
</description>
        <pubDate>Tue, 21 Jul 2020 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2020/07/21/bulk-import-yaml-pipelines/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2020/07/21/bulk-import-yaml-pipelines/</guid>
      </item>
    
      <item>
        <title>Did you know about the Azure DevOps App?</title>
        <description>&lt;p&gt;The title is a bit cheeky… but I just realised that you can pick-up a website in Edge and make it an &lt;em&gt;app&lt;/em&gt; by clicking on this item here:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-07-02_14-52-52.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now, what if you do that with an Azure DevOps organisation? You get a nice bootstrap-native app to be pinned anywhere you like:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-07-02_14-55-23.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I keep my main organisation pinned on the Start menu for ease of access.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-07-02_14-57-16.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It is nothing more than a webpage without the whole browser plumbing around, but from a usability point of view this (at least to me!) makes a world of difference!&lt;/p&gt;
</description>
        <pubDate>Thu, 02 Jul 2020 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2020/07/02/did-you-know-azure-devops-app/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2020/07/02/did-you-know-azure-devops-app/</guid>
      </item>
    
      <item>
        <title>What&apos;s new in Microsoft Security Code Analysis?</title>
        <description>&lt;p&gt;I blogged about the toolkit in &lt;a href=&quot;https://mattvsts.github.io/2019/11/01/when-to-integrate-sca/&quot;&gt;the&lt;/a&gt; &lt;a href=&quot;https://mattvsts.github.io/2019/10/22/getting-started-with-sca/&quot;&gt;past&lt;/a&gt;, Microsoft Security Code Analysis is something that you should look at if you want to integrate a solid set of static code analysis procedures around the security space.&lt;/p&gt;

&lt;p&gt;Over the past couple of months the team released a major set of &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/security/develop/security-code-analysis-releases&quot;&gt;enhancements&lt;/a&gt;, and it is clear that there is still so much coming through to properly implement security scans in Azure DevOps.&lt;/p&gt;

&lt;h2 id=&quot;credscan-updates&quot;&gt;CredScan updates&lt;/h2&gt;
&lt;p&gt;Aside from being 25% faster, CredScan can now identify new secret types, including various types of access tokens. This was a long-requested feature, because not all passwords are a username and password combination and having the capability of automatically detecting these is extremely important. You definitely do not want an Azure Active Directory access token in the clear into your repository!&lt;/p&gt;

&lt;h2 id=&quot;futures&quot;&gt;Futures&lt;/h2&gt;
&lt;p&gt;There a few interesting items in the roadmap: analysers for Java, Python and Azure Resource Manager templates. These not only expand the language selection, but they will also cover Infrastructure as Code files, making it a foundational tool you can integrate not only for .NET code, but also for other languages.&lt;/p&gt;
</description>
        <pubDate>Mon, 29 Jun 2020 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2020/06/29/what-new-in-microsoft-security-code-analysis/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2020/06/29/what-new-in-microsoft-security-code-analysis/</guid>
      </item>
    
      <item>
        <title>Getting started with project management in GitHub Projects</title>
        <description>&lt;p&gt;If you want to approach GitHub Issues for your projects, sooner or later you are going to need a form of project management. It can be Azure DevOps (and I am very keen &lt;a href=&quot;https://mattvsts.github.io/2020/04/22/synchronising-github-issues-and-azure-devops-work-items/&quot;&gt;on it&lt;/a&gt;), but what if you want to retain everything within GitHub? The answer is GitHub Projects.&lt;/p&gt;

&lt;p&gt;GitHub Projects is definitely designed around a board and a Lean process - all of the default Template options point at that direction:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-06-21_17-29-08.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automated Kanban&lt;/strong&gt; will get you started with a good amount of helpers to get it off the ground. You can also link repositories to a board, which is the best way of populating a board:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-06-21_17-31-47.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;For our example, let’s pretend I am creating a board that unifies the GitHub Issues the teams are working on and provides a unified pane of glass for all the current activities. If you are starting from scratch, then you are done - you get a board, and you can start adding stuff to it:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-06-21_17-42-04.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;What you see there as cards are not necessarily Issues coming from repos - you can also have independent cards, and everything is markdown-based anyway so they are easy to edit.&lt;/p&gt;

&lt;p&gt;In the real world it is quite unlikely to start in a nice, greenfield situation. More often than not you will need to setup a Board for an existing repository, which might already have a number of issues making up a backlog.&lt;/p&gt;

&lt;p&gt;In that case, the first thing to do would be to add the issues you want to this board. I linked two repositories with existing data, hence I need to add these:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-06-21_17-46-31.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-06-21_17-48-51.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can do it manually once or twice, but after a while it becomes an overhead…&lt;/p&gt;

&lt;p&gt;Needless to say, we have automations. If you set the &lt;strong&gt;Projects&lt;/strong&gt; property for an issue, it will be automatically be linked to the Project:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-06-21_18-00-46.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-06-21_18-01-20.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-06-21_18-02-14.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Also, any issue set to a Closed state will automatically go to to the Closed column.&lt;/p&gt;

&lt;p&gt;All nice and good, but it’s not enough to have a simple setup out of the box. A key missing bit, for example, is that you might want to move an issue when it’s assigned to someone into the &lt;strong&gt;In progress&lt;/strong&gt; column, and the out of the box automation doesn’t do that.&lt;/p&gt;

&lt;p&gt;That is where GitHub Actions enters the picture - thanks to &lt;a href=&quot;https://github.com/marketplace/actions/create-or-update-project-card&quot;&gt;one&lt;/a&gt; of the many actions in the marketplace you can create a workflow like this, and every time an issue gets someone assigned it will be automatically moved to that column:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-06-21_18-30-40.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;By implementing this workflow to any linked repository you will get a nice and smooth management experience for a Lean backlog. There is obviously much more to it, but it is a starting point to real project management in GitHub.&lt;/p&gt;
</description>
        <pubDate>Sun, 21 Jun 2020 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2020/06/21/getting-started-with-project-management-in-github-projects/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2020/06/21/getting-started-with-project-management-in-github-projects/</guid>
      </item>
    
      <item>
        <title>Running YAML Azure Pipelines from a restricted GitHub Service Connection</title>
        <description>&lt;p&gt;Last week a colleague (hi Kapil!) ran into an interesting scenario:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;what if I can’t use the GitHub app to integrate Azure Pipelines with my GitHub repository? All I have is a GitHub PAT.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The target GitHub repository contains the YAML Pipeline definitions, but it has no visibility towards Azure DevOps. All you have on the Azure DevOps side is a Service Connection created with a PAT.&lt;br /&gt;
This is a situation where the GitHub organisation restricts access to external parties, so they only release a PAT to allow for controlled access. It’s not an optimal situation IMHO, but we should make it work regardless.&lt;/p&gt;

&lt;p&gt;If you choose the Azure Pipeline classic editor, you will be able to consume that Service Connection:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-06-04_11-02-03.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You will be surprised to discover that once you point it at the right source (your GitHub Service Connection mentioned above), you will have an option to use a YAML file:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-06-04_11-09-56.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;All you then have to do is to set the path to your YAML definition, and the two will be integrated:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-06-04_11-11-58.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-06-04_11-12-59.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</description>
        <pubDate>Thu, 04 Jun 2020 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2020/06/04/running-yaml-azure-pipelines-from-restricted-github-service-connection/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2020/06/04/running-yaml-azure-pipelines-from-restricted-github-service-connection/</guid>
      </item>
    
      <item>
        <title>Working with Git repositories in Azure Pipelines</title>
        <description>&lt;p&gt;I keep talking about &lt;a href=&quot;https://www.youtube.com/watch?v=hgLzCQArWEA&quot;&gt;Azure Pipelines&lt;/a&gt; a lot these days and there are so many features in the Pipelines as Code implementation you just miss or overlook because you cannot go around the UI, poking stuff, turning dials and seeing what happens. At least, that’s what I always do :-)&lt;/p&gt;

&lt;p&gt;This time around I want to spend some time on what you can do with Git repositories in Azure Pipelines, because once you start embracing Pipelines as Code there is so much you can do with them - regardless of your versioning approach (single or multiple repositories).&lt;/p&gt;

&lt;h2 id=&quot;working-with-multiple-git-repositories&quot;&gt;Working with multiple Git repositories&lt;/h2&gt;
&lt;p&gt;One of these features is multi-repository access, and it gives you so much power over the handling of repositories as part of a pipeline run.&lt;/p&gt;

&lt;p&gt;Reaching out to multiple repositories, within a Pipeline is very simple, by leveraging the appropriate &lt;em&gt;Resources&lt;/em&gt; keyword and checking-out the repository you are interested in - it can be hosted anywhere, as long as it is reachable via a Service Connection:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;resources:
  repositories:
  - repository: ExternalRepository
    type: github
    endpoint: GHEC
    name: Org/Repo
...
steps:
- checkout: ExternalRepository
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;What if you want to specify a repository at runtime, rather than as part of the definition? If that repository is contained in your Azure DevOps Organisation (anywhere!) you can just run this as part of your steps, replacing the stuff within brackets:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;steps:
...
- checkout: git://&amp;lt;Team Project&amp;gt;/&amp;lt;repository name&amp;gt;
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can also choose the branch you want to checkout, by adding a &lt;em&gt;ref&lt;/em&gt; property to the repository resource or appending _@&lt;your branch=&quot;&quot; ref=&quot;&quot;&gt; to the checkout step:&lt;/your&gt;&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;resources:
  repositories:
  - repository: ExternalRepository
    type: github
    endpoint: GHEC
    name: Org/Repo
    ref: develop
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;steps:
...
- checkout: git://&amp;lt;Team Project&amp;gt;/&amp;lt;repository name&amp;gt;@develop
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;One typical example of multiple repository access is when you have a repository containing your Pipeline templates, and you need to run some of them as part of your specialised pipeline run, contained in a different repository (a microservice, for example). It’s as simple as this…&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;...
steps:
  - template: templates/my-template.yml@ExternalRepository
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;trigger-filtering-for-branches-and-pull-requests&quot;&gt;Trigger filtering for branches and Pull Requests&lt;/h2&gt;
&lt;p&gt;Yes, when you create a pipeline you get a CI trigger on master by default. But it is just the beginning…&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;trigger:
  branches:
    include:
    - master
    - develop
    - feature/*
    exclude:
    - experimental/*
  paths:
    include:
    - &apos;/&apos;
    exclude:
    - &apos;docs/&apos;
    - &apos;assets/&apos;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This example runs a certain pipeline on a CI basis only when a change is pushed to master, develop or any feature branch. It explicitly excludes experimental branches, and changes to the docs/ and assets/ folders. No fiddling around with comboboxes or toggles, you just type it down like this.&lt;/p&gt;

&lt;p&gt;If you are using Azure Repos, then the Pull Request trigger is going to be handled by a Branch Policy and you should not do anything to your Pipeline definition. If you are using any other Git hosting platform, then you can copy the code above and replace the &lt;em&gt;trigger&lt;/em&gt; keyword with &lt;em&gt;pr&lt;/em&gt; to implement a trigger filter for PRs as well.&lt;/p&gt;
</description>
        <pubDate>Sun, 24 May 2020 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2020/05/24/working-with-git-repositories-in-azure-pipelines/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2020/05/24/working-with-git-repositories-in-azure-pipelines/</guid>
      </item>
    
      <item>
        <title>Azure DevOps as the FinOps enabler</title>
        <description>&lt;p&gt;I recently spent a lot of time working on this topic, which in a nutshell can be summarised as:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Can I make Azure DevOps my FinOps enabler instead of re-inventing the wheel?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let’s take a step back. FinOps? Yes, FinOps.&lt;/p&gt;

&lt;h2 id=&quot;finops-is-a-reality-of-the-world-we-live-in&quot;&gt;FinOps is a reality of the world we live in&lt;/h2&gt;
&lt;p&gt;If you are using the Public Cloud, you are effectively using a utility. Hence, you are billed by a meter reading, and the more you use the more you pay.&lt;/p&gt;

&lt;p&gt;FinOps is an engineering specialisation that bridges the gap between the world of financial management (there is still a procurement function in every organisation, and guess where the purchase order for an Azure subscription is screened and approved or rejected?) and the technology side.&lt;/p&gt;

&lt;p&gt;The name is carefully identified as FinOps because of that - it actually stands for &lt;em&gt;Cloud Financial Operations&lt;/em&gt;, but it is not trying to rip-off the success of DevOps.&lt;/p&gt;

&lt;p&gt;It is a deliberate choice based on the fact that one of the DevOps pillars is about removing silos and communication barriers. FinOps does applies the same treatment to Procurement (the people actually paying for the cloud resources) and Engineering Operations (the people using these cloud resources).&lt;/p&gt;

&lt;h2 id=&quot;why-azure-devops&quot;&gt;Why Azure DevOps?&lt;/h2&gt;
&lt;p&gt;Think about it for a moment. With Azure DevOps (and Azure Pipelines in particular) you can have total control over the automations that provision and deploy the cloud resources you are going to use.&lt;/p&gt;

&lt;p&gt;Pipelines can be scheduled, and Service Connections allow you to connect to anything in Azure, from a Management Group down to an individual Resource Group, and you can always execute either PowerShell scripts or ARM templates against Azure to achieve the desired state.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-05-16_09-43-06.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It doesn’t take too long to understand that these are all the tools you need to empower your development teams towards a smart cloud usage.&lt;/p&gt;

&lt;h2 id=&quot;it-works-regardless&quot;&gt;It works regardless&lt;/h2&gt;
&lt;p&gt;Remember: you are on a meter, you pay for what you use. Do you really need that development environment running 24x7? Perhaps not, and you might make your application more resilient to restarts in the process of implementing that.&lt;/p&gt;

&lt;p&gt;Each team can and should integrate this core FinOps principle in their habits and procedures so that it becomes part of the fabric of your organisation.&lt;/p&gt;

&lt;p&gt;You might have circumstances where a team doesn’t want to collaborate, or maybe there are other constraints limiting their involvement. This is not a problem with Azure DevOps, as long as you have a Service Principal that can connect to the target Azure resources.&lt;/p&gt;

&lt;p&gt;If you need to go down the centralised management route, take advantage of YAML pipelines. Create a dedicated Git repository containing all the infrastructure pipelines you need, so you get a clear auditing trail.&lt;/p&gt;

&lt;p&gt;Also leverage Environments as much as you can in the process - they cost you nothing to implement them and you also get a clear separation for visibility purposes.&lt;/p&gt;

</description>
        <pubDate>Sat, 16 May 2020 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2020/05/16/azure-devops-as-the-finops-enabler/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2020/05/16/azure-devops-as-the-finops-enabler/</guid>
      </item>
    
      <item>
        <title>CI/CD YAML Pipelines finally GA!</title>
        <description>&lt;p&gt;YAML pipelines for CI/CD are finally &lt;a href=&quot;https://devblogs.microsoft.com/devops/announcing-general-availability-of-azure-pipelines-yaml-cd/&quot;&gt;GA&lt;/a&gt;. Hooray!&lt;/p&gt;

&lt;p&gt;There are a few changes which have been introduced fairly recently: resources, as well as a number of approvals and checks.&lt;/p&gt;

&lt;h2 id=&quot;resources&quot;&gt;Resources&lt;/h2&gt;
&lt;p&gt;Resources are the built-in mechanism for consuming resources as part of a pipeline.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;resources:
  pipelines: [ pipeline ]  
  builds: [ build ]
  repositories: [ repository ]
  containers: [ container ]
  packages: [ package ]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is the syntax to use when it comes to multi-repository builds, composition as part of releases, etc.&lt;/p&gt;

&lt;p&gt;In real-world situations you can have a situation where you have to deal with these (and more), so you are not tied to a single repository. Also, they enable a very interesting scenario: a reusable repository containing pipeline templates, which you can re-use across your organisation. A very cool example of inner source.&lt;/p&gt;

&lt;h2 id=&quot;approvals-and-checks&quot;&gt;Approvals and checks&lt;/h2&gt;
&lt;p&gt;This has been a long-standing request before GA: you need to have approvals, you need to control how releases progress from environment to environment.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-04-29_16-05-15.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now, it’s not just about &lt;em&gt;approvals&lt;/em&gt; here. You can also invoke an Azure Function, a REST API or query Azure Monitor like we did in the old Release Gates. My &lt;a href=&quot;https://github.com/MattVSTS/AvailabilityFunction&quot;&gt;AvailabilityFunction&lt;/a&gt; was designed for that!&lt;/p&gt;

&lt;p&gt;At the same time, the bottom check is extremely interesting - requesting a &lt;em&gt;Required template&lt;/em&gt; you can make sure certain stages adhere to a certain convention across the organisation. It’s pretty much the equivalent to a blueprint:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-04-29_16-09-26.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Evaluate artifact&lt;/em&gt; is another one worth a mention. &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/devops/pipelines/process/artifact-policy?view=azure-devops&quot;&gt;Artifact policy checks&lt;/a&gt; have been around for a while, and they currently apply to container pipelines. They act as a gatekeeper with a set of policies that cover many things, from what ports are exposed to which images are consumed - providing again not only a level of standardisation but also an automated validation which can prevent security or quality issues.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-04-29_16-18-57.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I am a massive fan of Pipelines as Code, especially in the Azure DevOps implementation. You have all the power of YAML and Pipelines as Code (including versioning and reproducibility, which are the two most important ones IMHO!) together with an easy UX when building them thanks to the Task Assistant.&lt;/p&gt;

&lt;p&gt;Now they are GA for the release side as well, so there is no excuse for &lt;strong&gt;not&lt;/strong&gt; using them :-)&lt;/p&gt;
</description>
        <pubDate>Wed, 29 Apr 2020 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2020/04/29/yaml-pipelines-ga/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2020/04/29/yaml-pipelines-ga/</guid>
      </item>
    
      <item>
        <title>Synchronising GitHub Issues and Azure DevOps Work Items</title>
        <description>&lt;p&gt;Another integration between Azure DevOps and GitHub is in work planning and tracking, or project management if you like.&lt;/p&gt;

&lt;p&gt;While from a technical perspective they will be achieved in a similar way, I believe we have a number of possible scenarios, with a couple of examples below:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;use Azure Boards for backlog management, as well as having an open source or inner source model where stuff is published to GitHub and issues from consumers are publicly logged from there.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;be independent from the project and portfolio management side of the story, where the PMO rolls backlog data coming from GitHub Issues into Epics and Features hosted natively in Azure Boards.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The solution is very straightforward - use Dan Hellem’s &lt;a href=&quot;https://github.com/danhellem/github-actions-issue-to-work-item&quot;&gt;Action&lt;/a&gt; as it is, and mapping the Azure DevOps Work Item Type of choice to what makes the most sense in your circumstances. You could even use a different Area Path, if you want:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-04-22_21-44-53.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Let’s say we are tackling the first scenario: in that case opening an issue in the GitHub world will create a Bug in Azure DevOps, so that external contributors will have an opportunity of opening something in your backlog, with various reminders of the connection to GitHub:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-04-22_21-49-00.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-04-22_21-51-53.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This also means that if someone, as part of a Pull Request, mentions that specific issue via the AB# syntax in a comment, commits will be automatically associated to the Azure DevOps Bug!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-04-22_22-02-54.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-04-22_22-01-23.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This enables a real contribution workflow at both ends, where the GitHub Issues are treated as first class citizens rather than an afterthought.&lt;/p&gt;

&lt;p&gt;The integration is deep both ways, as it requires the Azure Boards GitHub &lt;a href=&quot;https://github.com/marketplace/azure-boards&quot;&gt;application&lt;/a&gt; on the GitHub account or organisation, and it will automatically configure the GitHub Connection on the Azure DevOps side:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-04-23_17-33-07.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;On top of that, take a look at the Action’s &lt;a href=&quot;https://github.com/danhellem/github-actions-issue-to-work-item&quot;&gt;source code&lt;/a&gt; - extending that will open the Pandora’s box when it comes to customising the Work Item created by the integration:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-04-23_17-36-55.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It is effectively a wrapper around the REST API, so you can tailor it down to your needs!&lt;/p&gt;
</description>
        <pubDate>Wed, 22 Apr 2020 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2020/04/22/synchronising-github-issues-and-azure-devops-work-items/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2020/04/22/synchronising-github-issues-and-azure-devops-work-items/</guid>
      </item>
    
      <item>
        <title>Review - Team Topologies</title>
        <description>&lt;p&gt;I bought this book a few weeks ago after a suggestion by fellow MVP Wouter de Kort:&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Just purchased!&lt;/p&gt;&amp;mdash; Matteo Emili (@MattVSTS) &lt;a href=&quot;https://twitter.com/MattVSTS/status/1226571165025611788?ref_src=twsrc%5Etfw&quot;&gt;February 9, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;p&gt;It was definitely worth it. Team Topologies covers a lot of ground, it’s not your standard management book despite its 180-odd pages length taking out glossary, index and references.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/IMG_20200415_194847.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The thing I liked probably the most is that the book uses Conway’s Law as it is supposed to be used. It’s an unfortunate reality we deal with on a daily basis, but it’s not like the world is divided between who uses this law and who doesn’t…there are a number of shades in between, and Chapter 2 closes with this paragraph:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Conway’s Law Is Critical for Efficient Team Design in Tech&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It’s well known I am a big fan of pragmatic approaches that bring tangible benefits: the reverse Conway maneuver is an excellent start, which then you will adapt to the real case in front of you. Sometimes, you just have to deal with it. And the best way of dealing with it is bending it to your advantage.&lt;/p&gt;

&lt;p&gt;Then it moves on to Team Topologies (the actual topologies, not the title again!). The book delves into psychology, and it really resonates - so many times situations like the ones described actually happened. I experienced them first-hand, and there are plenty of things to takeaway as retrospective. Applying the outcomes from the book already made the difference in a couple of cases.&lt;/p&gt;

&lt;p&gt;But that said, the book is very clear:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Team Topologies Alone Are Not Sufficient for IT Effectiveness&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nobody is going to find the silver bullet in this book, but it gives a lot of good for thought. It’s &lt;em&gt;proper good&lt;/em&gt;. If you are in a consulting capacity, even a junior one, technology is just a tool: you are dealing with people, first and foremost. Technology always comes second in the pecking order.&lt;/p&gt;
</description>
        <pubDate>Tue, 14 Apr 2020 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2020/04/14/review-team-topologies/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2020/04/14/review-team-topologies/</guid>
      </item>
    
      <item>
        <title>What does &quot;automate your workflow&quot; means?</title>
        <description>&lt;p&gt;GitHub’s marketing headline is &lt;a href=&quot;https://github.com/features/actions&quot;&gt;very clear&lt;/a&gt; IMHO:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-04-07_14-23-11.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;But marketing aside, what does it &lt;strong&gt;actually&lt;/strong&gt; mean?&lt;/p&gt;

&lt;p&gt;GitHub Actions is not &lt;em&gt;just&lt;/em&gt; a CI/CD engine, its integration with the platform goes much deeper. The more I spend time with it, the more I find out these perhaps simple but (to me!) valuable bits.&lt;/p&gt;

&lt;p&gt;It’s true that we often bend Azure Pipelines &lt;a href=&quot;https://mattvsts.github.io/2019/06/30/remember-the-power-of-an-agent/&quot;&gt;to do things&lt;/a&gt; which are not really within the defined scope of work, but that’s a side-effect of Azure Pipelines being extremely flexible. Pipelines is a CI/CD engine that can be a general purpose orchestrator, Actions is the other way around.&lt;/p&gt;

&lt;p&gt;Let’s say, you might be here because of a tweet like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-04-07_14-32-46.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;That tweet was not manual. That tweet is the output of my custom workflow (thanks to &lt;a href=&quot;https://www.edwardthomson.com/blog/github_actions_30_integrating_other_apis_in_an_action.html&quot;&gt;Ed&lt;/a&gt; for his Action!):&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-04-07_18-50-37.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This workflow runs on every push to master, unless the commit message includes &lt;strong&gt;NO CI&lt;/strong&gt;. If the workflow is running it will pick up the comment from the commit (which by convention it is always going to be the title of the post) and tweets it in a pre-built body.&lt;/p&gt;

&lt;p&gt;“Automate your workflow” means this. Not just CI/CD, but an underlying orchestrator spanning across the platform, where the main artifact is code.&lt;/p&gt;
</description>
        <pubDate>Tue, 07 Apr 2020 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2020/04/07/what-does-automate-your-workflow-means/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2020/04/07/what-does-automate-your-workflow-means/</guid>
      </item>
    
      <item>
        <title>CI on GitHub Actions, CD on Azure Pipelines</title>
        <description>&lt;p&gt;If you want to start approaching GitHub Actions, you can easily do that targeting Continuous Integration.&lt;/p&gt;

&lt;p&gt;However, when it comes to the deployment side of the story, it can be more difficult. Requirements can be different for everyone, and Pipelines as of today has an established set of patterns and features people already use.&lt;/p&gt;

&lt;p&gt;Also, when it comes to GitHub Packages, there is one key missing item compared to Azure Artifacts: Universal Packages. They are a very effective way of moving stuff around, and as of today GitHub Packages does not support them.&lt;/p&gt;

&lt;p&gt;So you want to use GitHub and GitHub Actions for all things development. It’s not a problem, you will setup a workflow and build your stuff. But for deployments you want to use Azure Pipelines because you are already very familiar with it, you use Service Endpoints extensively, or whatever other reason.&lt;/p&gt;

&lt;p&gt;Nobody is stopping us from integrating Actions and Pipelines, with Azure Artifacts in between. It is relatively simple, and it provides good flexibility.&lt;/p&gt;

&lt;p&gt;Let’s take a step back: what do you do with &lt;em&gt;any&lt;/em&gt; project in your organisation? You run a CI engine that produces an artifact. That artifact can be deployed on multiple target environments, often also outside of your own project if you are working on a platform team or you are doing inner source.&lt;/p&gt;

&lt;p&gt;Taking for granted you are already building your artifacts as part of the build process, all you need to add a couple of Actions to your workflow:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    - name: Publish package
      uses: Azure/cli@v1.0.0
      env: 
        AZURE_DEVOPS_EXT_PAT: $
      with:
        azcliversion: 2.0.72
        inlineScript: |
          az extension add --name azure-devops
          echo $ | az devops login --organization https://dev.azure.com/&amp;lt;orgname&amp;gt;
          az artifacts universal publish --organization https://dev.azure.com/&amp;lt;orgname&amp;gt;/ --project=&quot;Your Project&quot; --scope project --feed &amp;lt;your feed name&amp;gt; --name &amp;lt;artifact name&amp;gt; --version 0.0.$ --description &quot;Description&quot; --path &amp;lt;path of your artifact&amp;gt;
      
    - name: Azure Pipelines Action
      uses: Azure/pipelines@v1
      with:
        # FQDN to the Azure DevOps organization with project name
        azure-devops-project-url: &apos;https://dev.azure.com/&amp;lt;orgname&amp;gt;/Your%20Project&apos;
        # Name of the Azure Pipeline to be triggered
        azure-pipeline-name: &apos;&amp;lt;your pipeline name&amp;gt;&apos;
        # PAT
        azure-devops-token: $
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Again, in Actions you have no Service Endpoint infrastructure so you have to deal with the cli directly. The first action uses the Azure CLI with a PAT added to the Secrets section of your project - you then add the azure-devops extension, authenticate and then publish a Universal Package to Azure Artifacts.&lt;/p&gt;

&lt;p&gt;Authentication is quite tricky here - despite all my efforts, I still had to echo the PAT before logging in. The Azure DevOps CLI does not support either Service Principals or PAT as a parameter, so I had to go that way. It does not leak in the Actions log, but the environment variable alone &lt;strong&gt;was not enough&lt;/strong&gt; to successfully authenticate.&lt;/p&gt;

&lt;p&gt;The reason why I chose a Universal Package is because it allows for easy and transparent flow of packages regardless of the content. If you are using MSDeploy for example, it is the way to go. Don’t pay too much attention to the use of the GitHub Actions Run Number, I just needed a quick incremental number to use for versioning.&lt;/p&gt;

&lt;p&gt;This process will publish the artifact(s) on the feed specified. Using a feed enables easy sharing of artifacts not only between GitHub and Azure DevOps, but also within projects contained inside the Azure DevOps organisation if the feed is configured as org-wide.&lt;/p&gt;

&lt;p&gt;The second Action invokes an Azure Pipeline, and it doesn’t require too much effort: FQDN, pipeline name and PAT will be enough to get you going. Of course that Pipeline should consume the feed we just published to!&lt;/p&gt;

&lt;p&gt;This is all it takes to integrate the two platforms - it is fairly straightforward once you iron out the differences. A question I got while discussing this is:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Why don’t you use GitHub Releases or GitHub Packages as artifacts repository?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Obviously I chose Azure Artifacts because I wanted to integrate Azure DevOps and GitHub within my context :-) but there are other reasons: I did not use GitHub Releases because I wanted the artifacts to be independent of the repository at GitHub level, effectively making the code and CI side of the story pluggable. I also didn’t want to tie down the deployment pipelines with an artifact source.&lt;/p&gt;

&lt;p&gt;The reason why I didn’t use GitHub Packages is simple: there is no support for a generic (Universal) package which can contain a MSDeploy package. MSDeploy is used fairly heavily, especially when deploying on Azure - I might be changing the underlying DevOps platform, but I am not going to revamp a situation where things are already established and well-oiled.&lt;/p&gt;
</description>
        <pubDate>Fri, 03 Apr 2020 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2020/04/03/CI-on-github-actions-CD-on-Azure-Pipelines/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2020/04/03/CI-on-github-actions-CD-on-Azure-Pipelines/</guid>
      </item>
    
      <item>
        <title>A tour of GitHub Enterprise Cloud</title>
        <description>&lt;p&gt;Continuing my exploration of GitHub from Azure DevOps, the next topic which caught my attention is the equivalence between Azure DevOps and GitHub at service level. I am particularly interested in GitHub Enterprise Cloud, which seems to be the closest match to what I am already familiar with!&lt;/p&gt;

&lt;h2 id=&quot;organisations&quot;&gt;Organisations&lt;/h2&gt;
&lt;p&gt;In Azure DevOps Services the first thing you do is creating an &lt;em&gt;Organisation&lt;/em&gt; (it used to be &lt;em&gt;Account&lt;/em&gt; and it is a &lt;em&gt;Collection&lt;/em&gt; in the on-premise world). When you go to GitHub.com, what you create straight away is an individual account. How would that work with enterprise ownership?&lt;/p&gt;

&lt;p&gt;The answer is the same, albeit slightly hidden: GitHub Organisations. It’s not in-your-face that much - you can find the Organisations page under your Settings:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-03-28_07-54-53.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;An organisation can totally be free - there is no cost attached to it if you use it for open-source development. If you need private repositories (and development) then you can create a Team plan or an Enterprise plan, with the relative cost.&lt;/p&gt;

&lt;p&gt;Once you move towards Enteprise Cloud, getting into the Organisation side you will be faced with a set of familiar set of settings and menus, but there are a few differences comparing them with Azure DevOps’.&lt;/p&gt;

&lt;h2 id=&quot;permissions-and-security&quot;&gt;Permissions and Security&lt;/h2&gt;
&lt;p&gt;All the ACL are handled under the &lt;em&gt;Member privileges&lt;/em&gt; menu, as well as various visibility settings.&lt;/p&gt;

&lt;p&gt;For a user, there are four &lt;em&gt;base permissions&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-03-28_08-22-44.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Unless a user is added to a specific Team or Repository, it will automatically inherit this base permission.&lt;/p&gt;

&lt;p&gt;From the same page you can also expand the Forking capability to private repos, and control the Actions integration. This is interesting - you have three settings: &lt;em&gt;Disabled&lt;/em&gt; (I wonder who will ever disable Actions!), &lt;em&gt;local Actions&lt;/em&gt; and &lt;em&gt;local and third party Actions&lt;/em&gt;. It is a nice way of enabling vetting for Actions should you need it - with the local Actions setting you are retricting usage to Actions where the code is contained within an Organisation’s repository.&lt;/p&gt;

&lt;p&gt;On the Security front you can require 2FA for all users contained in an Organisation (please do!), integrate SSO with your identity provider of choice, synchronise teams via AAD, add a SSH CA and implement IP whitelisting.&lt;/p&gt;

&lt;p&gt;The last one is very interesting for the Enterprise world, and it is nice to see such transparency about it. It is worth knowing that once you enable IP whitelisting you lose the ability to consume the hosted GitHub Actions runners, and you need to host your own.&lt;/p&gt;

&lt;h2 id=&quot;managing-a-project&quot;&gt;Managing a project&lt;/h2&gt;
&lt;p&gt;Unlike Azure DevOps, you do not require a &lt;em&gt;Team Project&lt;/em&gt; in GitHub. The approach is different - everything revolves around code, so you can have loose repos where all the members of an Organisation can contribute.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-03-28_08-02-54.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A &lt;em&gt;Project&lt;/em&gt; in GitHub is a set of features to enable a basic planning and tracking experience. One or more repos can be linked to a Project to facilitate suggestions and search. A Project can have a Project Template, but do not expect anything like in Azure DevOps - here things are very lightweight and prone to automation:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-03-28_08-08-45.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Basic Kanban&lt;/strong&gt; template is really the simplest one you can start from - all the automations from the other templates are implemented via GitHub Actions.&lt;/p&gt;

&lt;p&gt;You can immediately see that there is no choice between &lt;em&gt;Agile&lt;/em&gt;, &lt;em&gt;Scrum&lt;/em&gt; or &lt;em&gt;CMMI&lt;/em&gt; in terms of templates, it is an experience completely decoupled from your process. Needless to say you can customise anything and everything.&lt;/p&gt;

&lt;h2 id=&quot;teams&quot;&gt;Teams&lt;/h2&gt;
&lt;p&gt;A Team is a way of grouping people and granting access to common resources together. You can assign Projects, other Teams and Repositories to a Team, so that all the tracking effort can be targeted by these groups.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-03-28_08-57-27.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The main aim of a Team is to facilitate discussions - they can be used to track decisions and conversations before formalising them in Project issues.&lt;/p&gt;

&lt;h2 id=&quot;anything-else&quot;&gt;Anything else?&lt;/h2&gt;
&lt;p&gt;That is it for Enterprise Cloud, the differences with Azure DevOps are pretty much summarised in the above list.&lt;/p&gt;

&lt;p&gt;What I &lt;strong&gt;really&lt;/strong&gt; like is the lack of overhead. From an administrative perspective there is no need for a full-time role managing the organisation and things are really transparent. Teams can focus on creating value without spending too much time in administrative tasks, and there is a large focus on communication and information sharing within the platform.&lt;/p&gt;

&lt;p&gt;We should also keep in mind that this approach doesn’t require to go all-in with a massive change to the way teams work today. I am fairly sure only a relatively small percentage of teams will take advantage of &lt;strong&gt;all&lt;/strong&gt; the features an Organisation can offer from the get-go, often because of longstanding habits and resistance to change.&lt;/p&gt;

&lt;p&gt;There is nothing wrong with it, and GitHub Enterprise Cloud is granular enough to offer a seamless experience regardless.&lt;/p&gt;

</description>
        <pubDate>Sat, 28 Mar 2020 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2020/03/28/a-tour-of-github-enterprise-cloud/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2020/03/28/a-tour-of-github-enterprise-cloud/</guid>
      </item>
    
      <item>
        <title>Looking at the CD side of CI/CD with GitHub Actions - also how to deploy ARM templates with it!</title>
        <description>&lt;p&gt;It’s been a while I wanted to spend proper time with GitHub Actions and compare it with Azure Pipelines. Today thanks to the storm this weekend I had some time to do so :-) It’s a long and wordy post, be advised. And no, no TL;DR!&lt;/p&gt;

&lt;p&gt;GitHub Actions is built on the same foundation of Azure Pipelines, so the Continuous Integration side is very much what I am expecting from it: a series of tasks (Actions) running on an agent (Runner). The definition is contained in a yaml file (by default within a &lt;em&gt;.github/workflows&lt;/em&gt; folder) and is stored in your Git repository.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-02-09_14-45-17.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Nothing out of the ordinary up to this point: you will be dealing with a slightly different syntax, but it pretty much to what Azure Pipeline does.&lt;/p&gt;

&lt;p&gt;Now onto the Deployment side of the story, that’s where things get interesting. GitHub Actions as of today has got no deep integration with any cloud provider, or any authorisation automation for external resources.&lt;/p&gt;

&lt;p&gt;The premise is completely different from Azure Pipelines - you can (and should) use standard tools so that your local workflow can be automated. Hence, all the work we usually do around Azure CLI, PowerShell, Bash, etc. can be ported to Actions with minimal changes.&lt;/p&gt;

&lt;p&gt;There are several actions already available on the &lt;a href=&quot;https://github.com/marketplace?type=actions&quot;&gt;marketplace&lt;/a&gt;, so stuff like deployments or integrating existing automations won’t be an issue. Take &lt;a href=&quot;https://github.com/marketplace/actions/deploy-vm-from-vsphere-content-library&quot;&gt;this&lt;/a&gt; as a quite edge example: if you are running vSphere in your datacentre (so nothing to do with any cloud) you can deploy a VM from the Content Library with just one Action as part of your deployment.&lt;/p&gt;

&lt;p&gt;As a consequence of not having an equivalent to the Service Endpoint in Azure DevOps, you need to handle your secrets manually. This will entail, in the case of Azure, creating a Service Principal via the CLI and then building your own JSON structure with the four parameters you’ll need:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;{
    &quot;clientId&quot;: &quot;&amp;lt;guid&amp;gt;&quot;,
    &quot;clientSecret&quot;: &quot;&amp;lt;another_guid&amp;gt;&quot;,
    &quot;tenantId&quot;: &quot;&amp;lt;different_guid&amp;gt;&quot;,
    &quot;subscriptionId&quot;: &quot;&amp;lt;separate_guid&amp;gt;&quot;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Once you have this you can paste it into the Secrets section of your repository and then you will be able to consume it as a &lt;em&gt;Secret&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-02-10_19-43-21.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-02-10_19-44-22.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Logging in with Azure will be the first thing to do on a deployment. After that (and assuming you have your ARM template available in the repositoru), given you do not have facilities for ARM deployments, you’ll need to use the CLI:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-02-10_19-47-08.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now, as you could guess there is no ‘stage’ or ‘environment’ equivalence. The way you can manage target environments by mapping environment variables to secrets, and consuming them within your yml file.&lt;/p&gt;

&lt;p&gt;There is also no daisy-chaining: an Action workflow cannot invoke another workflow without API workarounds or Webhooks. However you can call multiple jobs with &lt;em&gt;job dependency&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-02-10_19-59-02.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Summarising, GitHub Actions is to Pipelines what the &lt;em&gt;shift left&lt;/em&gt; movement is to a developer: it adds transparency, and it is very simple to deal with. YAML (despite the different syntax to Pipelines) is still YAML, so nothing completely new out there, as well as the Actions marketplace.&lt;/p&gt;

&lt;p&gt;Cherry on top over here - you can &lt;a href=&quot;https://github.com/marketplace/actions/azure-pipelines-action&quot;&gt;invoke Azure Pipelines&lt;/a&gt; from a GitHub Actions workflow so you can move back and forth between both platforms should you need it, getting the best of both worlds!&lt;/p&gt;

</description>
        <pubDate>Mon, 10 Feb 2020 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2020/02/10/looking-at-the-cd-side-of-cicd-with-github-actions/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2020/02/10/looking-at-the-cd-side-of-cicd-with-github-actions/</guid>
      </item>
    
      <item>
        <title>A closer look at the pipeline authorisation model</title>
        <description>&lt;p&gt;It all starts from this error…&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-01-21_21-13-59.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Yes, you can click the button and (possibly) fix it, but what was the cause of that?&lt;/p&gt;

&lt;p&gt;The answer is simple: every Service Connection you are going to consume within a Pipeline needs to be authorised. What usually happens is that a Service Connection is automatically authorised for the project (or even across projects), and then someone &lt;em&gt;decides&lt;/em&gt; to remove the pipeline authorisation leaving you with a red build.&lt;/p&gt;

&lt;p&gt;Fixing this is really easy - your Service Connection has got a Security menu. Look into it…&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-01-21_21-20-07.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-01-21_21-20-46.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Click on the + button to add at least a pipeline, or to grant full-fledged access across different projects:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-01-21_21-22-38.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-01-21_21-23-06.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Needless to say, you can restrict access as much as you like - play with the ACLs as much as you like, but regardless of that Pipelines and Users will have different authorisation models. Especially because Pipelines themselves are considered &lt;a href=&quot;https://github.com/microsoft/azure-pipelines-yaml/blob/master/design/pipeline-resources.md&quot;&gt;resources&lt;/a&gt; in the new YAML world…&lt;/p&gt;
</description>
        <pubDate>Tue, 21 Jan 2020 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2020/01/21/a-closer-look-at-the-pipeline-authorisation-model/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2020/01/21/a-closer-look-at-the-pipeline-authorisation-model/</guid>
      </item>
    
      <item>
        <title>A primer on using VMs with multi-stage pipelines</title>
        <description>&lt;p&gt;One of the most demanded features for multi-stage pipelines in Azure DevOps is the possibility of natively targeting VMs. As of today you can easily target Kubernetes environments and cloud-hosted environments, but it is not yet possible to consume a set of targets made of virtual machines. Unfortunately we do not live in an ideal world where all the workloads are running in PaaS or containers, so at the moment we really cannot use it at scale with VMs. This changes with the new feature released last Friday: you will be able to target VMs directly as well as the above resources. How?&lt;/p&gt;

&lt;p&gt;It’s simple - the YAML syntax will have support for a new environment &lt;em&gt;resourceType&lt;/em&gt;, called VirtualMachine. That one has got support for tagging and strategies designed around VMs.
The best part IMHO is that it is completely transparent: once you have it setup you can keep writing your pipelines exactly like you would with a K8S or a PaaS environment.&lt;/p&gt;

&lt;p&gt;All you have to do is to create a new Environment with a &lt;em&gt;Virtual machine&lt;/em&gt; resource, specify the OS you are running and eventually run the associated script on your target VM.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-12-19_19-22-01.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-12-19_19-22-39.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;There you will be able to enter the resource tags you might want to use (in my case, simply &lt;em&gt;web&lt;/em&gt;). As simple as any other Azure DevOps agent deployment.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-12-19_20-11-42.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It’s all you have to do , once done you can start using your pipelines as usual. Let’s take a simple example - a modernised version of the &lt;a href=&quot;https://microsoft.github.io/PartsUnlimitedMRP/&quot;&gt;PartsUnlimitedMRP&lt;/a&gt; sample app:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# Gradle
# Build your Java project and run tests with Gradle using a Gradle wrapper script.
# Add steps that analyze code, save build artifacts, deploy, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/java

stages:
    - stage: Build
      jobs:
        - job: Build
          pool:
            vmImage: &apos;vs2017-win2016&apos;
          steps:
          - task: Gradle@2
            displayName: &apos;Integration Service&apos;
            inputs:
              workingDirectory: &apos;src/Backend/IntegrationService&apos;
              gradleWrapperFile: &apos;src/Backend/IntegrationService/gradlew&apos;
              gradleOptions: &apos;-Xmx3072m&apos;
              javaHomeOption: &apos;JDKVersion&apos;
              jdkVersionOption: &apos;1.8&apos;
              jdkArchitectureOption: &apos;x64&apos;
              publishJUnitResults: false
              testResultsFiles: &apos;**/TEST-*.xml&apos;
              tasks: &apos;build&apos;

          - task: Gradle@2
            displayName: &apos;Order Service&apos;
            inputs:
              workingDirectory: &apos;src/Backend/OrderService&apos;
              gradleWrapperFile: &apos;src/Backend/OrderService/gradlew&apos;
              gradleOptions: &apos;-Xmx3072m&apos;
              javaHomeOption: &apos;JDKVersion&apos;
              jdkVersionOption: &apos;1.8&apos;
              jdkArchitectureOption: &apos;x64&apos;
              publishJUnitResults: false
              testResultsFiles: &apos;**/TEST-*.xml&apos;
              tasks: &apos;build&apos;

          - task: Gradle@2
            displayName: &apos;Clients&apos;
            inputs:
              workingDirectory: &apos;src/Clients&apos;
              gradleWrapperFile: &apos;src/Clients/gradlew&apos;
              gradleOptions: &apos;-Xmx3072m&apos;
              javaHomeOption: &apos;JDKVersion&apos;
              jdkVersionOption: &apos;1.8&apos;
              jdkArchitectureOption: &apos;x64&apos;
              publishJUnitResults: false
              testResultsFiles: &apos;**/TEST-*.xml&apos;
              tasks: &apos;build&apos;

          - task: CopyFiles@2
            displayName: &apos;Copy drop&apos;
            inputs:
              SourceFolder: &apos;$(Build.SourcesDirectory)\src&apos;
              Contents: &apos;**/build/libs/!(buildSrc)*.?ar&apos;
              TargetFolder: &apos;$(build.artifactstagingdirectory)\drop&apos;

          - task: CopyFiles@2
            displayName: &apos;Copy deployment artifacts&apos;
            inputs:
              SourceFolder: &apos;$(Build.SourcesDirectory)&apos;
              Contents: |
                **/deploy/SSH-MRP-Artifacts.ps1
                **/deploy/deploy_mrp_app.sh
                **/deploy/MongoRecords.js
              TargetFolder: &apos;$(build.artifactstagingdirectory)\deploy&apos;
            
          - task: PublishPipelineArtifact@1
            displayName: &apos;Upload drop&apos;
            inputs:
              targetPath: &apos;$(build.artifactstagingdirectory)\drop&apos;
              artifact: &apos;drop&apos;
              publishLocation: &apos;pipeline&apos;

          - task: PublishPipelineArtifact@1
            displayName: &apos;Upload deploy&apos;
            inputs:
              targetPath: &apos;$(build.artifactstagingdirectory)\deploy&apos;
              artifact: &apos;deploy&apos;
              publishLocation: &apos;pipeline&apos;
    
    - stage: Release
      jobs:
        - deployment: VMDeployment
          displayName: &quot;Deployment on local Ubuntu VM&quot;
          environment:
            name: &quot;Target VMs&quot;
            resourceType: VirtualMachine
            tags: web
          strategy:
              runOnce:
                  preDeploy:
                    steps:
                      - task: Bash@3
                        inputs:
                          targetType: &apos;inline&apos;
                          script: &apos;echo &apos;&apos;Hello world&apos;&apos;&apos;
                  deploy:
                      steps:
                        - task: DownloadPipelineArtifact@2
                          inputs:
                            buildType: &apos;specific&apos;
                            project: &apos;daf1bce1-923a-41af-ad31-cfebfd7eda61&apos;
                            definition: &apos;115&apos;
                            buildVersionToDownload: &apos;latest&apos;
                            artifactName: &apos;drop&apos;
                            targetPath: &apos;$(Pipeline.Workspace)&apos;
                        - task: DownloadPipelineArtifact@2
                          inputs:
                            buildType: &apos;specific&apos;
                            project: &apos;daf1bce1-923a-41af-ad31-cfebfd7eda61&apos;
                            definition: &apos;115&apos;
                            buildVersionToDownload: &apos;latest&apos;
                            artifactName: &apos;deploy&apos;
                            targetPath: &apos;$(Pipeline.Workspace)&apos;
                        - task: Bash@3
                          inputs:
                            filePath: &apos;$(Pipeline.Workspace)/deploy/deploy_mrp_app.sh&apos;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The Build stage of my pipeline runs on a hosted agent: I am building the Java services with it. I don’t have a Gradle build server easily available (nor I want to spend the effort of setting up one!), and as it is provided by Azure Pipelines it suits my requirement.
Once the Build stage is done, the Release starts. I am targeting the environment I created before (&lt;em&gt;Target VMs&lt;/em&gt;), and I am pointing at all the VMs with the &lt;em&gt;web&lt;/em&gt; tag.&lt;/p&gt;

&lt;p&gt;From there I am using one of the OOB strategies, called &lt;em&gt;runOnce&lt;/em&gt;. As the name suggests, it runs once on all the targets, and it has two distinct phases: a preDeploy one, and a main phase for deployment.&lt;/p&gt;

&lt;p&gt;The preDeploy phase allows to run specific tasks before the main deployment phase, and it is very useful for setting the environment before the actual deployment. In my case I am running a simple echo script, also because there used to be a bug where the runOnce strategy didn’t run correctly without it. This has been fixed, but I left it out as an example.&lt;/p&gt;

&lt;p&gt;In the main deploy phase the pipeline starts by explicitly downloading from a set of build artifacts. It could be the previous phase (it is in this case), but it could also be from other pipelines. It allows you to shape the pipeline in a granular way, effectively. Then it runs a script to deploy the MRP application (as it comes in the original codebase) via Bash. Again, as simple as we are used to.&lt;/p&gt;

&lt;p&gt;The task support is exactly the same as the classic UI-based pipelines and the YAML pipelines. What I find extremely interesting is the OOB support for &lt;strong&gt;Rolling&lt;/strong&gt; deployments, which I will cover in a separate post. Canary and Blue-Green will be implemented as well in the future.&lt;/p&gt;

</description>
        <pubDate>Thu, 16 Jan 2020 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2020/01/16/a-primer-on-using-vms-with-multi-stage-pipelines/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2020/01/16/a-primer-on-using-vms-with-multi-stage-pipelines/</guid>
      </item>
    
      <item>
        <title>Create a build matrix with Azure Pipelines</title>
        <description>&lt;p&gt;I was discussing this with a colleague a couple of days ago (if you are reading this, hi Keith!): can we easily build a build matrix with Azure Pipelines?&lt;/p&gt;

&lt;p&gt;A build matrix is something that comes out of product-based companies: you have a single code base that you need to build across multiple permutations of operating systems, software versions, etc.
Think about the pre-requisites of your favourite PC videogame or your trusted software you carry with you since God-knows-when - each one of them will have a &lt;em&gt;support matrix&lt;/em&gt; behind them, dictating if and how you can get support from the manufacturer. It also means that if yoiu end up within these pre-requisites, chances are your problem has already been identified, documented (and fixed!) as part of a regular testing strategy.&lt;/p&gt;

&lt;p&gt;You can do that fairly easily with Azure Pipelines - the &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/devops/pipelines/get-started-multiplatform?view=azure-devops&quot;&gt;documentation&lt;/a&gt; has got an example. Is it enough though? I thought about digging deeper - not just stopping at the &lt;em&gt;multiplatform&lt;/em&gt; side of the story. And everybody knows about my allergy to JavaScript…&lt;/p&gt;

&lt;p&gt;With a moderately complex application there are a number of tasks you need to carry on. Take a simple .NET Core &lt;a href=&quot;https://github.com/dotnet-architecture/eShopOnWeb&quot;&gt;application&lt;/a&gt; - you need to restore your dependencies for each project you need to build, compile, run at the very least a suite of unit tests, then package your artifacts and upload it for downstream consumption into each environment. Something resembling this, perhaps…&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;trigger:
- master

pool:
  vmImage: &apos;windows-latest&apos;

variables:
  solution: &apos;**/*.sln&apos;
  buildPlatform: &apos;Any CPU&apos;
  buildConfiguration: &apos;Release&apos;

steps:
- task: DotNetCoreCLI@2
  displayName: &quot;Restore&quot;
  inputs:
    command: &apos;restore&apos;
    projects: &apos;**/*.csproj&apos;
    feedsToUse: &apos;select&apos;

- task: DotNetCoreCLI@2
  displayName: &quot;Build&quot;
  inputs:
    command: &apos;build&apos;
    projects: &apos;**/*.csproj&apos;

- task: DotNetCoreCLI@2
  displayName: &quot;Unit Tests&quot;
  inputs:
    command: &apos;test&apos;
    projects: &apos;**/tests/UnitTests/UnitTests.csproj&apos;

- task: DotNetCoreCLI@2
  displayName: &quot;Publish Infrastructure&quot;
  inputs:
    command: &apos;publish&apos;
    publishWebProjects: false
    projects: &apos;$(Build.SourcesDirectory)/src/Infrastructure/Infrastructure.csproj&apos;

- task: DotNetCoreCLI@2
  displayName: &quot;Publish ApplicationCore&quot;
  inputs:
    command: &apos;publish&apos;
    publishWebProjects: false
    projects: &apos;$(Build.SourcesDirectory)/src/ApplicationCore/ApplicationCore.csproj&apos;

- task: DotNetCoreCLI@2
  displayName: &quot;Publish Web&quot;
  inputs:
    command: &apos;publish&apos;
    publishWebProjects: true

- task: CopyFiles@2
  inputs:
    SourceFolder: &apos;$(Build.SourcesDirectory)&apos;
    Contents: |
      src\ApplicationCore\bin\Debug\netstandard2.1\ApplicationCore.dll
      src\Infrastructure\bin\Debug\netstandard2.1\Infrastructure.dll
      src\Web\bin\Debug\netcoreapp3.1\Web.dll
      src\Web\bin\Debug\netcoreapp3.1\Web.Views.dll
    TargetFolder: &apos;$(Build.ArtifactStagingDirectory)&apos;

- task: PublishPipelineArtifact@1
  inputs:
    targetPath: &apos;$(Build.ArtifactStagingDirectory)&apos;
    artifact: &apos;drop&apos;
    publishLocation: &apos;pipeline&apos;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Now, awesome. But what if you want to support two different .NET Core versions and all the major operating systems, in at least two versions? In a regular scenario, it means either a lot of overhead or a lot of interaction.&lt;/p&gt;

&lt;p&gt;The YAML Pipeline facilities come to our rescue thanks to the &lt;em&gt;matrix&lt;/em&gt; option in the &lt;em&gt;strategy&lt;/em&gt; &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=azure-devops&amp;amp;tabs=schema#job&quot;&gt;job condition.&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This allows for simple, zero-touch permutations. An example is the one above: two OS, with two runtimes depending on the version:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;trigger:
- master

strategy:
  matrix:
    &apos;Ubuntu 16.04&apos;:
      image: &apos;ubuntu-16.04&apos;
      dotnetcore: &apos;2.2.x&apos;
    &apos;Ubuntu 18.04&apos;:
      image: &apos;ubuntu-18.04&apos;
      dotnetcore: &apos;3.1.x&apos;
    &apos;MacOS X High Sierra&apos;:
      image: &apos;macos-10.13&apos;
      dotnetcore: &apos;2.2.x&apos;
    &apos;MacOS X Mojave&apos;:
      image: &apos;macos-10.14&apos;
      dotnetcore: &apos;3.1.x&apos;
    &apos;Windows Server 2016&apos;:
      image: &apos;vs2017-win2016&apos;
      dotnetcore: &apos;2.2.x&apos;
    &apos;Windows Server 2019&apos;:
      image: &apos;windows-2019&apos;
      dotnetcore: &apos;3.1.x&apos;

pool:
  vmImage: $(image)

variables:
  solution: &apos;**/*.sln&apos;
  buildPlatform: &apos;Any CPU&apos;
  buildConfiguration: &apos;Release&apos;

steps:
- task: UseDotNet@2
  inputs:
    packageType: &apos;sdk&apos;
    version: $(dotnetcore)
    
- task: DotNetCoreCLI@2
  displayName: &quot;Restore&quot;
  inputs:
    command: &apos;restore&apos;
    projects: &apos;**/*.csproj&apos;
    feedsToUse: &apos;select&apos;

- task: DotNetCoreCLI@2
  displayName: &quot;Build&quot;
  inputs:
    command: &apos;build&apos;
    projects: &apos;**/*.csproj&apos;

- task: DotNetCoreCLI@2
  displayName: &quot;Unit Tests&quot;
  inputs:
    command: &apos;test&apos;
    projects: &apos;**/tests/UnitTests/UnitTests.csproj&apos;

- task: DotNetCoreCLI@2
  displayName: &quot;Publish Infrastructure&quot;
  inputs:
    command: &apos;publish&apos;
    publishWebProjects: false
    projects: &apos;$(Build.SourcesDirectory)/src/Infrastructure/Infrastructure.csproj&apos;

- task: DotNetCoreCLI@2
  displayName: &quot;Publish ApplicationCore&quot;
  inputs:
    command: &apos;publish&apos;
    publishWebProjects: false
    projects: &apos;$(Build.SourcesDirectory)/src/ApplicationCore/ApplicationCore.csproj&apos;

- task: DotNetCoreCLI@2
  displayName: &quot;Publish Web&quot;
  inputs:
    command: &apos;publish&apos;
    publishWebProjects: true

- task: CopyFiles@2
  inputs:
    SourceFolder: &apos;$(Build.SourcesDirectory)&apos;
    Contents: |
      src\ApplicationCore\bin\Debug\netstandard2.1\ApplicationCore.dll
      src\Infrastructure\bin\Debug\netstandard2.1\Infrastructure.dll
      src\Web\bin\Debug\netcoreapp3.1\Web.dll
      src\Web\bin\Debug\netcoreapp3.1\Web.Views.dll
    TargetFolder: &apos;$(Build.ArtifactStagingDirectory)&apos;

- task: PublishPipelineArtifact@1
  inputs:
    targetPath: &apos;$(Build.ArtifactStagingDirectory)&apos;
    artifact: &apos;$(image)&apos;
    publishLocation: &apos;pipeline&apos;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The build component of the pipeline is the same. All I did is adding the matrix on top, and force the explicit version of the .NET Core SDK I want to use for my target build so to dynamically enable different versions.&lt;/p&gt;

&lt;p&gt;Let’s take a look at the matrix itself in detail:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;strategy:
  matrix:
    &apos;Ubuntu 16.04&apos;:
      image: &apos;ubuntu-16.04&apos;
      dotnetcore: &apos;2.2.x&apos;
    &apos;Ubuntu 18.04&apos;:
      image: &apos;ubuntu-18.04&apos;
      dotnetcore: &apos;3.1.x&apos;
    &apos;MacOS X High Sierra&apos;:
      image: &apos;macos-10.13&apos;
      dotnetcore: &apos;2.2.x&apos;
    &apos;MacOS X Mojave&apos;:
      image: &apos;macos-10.14&apos;
      dotnetcore: &apos;3.1.x&apos;
    &apos;Windows Server 2016&apos;:
      image: &apos;vs2017-win2016&apos;
      dotnetcore: &apos;2.2.x&apos;
    &apos;Windows Server 2019&apos;:
      image: &apos;windows-2019&apos;
      dotnetcore: &apos;3.1.x&apos;

pool:
  vmImage: $(image)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is an example hence the simple approach - a more engineered approach would be to populate the matrix variables via other controlled variables, without requiring a change in the pipeline in case you want to change the version or the image. No other modification is required, no configuration or extra software to install. It’s all part of the out of the box experience.&lt;/p&gt;

&lt;p&gt;The result can be consumed really easily - the .NET Core 2.x version value I entered there doesn’t work on purpose while the 3.x does. This is the build summary for the whole set of runs, with each run clearly marked:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2020-01-07_21-14-11.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It also means that the effort to add or remove an environment from the matrix is all in the key-value pairs making it up. If I were to make it more complicated by adding both .NET Core versions to each OS, I could have added a template to loop for each one of them with the same image type so to have a situation like:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Windows Server 2019 runs with .NET Core 2.2.x&lt;/li&gt;
  &lt;li&gt;Windows Server 2019 runs with .NET Core 3.1.x&lt;/li&gt;
  &lt;li&gt;Windows Server 2016 runs with .NET Core 2.2.x&lt;/li&gt;
  &lt;li&gt;Windows Server 2016 runs with .NET Core 3.1.x&lt;/li&gt;
  &lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is a strong display of power for the &lt;em&gt;pipelines as code&lt;/em&gt; approach - I am moving more and more things over there, and I see little reasons to go back, smaller by the day.&lt;/p&gt;
</description>
        <pubDate>Tue, 07 Jan 2020 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2020/01/07/create-a-build-matrix-with-azure-pipelines/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2020/01/07/create-a-build-matrix-with-azure-pipelines/</guid>
      </item>
    
      <item>
        <title>Review - The Unicorn Project</title>
        <description>&lt;p&gt;Here it is, the most awaited book this year for whoever is even tangentially involved with DevOps…&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-12-22_08-32-25.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The book covers the endeavours of Maxine, demoted from her team at Parts Unlimited to the Phoenix Project just after the payroll outage. 
It is set in the same universe as The Phoenix Project and both books share the same timeline.&lt;/p&gt;

&lt;p&gt;The Phoenix Project was about the transformation of an organisation to an engineering factory, being able to free from the shackles of legacy and become a true value mover.
With that background in mind, The Unicorn Project goes deeper behind the scenes, looking at the people and the human interactions behind the transformation.&lt;/p&gt;

&lt;p&gt;We finally get to know the development teams, and how they work with each other. Brent is no longer ‘just’ the technical SME, but he has got a specific role and personality to fit within the team. It all makes sense at the end of the day, you are going deeper hence you discover more about these key people. And we’ve all been Maxine, at some point…&lt;/p&gt;

&lt;p&gt;The biggest takeaway IMHO is about the Five Ideals, a long overdue definition over these key processes we long considered best practices. 
I am not going to spoil anything from the book so this is my own interpretation, but in short they are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Locality and simplicity&lt;/li&gt;
  &lt;li&gt;Focus, flow and joy&lt;/li&gt;
  &lt;li&gt;Improvement of daily work&lt;/li&gt;
  &lt;li&gt;Psychological safety&lt;/li&gt;
  &lt;li&gt;Customer focus&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They can only be enabled by the Three Ways described in the previous book. And thinking about it, it makes total sense as you need an organisational driver for change before being able to put them into practice.&lt;/p&gt;

&lt;p&gt;There are all sorts of situations we’ve experienced in one way or another. From the lack of reliable CI to the outages and the executives’ behaviour, this book is a collection of real people talking about a realistic scenario. it is definitiely a book to get at all costs (together with The Phoenix Project if you haven’t already!), as it will provide a guideline and a blueprint for anyone trying to transform and improve an organisation.&lt;/p&gt;

&lt;p&gt;There was one detail I believe spoiled the immersion and the experience: the frequent name-dropping of technologies and companies. It was not there in the Phoenix Project, and I personally didn’t like it because instead of acting as a reminder (I believe that was Gene’s aim) it kinda broke the 4th wall too often. I didn’t mind Parts Unlimited to sit in its parallel universe, without &lt;a href=&quot;https://en.wikipedia.org/wiki/Facebook,_Apple,_Amazon,_Netflix_and_Google&quot;&gt;FAANG&lt;/a&gt; and references to various pieces of technology.&lt;/p&gt;

&lt;p&gt;It’s definitely a minor detail that won’t ruin your enjoyment of the book, but for me it was a noticeable difference from the first one.&lt;/p&gt;
</description>
        <pubDate>Sun, 22 Dec 2019 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/12/22/review-the-unicorn-project/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/12/22/review-the-unicorn-project/</guid>
      </item>
    
      <item>
        <title>Why isn&apos;t my agent updating?</title>
        <description>&lt;p&gt;This happens fairly often in restricted configurations where there are proxies, firewalls, etc…
Let’s say you want to update your Azure Pipelines agent from the UI:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-12-13_17-06-00.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If you see a message saying that it’s downloading the agent and then goes back to Idle, chances are you have a networking issue on the agent machine, usually towards the internet.&lt;/p&gt;

&lt;p&gt;The agent update process is fully automated, and all it does is downloading the new agent from a well known address (https://vstsagentpackage.azureedge.net), and replacing the binaries.&lt;/p&gt;

&lt;p&gt;Go and have a look in the Agent log:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-12-13-17-11-00.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can see that the machine cannot download the new agent package, hence the process fails and releases the agent from the lock to bring it back to the pool. It’s a totally safe operation, but you won’t see any error message surfacing in the UI by design.&lt;/p&gt;
</description>
        <pubDate>Fri, 13 Dec 2019 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/12/13/why-isnt-my-agent-updating/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/12/13/why-isnt-my-agent-updating/</guid>
      </item>
    
      <item>
        <title>You&apos;ve got no excuses in managing secrets with Azure DevOps and KeyVault!</title>
        <description>&lt;p&gt;As part of a solid engineering practices one of the first things I flag up during an assessment is how you handle secrets - their management is really one of these things where you cannot cut corners.&lt;/p&gt;

&lt;p&gt;Azure KeyVault is awesome in this, as it is really set-and-forget. And using Azure Pipelines with KeyVault is really &lt;em&gt;stuff of the dreams&lt;/em&gt;, as the integration between the two makes it really easy to consume.&lt;/p&gt;

&lt;p&gt;Let’s say you setup this secret named ‘Key’ in KeyVault:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-12-01_11-42-35.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Azure Pipelines and Azure KeyVault by default share a &lt;em&gt;convention over configuration&lt;/em&gt; approach, meaning that your secrets’ key names in a KeyVault are automatically mapped to Pipelines variables with the same name. This makes it ridiculously easy to use!&lt;/p&gt;

&lt;p&gt;All you need to do is to download the secrets you are interested in from your KeyVault as part of a build or a release, and use the relative variables.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-12-01_11-51-46.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In the real world you would use it to deploy and configure your resources, but I didn’t want to add additional overhead to the scenario - I just want to show you that &lt;strong&gt;it works&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So I created a quick Pipeline that validates a secret with a control value to make sure it is correct - the &lt;strong&gt;Key&lt;/strong&gt; variable is empty but encrypted to mark it a secret, the &lt;strong&gt;ControlKey&lt;/strong&gt; variable is the value against which I want to check it:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-12-01_11-49-36.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Then this barebone PowerShell script is going to validate it on the fly:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-12-01_11-52-11.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Give it a go, I can guarantee it is going to work as expected :-)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-12-01_11-55-30.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-12-01_11-56-45.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</description>
        <pubDate>Sun, 01 Dec 2019 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/12/01/no-excuses-managing-secrets-azure-devops-keyvault/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/12/01/no-excuses-managing-secrets-azure-devops-keyvault/</guid>
      </item>
    
      <item>
        <title>Enforce governance on Azure DevOps Organisations</title>
        <description>&lt;p&gt;This is a crucial but often overlooked detail when it comes to corporate adoption of Azure DevOps - how can I prevent users from creating &lt;em&gt;rogue Organisations&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;Needless to say, the first port of call would be to understand why the &lt;em&gt;rogue Organisation&lt;/em&gt; was created in the first place. Talking to each other goes a long way! And more often than not, the underlying reason is a simple misunderstanding of requirements or a lack of communication betweem two parties. The main reason why Organisations should not proliferate is because it can easily become a governance nightmare - especially when you start connecting Azure subscriptions.&lt;/p&gt;

&lt;p&gt;While there is always a chance of someone creating an org with their own personal Microsoft Account (nothing you can do about that I’m afraid!), we have some options to track or even prevent Organisations created with AAD backing but without approval.&lt;/p&gt;

&lt;p&gt;The reactive route is fairly easy to implement: you can setup an Azure Monitor Alert looking for operations against the &lt;em&gt;Microsoft.VisualStudio/Account&lt;/em&gt; Resource Type:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-11-20-15-18-51.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This will alert you if someone creates a new Organisation connected to an Azure Active Directory tenant. It is good, but it is still reactive: someone did it and now you have to fix it.&lt;/p&gt;

&lt;p&gt;The proactive way has just been released - the documentation is &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/devops/organizations/accounts/azure-ad-tenant-policy-restrict-org-creation?view=azure-devops&quot;&gt;here&lt;/a&gt;, and the role looks like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-11-20-15-19-56.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The new Administrator Role, that is going to contain a list of authorised users, is combined with a feature which ties-in with your existing Azure DevOps Organisations:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-11-20-15-13-42.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;These two together prevent the creation of unauthorised AAD-backed Organisations, and simply the overall governance of the stack. Fewer operations to worry about!&lt;/p&gt;
</description>
        <pubDate>Wed, 20 Nov 2019 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/11/20/enforce-governance-on-azure-devops-organisations/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/11/20/enforce-governance-on-azure-devops-organisations/</guid>
      </item>
    
      <item>
        <title>Did you know? Repo branching policies in Azure DevOps</title>
        <description>&lt;p&gt;It’s one of these things that go unnoticed until you actually stumble upon them: did you know that Azure DevOps has a number of branch policies you can apply to each repository in your Team Project?&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-11-13_18-40-40.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;These are repo-wide, different than the ones specific to the single branch. I am very fond of the &lt;strong&gt;Commit author email validation&lt;/strong&gt; one that blocks lazy people not setting up their Git Config correctly :-)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-11-13_18-51-04.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It’s also very handy to be able to control the maximum file size and path length direcly:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-11-13_18-51-59.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Check them out, I am sure you will find an excellent use of these. Small details, but they can make the difference sometimes.&lt;/p&gt;
</description>
        <pubDate>Wed, 13 Nov 2019 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/11/13/did-you-know-branch-policies/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/11/13/did-you-know-branch-policies/</guid>
      </item>
    
      <item>
        <title>When to integrate SCA?</title>
        <description>&lt;p&gt;As much as I am a fan of &lt;a href=&quot;https://secdevtools.azurewebsites.net/&quot;&gt;Microsoft Secure Code Analysis&lt;/a&gt; I would not go and blindly integrate the whole suite without a degree of thought.&lt;/p&gt;

&lt;p&gt;If you attended one of the sessions where I talk about quality, as part of my common sense approach to blending security concepts into the DevOps fabric of an organisation I still swear by nimbleness and agility - meaning I am not going to transform a 30 seconds build into an ordeal. We are in luck with SCA though, as most of the tools bear a minimal overhead so we can integrate as many as possible into a CI build!&lt;/p&gt;

&lt;p&gt;That said, still think wisely about how you are going to implement the toolkit: stuff like CredScan or BinSkim should always be integrated in a CI build. BinSkim slows things down a little bit, but the benefit of that is that every binary vulnerability will be raised immediately rather than after a PR or a merge. It is worth it - you don’t want to spend more time fixing a develop build!&lt;/p&gt;

&lt;p&gt;On the other hand a full-blown malware scan (maybe with a boot sector scan as well), with a large set of artifacts can take a long time and you might not want to run it in a regular run-of-the-mill build. The place where this is mostly needed is towards the final stages, where you are preparing these bits for consumption.&lt;/p&gt;

&lt;p&gt;The &lt;em&gt;Roslyn Analysers&lt;/em&gt; and &lt;em&gt;TSLint&lt;/em&gt; are very much an extension of what you can do in your IDE (more to come on that) and the overhead is similar to a local build - the impact varies massively depending on the rules you decide to apply. It’s a call you make on the balance of things, and you have alternatives like SonarQube that can help swing the decision.&lt;/p&gt;
</description>
        <pubDate>Fri, 01 Nov 2019 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/11/01/when-to-integrate-sca/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/11/01/when-to-integrate-sca/</guid>
      </item>
    
      <item>
        <title>Getting started with Secure Code Analysis</title>
        <description>&lt;p&gt;I recently got in touch with the &lt;a href=&quot;https://secdevtools.azurewebsites.net/&quot;&gt;Microsoft Secure Code Analysis&lt;/a&gt; team as part of my deeper research on DevSecOps practices, and I was astounded by how easy and effective it is to integrate a decent baseline of Continuous Assurance into any pipeline.&lt;/p&gt;

&lt;p&gt;If you want to give it a go &lt;a href=&quot;sdt-vsts@microsoft.com&quot;&gt;send them an email&lt;/a&gt;, they have a two weeks trial you can leverage to evaluate the solution. I strongly encourage you to do so as it is so easy to get it into your existing pipelines!&lt;/p&gt;

&lt;p&gt;Once you get access to the extension it gets really straightforward to implement - you add the extension to your Azure DevOps Services instance and you are good to go. Unfortunately it does not work on-premise.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-10-22_20-52-38.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;These are the tools you can add - with the exception of the Microsoft Security Risk Detection (which requires an account on the MSRD service) everything else is a simple task in the pipeline:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-10-22_20-57-34.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now, a few tips on this: if you want to have full status integration with the pipeline you need to add that &lt;strong&gt;Post Analysis&lt;/strong&gt; task. The tools are designed to use in a non-obtrusive manner, but it is my personal recommendation you start adding that as a success condition. You can even decide which tool to independently use as a success condition:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-10-22_21-08-00.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Let’s take the Credential Scanner as a starting point. It is essential. As a rule of thumb, if you can, you should always have a CredScan in your CI builds. It’s one of these things you should never skip IMHO…
It cannot be any simpler to run. Choose an Output Format and point it at any folder you like - usually the source code directory will do.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-10-22_21-14-43.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If credentials are in your source code (the horror!) the build will eventually fail - and if you upload your output file to a drop folder you will also be able to see where are these!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-10-22_21-16-30.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-10-22_21-17-29.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This is just a taster, in the coming posts we will look at more tools and at a few integration strategies.&lt;/p&gt;
</description>
        <pubDate>Tue, 22 Oct 2019 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/10/22/getting-started-with-sca/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/10/22/getting-started-with-sca/</guid>
      </item>
    
      <item>
        <title>Review - DevOps for the Modern Enterprise</title>
        <description>&lt;p&gt;It’s been a while since my last book review - unfortunately I did not read any work-related book for the last few months, and that dried up a fair bit.&lt;/p&gt;

&lt;p&gt;That said, I just finished Mirco Hering’s &lt;em&gt;DevOps for the Modern Enterprise&lt;/em&gt; and I think it is a great one.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/IMG_20191019_171555.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It’s a very good book for several reasons, but the one that resonates the most with me is that all the mentioned approaches and situations are definitely from the real world: I’ve been through similar scenarios and I am facing some of them even right now.&lt;/p&gt;

&lt;p&gt;Stuff like the use of the &lt;em&gt;strangler pattern&lt;/em&gt; for org-wide applications reviews for example, it’s something that is really tried-and-tested - or on how to manage the relationship with your team (&lt;em&gt;resources&lt;/em&gt;, a term neither of us really get on well with). I am sure anyone in a management position will find benefit from that, and there is also a nice section at the end about the technology trends and aspects that are getting traction these days. It is really a nice all-around view on real world DevOps and Continuous Delivery.&lt;/p&gt;

&lt;p&gt;That said the book goes way beyond the traditional DevOps angle, and Mirco is very good at widening the angle at which he is applying the suggestions. From a technology perspective, the book defines regular patterns you can apply to a variety of situations, and it is very broad in reach so anybody can find something valuable out of these pages. It’s very much a collection of advices coming from real life examples, for the good and the bad. I can really recommend it.&lt;/p&gt;
</description>
        <pubDate>Sat, 19 Oct 2019 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/10/19/review-devops-modern-enterprise/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/10/19/review-devops-modern-enterprise/</guid>
      </item>
    
      <item>
        <title>When to scan what?</title>
        <description>&lt;p&gt;Picking up from my &lt;a href=&quot;https://mattvsts.github.io/2019/09/30/integrate-fortify-in-azure-devops/&quot;&gt;last&lt;/a&gt; post, a question I regularly get after showing these tools is:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Should I apply all of these (&lt;em&gt;tools and practices&lt;/em&gt;) to CI builds and canary releases?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer is clearly not. If you start running code quality checks, SASTs, DASTs, OSS compliance checks SVTs, etc. as part of a CI process these will become ridicously long and the value you &lt;em&gt;think&lt;/em&gt; you are providing will go down the drain, lost in the sea of people screaming because your CI build now takes four hours up from the two minutes it used to.&lt;/p&gt;

&lt;p&gt;Everything clearly has a place and a time.&lt;/p&gt;

&lt;p&gt;There are no-brainers like OSS compliance scans for example - these should happen at every CI build. Doing it so early prevents the risk of adding an old/insecure/non-compliant library and causing issues down the line. Also, the overhead on the build process is minimal - we are talking a couple of minutes tops (from what I’ve seen).&lt;/p&gt;

&lt;p&gt;Secrets detection is another one: you cannot afford to leak a password, access key or whatever other secret these days. It doesn’t need more time spent on it.&lt;/p&gt;

&lt;p&gt;Other things like code quality scans are more nuanced. My approach to these is to have different rulesets for different type of builds. A CI build to develop will have a different (looser) ruleset compared to a full master release. And it makes sense - if you want to merge a large development from develop to master for the first time chances are you focused on certain areas of the enhancement, which while being absolutely good and welcome it might cause issues within master. Different rulesets ensure you don’t get bogged down in making it &lt;em&gt;green&lt;/em&gt; from the beginning, but you can spend time on these refinements closer to the moment you actually need to merge it.&lt;/p&gt;

&lt;p&gt;Infrastructure deserves its own chapter. Security Validation of IaC resources should always be a continuous process, because it is subject to continuous movement. Take IaaS for example. OS patches are enough movement to demand for a continuous process, without mentioning infrastructure vulnerabilities (even at network level). DevOps is simply the entrypoint for this practice - it is imperative to make it an organisational approach.&lt;/p&gt;

&lt;p&gt;If you run Security Validation Tests regularly on your infrastructure, you will find out things that are usually brought up only &lt;em&gt;on demand&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-10-10-17-50-08.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Doing so will not only save you a massive headache, but it will ensure you are going to proactively act on these areas rather than fixing things in a rush as a reactive effort. And this saves money in the longer run. Different security rules and analysis (again) at every step of the way - IaC analysis at build and release time, but then continuous assurance at structural level, as a separate process from the development workstream.&lt;/p&gt;

&lt;p&gt;It is also connected to Security scans - both static and dynamic.&lt;/p&gt;

&lt;p&gt;A SAST (Static Analysis Security Test) is expensive to run - it can take hours to complete a run. A DAST (Dynamic Analysis Security Test) alone might not be enough. Having a structured chain of checks and balances, with different tools, rules and layers along the way from the IDE down to the Production environment is going to make all the difference in the world when it comes to DevOps.&lt;/p&gt;

&lt;p&gt;SASTs should be performed in parallel to all the other testing activities. 
DASTs can be run as part of the performance and reliability testing.&lt;/p&gt;

&lt;p&gt;This mix ensures a good level of agility for delivery (you still need to deliver your value as per DevOps definition!) while balancing it with a strong, 360 degree approach that ensures no stone is - hopefully - left unturned during the journey.&lt;/p&gt;
</description>
        <pubDate>Thu, 10 Oct 2019 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/10/10/when-to-scan-what/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/10/10/when-to-scan-what/</guid>
      </item>
    
      <item>
        <title>Integrate Fortify in Azure DevOps, how easy!</title>
        <description>&lt;p&gt;For my latest session (at &lt;a href=&quot;https://www.winops.org/london/agenda/computersaysno.php&quot;&gt;WinOps 2019&lt;/a&gt;, brilliant conference as usual) I dabbled with some addition to my session on Code Quality and DevSecOps.&lt;/p&gt;

&lt;p&gt;One of these additions was Fortify - a well-known security scanner from Microfocus. I played with their On-Demand offering, and I was amazed at how easy it is to setup. There were a couple of catches I want to mention though.&lt;/p&gt;

&lt;p&gt;Bearing in mind a security scanner in a Pipeline simply sends the code samples to the service, I was expecting it to be smoother to configure. Nothing hard, undocumented or complicated, but there are a couple of things that might require clarification.&lt;/p&gt;

&lt;p&gt;For example, creating a BSI token. A BSI (Build Server Integration) token is something used by Fortify to identify the application and the build server used as a gateway. All is nice and good, but when I tried to configure the token directly from the Azure Pipelines suggested link I only got as far as a login error goes.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-09-30-21-08-52.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-09-30-21-06-54.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;On the other hand, doing the same from the Application Dashboard worked a charm.&lt;/p&gt;

&lt;p&gt;Also, the task itself - don’t expect anything other than a green build if it all goes to plan:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-09-30-21-10-22.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;There is no dashboard integration within the build or any other sign of communication between the two. That said I am not expecting CI builds to include this scanning tool so it might be understandable.&lt;/p&gt;

&lt;p&gt;All in all the tool is very nice though. Something I particularly enjoyed is seeing the level of detail it can go. Let’s take this &lt;em&gt;simple&lt;/em&gt; issue:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-09-30-21-12-51.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Not only you will get a technical explanation with a safe example, you will also get a list of all the best practices and standards (&lt;strong&gt;including GDPR&lt;/strong&gt;) you are violating:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-09-30-21-13-45.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I reckon it is a very valuable information to have in this day and age. Just don’t integrate it in the CI build (but pass it along onto master and develop) as otherwise you won’t be able to appreciate its value.&lt;/p&gt;
</description>
        <pubDate>Mon, 30 Sep 2019 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/09/30/integrate-fortify-in-azure-devops/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/09/30/integrate-fortify-in-azure-devops/</guid>
      </item>
    
      <item>
        <title>Let&apos;s talk about Build retention, shall we?</title>
        <description>&lt;p&gt;Build Retention Policies have always been a contentious thing to talk about: at some point, you need to let go of your old builds.
This post is not about &lt;strong&gt;after how long&lt;/strong&gt;, but to talk about a couple of things to consider which might not be immediate.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/azure/devops/pipelines/policies/retention?view=azure-devops&quot;&gt;Retention policies&lt;/a&gt; are applied at project level:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-09-15-18-58-59.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You have three settings to think about: how long you want to keep your &lt;em&gt;artifacts and attachments&lt;/em&gt;, your &lt;em&gt;runs&lt;/em&gt; and your &lt;em&gt;pull request runs&lt;/em&gt;. A &lt;em&gt;run&lt;/em&gt; is the actual build run, and it overrides both the other settings:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-09-15-19-02-31.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can keep a run for up to two years, but artifacts and attachments will be gone after two months and PR runs after one. This is the topmost setting you can have, and it makes sense at the end of the day: you don’t want to clog your organisation with stuff that is effectively not useful in the longer run. If you want to store your artifacts for more than two months you should publish your artifacts in a proper way (Azure Packages springs to mind…) rather than relying on the build run.&lt;/p&gt;

&lt;p&gt;Then the elephant in the room: &lt;em&gt;how should I version my build runs?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Long story short, you should have a way of easily identify your builds. It can be &lt;a href=&quot;https://gitversion.readthedocs.io/en/latest/&quot;&gt;GitVersion&lt;/a&gt;, it can be &lt;a href=&quot;https://semver.org/&quot;&gt;Semantic Versioning&lt;/a&gt;, it can be something else…but don’t leave them to the standard naming convention as it won’t make your life any easier.&lt;/p&gt;

&lt;p&gt;Do not rely on the $(Rev:r) counter - you need to be in control of your builds, and be able to come back to a certain build if needed. Using $(Rev:r) isn’t a feasible solution in the long run and also, bugs might &lt;a href=&quot;https://developercommunity.visualstudio.com/content/problem/576040/successful-builds-no-longer-retained-so-buildnumbe.html&quot;&gt;hit&lt;/a&gt;. I was affected by this one, and there was no way back.&lt;/p&gt;
</description>
        <pubDate>Sun, 15 Sep 2019 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/09/15/lets-talk-about-build-retention-shall-we/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/09/15/lets-talk-about-build-retention-shall-we/</guid>
      </item>
    
      <item>
        <title>Project-wide flaky test detection</title>
        <description>&lt;p&gt;Azure DevOps is a complex platform and today I found out something quite interesting: &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/devops/pipelines/test/flaky-test-management?view=azure-devops&quot;&gt;system-wide flaky test detection&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A really neat feature indeed - you can configure detection and management of flaky (unreliable) tests so that it does not affect the overall statistics of your code quality analysis.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-09-05-16-33-15.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In my opinion this feature shines when your tests are under development, and they are not yet finalised in your codebase. With it you can have a reliable picture with the stable tests as part of the test reporting side of the build, and these tests under development will be left &lt;em&gt;on the side&lt;/em&gt; to allow for analysis and fixes.&lt;/p&gt;

&lt;p&gt;Of course you have total control over what is recognised as Flaky/UnFlaky, as per this documentation screenshot:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://docs.microsoft.com/en-us/azure/devops/pipelines/test/_img/flaky-test-management/mark-flaky-1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can always change the category and alter the build result.&lt;/p&gt;
</description>
        <pubDate>Thu, 05 Sep 2019 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/09/05/project-wide-flaky-test-detection/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/09/05/project-wide-flaky-test-detection/</guid>
      </item>
    
      <item>
        <title>Hey, my Service Principal expired!</title>
        <description>&lt;p&gt;If you used Azure DevOps long enough, you will eventually run into a situation like this - your Service Principal will expire and throw this error:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-08-19-20-55-34.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-08-19-20-51-22.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Don’t panic if you see this - when you authorise an Azure Resource Manager Service Connection Azure DevOps creates a new App Registration in Azure Active Directory (even if you are using as public tenant like hotmail - you will still get an AAD tenant to use):&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-08-19-20-38-35.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This App Registration has a default expiration of two years:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-08-19-20-39-30.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The error simply means that your Service Principal expired. All you have to do is to renew the Service Principal &lt;strong&gt;from the Azure DevOps UI&lt;/strong&gt; and you will be good to go. Don’t renew it from the Portal, as otherwise Azure DevOps won’t know how to handle the secret!&lt;/p&gt;
</description>
        <pubDate>Mon, 19 Aug 2019 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/08/19/hey-my-service-principal-expired/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/08/19/hey-my-service-principal-expired/</guid>
      </item>
    
      <item>
        <title>Challenges of creating an internal sharing model with Azure DevOps</title>
        <description>&lt;p&gt;Azure DevOps is a brilliant platform with a flexibility second to none, so it comes fairly natural to try and push its boundaries more and more when you start experimenting with its feature.&lt;/p&gt;

&lt;p&gt;A very interesting problem came up in the last couple of weeks:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I am trying to create an internal sharing model (also known as &lt;em&gt;Inner Source&lt;/em&gt;) within our Azure DevOps organisation, but I am stuck on the visibility front. How can I make sure that users of different, segregated projects all get access to the same, shared project?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is an interesting situation indeed. And guess what, it all boils down to a couple of points.&lt;/p&gt;

&lt;p&gt;Looking at the individual services, everything looks so easy - the easiest to tackle is Azure Pipelines - cross-Team Project consumption is trivial to setup, so that is definitely off the problems’ list.&lt;/p&gt;

&lt;p&gt;Azure Repos itself, not an issue - it is a Git repository after all, and features like &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/devops/repos/git/forks?view=azure-devops&amp;amp;tabs=visual-studio&quot;&gt;Forks&lt;/a&gt; make this a very valuable component. Each user will be able to fork from/to the shared set of repositories in a completely transparent way.&lt;/p&gt;

&lt;p&gt;Azure Test Plans…nothing to mention, really.&lt;/p&gt;

&lt;p&gt;Azure Boards has got an interesting challenge, which highlights the most complex problem you will face in this exercise: you cannot re-use existing Project Groups nested into different Groups.
This throws a massive spanner in the works, as if you are creating an Inner Source model you don’t want to handle permissions at a granular level, but you want as much inheritance as possible when it comes to accounts. It doesn’t make sense to authorise a user directly, expecially if you have a large organisation - the management overhead becomes quickly too much to handle.&lt;/p&gt;

&lt;p&gt;You also cannot take the shortcut of leveraging the &lt;strong&gt;Project Collection Valid Users&lt;/strong&gt; group - that is locked down, and unless you start fiddling with &lt;em&gt;tfssecurity.exe&lt;/em&gt;. You can do that, but what stops me (and should stop you) is that you are forcing a group you are not supposed to use. It can work, it works, but from a supportability point of view it can become a risk - and if you have a very large organisation I am not sure it is the best way forward.&lt;/p&gt;

&lt;p&gt;So, what are we left with? Aside from adding users directly (again, no!), if the organisation is setup in a smart way you will likely have your AAD synchronised with an on-premise Active Directory forest. That means your AD groups can be leveraged in Azure DevOps, and the users contained in there will inherit the access permissions.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-08-10-12-27-05.png&quot; alt=&quot;Permissions&quot; /&gt;&lt;/p&gt;

&lt;p&gt;With that in mind, you can build your Inner Source security model around AD groups (which should already control user access, as Active Directory - or any other directory service for this matter - should be the main way of handling access) mapped to Azure DevOps prather than directly into the Team Project, and then assign the group(s) to the Inner Source project.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-08-10-12-31-02.png&quot; alt=&quot;add&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Of course it is not something you will do for every organisation. If you have small organisations you might accept managing the users. If you are using a single Team Project, you don’t have this problem at all. As usual, the real world is the most varied of the demo scenarios, there is no one-size-fits-all solution.&lt;/p&gt;
</description>
        <pubDate>Sat, 10 Aug 2019 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/08/10/challenges-of-creating-an-internal-sharing-model-with-azure-devops/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/08/10/challenges-of-creating-an-internal-sharing-model-with-azure-devops/</guid>
      </item>
    
      <item>
        <title>What is the difference between Usage and Auditing in Azure DevOps?</title>
        <description>&lt;p&gt;The Azure DevOps team released a new &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/devops/organizations/settings/azure-devops-auditing?view=azure-devops&quot;&gt;Auditing&lt;/a&gt; feature a couple of days ago, and then a question immediately sprung up: what is the difference between Auditing (the new feature) and Usage?&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/azure/devops/integrate/concepts/rate-limits?view=azure-devops&quot;&gt;Usage&lt;/a&gt; is pretty much the old Operational Intelligence brought into a new UI and into the Cloud operating model: it is mostly about service health, and from there you can only get a live snapshot of what is going on. Data is flushed after 14 days and lists every call to the APIs. It can be used as an auditing tool, but it is not meant as such - you need to spend time filtering the log and extracting the information you need to get to a point where you can use that data for an audit. I &lt;a href=&quot;https://mattvsts.github.io/2014/03/02/how-to-perform-tfs-security-audit/&quot;&gt;blogged&lt;/a&gt; about &lt;a href=&quot;https://mattvsts.github.io/2014/07/07/tfs-audits-how-to-create-reports-on/&quot;&gt;this&lt;/a&gt; in the past.&lt;/p&gt;

&lt;p&gt;Auditing is much more - it is a centralised place for &lt;strong&gt;events&lt;/strong&gt; raised in Azure DevOps. An event is an access policy change, a Team Project creation or deletion, extension installation or update, etc. It provides a much different view over what happens to the service, and it is tailored down the needs of a real auditing process - it means no more fiddling with the log, no more overhead to extract the data you need.&lt;/p&gt;

&lt;p&gt;The feature is currently under development, and it is going to receive interesting developments like &lt;a href=&quot;https://dev.azure.com/mseng/AzureDevOpsRoadmap/_workitems/edit/1565788/&quot;&gt;this one&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Sun, 28 Jul 2019 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/07/28/what-is-the-difference-between-usage-and-auditing-in-azure-devops/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/07/28/what-is-the-difference-between-usage-and-auditing-in-azure-devops/</guid>
      </item>
    
      <item>
        <title>Why are you not using conditions?</title>
        <description>&lt;p&gt;All technology tools and platforms have some feature which, for one reason or another, are less known and used compared to others. 
More often than not, &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/devops/pipelines/process/conditions?view=azure-devops&amp;amp;tabs=yaml&quot;&gt;Conditions&lt;/a&gt; in Azure Pipelines fall within this category.&lt;/p&gt;

&lt;p&gt;Out of ten Pipelines I see on any given day, at least eight will have everything chucked in a single Job. It is definitely not an optimal way of doing things.&lt;/p&gt;

&lt;p&gt;Aside from the fact that Jobs are there for a reason (I might talk about this next time around) what shocks me the most is that people will come with the most convoluted ways to achieve what is effectively a trival goal given the right tools.&lt;/p&gt;

&lt;p&gt;For example, let’s pick up an extremely common, simple yet very hard example: a database backup to run before running the pipeline.&lt;/p&gt;

&lt;p&gt;Yes, if the database is a reasonable size it can be embedded somewhere. But what if it isn’t?
In that case, you should think long and hard about it. How long will it take? Are you going to slow down your releases? Shall we start adding an extra stage before just for that?&lt;/p&gt;

&lt;p&gt;Stop you there for a second. Do you need to run a backup &lt;strong&gt;every time&lt;/strong&gt;? That alone is an answer that shapes the pipeline design. 
If not, then you need a Job that runs the backup &lt;strong&gt;only under certain conditions&lt;/strong&gt;. Conditions &lt;strong&gt;you&lt;/strong&gt; control.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-07-20-10-51-02.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;So, the database backup should not run by default, but it needs to be controlled when releasing. Easy peasy - first of all, create a scoped variable for each stage where this applies:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-07-20-10-52-06.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This variable controls our Job. Then the job needs to be configured to look for the value and act accordingly.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-07-20-10-54-19.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;That’s literally it. Set the variable when triggering the release, and you are set:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-07-20-10-55-12.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/2019-07-20-10-55-49.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Features are there, documentation is plentiful, use them! :-)&lt;/p&gt;
</description>
        <pubDate>Sat, 20 Jul 2019 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/07/20/why-are-you-not-using-conditions/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/07/20/why-are-you-not-using-conditions/</guid>
      </item>
    
      <item>
        <title>How to implement rollback strategies in Azure Pipelines</title>
        <description>&lt;p&gt;Sometimes simple things seem really hard - rollback strategies seem to end up in this category!&lt;/p&gt;

&lt;p&gt;Let’s make things simple: each and every release pipeline you create can have multiple jobs, and each job can have its own execution condition.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20190705.1.png&quot; alt=&quot;Run&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This means you should have, at a minimum, one job for your deployment and one for your rollback &lt;strong&gt;if something goes wrong&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20190705.2.png&quot; alt=&quot;Jobs&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The Rollback job will have this execution condition:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20190705.3.png&quot; alt=&quot;Condition&quot; /&gt;&lt;/p&gt;

&lt;p&gt;There you can run everything you need to restore your target stage - drop a database and restore it from a backup for example, together with an artifact rollback. Do not use a separate stage for this, as it creates confusion and potentially problems. Always add a rollback job at the end for this purpose.&lt;/p&gt;

&lt;p&gt;And eventually, this is clearly true for both cloud and on-premise scenarios - there is nothing stopping you from doing this regardless of the target location. 
In case of an on-premise deployment you would use a Deployment Group job rather than an Agent job, that is the only difference.&lt;/p&gt;
</description>
        <pubDate>Sun, 07 Jul 2019 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/07/07/how-to-implement-rollback-strategies-in-azure-pipelines/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/07/07/how-to-implement-rollback-strategies-in-azure-pipelines/</guid>
      </item>
    
      <item>
        <title>Ten years of MVP Award</title>
        <description>&lt;p&gt;Today is an important day. Today is Renewal Day for a sizeable amount of the Microsoft MVP population, and I &lt;a href=&quot;https://mvp.microsoft.com/en-us/PublicProfile/4027206?fullName=Matteo%20Emili&quot;&gt;was renewed&lt;/a&gt; as well for the 10th year in a row.&lt;/p&gt;

&lt;p&gt;Ten years is a very long time…why do I keep doing everything I do (which eventually can bring to the Award, but never the other way around)? Because I love it.&lt;/p&gt;

&lt;p&gt;I love running a &lt;a href=&quot;https://www.meetup.com/London-Microsoft-DevOps/&quot;&gt;Meetup&lt;/a&gt;, despite massive drop rates and a perennial struggle for attendance. I just organised &lt;a href=&quot;https://mattvsts.github.io/2019/06/16/postmortem-of-the-global-devops-bootcamp-2019/&quot;&gt;Global DevOps Bootcamp 2019&lt;/a&gt; in London, which was a huge experience. I just love meeting people and listening to their experience while sharing mine, over the years I became friends with a huge amount of people, and being an MVP became an enriching experience at a deeply personal level.&lt;/p&gt;

&lt;p&gt;I am a founding member of &lt;a href=&quot;https://www.domusdotnet.org/&quot;&gt;several&lt;/a&gt; &lt;a href=&quot;https://www.meetup.com/Taunton-and-area-Developers-Meetup/&quot;&gt;other&lt;/a&gt; &lt;a href=&quot;http://www.getlatestversion.it/&quot;&gt;communities&lt;/a&gt; all over Europe, and I travel at my own expense (except if the conference has paid for tickets!) to speak anywhere I can find a stage, large or small. I do it because I believe that sharing is the cornerstone of cultural growth, and I try to venture in new territories whenever possible. It is also an excellent excuse to travel and visit new places :-)&lt;/p&gt;

&lt;p&gt;I started my first few &lt;a href=&quot;https://github.com/mattvsts&quot;&gt;open-source contributions&lt;/a&gt; this year, and I hope I will pick them up again whenever I have time. I have a huge mountain to climb in that regard, but I am not giving up on that…it is still part of the sharing concept above.&lt;/p&gt;

&lt;p&gt;All in all, it’s been a fantastic ride. Let’s turn this corner, and keep going.&lt;/p&gt;
</description>
        <pubDate>Mon, 01 Jul 2019 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/07/01/ten-years-of-mvp-award/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/07/01/ten-years-of-mvp-award/</guid>
      </item>
    
      <item>
        <title>Remember the power of an Agent</title>
        <description>&lt;p&gt;This post stems from a discussion I had a few days ago: sometimes we just forget how powerful having an Agent on a target system can be.&lt;/p&gt;

&lt;p&gt;The example in case is for a well known financial product, which usually runs in a network isolated from the internet and with very limited access from operators. You want a degree of controlled access without resorting to complex solutions (AAD Conditional Access, etc.) or products because of other limitations. You cannot leverage Azure Automation as well with its Hybrid Runbook Worker because of the non-existent internet access. What’s left?&lt;/p&gt;

&lt;p&gt;Enter Azure DevOps Server in this scenario. Once you install an Azure Pipelines agent on the target machines you have an easy way of leveraging all sorts of automations (including custom scripts if you &lt;strong&gt;really&lt;/strong&gt; need them!) in a tightly controlled fashion. Once the permissions are clearly locked down (and approvals are in place at every required stage) you can use the linked Git repositories or TFVC paths to drop whatever you need on the targets, automate routine tasks, perform scheduled operations.&lt;/p&gt;

&lt;p&gt;You get the authentication layer for free, courtesy of Active Directory. You get an integrated artifact funnel thanks to either Repos or Artifacts. You get several out-of-the-box ways of performing automated tasks and you get an orchestrator to coordinate these tasks.&lt;/p&gt;

&lt;p&gt;If you think about it from a non-technical point of view, how much effort would it take to build up something like that from scratch or integrate a number of different technologies to do all of the above? A lot, I reckon. Which is why one should never forget &lt;em&gt;the power of an Agent&lt;/em&gt; :-)&lt;/p&gt;
</description>
        <pubDate>Sun, 30 Jun 2019 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/06/30/remember-the-power-of-an-agent/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/06/30/remember-the-power-of-an-agent/</guid>
      </item>
    
      <item>
        <title>Postmortem of the Global DevOps Bootcamp 2019</title>
        <description>&lt;p&gt;This year I hosted the &lt;a href=&quot;https://globaldevopsbootcamp.com/&quot;&gt;Global DevOps Bootcamp 2019&lt;/a&gt; for London, and the theme of the event was &lt;em&gt;You Build It, You Run It!&lt;/em&gt; - so it’s time for a postmortem!&lt;/p&gt;

&lt;p&gt;It was a wrap-up of several months of preparation, not only from myself but also from the central organisation team. The effort they put in was really remarkable, and I don’t think we would have gone anywhere without their support. What they did was really outstanding, not only from a technology standpoint but also on the &lt;em&gt;operations&lt;/em&gt; side - I never saw anything being that smooth from top to bottom.&lt;/p&gt;

&lt;p&gt;The event itself went really well: six teams were extremely engaged with the challenges and they spent the whole day in the awesome Microsoft Reactor:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://pbs.twimg.com/media/D9GIuxfVAAAIgAJ.jpg&quot; alt=&quot;Teams&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The whole premise of the workshop was about maintaining a production website (Parts Unlimited!) up and running so that sales could keep coming in - that was a brilliant way of keeping people on their toes, with each team using a different approach to maintain it up as much as possible. The clear takeaway here was about acting with pro-activity: many of the problems introduced during the challenges could have been prevented by implementing pro-active strategies like monitoring, alerting or other pre-emptive actions in general.&lt;/p&gt;

&lt;p&gt;The most recurring feedback was to get the challenges available as either documentation or samples after the event, something that I believe it is going to happen down the line.&lt;/p&gt;

&lt;p&gt;In terms of what did not go well, unfortunately it’s all about the drop rate and the no-shows. I managed to send back pretty much of the no-longer-needed lunchboxes so I could minimise waste, but as of today I still cannot get my head around how it is possible being unable to cancel the participation to a free event as soon as you are aware of another commitment (and despite reminders!). It doesn’t take much after all, and it hurts future possibilities of organising similar events. One of the attendees told me that his friends gave up on rocking up on the day because of the sold-out capacity, which we were nowhere near on the day.&lt;/p&gt;

&lt;p&gt;Regardless, I loved hosting the event and I am surely looking forward to hosting next year’s as well at the &lt;a href=&quot;https://www.meetup.com/London-Microsoft-DevOps/&quot;&gt;London Microsoft DevOps Meetup&lt;/a&gt;!&lt;/p&gt;
</description>
        <pubDate>Sun, 16 Jun 2019 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/06/16/postmortem-of-the-global-devops-bootcamp-2019/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/06/16/postmortem-of-the-global-devops-bootcamp-2019/</guid>
      </item>
    
      <item>
        <title>Review - Azure DevOps Server 2019 Cookbook</title>
        <description>&lt;p&gt;More than ten years ago I was at the beginning of my career, and I bought a book - “Team Foundation Server 2008 in action”. That book was a cornerstone in cementing my future as an ALM and then DevOps expert, and it was massively different compared to the vast majority of other books available at that time because of its setting: a series of targeted examples, easy to implement and with reachable value. I loved that book, and I never gave it away - I still rock it in my personal library together with many others.&lt;/p&gt;

&lt;p&gt;Fast forward a good twelve years later, you can imagine that when my colleagues &lt;a href=&quot;https://www.visualstudiogeeks.com/&quot;&gt;Tarun Arora and Utkarsh Shigihalli&lt;/a&gt; told me they wrote a new edition of their Cookbook on &lt;del&gt;Team Foundation&lt;/del&gt; Azure DevOps Server me buying it was simply a natural consequence. As you can see from the post history, it’s been a while since I blogged a review - for good reason. I did not stop reading, I simply did not find an extremely good book to talk about, and I did not want to have another outlet for moaning about things :-)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20190605.1.jpg&quot; alt=&quot;Book&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This one is different. I feel long gone are the days of both extremely detailed, deep dive books and shallow, introductive texts. The former have been replaced by on-demand trainings, the latter by videos and blogposts. These days you don’t find a middle ground that often. This book is that middle ground.&lt;/p&gt;

&lt;p&gt;With this book you will have a number of recipes you will be able to implement in a very simple and straightforward way, with immediate impact across teams and organisations. Do you want to do stuff with Git hooks? Chapter 2. Integrate SpecFlow in your pipelines? Chapter 5.&lt;/p&gt;

&lt;p&gt;Easy, and handy. I loved it.&lt;/p&gt;
</description>
        <pubDate>Wed, 05 Jun 2019 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/06/05/review-azure-devops-server-2019-cookbook/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/06/05/review-azure-devops-server-2019-cookbook/</guid>
      </item>
    
      <item>
        <title>How to move your Release Definitions to YAML today!</title>
        <description>&lt;p&gt;You might have got it - I am very, very keen on YAML Build and Release Pipelines, because they unleash the power of a full-fledged orchestrator in a single format: YAML files.&lt;/p&gt;

&lt;p&gt;A friend of mine is very excited about them, but he is puzzled by the fact that the Environments page only shows Kubernetes resources. While there is clearly a focus on Kubernetes, this does not mean that you can only use multi-stage CI/CD definitions with it. You can definitely convert your existing pipelines, targeting your current applications!&lt;/p&gt;

&lt;p&gt;Let’s take a simple example: a Build Definition that creates a MSDeploy package and a Release Definition that consumes the Build Artifacts and deploys an ARM template and the aforementioned package. You surely saw some tutorial or example on how to achieve this in UI-based (a.k.a. Designer, Classic, etc.) Pipelines, but how to do the same with YAML?&lt;/p&gt;

&lt;p&gt;First of all, this is all contained in a file - I am simply going to look at different portions at different times. You can also split them, but for the sake of simplicity I am going to use the whole file as a baseline.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;stages:
  - stage: Build
    jobs:
    - job: Build
      pool: 
        vmImage: &apos;vs2017-win2016&apos;
      steps:
      - task: NuGetInstaller@0
        displayName: &apos;NuGet restore&apos;
        inputs:
          solution: &apos;**\*.sln&apos;

      - task: VSBuild@1
        displayName: &apos;Build solution&apos;
        inputs:
          vsVersion: 15.0
          msbuildArgs: &apos;/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation=&quot;$(build.stagingDirectory)&quot; /p:IncludeServerNameInBuildInfo=True /p:GenerateBuildInfoConfigFile=true /p:BuildSymbolStorePath=&quot;$(SymbolPath)&quot; /p:ReferencePath=&quot;C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\Extensions\Microsoft\Pex&quot;&apos;
          platform: &apos;x86&apos;
          configuration: &apos;Release&apos;

      - task: CopyFiles@1
        displayName: &apos;Copy Files&apos;
        inputs:
          SourceFolder: &apos;$(build.stagingDirectory)&apos;
          Contents: &apos;**/*.zip&apos;
          TargetFolder: &apos;$(build.artifactstagingdirectory)&apos;
      - task: CopyFiles@2
        displayName: &apos;Copy Files&apos;
        inputs:
          SourceFolder: &apos;$(build.sourcesdirectory)&apos;
          Contents: &apos;**/*.json&apos;
          TargetFolder: &apos;$(build.artifactstagingdirectory)&apos;

      - task: PublishPipelineArtifact@0
        displayName: &apos;Publish Pipeline Artifact&apos;
        inputs:
          artifactName: &apos;drop&apos;
          targetPath: &apos;$(build.artifactstagingdirectory)&apos;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is our Build stage. Nothing too fancy - we use a Windows Server 2016 with Visual Studio 2017 Agent VM provided by the &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/hosted?view=azure-devops&quot;&gt;Microsoft Hosted Build Pool&lt;/a&gt;, and there we run the usual suspects: NuGet restore, Visual Studio Build, Copy two types of artifacts in the Artifacts Staging Directory and then we use the new &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/devops/pipelines/artifacts/pipeline-artifacts?view=azure-devops&amp;amp;tabs=yaml&quot;&gt;Publish Pipeline Artifact&lt;/a&gt; to publish the drop folder. This new task is made with YAML Pipelines in mind, and it is definitely the recommended one to use.&lt;/p&gt;

&lt;p&gt;Now you need to consume the Artifacts. You can do this in the Deployment stage:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  - stage: Deploy
    jobs:
    - deployment: DeployWeb
      pool:
        vmImage: &apos;vs2017-win2016&apos;
      environment: &apos;target&apos;
      strategy:
        runOnce:
          deploy:
            steps:
            - task: DownloadPipelineArtifact@0
              inputs:
              artifactName: &apos;drop&apos;
              targetPath: $(System.DefaultWorkingDirectory)
            - task: AzureResourceGroupDeployment@2
              inputs:
                azureSubscription: &apos;ACME Azure&apos;
                action: &apos;Create Or Update Resource Group&apos;
                resourceGroupName: &apos;Demo&apos;
                location: &apos;West Europe&apos;
                templateLocation: &apos;Linked artifact&apos;
                csmFile: &apos;**/FullEnvironmentSetupMerged.json&apos;
                csmParametersFile: &apos;**/FullEnvironmentSetupMerged.param.json&apos;
                overrideParameters: &apos;-WebsiteName PULE2E -PUL_ServerName PULE2EServer  -PUL_HostingPlanName PULE2EHP
                deploymentMode: &apos;Incremental&apos;

              ...other stuff to deploy database and web server...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The cool part here is that you can use the same file, and the same language to perform the operations you are accustomed to. If you (like me!) need help with the YAML syntax, use the &lt;a href=&quot;https://mattvsts.github.io/2019/04/11/do-you-want-to-move-to-yaml-pipelines/&quot;&gt;YAML Assistant&lt;/a&gt; and it will take a mere five minutes to get to the results you need.&lt;/p&gt;

&lt;p&gt;The graphical result you can see in the whole run is this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20190523.1.png&quot; alt=&quot;UI&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In this case, it is going to be only two stages. Needless to say that if you have more, you will have more (hopefully green!) boxes. And if you need them, you can also have multiple jobs within a single stage. It’s all about what you put in the YAML definition. This is an example with three stages, one job each:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  - stage: Deploy1
    jobs:
    - deployment: DeployWeb1
      pool:
        vmImage: &apos;vs2017-win2016&apos;
      environment: &apos;target1&apos;
...
  - stage: Deploy2
    jobs:
    - deployment: DeployWeb2
      pool:
        vmImage: &apos;vs2017-win2016&apos;
      environment: &apos;target2&apos;
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20190523.5.png&quot; alt=&quot;ThreeStages&quot; /&gt;&lt;/p&gt;
</description>
        <pubDate>Thu, 23 May 2019 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/05/23/how-to-move-your-release-definitions-to-yaml-today/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/05/23/how-to-move-your-release-definitions-to-yaml-today/</guid>
      </item>
    
      <item>
        <title>How YAML pipelines change the whole CI/CD story</title>
        <description>&lt;p&gt;At Build the Azure DevOps team &lt;a href=&quot;https://devblogs.microsoft.com/devops/whats-new-with-azure-pipelines/&quot;&gt;announced&lt;/a&gt; YAML pipelines for the deployment side of the story.
I am very excited, because I believe this changes the whole CI/CD proposition not just for Azure DevOps as a platform but in a broader sense.&lt;/p&gt;

&lt;p&gt;For years, I’ve been talking around at conferences and meetups about the fact that in a true DevOps world we only have to deal with packages (coming out of builds) and orchestrators (handling deployments). 
The whole concept of Build or Release Definition has been slowly merging, and now we are at a stage where we can see a truly unified orchestration story.&lt;/p&gt;

&lt;p&gt;So, if in the past you were used to this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20190510.1.png&quot; alt=&quot;old&quot; /&gt;&lt;/p&gt;

&lt;p&gt;now you need to get used to this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20190510.2.png&quot; alt=&quot;new&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The fact is - the division is going away. It was already close to non-existent before with the task-based model, but now it is completely gone.
To take advantage of this, all you need to do is structuring your yml pipeline as follows:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;stages:
- stage: Build
  jobs:
  - job: Build
    pool:
      vmImage: &apos;Ubuntu-16.04&apos;
    continueOnError: true
    steps:
        ...
- stage: Deploy
  jobs:
  - deployment: DeployWeb
    pool:
      vmImage: &apos;Ubuntu-16.04&apos;
    environment: &apos;target&apos;
    strategy:
      runOnce:
        deploy:
          steps:
            ...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The actual result of this pipeline is two stages: one dedicated to the build and the other one targeting a release:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20190510.3.png&quot; alt=&quot;pipeline&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And the two jobs reported in the matching stage:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20190510.4.png&quot; alt=&quot;jobs&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Of course the example is very simple and does not cover all the possible scenarios, but what this means is that you have an end-to-end pipeline definition from build to release - in different phases, defined by the type of activity you need to perform.&lt;/p&gt;

&lt;p&gt;In a real-world situation, one of the things you can do is to split the Build and Release portion of the definition with templates, and pick it up from there. 
Then the orchestrator will instantiate whatever is needed by leveraging parameters, and you will not only get consistency but also the ability of re-using loads of work in a series of standard components.&lt;/p&gt;
</description>
        <pubDate>Fri, 10 May 2019 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/05/10/how-yaml-pipelines-change-the-whole-ci-cd-story/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/05/10/how-yaml-pipelines-change-the-whole-ci-cd-story/</guid>
      </item>
    
      <item>
        <title>Solving the looping problem in Azure DevOps Pipelines</title>
        <description>&lt;p&gt;What should you do if you want to have a Pipelines job that loops based on dynamic inputs?
Working around this problem has always been a pet peeve of mine - luckily today we’ve got options! Three in total to be precise, with different degree of difficulty.&lt;/p&gt;

&lt;p&gt;One of them is the simplest and has been around for ages: embed what you need to do in a script. Try to split the problem down to the lowest common denominator, and run the script.
I just did this in a situation where we needed to run a non-predictable number of SonarQube scans as part of a CI build. We had the whole codebase in the branch (because reasons…), and based off the standard folder structure used by the projects I put together a script that runs the SonarQube scanner based on the number of plugins changed in a certain commit.&lt;/p&gt;

&lt;p&gt;If you think about that, it’s a very basic challenge. The &lt;em&gt;problem&lt;/em&gt; (I don’t even want to call it as such, but still a challenge regardless) is that there is no built-in facility for such a concept, hence I had to improvise.&lt;/p&gt;

&lt;p&gt;The second one is using a build definition to be used as a template. You can trigger a dynamic number of these from another build (with a REST API call) that acts as orchestrator. This is slightly harder, but it allows for the GUI-based definitions to be used as templates so you can re-use what you have and you know already.&lt;/p&gt;

&lt;p&gt;The third (and better) way of doing so comes with the YAML pipelines: the &lt;a href=&quot;https://github.com/Microsoft/azure-pipelines-yaml/blob/master/design/each-expression.md&quot;&gt;&lt;em&gt;each&lt;/em&gt;&lt;/a&gt; expression.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Each&lt;/em&gt; in YAML is equivalent to a for loop. So you can create a template which will have a set of actions, and pass parameters across during your build. YAML is looser than a GUI-based build definition IMHO, so it allows for something like this:&lt;/p&gt;

&lt;p&gt;template.yml:
&lt;img src=&quot;/images/posts/20190504.2.png&quot; alt=&quot;template&quot; /&gt;&lt;/p&gt;

&lt;p&gt;azure-pipelines.yml:
&lt;img src=&quot;/images/posts/20190504.1.png&quot; alt=&quot;pipeline&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Doing this will create two inline script task totally on the fly:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/20190504.3.png&quot; alt=&quot;result&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It is a very elegant solution that solves the looping problem in the first place, but of course it has a steeper learning curve.&lt;/p&gt;

&lt;p&gt;Regardless of what you choose, the flexibility of the platform is at such a level that anybody can find the solution which fits best given a problem. And it was good fun exploring them throughout :-)&lt;/p&gt;
</description>
        <pubDate>Sat, 04 May 2019 00:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/05/04/solving-the-looping-problem-in-Azure-DevOps-Pipelines/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/05/04/solving-the-looping-problem-in-Azure-DevOps-Pipelines/</guid>
      </item>
    
      <item>
        <title>Make your life easier with Group Rules in Azure DevOps Services</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;This is something that comes in very handy - licence management isn&apos;t the simplest thing to implement and police. There is always someone who is going to try and sneak around the process in place, in order to &lt;i&gt;quickly&amp;nbsp;&lt;/i&gt;get access.&lt;br /&gt;&lt;br /&gt;Group rules make this really simple. It&apos;s basically a templating model applied to the Azure DevOps licensing system:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-8YifT3JGi_s/XL31lwbdqmI/AAAAAAAAFeQ/4BnUWx8XQNEh_MUGKKbT9Y4mxZbyfQnTACLcBGAs/s1600/group.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;565&quot; data-original-width=&quot;480&quot; src=&quot;https://2.bp.blogspot.com/-8YifT3JGi_s/XL31lwbdqmI/AAAAAAAAFeQ/4BnUWx8XQNEh_MUGKKbT9Y4mxZbyfQnTACLcBGAs/s1600/group.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In the example above, I created a rule for a fictitious Workshop - all my users will have a Basic licence (as they might not be Visual Studio subscribers) but they will be automatically added to the Project Administrators group.&lt;br /&gt;&lt;br /&gt;This might feel simplicistic, but you can add as many projects as you like in a rule. Which means that creating these will help shape the organisation&apos;s management, especially in large companies - you can have Visual Studio subscribers automatically added to all projects, and Basic subscribers (which might be contractors for example) scoped to business unit (where costs are usually accounted for and split) for example.&lt;br /&gt;&lt;br /&gt;If you are an Organisation Administrator, this will save you plenty of time 😁&lt;/div&gt;</description>
        <pubDate>Mon, 22 Apr 2019 17:12:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/04/22/make-your-life-easier-with-group-rules/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/04/22/make-your-life-easier-with-group-rules/</guid>
      </item>
    
      <item>
        <title>Do you want to move to YAML pipelines? Here is how I would do it.</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;YAML pipelines can be daunty, no question about this - especially if you come from a background where you come from a nice UI like the one for Build Pipelines to a plain text file describing the Pipeline itself.&lt;br /&gt;&lt;br /&gt;Well, I feel it is daunty anyway :-)&lt;br /&gt;&lt;br /&gt;But in a process of continuous improvement I am prone to leave the comfort zone to experiment, and this is how I feel after approaching YAML pipeline. It&apos;s a bit like Git, if you like...&lt;br /&gt;&lt;br /&gt;So, first of all don&apos;t try to mix and match the two - always start afresh. It is double the effort to try to apply something like this in a brownfield situation. Be confident with it first, and then apply it to something else.&lt;br /&gt;&lt;br /&gt;Once you remember that the file needs to be named &lt;i&gt;azure-pipelines.yml...&lt;/i&gt;my best friend in this process is the &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema&quot;&gt;YAML schema reference&lt;/a&gt;, it contains lots of useful examples to help you structure the pipeline and it contains the references to Bash, Script and PowerShell so you are not completely lost when you approach the &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/index?view=azure-devops&quot;&gt;task catalogue&lt;/a&gt;.&lt;br /&gt;The documentation is now YAML-first, so it is going to be easy to follow. Start by replicating a simple .NET Framework build from the UI with YAML. Then try again with a small variation. You will quickly get the grip with it.&lt;br /&gt;&lt;br /&gt;But it is long and tedious and time consuming. Which is why Microsoft decided to create the YAML assistant, a brilliant feature that merges YAML pipelines and the old UI-based designed.&lt;br /&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-Fcl8gX9B-A8/XK-C0CCgU7I/AAAAAAAAFdc/QafAL0p3ibo1xNHc1heKjwrwJnPokIgVACLcBGAs/s1600/yaml0.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;194&quot; data-original-width=&quot;152&quot; src=&quot;https://4.bp.blogspot.com/-Fcl8gX9B-A8/XK-C0CCgU7I/AAAAAAAAFdc/QafAL0p3ibo1xNHc1heKjwrwJnPokIgVACLcBGAs/s1600/yaml0.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If you need to add a task and you are not sure on what to do, show the assistant and select the task from there:&lt;br /&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-jYxCDzQzTOs/XK-C0HlkFcI/AAAAAAAAFdY/BcMKGhaIMAETee13ps5kD1GvjEgTb0xMgCLcBGAs/s1600/yaml1.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;493&quot; data-original-width=&quot;362&quot; src=&quot;https://2.bp.blogspot.com/-jYxCDzQzTOs/XK-C0HlkFcI/AAAAAAAAFdY/BcMKGhaIMAETee13ps5kD1GvjEgTb0xMgCLcBGAs/s1600/yaml1.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And you will be able to fill all the parameters like you would in a UI-based pipeline:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-BdXIBdHQbTQ/XK-C0DS2vjI/AAAAAAAAFdg/KeK_IfE7WwgZyCh5UU40XvPzyDaSWPWIgCLcBGAs/s1600/yaml2.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;767&quot; data-original-width=&quot;357&quot; src=&quot;https://4.bp.blogspot.com/-BdXIBdHQbTQ/XK-C0DS2vjI/AAAAAAAAFdg/KeK_IfE7WwgZyCh5UU40XvPzyDaSWPWIgCLcBGAs/s1600/yaml2.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Once this is done, add it to the pipeline and you are done with it:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-8u2C1JJWQJk/XK-C0zoYHrI/AAAAAAAAFdk/0qaQMSfVyPcBXPiF25f-kGhKPJ0AeCuGwCLcBGAs/s1600/yaml3.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;135&quot; data-original-width=&quot;287&quot; src=&quot;https://2.bp.blogspot.com/-8u2C1JJWQJk/XK-C0zoYHrI/AAAAAAAAFdk/0qaQMSfVyPcBXPiF25f-kGhKPJ0AeCuGwCLcBGAs/s1600/yaml3.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This is a very smart way of handling this, and over time you will find yourself going more and more to it.&lt;/div&gt;</description>
        <pubDate>Thu, 11 Apr 2019 19:42:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/04/11/do-you-want-to-move-to-yaml-pipelines/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/04/11/do-you-want-to-move-to-yaml-pipelines/</guid>
      </item>
    
      <item>
        <title>Use Azure DevOps Release Gates to check for website availability and automate stage flows</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Modern deployment patterns rely on automation, everywhere. A common request in this space is to automatically verify if a web resource is up and running before proceeding with the deployment.&lt;br /&gt;&lt;br /&gt;Instead of having a script that runs within a Stage, why not leveraging Release Gates? At the end of the day they are designed with automation in mind.&lt;br /&gt;&lt;br /&gt;To make this example generic enough, I created an Azure Function (&lt;a href=&quot;https://github.com/MattVSTS/AvailabilityFunction&quot;&gt;code here&lt;/a&gt;) based off the HttpTrigger sample that checks for a URL availability. If the code is not 4xx or 5xx it returns a simple JSON output:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-juyhg2OjbPc/XJIQawCKVOI/AAAAAAAAFc0/O5Evs1UmLvMslQ1rLzECo0QwNnfhUErdwCLcBGAs/s1600/function4.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;897&quot; data-original-width=&quot;879&quot; height=&quot;640&quot; src=&quot;https://3.bp.blogspot.com/-juyhg2OjbPc/XJIQawCKVOI/AAAAAAAAFc0/O5Evs1UmLvMslQ1rLzECo0QwNnfhUErdwCLcBGAs/s640/function4.png&quot; width=&quot;626&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It is not the coolest or cleanest code, but it works 😁 Now, once this Function is up and running, we can leverage it within a Release Gate in a Pre-deployment condition:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-24enRHPal28/XJIODHbxEYI/AAAAAAAAFcg/CPRYCe5sS6ctnsxplnLjFM7p9gdXQHQ1wCLcBGAs/s1600/function0.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;342&quot; data-original-width=&quot;482&quot; height=&quot;283&quot; src=&quot;https://2.bp.blogspot.com/-24enRHPal28/XJIODHbxEYI/AAAAAAAAFcg/CPRYCe5sS6ctnsxplnLjFM7p9gdXQHQ1wCLcBGAs/s400/function0.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Set the Completion event to &lt;b&gt;ApiResponse&lt;/b&gt;, and check the value of the output as a &lt;b&gt;Success criteria&lt;/b&gt;. If IsUp is true, then the website is up and running:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-Hxn4KIXiCKk/XJIOCxb0loI/AAAAAAAAFcY/gL00LCM9ycUEvKnrPMpPaElXWSxd6Of3gCLcBGAs/s1600/function1.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;98&quot; data-original-width=&quot;239&quot; src=&quot;https://3.bp.blogspot.com/-Hxn4KIXiCKk/XJIOCxb0loI/AAAAAAAAFcY/gL00LCM9ycUEvKnrPMpPaElXWSxd6Of3gCLcBGAs/s1600/function1.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You can actually make it even smarter by checking for both IsUp and the code:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-lzzEqcFqX4E/XJIODC-2obI/AAAAAAAAFcc/48KKyTSVLikgky294TQDsDEcMcRmoYVaQCLcBGAs/s1600/function2.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;80&quot; data-original-width=&quot;340&quot; src=&quot;https://2.bp.blogspot.com/-lzzEqcFqX4E/XJIODC-2obI/AAAAAAAAFcc/48KKyTSVLikgky294TQDsDEcMcRmoYVaQCLcBGAs/s1600/function2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This would be enough to have the check in place, and automate the gatekeeping of your stage flow.&lt;/div&gt;</description>
        <pubDate>Wed, 20 Mar 2019 19:41:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/03/20/use-azure-devops-release-gates-to-check/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/03/20/use-azure-devops-release-gates-to-check/</guid>
      </item>
    
      <item>
        <title>Did you know? Changing default and comparison branch in Git from Azure DevOps</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;This was one of those things you never realise until you actually look at it:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-gZC2jJisnLc/XIqrzbUjCFI/AAAAAAAAFZI/9umwFI8xwycYUICLDsnRBYKsVQOxLUWIgCLcBGAs/s1600/branch0.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;34&quot; data-original-width=&quot;231&quot; src=&quot;https://1.bp.blogspot.com/-gZC2jJisnLc/XIqrzbUjCFI/AAAAAAAAFZI/9umwFI8xwycYUICLDsnRBYKsVQOxLUWIgCLcBGAs/s1600/branch0.png&quot; style=&quot;cursor: move;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Have you ever thought that many people just leave that at the default setting (both Default and Compare on master) without too much thought?&lt;br /&gt;&lt;br /&gt;Well, it is easy to change for both.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Compare:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Right click on any other branch, and select &lt;b&gt;Set as compare branch&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-3KamqVGQ73k/XIqrza_rn9I/AAAAAAAAFZM/R-7wrYfUjSsl_Jc0mTvb03niH4NsrDAZwCLcBGAs/s1600/branch1.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;405&quot; data-original-width=&quot;219&quot; height=&quot;320&quot; src=&quot;https://1.bp.blogspot.com/-3KamqVGQ73k/XIqrza_rn9I/AAAAAAAAFZM/R-7wrYfUjSsl_Jc0mTvb03niH4NsrDAZwCLcBGAs/s320/branch1.png&quot; width=&quot;172&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Default:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;From the Repository settings, right click on any other branch and select &lt;b&gt;Set as default branch&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-RU2lJTBQUbI/XIqrzcfj4mI/AAAAAAAAFZQ/idtcl5gkpXA5rYOzE244wcVy1eTHL4CmQCLcBGAs/s1600/branch2.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;121&quot; data-original-width=&quot;292&quot; src=&quot;https://2.bp.blogspot.com/-RU2lJTBQUbI/XIqrzcfj4mI/AAAAAAAAFZQ/idtcl5gkpXA5rYOzE244wcVy1eTHL4CmQCLcBGAs/s1600/branch2.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now, you might wonder why you might want to change these settings.&lt;br /&gt;&lt;br /&gt;The Compare branch is a user setting - you might want to use it to set your development branch as a baseline branch to see how far master is ahead or behind compared to develop, for example.&lt;br /&gt;&lt;br /&gt;On the other hand, the Default branch is for Pull Requests - it identifies&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; the default branch for merging code into when creating a new Pull Request.&lt;/div&gt;</description>
        <pubDate>Thu, 14 Mar 2019 19:31:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/03/14/did-you-know-changing-default-and/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/03/14/did-you-know-changing-default-and/</guid>
      </item>
    
      <item>
        <title>A quick reflection on git reset</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;This is fairly quick, but I haven&apos;t realised how important it is up to now - a friend made up such a mess of his repository adding and changing files before committing that he wanted to delete the folder and start from scratch.&lt;br /&gt;&lt;br /&gt;Is it worth it? Not really, you can move around Git&apos;s history with this command:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;git reset --hard &amp;lt;SHA of the target commit&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Why do I say it is an important thing to keep in mind? Think of it this way: if the user comes from TFVC, this is equivalent to a local Undo All and to Get Specific Version and Get Latest Version (with HEAD instead of the SHA) commands.&lt;/div&gt;</description>
        <pubDate>Fri, 08 Mar 2019 21:58:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/03/08/a-quick-reflection-on-git-reset/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/03/08/a-quick-reflection-on-git-reset/</guid>
      </item>
    
      <item>
        <title>Using the Basic Process Template in Azure DevOps to make support management easier</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;I love the introduction of a &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/devops/boards/get-started/track-issues-tasks?view=azure-devops&quot;&gt;Basic Process Template&lt;/a&gt; in Azure DevOps, and I will tell you why – it provides a very simple structure for projects that do not want or require a more complex set of prescriptions, but it still feeds from the best practices and the consensus of Agile methodologies so you are not left totally in the dark or to yourself.&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;An example is support management (as well as escalation management – for the sake of this post I will only refer to support, but many of these concepts apply to both). While there are tools like Service Now which provide an end-to-end lifecycle for support tickets, for certain teams or organisation it can be like hammering a nail for a picture on the wall with a sledgehammer. Doable, but at what cost? Let’s use this scenario as an example.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;For starters, you don’t really need Iterations here. While you could use them – nothing wrong with iterations within a support team – you can do equally well without them, it is up to the team and how it is organised. Areas are what you might need: at least an area per product. Don’t be tempted to add many sub-areas under each product, you can easily leverage tags and be way tidier that way.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-pfWSv-6nZ3k/XGmCGInamqI/AAAAAAAAFYE/qTfo_D_RZNkuO-KNrcvokkWbfDDpgMVoACLcBGAs/s1600/sm0.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;319&quot; data-original-width=&quot;664&quot; height=&quot;191&quot; src=&quot;https://4.bp.blogspot.com/-pfWSv-6nZ3k/XGmCGInamqI/AAAAAAAAFYE/qTfo_D_RZNkuO-KNrcvokkWbfDDpgMVoACLcBGAs/s400/sm0.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Also – don’t be scared if you see this error message:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-h_Br2v3Z64Q/XGmCGCIIcQI/AAAAAAAAFX8/hWrYRgd7kf0a5nT20czmkm-gAWYDuxwngCLcBGAs/s1600/sm1.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;384&quot; data-original-width=&quot;847&quot; height=&quot;180&quot; src=&quot;https://1.bp.blogspot.com/-h_Br2v3Z64Q/XGmCGCIIcQI/AAAAAAAAFX8/hWrYRgd7kf0a5nT20czmkm-gAWYDuxwngCLcBGAs/s400/sm1.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;It is perfectly normal, you don’t have bugs in this project! You have Issues instead. So disregard that.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Onto your backlog now, you can start by clicking on the button to create a new Work Item – which is going to be an Issue:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-kPiKV-bNyh4/XGmCGEymsaI/AAAAAAAAFYA/QUrHAx_faP00XiHfqtNPd_kitfkmyYD1wCLcBGAs/s1600/sm2.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;730&quot; data-original-width=&quot;1210&quot; height=&quot;241&quot; src=&quot;https://1.bp.blogspot.com/-kPiKV-bNyh4/XGmCGEymsaI/AAAAAAAAFYA/QUrHAx_faP00XiHfqtNPd_kitfkmyYD1wCLcBGAs/s400/sm2.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;You can go on for a while. I also really like the fact that you can define where the new Work Item goes: top, bottom or at selection. Really neat IMHO.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-Vi9ywggGRio/XGmCGpdrnFI/AAAAAAAAFYI/0EJbr92maWM1_Swlx-QFVokmIiZCku75ACLcBGAs/s1600/sm3.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;280&quot; data-original-width=&quot;334&quot; src=&quot;https://4.bp.blogspot.com/-Vi9ywggGRio/XGmCGpdrnFI/AAAAAAAAFYI/0EJbr92maWM1_Swlx-QFVokmIiZCku75ACLcBGAs/s1600/sm3.PNG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-QPsl_4pt4Ow/XGmCG0AVnkI/AAAAAAAAFYM/Z1y69b8J9Bw9MhbOBkxTexuYZaOG7tCtQCLcBGAs/s1600/sm4.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;539&quot; data-original-width=&quot;1585&quot; height=&quot;135&quot; src=&quot;https://2.bp.blogspot.com/-QPsl_4pt4Ow/XGmCG0AVnkI/AAAAAAAAFYM/Z1y69b8J9Bw9MhbOBkxTexuYZaOG7tCtQCLcBGAs/s400/sm4.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Once you have a backlog, people start working on it – Azure Boards come in very handy at this, and they are already pre-set in a way that many people will find intuitive:&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-je3id2zsLhg/XGmCG1qKynI/AAAAAAAAFYQ/z6zhqay4i8k2EdZm15cmad_iE7x6CkFhQCLcBGAs/s1600/sm5.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;295&quot; data-original-width=&quot;1511&quot; height=&quot;78&quot; src=&quot;https://4.bp.blogspot.com/-je3id2zsLhg/XGmCG1qKynI/AAAAAAAAFYQ/z6zhqay4i8k2EdZm15cmad_iE7x6CkFhQCLcBGAs/s400/sm5.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;If you think about it, support management is the perfect example of a Lean project in practice. Stuff comes in, it’s worked on for a while and it comes out on the other side with a status. That’s really it, and the Basic Process Template is a perfect starting point for this kind of approach.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;And let me stress that – it is a &lt;b&gt;starting point&lt;/b&gt;. You can customise it like any other Process Template and you can change everything about it, but IMHO its real value is in the simplified angle from where it tries to make life simpler for these teams or situations where other structures might be overkill.&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</description>
        <pubDate>Sun, 17 Feb 2019 15:53:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/02/17/using-basic-process-template-in-azure/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/02/17/using-basic-process-template-in-azure/</guid>
      </item>
    
      <item>
        <title>The continuous quest for automation in DevOps, and the Azure ML Studio example</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;When you think about it, most of the tasks you carry on in a &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;DevOps environment&lt;/i&gt; revolve around automation.&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Infrastructure as Code? It’s automation, right? Cool. Testing? As automated as possible. Integration with 3&lt;sup&gt;rd&lt;/sup&gt; party systems (SonarQube, WhiteSource, Azure DevOps, Jira, anything you retrieve data from or send data to) – it is automated. &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;You might think I live in a DevOps bubble. Let’s expand then – SRE? Data processing? How many things we rely on in modern development that have automation to their core? Excellent, you got your answer.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Mind that, it is not a Cloud exclusive. At the end of the day it’s technology we are talking about – hence my mantra “&lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;A technology problem is never really a problem. Technology can be bent at will.&lt;/i&gt;”&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Now, I am working upon a client at the moment which has many efforts going on, and I was asked if I know of a way of automating deployment of Azure Machine Learning Experiments from Azure ML Studio.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Being completely oblivious to the technology I spent some time on it, and despite being a machine learning tool it is quite WYSIWYG. Hence no automation whatsoever, at the moment. Being a cloud-based product there isn’t the shadow of a doubt that eventually it will be implemented (given enough demand, obviously), but it is manual today. And I need to do this today, so there was no other option than going down a custom route.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Let’s pretend for a minute that I am not living under a rock, I don’t know how to use a search engine. The first step here would be to fire up Fiddler and see what happens when you press your buttons in the tool’s UI.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;It is a modern web-based tool so there is communication between the UI and some API layer. There will be some sort of authentication involved. You can work your way around it. Eventually, you will be able to replicate this interaction with a script, and put it in your pipeline.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Given I do not live under a rock and I know how to use a browser the first search result would be the excellent &lt;a href=&quot;https://github.com/hning86/azuremlps&quot;&gt;Azure ML PS&lt;/a&gt;. Using it in a set of PowerShell scripts, stored in a Git repository, to be then consumed by an Azure PowerShell task in Azure DevOps Pipelines is really trivial. Again, this is a valid proposition for both on-premise systems as well as cloud-based systems.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Pipelines are brilliant for this – and I mean it. If you have something ready, or something that cannot use a task, just throw it within a PowerShell or a Bash script and you are in business. Use a Windows agent or a Unix agent, I don’t really care to be fair – as long as you can interact with the target system with a script everything is good in my view.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Sure, there will be situations where automating gets really difficult. Sometimes you can’t avoid doing manual things. Some other times you will be better off rewriting the whole thing. But usually, we are in a quest for continuous automation and it is what keeps us going. Keep automating!&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</description>
        <pubDate>Sun, 10 Feb 2019 18:31:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/02/10/the-continuous-quest-for-automation-in/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/02/10/the-continuous-quest-for-automation-in/</guid>
      </item>
    
      <item>
        <title>How to reorder your stages in Azure Pipelines</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;It might seem funny, it might seem stupid... but this might happen to someone else, so it can be handy for the future. How do you re-order your stages in a pipeline?&lt;br /&gt;&lt;br /&gt;Let&apos;s take this example:&lt;br /&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-P9uWiszR66k/XFRuuR1sOlI/AAAAAAAAFTs/9NzZEjpcFTAVQby_7adD1otl8vVG6ULOQCLcBGAs/s1600/stages0.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;294&quot; data-original-width=&quot;1030&quot; height=&quot;114&quot; src=&quot;https://3.bp.blogspot.com/-P9uWiszR66k/XFRuuR1sOlI/AAAAAAAAFTs/9NzZEjpcFTAVQby_7adD1otl8vVG6ULOQCLcBGAs/s400/stages0.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now, if you want to move Stage 2 to the end, you will try and click on the Stage UI or in the Tasks and you will not find how this is possible.&lt;br /&gt;&lt;br /&gt;The answer is in the &lt;b&gt;Pre-deployment conditions&lt;/b&gt;:&lt;br /&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-OvM4nMiGhSo/XFRuuScEIMI/AAAAAAAAFT0/HxG9p5lvPJEY-qohoy-dvXqJGNRmftjSwCLcBGAs/s1600/stages1.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;120&quot; data-original-width=&quot;82&quot; src=&quot;https://3.bp.blogspot.com/-OvM4nMiGhSo/XFRuuScEIMI/AAAAAAAAFT0/HxG9p5lvPJEY-qohoy-dvXqJGNRmftjSwCLcBGAs/s1600/stages1.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;There you can find the triggers that can be linked to a Stage, which in this case is &lt;b&gt;the completion of&amp;nbsp; a previous stage&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-0Cmjkwih8mU/XFRuucQFXGI/AAAAAAAAFTw/_iWKaauMJlUnQZu9DQYcswqOOVQt_zZ2gCLcBGAs/s1600/stages2.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;423&quot; data-original-width=&quot;375&quot; src=&quot;https://2.bp.blogspot.com/-0Cmjkwih8mU/XFRuucQFXGI/AAAAAAAAFTw/_iWKaauMJlUnQZu9DQYcswqOOVQt_zZ2gCLcBGAs/s1600/stages2.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Changing that value will make your re-ordering needs a reality 😊&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</description>
        <pubDate>Fri, 01 Feb 2019 16:10:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/02/01/how-to-reorder-your-stages-in-azure/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/02/01/how-to-reorder-your-stages-in-azure/</guid>
      </item>
    
      <item>
        <title>My road to an open source project: Azure Traffic Manager extension for Azure DevOps</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;As I mentioned in my last few posts, I have been working in my spare time to convert the existing scripts I had for Azure Traffic Manager into an Azure DevOps extension.&lt;br /&gt;&lt;br /&gt;I finally managed a critical point to publish the code on &lt;a href=&quot;https://github.com/MattVSTS/AzureDevOps-AzureTrafficManager-Extension&quot;&gt;GitHub&lt;/a&gt;! I am not a massive code person, it might feel like a drop in the ocean but it is something really big for me :-) It was also a great exercise on the actual end to end process of creating a working extension, which I found extremely interesting and valuable.&lt;br /&gt;&lt;br /&gt;The extension does four things at the moment: enable and disable an Endpoint, promote and demote a priority-based Endpoint. It is fairly simple, but again this code stems from demos, labs and community efforts I did over the last 12 months so it is not something that was used by a company in production.&lt;br /&gt;&lt;br /&gt;It is available in Public Preview &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=matteoemili.azure-traffic-manager&quot;&gt;here&lt;/a&gt;, and I am still ironing out a few issues both on the pipeline side and the code. Still, given the lack of an official Azure Traffic Manager extension I feel it can be a decent stopgap - at least with these basic features. I will try to make it even more complete over time so it can be even better!&lt;/div&gt;</description>
        <pubDate>Wed, 23 Jan 2019 15:06:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/01/23/my-road-to-open-source-project-azure/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/01/23/my-road-to-open-source-project-azure/</guid>
      </item>
    
      <item>
        <title>The dev.azure.com URL - can I move away from the old visualstudio.com URL?</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Plenty of reasons behind this, but you might want to move away from your &amp;lt;organisation&amp;gt;.visualstudio.com URL and onto the new dev.azure.com/&amp;lt;organisation&amp;gt; URL as a matter of standards.&lt;br /&gt;&lt;br /&gt;It is fairly easy to do - straight from the Overview Settings page of the organisation:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-X90Xdi_MyPc/XEBfSiVr87I/AAAAAAAAFTM/vSUDFsTeAVQ5C4nWP4TkVieghQ7qgq0awCLcBGAs/s1600/2019-01-17_10-56-09.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;230&quot; data-original-width=&quot;454&quot; src=&quot;https://1.bp.blogspot.com/-X90Xdi_MyPc/XEBfSiVr87I/AAAAAAAAFTM/vSUDFsTeAVQ5C4nWP4TkVieghQ7qgq0awCLcBGAs/s1600/2019-01-17_10-56-09.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If you configured your Build Agents on-premise with a PAT and the old URL you are covered, the configuration will still work, plan for this in advance anyway and make sure you are prepared 👀&lt;/div&gt;</description>
        <pubDate>Thu, 17 Jan 2019 17:49:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/01/17/the-devazurecom-url-can-i-move-away/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/01/17/the-devazurecom-url-can-i-move-away/</guid>
      </item>
    
      <item>
        <title>The importance of the .gitignore file</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;A few days ago I spent a some time reviewing some old repositories of mine (mostly demos) and I realised how cluttered they were.&lt;br /&gt;&lt;br /&gt;You know why? Because they were created years ago, went unmaintained for ages and they were lacking a .gitignore file.&lt;br /&gt;&lt;br /&gt;Early in the days of learning Git, one of the things I left behind was - guess what - a proper usage of .gitignore files. Moving on I realised how important they are: they prevent your repository from becoming filled with temporary files you don&apos;t really need. If you go back to old repos you created when you were not as proficient as you are today, you are guaranteed to stumble into that like I did.&lt;br /&gt;&lt;br /&gt;For example: if you create an empty MVP Application using ASP.NET Core and you run a &lt;i&gt;git add --all &lt;/i&gt;you will surely add files like sqlite&apos;s db.lock file, which is utterly useless in a Version Control System.&lt;br /&gt;&lt;br /&gt;Or the whole .vs folder, .suo files, the obj folders and so on...you don&apos;t need this stuff in a Git repository!&lt;br /&gt;&lt;br /&gt;At the end of the day a .gitignore file is literally a list of files to ignore in order to maintain your repository lean and nimble. Spend five minutes (tops!) on it, and you will get the rewards way down the line.&lt;br /&gt;&lt;br /&gt;If you are &lt;b&gt;*that*&lt;/b&gt; lazy and you think you can&apos;t spend five minutes on it, there is a nice service (what isn&apos;t commoditised today?!) called &lt;a href=&quot;http://gitignore.io/&quot;&gt;gitignore.io&lt;/a&gt;&amp;nbsp;that will create a default one for you based off your favourite IDE or environment.&lt;br /&gt;&lt;br /&gt;Really, do it! 😁&lt;/div&gt;</description>
        <pubDate>Fri, 11 Jan 2019 12:46:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2019/01/11/the-importance-of-gitignore-file/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2019/01/11/the-importance-of-gitignore-file/</guid>
      </item>
    
      <item>
        <title>Recycle your PowerShell scripts in a custom Azure DevOps task</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;I am a huge PowerShell fan, and pretty much anybody who knows me is aware of that.&lt;br /&gt;&lt;br /&gt;Over time I developed my set of scripts for demos and conferences, and some of them are in use in my homelab on a regular basis. One of them is for managing Azure Traffic Manager, and I realised that there is no Azure DevOps task for managing Traffic Manager on the marketplace! Thanks to the brilliant session Utkarsh did at the London Microsoft DevOps Meetup I decided to give a go at at converting that script.&lt;br /&gt;&lt;br /&gt;So this is what I did to recycle my script in a task - beware: this post is a crash course on how to do that, and I don&apos;t think it is actually anything special. It is just an easy way of productively recycle some existing scripts in a good way. I haven&apos;t finished yet - as a good Product Owner I started with an MVP and I see there is more and more to add to it 👀 - but it is slowly coming together and I hope it can be useful to someone in the near future.&lt;br /&gt;&lt;br /&gt;What you need to do is create the scaffolding with the tfx cli. from which you can start customising the script.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-ZbdduTzTmh0/XCYGAXKmdcI/AAAAAAAAFPY/hfZPlN1CqZAjuQA35R-rAqdLJ10tVDqqwCLcBGAs/s1600/tfxcli0.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;183&quot; data-original-width=&quot;651&quot; height=&quot;111&quot; src=&quot;https://3.bp.blogspot.com/-ZbdduTzTmh0/XCYGAXKmdcI/AAAAAAAAFPY/hfZPlN1CqZAjuQA35R-rAqdLJ10tVDqqwCLcBGAs/s400/tfxcli0.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Then remove any reference to the JavaScript portion of the task - you are just recycling a PowerShell script so you don&apos;t need it! It will also save you time when debugging it as otherwise the runner defaults to the JavaScript entry-point. Needless to say, the name of the target script is going to be the name of your script.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-Cj5fouoj_6I/XCYHHNU2MyI/AAAAAAAAFPg/zATde-wZqkYbQ5molLX9SS3eGaOU-BZhgCLcBGAs/s1600/tfxcli1.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;133&quot; data-original-width=&quot;359&quot; src=&quot;https://3.bp.blogspot.com/-Cj5fouoj_6I/XCYHHNU2MyI/AAAAAAAAFPg/zATde-wZqkYbQ5molLX9SS3eGaOU-BZhgCLcBGAs/s1600/tfxcli1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Add the &lt;a href=&quot;https://www.powershellgallery.com/packages/VstsTaskSdk/0.9.0&quot;&gt;VstsTaskSdk &lt;/a&gt;module otherwise you are going to get odd errors out. Also, remove any versioning reference. The structure should be &lt;b&gt;.../ps_modules/VstsTaskSdk&lt;/b&gt;. This is true for every module you are going to use:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-sUfRIRvoW-4/XCYHd1k_oTI/AAAAAAAAFPo/1kNLgSrOVIMgCHvVzCYtK0Fp11HP7M6cACLcBGAs/s1600/tfxcli2.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;110&quot; data-original-width=&quot;214&quot; src=&quot;https://4.bp.blogspot.com/-sUfRIRvoW-4/XCYHd1k_oTI/AAAAAAAAFPo/1kNLgSrOVIMgCHvVzCYtK0Fp11HP7M6cACLcBGAs/s1600/tfxcli2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Code-wise, keep the scaffolding as clean as you can, and add your script inside the try statement after the Trace-VstsEnteringInvocation $MyInvocation. You should be able to recycle your script with little changes, of course some adjustment might be needed. If you need to get input parameters you can use the Get-VstsInput command.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-OK20nMbZ1yo/XCYIYboCJuI/AAAAAAAAFPw/SlYiTeK6mNke8c7QFvAlo_4BLoC_g2jpQCLcBGAs/s1600/tfxcli3.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;292&quot; data-original-width=&quot;646&quot; height=&quot;180&quot; src=&quot;https://1.bp.blogspot.com/-OK20nMbZ1yo/XCYIYboCJuI/AAAAAAAAFPw/SlYiTeK6mNke8c7QFvAlo_4BLoC_g2jpQCLcBGAs/s400/tfxcli3.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</description>
        <pubDate>Fri, 28 Dec 2018 11:28:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/12/28/recycle-your-powershell-scripts-in/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/12/28/recycle-your-powershell-scripts-in/</guid>
      </item>
    
      <item>
        <title>How to authenticate with the Azure subscription you select in a custom PowerShell Azure DevOps task</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;I will cover more about my custom PowerShell Azure DevOps task, but I wanted to share this quick tip as I struggled as much as the next guy about it...&lt;br /&gt;&lt;br /&gt;Say that you want to re-use your PowerShell scripts, and instead of having inline PowerShell tasks you want to package them properly for cross-organisational re-use. It is a relatively easy and straightforward task, but chances are you are going to target an Azure subscription with it and you want to have the nice dropbox and the integrated experience you get with first party tasks.&lt;br /&gt;&lt;br /&gt;It is not really difficult, but for some reasons I could not really find an easy walkthrough about that - a limited set of steps, but somehow hard to find...&lt;br /&gt;&lt;br /&gt;What you need to do is to import the &lt;a href=&quot;https://github.com/Microsoft/azure-pipelines-tasks/tree/master/Tasks/Common/VstsAzureHelpers_&quot;&gt;VstsAzureHelpers&amp;nbsp;&lt;/a&gt;&amp;nbsp;module and include it in the PowerShell modules consumed by your task. Once that is done, you need to make sure you can select the Azure Subscription in the parameters - easy to do as you need to edit the task.json file:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-Ffbi5-i1SlY/XBoDsezvwGI/AAAAAAAAFO4/cZb2gaGRDdgeoUFrOoKpdNX75--k2rqAwCLcBGAs/s1600/azps0.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;178&quot; data-original-width=&quot;569&quot; src=&quot;https://1.bp.blogspot.com/-Ffbi5-i1SlY/XBoDsezvwGI/AAAAAAAAFO4/cZb2gaGRDdgeoUFrOoKpdNX75--k2rqAwCLcBGAs/s1600/azps0.PNG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;After this you can finally use the &lt;b&gt;Initialize-Azure&lt;/b&gt; command in your PowerShell script, which is going to automatically pick the subscription from the parameter and initialise the relevant cmdlets so that you can use stuff like Set-AzureRM... without running &lt;b&gt;Login-AzureRmAccount&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-Ykwos8Im4cg/XBoEAsaSMoI/AAAAAAAAFPA/W5QC-5Sh1u4jnHXD4MIiJ6NfppVGwzGrQCLcBGAs/s1600/azps1.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;125&quot; data-original-width=&quot;476&quot; src=&quot;https://2.bp.blogspot.com/-Ykwos8Im4cg/XBoEAsaSMoI/AAAAAAAAFPA/W5QC-5Sh1u4jnHXD4MIiJ6NfppVGwzGrQCLcBGAs/s1600/azps1.PNG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Easier done than said 😀 I hope it is going to be helpful!&lt;/div&gt;</description>
        <pubDate>Wed, 19 Dec 2018 08:42:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/12/19/how-to-authenticate-with-azure/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/12/19/how-to-authenticate-with-azure/</guid>
      </item>
    
      <item>
        <title>Lift and shift migration of Team Foundation Server to Azure with Azure DevOps Server 2019</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;This is a consequence of the support for Azure SQL Database - as you can use it as a data tier now, you can also upgrade your existing Team Foundation Server instance to Azure DevOps in a lift and shift fashion.&lt;br /&gt;&lt;br /&gt;First of all -- *this works on my machine* (lab) and *I bear no responsibilities* 😁 it is highly experimental and only with Azure DevOps Server 2019 RC1 - although I am sure it is going to be polished in the next releases. Let&apos;s review the pre-requisites:&lt;br /&gt;&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;You need to run domain-joined VM(s)&lt;/li&gt;&lt;li&gt;The(se) VM(s) must have a Managed Identity in order to access Azure SQL Database&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;In order to lift and shift your databases, you need to import them into Azure SQL Database. You can use many methods like the Microsoft Data Migration Assistant, SSMS or a manual import.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-Z9Au0csb5tg/XAl9aYwKHRI/AAAAAAAAFLs/CMMD-q6WZTAo_eD005dLgK6abbngm42agCLcBGAs/s1600/azdo-ls1.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;653&quot; data-original-width=&quot;680&quot; height=&quot;383&quot; src=&quot;https://2.bp.blogspot.com/-Z9Au0csb5tg/XAl9aYwKHRI/AAAAAAAAFLs/CMMD-q6WZTAo_eD005dLgK6abbngm42agCLcBGAs/s400/azdo-ls1.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It is likely that you need to remove all the Windows users, and the table and stored procedures used for the scheduled backups. Remember that as of now it is still an experimental process - no support whatsoever for this, especially because you are modifying the database manually!&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-MGM-VFVf_sM/XAl9aJ33BVI/AAAAAAAAFLo/xt01-S3E2Vk_6_A5GSPqhZxWB1o-Ffg1gCLcBGAs/s1600/exportazdo_collection.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;391&quot; data-original-width=&quot;607&quot; src=&quot;https://3.bp.blogspot.com/-MGM-VFVf_sM/XAl9aJ33BVI/AAAAAAAAFLo/xt01-S3E2Vk_6_A5GSPqhZxWB1o-Ffg1gCLcBGAs/s1600/exportazdo_collection.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Once the database are imported (S3 tier or above!) you need to run this query on the Azure DevOps databases:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: EN-US; mso-highlight: white;&quot;&gt;CREATE&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; font-family: Consolas; font-size: 9.5pt;&quot;&gt; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: EN-US; mso-highlight: white;&quot;&gt;USER&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; font-family: Consolas; font-size: 9.5pt;&quot;&gt; &amp;lt;vmname&amp;gt; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: EN-US; mso-highlight: white;&quot;&gt;FROM&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; font-family: Consolas; font-size: 9.5pt;&quot;&gt; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: EN-US; mso-highlight: white;&quot;&gt;EXTERNAL&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; font-family: Consolas; font-size: 9.5pt;&quot;&gt; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: EN-US; mso-highlight: white;&quot;&gt;PROVIDER&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; font-family: Consolas; font-size: 9.5pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: EN-US; mso-highlight: white;&quot;&gt;ALTER&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; font-family: Consolas; font-size: 9.5pt;&quot;&gt; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: EN-US; mso-highlight: white;&quot;&gt;ROLE&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; font-family: Consolas; font-size: 9.5pt;&quot;&gt; db_owner &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: EN-US; mso-highlight: white;&quot;&gt;ADD&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; font-family: Consolas; font-size: 9.5pt;&quot;&gt; MEMBER &amp;lt;vmname&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: blue; font-family: Consolas; font-size: 9.5pt;&quot;&gt;ALTER&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; font-family: Consolas; font-size: 9.5pt;&quot;&gt; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: blue; font-family: Consolas; font-size: 9.5pt;&quot;&gt;USER&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; font-family: Consolas; font-size: 9.5pt;&quot;&gt; &amp;lt;vmname&amp;gt; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: blue; font-family: Consolas; font-size: 9.5pt;&quot;&gt;WITH&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; font-family: Consolas; font-size: 9.5pt;&quot;&gt; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: blue; font-family: Consolas; font-size: 9.5pt;&quot;&gt;DEFAULT_SCHEMA&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: grey; font-family: Consolas; font-size: 9.5pt;&quot;&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; font-family: Consolas; font-size: 9.5pt;&quot;&gt;&lt;span style=&quot;background-color: white;&quot;&gt;dbo&lt;/span&gt;&lt;span style=&quot;background-color: yellow;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;Followed by this query in the master database:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: EN-US; mso-highlight: white;&quot;&gt;CREATE&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; font-family: Consolas; font-size: 9.5pt;&quot;&gt; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: EN-US; mso-highlight: white;&quot;&gt;USER&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; font-family: Consolas; font-size: 9.5pt;&quot;&gt; &amp;lt;vmname&amp;gt; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: EN-US; mso-highlight: white;&quot;&gt;FROM&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; font-family: Consolas; font-size: 9.5pt;&quot;&gt; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: EN-US; mso-highlight: white;&quot;&gt;EXTERNAL&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; font-family: Consolas; font-size: 9.5pt;&quot;&gt; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: EN-US; mso-highlight: white;&quot;&gt;PROVIDER&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; font-family: Consolas; font-size: 9.5pt;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: EN-US; mso-highlight: white;&quot;&gt;ALTER&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; font-family: Consolas; font-size: 9.5pt;&quot;&gt; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: EN-US; mso-highlight: white;&quot;&gt;ROLE&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; font-family: Consolas; font-size: 9.5pt;&quot;&gt; dbmanager &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; color: blue; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: EN-US; mso-highlight: white;&quot;&gt;ADD&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; font-family: Consolas; font-size: 9.5pt;&quot;&gt; MEMBER &amp;lt;vmname&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; font-family: Consolas; font-size: 9.5pt;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Times New Roman&amp;quot;; font-size: small;&quot;&gt;This is it really - then you can launch your Azure DevOps Server Configuration Wizard and proceed to an upgrade. Yes, even if you already installed Azure DevOps Server! Of course there are changes to perform here, so it makes sense to call it as such:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;background: white; font-family: Consolas; font-size: 9.5pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; dir=&quot;rtl&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-sznhHbW77Fg/XAl9aEtulDI/AAAAAAAAFLk/mPkaqouyBYURW3BwW74b5T0j2wj3xCPwACLcBGAs/s1600/azdo-ls0.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;294&quot; data-original-width=&quot;516&quot; src=&quot;https://2.bp.blogspot.com/-sznhHbW77Fg/XAl9aEtulDI/AAAAAAAAFLk/mPkaqouyBYURW3BwW74b5T0j2wj3xCPwACLcBGAs/s1600/azdo-ls0.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</description>
        <pubDate>Thu, 06 Dec 2018 19:58:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/12/06/lift-and-shift-migration-of-team/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/12/06/lift-and-shift-migration-of-team/</guid>
      </item>
    
      <item>
        <title>Time for a change</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Today is my last day at Quest Software and One Identity. Moving on has been a hard-thought decision, after over five and a half years. I met some great people there, and I managed to grow a lot given the different perspective I found myself in after day one.&lt;br /&gt;Working with &lt;a href=&quot;https://twitter.com/hussar77?lang=en&quot;&gt;Vladimir Gusarov&lt;/a&gt; was thoroughly great, we&apos;ve gone through a lot of scenarios and situations but we always managed to get positives out of them.&lt;br /&gt;&lt;br /&gt;It is never easy to move on - so many memories and experiences to carry on with you. The company deserves a huge &apos;thank you!&apos; for this ride, and I can only speak well about them. Thanks!&lt;br /&gt;&lt;br /&gt;Now, where am I moving to? Well... I could tease you, but it would be kinda pointless 😊 I am moving back to Avanade, but in the UK branch.&lt;br /&gt;&lt;br /&gt;This means I am going to work with a somewhat known group of people - &lt;a href=&quot;https://twitter.com/arora_tarun?lang=en&quot;&gt;Tarun Arora&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/vlatkoivanovski?lang=en&quot;&gt;Vlatko Ivanovski&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href=&quot;https://twitter.com/onlyutkarsh?lang=en-gb&quot;&gt;Utkarsh Shigihalli&lt;/a&gt;&amp;nbsp;for starters. But I will also manage to catch up with people I worked with when six years ago... maybe I should start rehearsing my best version of Terminator&apos;s &quot;&lt;i&gt;I am back&lt;/i&gt;&quot; 😂&lt;/div&gt;</description>
        <pubDate>Fri, 30 Nov 2018 08:44:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/11/30/time-for-change/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/11/30/time-for-change/</guid>
      </item>
    
      <item>
        <title>Big changes in Azure DevOps Server 2019 - Inherited Processes</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Another huge feature brought by Azure DevOps Server 2019 is Process Inheritance - meaning you are going to get the same customisation experience you get today on Azure DevOps Services on your own Azure DevOps Server instance.&lt;br /&gt;&lt;br /&gt;It is a collection-wide setting and it cannot be changed once the collection is created, so you won&apos;t get it for free when you upgrade to the new version of the product. But there are ways of moving stuff across, and if you do you will get all the benefits from the new model.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-7Jt_y2Xdn90/W_a5MG2z2eI/AAAAAAAAFKQ/eKCm5tyZt1ojKvI_Jf-E69_iEHMU3-LbQCLcBGAs/s1600/inh0.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;620&quot; data-original-width=&quot;822&quot; height=&quot;301&quot; src=&quot;https://3.bp.blogspot.com/-7Jt_y2Xdn90/W_a5MG2z2eI/AAAAAAAAFKQ/eKCm5tyZt1ojKvI_Jf-E69_iEHMU3-LbQCLcBGAs/s400/inh0.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Why am I so excited about it? Because as of now, the on-premise customisation was very powerful but also quite complex to master. The Process Template Editor in Visual Studio, witadmin.exe, storing the versioned changes somewhere else, all things that require time and effort, especially when you need to manage an instance that provide a service to your users.&lt;br /&gt;&lt;br /&gt;With the new process model customisations can be implemented straight from the Web UI, and finally the concept of process inheritance comes on-premise, making your life much easier.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-aWHtIiJ6wZI/W_a6EBZBJSI/AAAAAAAAFKY/_DDxUn3DyZYtrTrby488jGyGWuxuaUoNQCLcBGAs/s1600/inh1.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;317&quot; data-original-width=&quot;396&quot; src=&quot;https://4.bp.blogspot.com/-aWHtIiJ6wZI/W_a6EBZBJSI/AAAAAAAAFKY/_DDxUn3DyZYtrTrby488jGyGWuxuaUoNQCLcBGAs/s1600/inh1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Once you start using this different approach you will be able to easily apply derived processes to your projects, without going through all the existing fiddling with witadmin or the Process Editor. It is a massive improvement.&lt;/div&gt;</description>
        <pubDate>Mon, 26 Nov 2018 12:18:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/11/26/big-changes-in-azure-devops-server-2019_26/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/11/26/big-changes-in-azure-devops-server-2019_26/</guid>
      </item>
    
      <item>
        <title>Big changes in Azure DevOps Server 2019 - SQL Azure Database support</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;div&gt;This is the first of a (hopefully!) series of posts looking at the substantial new features of Azure DevOps Server, which was released yesterday in &lt;a href=&quot;https://azure.microsoft.com/services/devops/server&quot;&gt;RC1&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;If you follow my blog you know that despite everything going on around Azure DevOps Services, I have a soft spot for Azure DevOps Server (formerly Team Foundation Server) - the on-premise product.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Why? Well, since it is a quarterly snapshot of the code from the service it seems excellent value in terms of what it offers once brought on-premise!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is quite an important feature I reckon: Azure DevOps Server now supports Azure SQL Database as the Data Tier.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-GS0IyZ1kFi0/W_Wk5xA-qUI/AAAAAAAAFJs/hYbBYIkF3Do2upbmwp3xE08OKnE2ItXQQCLcBGAs/s1600/azdos4.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;623&quot; data-original-width=&quot;906&quot; height=&quot;275&quot; src=&quot;https://2.bp.blogspot.com/-GS0IyZ1kFi0/W_Wk5xA-qUI/AAAAAAAAFJs/hYbBYIkF3Do2upbmwp3xE08OKnE2ItXQQCLcBGAs/s400/azdos4.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I can already see you are scratching your head, a little puzzled. Let&apos;s put some red lines here, shall we? This configuration works (not &quot;is supported&quot; - works!) only when you are running an Azure DevOps Server instance in an Azure VM. So this is already a huge restriction, but it makes sense - you cannot have better connectivity than something already within the Azure datacentre. After all, on-premise does not necessarily need to be inside a wholly-owned datacentre.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also, when you create the Application Tier VM(s) you need to assign a &lt;b&gt;System assigned Managed Identity&lt;/b&gt;&amp;nbsp;to it - this is how the VM will authenticate with your database, and this is what will enable the Azure option in the deployment screen you saw before.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-z_VPR73MISk/W_Wk5atctcI/AAAAAAAAFJk/4BRKY-px0uAVKgDUytFV-xrxxMiWz3mhQCLcBGAs/s1600/azdos1.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;441&quot; data-original-width=&quot;436&quot; src=&quot;https://3.bp.blogspot.com/-z_VPR73MISk/W_Wk5atctcI/AAAAAAAAFJk/4BRKY-px0uAVKgDUytFV-xrxxMiWz3mhQCLcBGAs/s1600/azdos1.PNG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also, you need to provision at least two empty databases in advance: the Configuration database (name it Tfs_Configuration, for now) and the main Collection database (again, Tfs_DefaultCollection?). Once you have these two up and running, you need to set an AAD administrator user and assign these roles to your databases:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-bM_OyUB3bEA/W_Wk5UpVs9I/AAAAAAAAFJo/A0S7E-D5WNoQT-a5QHso-rOLl5o3q3yzACLcBGAs/s1600/azdos2.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;83&quot; data-original-width=&quot;333&quot; src=&quot;https://3.bp.blogspot.com/-bM_OyUB3bEA/W_Wk5UpVs9I/AAAAAAAAFJo/A0S7E-D5WNoQT-a5QHso-rOLl5o3q3yzACLcBGAs/s1600/azdos2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-cDq76KbUDoc/W_Wk5agdeCI/AAAAAAAAFJg/Veq_mAStZ74nxOjeTJueBHADR1Vn1xg-gCLcBGAs/s1600/azdos3.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;45&quot; data-original-width=&quot;322&quot; src=&quot;https://3.bp.blogspot.com/-cDq76KbUDoc/W_Wk5agdeCI/AAAAAAAAFJg/Veq_mAStZ74nxOjeTJueBHADR1Vn1xg-gCLcBGAs/s1600/azdos3.png&quot; /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;AT here is the name of the VM, as you are leveraging on the system assigned managed identity. AAD is required to actually manipulate the databases. Also, the first SQL script needs to run only against the &lt;b&gt;master&lt;/b&gt;&amp;nbsp;database, while the second one should run against the Configuration database and the Collection database.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-FgskhdwgAko/W_Wk6edYssI/AAAAAAAAFJw/82Xd4Eg0mJchELixyg9wU9jPEmRaRln5gCLcBGAs/s1600/azdos6.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;623&quot; data-original-width=&quot;907&quot; height=&quot;274&quot; src=&quot;https://4.bp.blogspot.com/-FgskhdwgAko/W_Wk6edYssI/AAAAAAAAFJw/82Xd4Eg0mJchELixyg9wU9jPEmRaRln5gCLcBGAs/s400/azdos6.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What if you don&apos;t run these? The wizard put a series of checks in place to prevent a botched configuration. Hence, if you don&apos;t run the first script you are not allowing the VM to authenticate against the Azure SQL Database Server, causing this error:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-TUGpaNQlU10/W_Wk6jy_KDI/AAAAAAAAFJ0/E2OykAmAuqIIsq5YMmxTPYy2SlmTkwbMQCLcBGAs/s1600/azdos7.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;165&quot; data-original-width=&quot;482&quot; src=&quot;https://1.bp.blogspot.com/-TUGpaNQlU10/W_Wk6jy_KDI/AAAAAAAAFJ0/E2OykAmAuqIIsq5YMmxTPYy2SlmTkwbMQCLcBGAs/s1600/azdos7.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Without the second script you will get an explicit error during the Readiness Checks. Eventually, all databases should run an S3 tier or above, otherwise you will be prevented to configure the instance (for the Configuration database) or you will get various errors and your collection will not be provisioned.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-s29cTi2nBMI/W_Wk6yyZx6I/AAAAAAAAFJ4/tzcd6ZYHyVkl3HDSRIxgJZyMRGLJevKJACLcBGAs/s1600/azdos8.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;99&quot; data-original-width=&quot;688&quot; height=&quot;56&quot; src=&quot;https://4.bp.blogspot.com/-s29cTi2nBMI/W_Wk6yyZx6I/AAAAAAAAFJ4/tzcd6ZYHyVkl3HDSRIxgJZyMRGLJevKJACLcBGAs/s400/azdos8.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Why all of this? Put yourself in the shoes of someone who deals with a 3TB Collection on a daily basis. Backups, storage, DBCC, hardware performance and high availability. Can you see the reasons why? 😀&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</description>
        <pubDate>Wed, 21 Nov 2018 18:39:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/11/21/big-changes-in-azure-devops-server-2019/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/11/21/big-changes-in-azure-devops-server-2019/</guid>
      </item>
    
      <item>
        <title>Tips on granular migrations with the Migration Tools for Azure DevOps</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;As &lt;a href=&quot;https://mattvsts.blogspot.com/2018/08/how-vsts-sync-migrator-is-going-to.html&quot;&gt;you know&lt;/a&gt;, I am a huge fan of Martin Hinshelwood&apos;s &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=nkdagility.vsts-sync-migration&quot;&gt;Migration Tools for Azure DevOps&lt;/a&gt;. I&apos;ve been using them for the past few months, and I put together a list of common occurrences that you are likely to face.&lt;br /&gt;&lt;br /&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Throttling - it is going to happen!&lt;/h3&gt;&lt;div&gt;You cannot do anything about it - you are hitting a cloud service, so it is inevitable that you are going to get throttled because of the irregular shape and the amount of data you are moving. What I can tell you is that if you are migrating an average amount of Work Items (in the low thousands I reckon) you are very likely to hit throttling using the &lt;b&gt;LinkMigrationContext &lt;/b&gt;processor because of the load generated on the service.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Correct use of the ReflectedWorkItemID field&lt;/h3&gt;&lt;div&gt;I experimented a fair bit with it, and the solution is to actually have it on both ends for the best outcome. Also remember that custom fields in Azure DevOps Services are unique, so don&apos;t be tempted to create the ReflectedWorkItemID field in the custom project used by only a project while you will need to re-use it across the board.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Always create a custom process first - to be used as a starting point for migrated projects that is going to have that field - and then apply that to the target project with whatever further customisation you need.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Split your migrations into core and non-core processors&lt;/h3&gt;&lt;div&gt;When do you need your users to be away from the source system? When can they start using the target system? All questions that are going to pop around, sooner rather than later.&amp;nbsp;&lt;/div&gt;&lt;div&gt;In my opinion if you are performing a Work Item migration they can start working after Areas/Iterations, Work Items and relationship links have been migrated. Why? Because unless you have someone who is really into his/her attachments, that is the main staple of the Work Item Tracking pillar of Azure DevOps.&lt;/div&gt;&lt;div&gt;Every project is different, of course. But these are my notes so they are &lt;i&gt;skewed&lt;/i&gt;&amp;nbsp;from my personal experience 😊&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Identify what needs to be migrated right now and what can wait&lt;/h3&gt;&lt;div&gt;If you have too much data to move and you cannot afford that &lt;i&gt;downtime&lt;/i&gt;, you need to change your scope. A feasible approach is to move what is currently active, meaning people can start working right away. Once that is done, you can start batching all the closed items - remember that the &lt;b&gt;WorkItemMigrationContext&lt;/b&gt;&amp;nbsp;uses WIQL behind the scenes to identify what is going to be moved, so it is very straightforward.&lt;/div&gt;&lt;div&gt;Doing this makes sure that everything will &lt;i&gt;eventually&lt;/i&gt;&amp;nbsp;be migrated, but without the time pressure of the usage downtime. It is just down to coordination.&lt;/div&gt;&lt;/div&gt;</description>
        <pubDate>Tue, 13 Nov 2018 17:24:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/11/13/tips-on-granular-migrations-with/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/11/13/tips-on-granular-migrations-with/</guid>
      </item>
    
      <item>
        <title>Why you should scan your code within your pipelines</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Like many I received this email from GitHub a couple of weeks ago on an old repository:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;br /&gt; &lt;div class=&quot;MsoNormal&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-cuXJcD3iqVg/W9XueYkDRFI/AAAAAAAAFHY/hGpx_De53rcpZOmM2yfkBqFIVmTzn6sgQCLcBGAs/s1600/a1.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;613&quot; data-original-width=&quot;974&quot; height=&quot;251&quot; src=&quot;https://4.bp.blogspot.com/-cuXJcD3iqVg/W9XueYkDRFI/AAAAAAAAFHY/hGpx_De53rcpZOmM2yfkBqFIVmTzn6sgQCLcBGAs/s400/a1.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;This made me think about how important security scanning is in this day and age. Your code might have been top notch a couple of years ago, and being dangerous today. &lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;  &lt;div class=&quot;MsoNormal&quot;&gt;So, to have a bit of a laugh, I hooked up WhiteSource Bolt to a build of that code to see the actual outcome on the open source libraries used there.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;WhiteSource Bolt is also free for Azure DevOps, so there is really little stopping you from scanning your code &lt;span style=&quot;font-family: &amp;quot;Segoe UI Emoji&amp;quot;,sans-serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-char-type: symbol-ext; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-symbol-font-family: &amp;quot;Segoe UI Emoji&amp;quot;;&quot;&gt;😊&lt;/span&gt;this is the (kind of expected result):&lt;/div&gt;&lt;br /&gt; &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-r-Ek5g638LY/W9XtoNQKEUI/AAAAAAAAFHA/M3Pqrto9E4gM9MTfAcihrQIT9MnzNRLswCLcBGAs/s1600/a2.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;257&quot; data-original-width=&quot;382&quot; src=&quot;https://2.bp.blogspot.com/-r-Ek5g638LY/W9XtoNQKEUI/AAAAAAAAFHA/M3Pqrto9E4gM9MTfAcihrQIT9MnzNRLswCLcBGAs/s1600/a2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-LiWMD4Y6Ycg/W9XtoOuc-ZI/AAAAAAAAFG8/V5cYx-v6m-YppDh7Q9s1Wh_qKfPHaLZuACLcBGAs/s1600/a3.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;257&quot; data-original-width=&quot;382&quot; src=&quot;https://1.bp.blogspot.com/-LiWMD4Y6Ycg/W9XtoOuc-ZI/AAAAAAAAFG8/V5cYx-v6m-YppDh7Q9s1Wh_qKfPHaLZuACLcBGAs/s1600/a3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-9OOjyPxkfv8/W9Xtou9MJxI/AAAAAAAAFHI/7tvtjp-BwFwT7j6Cfbcv20sW1a4Jmd64ACLcBGAs/s1600/a4.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;642&quot; data-original-width=&quot;334&quot; src=&quot;https://1.bp.blogspot.com/-9OOjyPxkfv8/W9Xtou9MJxI/AAAAAAAAFHI/7tvtjp-BwFwT7j6Cfbcv20sW1a4Jmd64ACLcBGAs/s1600/a4.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This is code from a couple of years ago – do you think your code from two years ago is still as good as it was back then?&amp;nbsp;&lt;span style=&quot;font-family: &amp;quot;Segoe UI Emoji&amp;quot;, sans-serif;&quot;&gt;😊&lt;/span&gt;&lt;br /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;font-family: &amp;quot;Segoe UI Emoji&amp;quot;, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</description>
        <pubDate>Sun, 28 Oct 2018 17:15:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/10/28/why-you-should-scan-your-code-within/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/10/28/why-you-should-scan-your-code-within/</guid>
      </item>
    
      <item>
        <title>Unblock the SonarQube upgrade process when using Azure AD plugin for authentication</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;There is a well &lt;a href=&quot;https://github.com/SonarQubeCommunity/sonar-auth-aad/issues/55&quot;&gt;known issue&lt;/a&gt; with SonarQube&apos;s Azure AD plugin, where an upgrade from v6.x to v7.x fails. Fixing this issue involves modifying the Users table manually outside of the upgrade process, and at the moment it is something you cannot avoid.&lt;br /&gt;&lt;br /&gt;The reason why this happens is because the external_identity column does not contain a unique value, while instead it is filled with &apos;&lt;i&gt;Azure AD&lt;/i&gt;&apos; for each user. This is not a critical column, and you should be able to do this without issues.&lt;br /&gt;&lt;br /&gt;Then I thought about a handy way of fixing this instead of just writing random data in it. Whenever you sign-in with the new plug-in, &apos;&lt;i&gt;Azure AD&lt;/i&gt;&apos; is going to be replaced with your email. So, I put together this very simple script.&lt;br /&gt;&lt;br /&gt;Before you run this remember that I bear no responsibilities from it - it worked on my machine, it might not on yours 😊 always test it on backups first!&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-faDr6gK1DYM/W83rNX9gwII/AAAAAAAAFEs/kJD84QT1-AcLlAy_bgASlsF3txn1_PrfwCLcBGAs/s1600/2018-10-22_16-21-15.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;184&quot; data-original-width=&quot;375&quot; src=&quot;https://1.bp.blogspot.com/-faDr6gK1DYM/W83rNX9gwII/AAAAAAAAFEs/kJD84QT1-AcLlAy_bgASlsF3txn1_PrfwCLcBGAs/s1600/2018-10-22_16-21-15.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This takes care of the uniqueness of the value and enables the upgrade to go ahead. Needless to say that this script can be easily added to my proof-of-concept of &lt;a href=&quot;https://mattvsts.blogspot.com/2017/12/an-unusual-scenario-for-release.html&quot;&gt;automated pipeline&lt;/a&gt;!&lt;/div&gt;</description>
        <pubDate>Mon, 22 Oct 2018 15:25:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/10/22/unblock-sonarqube-upgrade-process-when/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/10/22/unblock-sonarqube-upgrade-process-when/</guid>
      </item>
    
      <item>
        <title>A small detail to keep in mind while exporting Build Definitions</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;As part of a migration process you might want to easily migrate the Build Definitions for your pipelines – you can easily do this by using the Export Definition in your Pipelines:&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-yPG7HfK-dHY/W8Bj8vXBWkI/AAAAAAAAFC0/FHRqYxWl3fMrWGZdx6iB-wuCVFYQzdxLgCLcBGAs/s1600/export.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;501&quot; data-original-width=&quot;584&quot; height=&quot;342&quot; src=&quot;https://4.bp.blogspot.com/-yPG7HfK-dHY/W8Bj8vXBWkI/AAAAAAAAFC0/FHRqYxWl3fMrWGZdx6iB-wuCVFYQzdxLgCLcBGAs/s400/export.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This will create a .json file you can import in your destination project with all the properties of your build pipeline, but bear in mind that there is no magic going on here: if you import it in a different Team Project, it is not going to automatically re-target your definitions, hence you would be pointing at the &lt;b&gt;old repository&lt;/b&gt; and the &lt;b&gt;old branch&lt;/b&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-requ2TzuYVw/W8Bkgm3WTPI/AAAAAAAAFC8/w_J8nazs_j8XbYQnkluXADzwKW8s8-CQwCLcBGAs/s1600/import.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;633&quot; data-original-width=&quot;910&quot; height=&quot;278&quot; src=&quot;https://3.bp.blogspot.com/-requ2TzuYVw/W8Bkgm3WTPI/AAAAAAAAFC8/w_J8nazs_j8XbYQnkluXADzwKW8s8-CQwCLcBGAs/s400/import.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It can be quite worrisome if you are moving stuff across Team Projects while keeping them available – there will be no warning, meaning you will get odd errors like &lt;a href=&quot;https://mattvsts.blogspot.com/2017/02/prs-and-unable-to-queue-build-with-vsts.html&quot;&gt;this&lt;/a&gt;. You’ve been warned &lt;span style=&quot;font-family: &amp;quot;segoe ui emoji&amp;quot; , sans-serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-char-type: symbol-ext; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-symbol-font-family: &amp;quot;Segoe UI Emoji&amp;quot;;&quot;&gt;😊&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</description>
        <pubDate>Fri, 12 Oct 2018 09:09:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/10/12/a-small-detail-to-keep-in-mind-while/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/10/12/a-small-detail-to-keep-in-mind-while/</guid>
      </item>
    
      <item>
        <title>Why Universal Packages?</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;You might have read about the new Universal Package, something I am quite a fan of. There is no need for a huge software system in order to use them: actually I read about the many situations where they come in handy, but I believe I have a great one-size-fits-all example.&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;We know that Git, a file-system based Version Control System, is not suited for binary storage. The solution I always recommended was to use a TFVC (yes! TFVC!) repository so that you will not only get transactional consistency when consuming these files, but also versioning.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;At the end of the day, these files would be stored in a database hence TFVC fits the bill quite well. But it was kind of a basic solution for this scenario, as it does not offer what Universal Packages do. The whole idea is to create packages to be easily consumed by other users, not fiddle with yet another Version Control System.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Universal Packages not only do this, but they also offer a great deal of compression. Something that is really welcome when it comes to binary files.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;My example exactly: let’s say you store media files for your products. Images, videos, stuff that is not textual. You need to consume these files during your pipeline’s execution, in whatever scenario you need them. &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Compression (in terms of package size) means performance when consuming them, something that is extremely welcome IMHO. And as you can version packages, you get versioning as well. All by using something that is optimised for that scenario, instead of bending some other sort of technology.&lt;/div&gt;&lt;/div&gt;</description>
        <pubDate>Tue, 09 Oct 2018 09:47:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/10/09/why-universal-packages/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/10/09/why-universal-packages/</guid>
      </item>
    
      <item>
        <title>Should I use GitHub to use the ten free Azure Pipelines?</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;At yesterday&apos;s meetup we got this question: why should I use GitHub to get the ten free parallel Azure Pipelines if I already have a project in the service?&lt;br /&gt;&lt;br /&gt;It is an excellent question, and the answer is that you should use GitHub only if you want to. As long as a project is marked as Public in Azure DevOps it will get the ten free pipelines!&lt;br /&gt;&lt;br /&gt;You can verify it yourself: mark a project as &lt;b&gt;Public&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-qQWraVl__Rg/W6pOJdDnkJI/AAAAAAAAFA8/E2o-iIauCc8sj8vycZ6CuwAQWx5KACH1ACLcBGAs/s1600/azp0.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;479&quot; data-original-width=&quot;521&quot; src=&quot;https://1.bp.blogspot.com/-qQWraVl__Rg/W6pOJdDnkJI/AAAAAAAAFA8/E2o-iIauCc8sj8vycZ6CuwAQWx5KACH1ACLcBGAs/s1600/azp0.PNG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now browse to the &lt;b&gt;Retention and parallel jobs&lt;/b&gt; section of the &lt;b&gt;Build and Release&lt;/b&gt; settings menu, and check it yourself under the &lt;b&gt;Parallel Jobs &lt;/b&gt;tab - 10 jobs!&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-USnS_xX31uU/W6pOJRrThVI/AAAAAAAAFA4/zFrEwV4ItjAcgoC8J3guOiG8r-yXgl12QCLcBGAs/s1600/azp1.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;214&quot; data-original-width=&quot;528&quot; src=&quot;https://3.bp.blogspot.com/-USnS_xX31uU/W6pOJRrThVI/AAAAAAAAFA4/zFrEwV4ItjAcgoC8J3guOiG8r-yXgl12QCLcBGAs/s1600/azp1.PNG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Having free Pipelines is not about being forced to use GitHub, it just means you get them as long as your project is public - regardless of the location.&lt;/div&gt;</description>
        <pubDate>Tue, 25 Sep 2018 15:05:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/09/25/should-i-use-github-to-use-ten-free/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/09/25/should-i-use-github-to-use-ten-free/</guid>
      </item>
    
      <item>
        <title>Use the free Azure Pipeline plan with your GitHub project!</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;It&apos;s been a couple of weeks from the Azure DevOps announcement, and I am contemplating an amazing London sunset while I prepare for &lt;a href=&quot;https://www.meetup.com/London-Microsoft-DevOps/events/254239673/&quot;&gt;tomorrow&apos;s event&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Before getting distracted by the landscape, I was setting up the free Azure Pipelines offer with a GitHub repository of mine... and I realised how frictionless it is!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Start from &lt;a href=&quot;https://github.com/marketplace/azure-pipelines&quot;&gt;here &lt;/a&gt;and select the Free plan:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: left;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;696&quot; data-original-width=&quot;1573&quot; height=&quot;175&quot; src=&quot;https://1.bp.blogspot.com/-ZLI22VkB08w/W6fJOUW0m4I/AAAAAAAAE_I/fqlzGbcGzUQz-HrU41ESb0hTM-NQxIpqgCLcBGAs/s400/pp0.PNG&quot; width=&quot;400&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&amp;nbsp;&lt;span style=&quot;margin-left: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;712&quot; data-original-width=&quot;1600&quot; height=&quot;177&quot; src=&quot;https://3.bp.blogspot.com/-kA0mmWYFYu8/W6fJOp3-3iI/AAAAAAAAE_Q/HD6OZWORBeUv8cZdfscc_R_nnHZlGh3LwCLcBGAs/s400/pp1.PNG&quot; width=&quot;400&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Then select if you want to apply that plan to all your repositories or if you want to use it for select ones:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1192&quot; data-original-width=&quot;957&quot; height=&quot;400&quot; src=&quot;https://3.bp.blogspot.com/-V2GeaSScJDo/W6fJOenLUJI/AAAAAAAAE_M/j86WiPcp_uEaHHXdNF6PsAk8ArUvkG-VwCLcBGAs/s400/pp2.PNG&quot; width=&quot;320&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Now, either select an existing organisation or create a new one, and use a project (in my case a new one called GitHub, but you can use an existing one a well) to &lt;i&gt;refer&lt;/i&gt;&amp;nbsp;to the GitHub project. I say &lt;i&gt;refer&lt;/i&gt;&amp;nbsp;because the level of interaction with Azure DevOps is kept to a minimum - you are consuming it, but you are not doing anything else with it as of now:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: left;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;736&quot; data-original-width=&quot;681&quot; height=&quot;400&quot; src=&quot;https://4.bp.blogspot.com/-RAPZi2T52Xs/W6fJO39XgvI/AAAAAAAAE_U/NejpHiz98SYw0jfaysIpTzR2cfrLGFyZACLcBGAs/s400/pp3.PNG&quot; width=&quot;370&quot; /&gt;&lt;span style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;Once you are done, select the template you feel it is closer to your project. In my case I selected a .NET Desktop template because I am building legacy code so it would be the most appropriate:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;span style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;602&quot; data-original-width=&quot;1573&quot; height=&quot;152&quot; src=&quot;https://3.bp.blogspot.com/-xbWw5BKmLPA/W6fJPFqh_KI/AAAAAAAAE_Y/zYHmSesR4Ekd6w93BRAyrqd7667ZtvQVgCLcBGAs/s400/pp4.PNG&quot; width=&quot;400&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;This will create a yml definition in your repository. Save it, and trigger it - job done!&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;span style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;572&quot; data-original-width=&quot;659&quot; height=&quot;346&quot; src=&quot;https://2.bp.blogspot.com/-0y3OZ2dIZfk/W6fJPb4S38I/AAAAAAAAE_c/LZvz4tDhc0UDkRBlUKOr1YjrFTpmCZS_gCLcBGAs/s400/pp5.PNG&quot; width=&quot;400&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;span style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;625&quot; data-original-width=&quot;1178&quot; height=&quot;211&quot; src=&quot;https://3.bp.blogspot.com/-Ikj-Cu2XrQE/W6fJPhPj1DI/AAAAAAAAE_g/x0WRS-gXF_cFO7eoiNJSnmditgEkUTsjACLcBGAs/s400/pp6.PNG&quot; width=&quot;400&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;span style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1024&quot; data-original-width=&quot;1083&quot; height=&quot;377&quot; src=&quot;https://2.bp.blogspot.com/-bjPfcKEG694/W6fJPjl7sKI/AAAAAAAAE_k/N4F8kTw4Cn8hojLzpVcoYmL1njhgoG85gCLcBGAs/s400/pp7.PNG&quot; width=&quot;400&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This was for something I had there since I barely remember when...hence it should not be too difficult to set up Pipelines for your project! 😊&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The build is already set up to perform CI and PR validation, so there is little effort other than create it and potentially customise it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;322&quot; data-original-width=&quot;502&quot; height=&quot;256&quot; src=&quot;https://4.bp.blogspot.com/-9Y16K3GVD6s/W6fLwGpgLkI/AAAAAAAAFAA/W56uuYYG9BkMy9ypGzLHxt2mY-KGLLkZACLcBGAs/s400/pp8.PNG&quot; width=&quot;400&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: left;&quot;&gt;And it is not a joke when we mention the ten parallel free pipelines - they are already there, provisioned for your account!&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-KSxB7h89pfY/W6fMreLCpfI/AAAAAAAAFAI/V6L0BbOE-EssIeTwsd1UuWm3pZ9zC6Q4wCLcBGAs/s1600/pp9.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;698&quot; data-original-width=&quot;670&quot; height=&quot;400&quot; src=&quot;https://1.bp.blogspot.com/-KSxB7h89pfY/W6fMreLCpfI/AAAAAAAAFAI/V6L0BbOE-EssIeTwsd1UuWm3pZ9zC6Q4wCLcBGAs/s400/pp9.PNG&quot; width=&quot;383&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</description>
        <pubDate>Sun, 23 Sep 2018 17:27:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/09/23/use-free-azure-pipeline-plan-with-your/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/09/23/use-free-azure-pipeline-plan-with-your/</guid>
      </item>
    
      <item>
        <title>So... what happened to VSTS?</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Yes I know – it is a bit of an old news, but I was on holiday and I realised that there are so many crumbs of information around, hence a nice summarising post would help.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;On 10&lt;sup&gt;th&lt;/sup&gt; September, Visual Studio Team Services became Azure DevOps. First things first: does this mean that now you cannot target on-premise, AWS or GCP? You couldn’t be more wrong – there is no change on that front. You are free to use any technology and to target any environment with it, it just happens to fall under the Azure umbrella.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;I personally feel that the new name, despite being a huge change, underlines the fact that the stack is a business driver, not just a development tool. If you are an existing &lt;s&gt;VSTS&lt;/s&gt; Azure DevOps user, what changes for you is how the product is &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;packaged&lt;/i&gt; – if you had to get all of the &lt;s&gt;VSTS&lt;/s&gt; Azure DevOps services before, now you can choose what to actually get: Boards, Pipelines, Repos, etc.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;So you will get a nice per-project selector:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;br /&gt; &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-A7X9h-5hhu0/W5-CnPFJNqI/AAAAAAAAE9w/PSPmolyL2hMnTPaMtcJqCdWEZWlxAwveACLcBGAs/s1600/services.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;554&quot; data-original-width=&quot;663&quot; height=&quot;532&quot; src=&quot;https://4.bp.blogspot.com/-A7X9h-5hhu0/W5-CnPFJNqI/AAAAAAAAE9w/PSPmolyL2hMnTPaMtcJqCdWEZWlxAwveACLcBGAs/s640/services.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;This means that if you want to use an Azure DevOps project just for the Work Item Tracking features and completely hide the Repos, you can totally do that.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Also, the whole UX changed. For the better, I reckon – I find it much improved in pretty much all areas, it just feels better to use. The URL formatting changed (from &lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt;&amp;lt;org&amp;gt;.visualstudio.com&lt;/b&gt;to &lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt;dev.azure.com/&amp;lt;org&amp;gt;&lt;/b&gt;), but it won’t break anything – Microsoft is well aware of this, and it is not going to touch the URLs for the foreseeable future.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Then, the elephant in the room – the &lt;a href=&quot;https://azure.microsoft.com/en-gb/services/devops/pipelines/&quot;&gt;open-source offering&lt;/a&gt; for Azure Pipelines. When I first heard about it, I had to double check I was not making a mistake. Ten free parallel jobs (effectively it is like having ten build machines) with unlimited minutes for OSS projects, regardless of what technologies you use. The agents run on Windows, Linux and MacOS, making it really cross-platform and open to everyone.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Put aside technology for a moment, and think about it. Ten parallel builds with unlimited minutes, for free. It would a relevant cost that is completely slashed away, making end-to-end OSS delivery as easy as drinking a cup of coffee. I believe it is quite unprecedented, and kudos to Microsoft for offering this.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Eventually, Team Foundation Server is going to be renamed to Azure DevOps Server from the next major release. No other changes on that front, it is still a regular snapshot of Azure DevOps brought on-premise. And no, I don&apos;t think it is going to be discontinued anytime soon!&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;That’s it in a nutshell. It’s a large revamp, but the underlying pillars are still there. Enjoy it!&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</description>
        <pubDate>Mon, 17 Sep 2018 10:35:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/09/17/so-what-happened-to-vsts/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/09/17/so-what-happened-to-vsts/</guid>
      </item>
    
      <item>
        <title>A collection of SQL Server-related tips for the TFS Administrator</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;If you run Team Foundation Server on-premise, understanding how SQL Server works on the Data Tier is extremely important. Despite the push for the cloud, there might be so many reasons why you need to stick with your on-premise installation of TFS – and the bigger the instance is the more SQL Server knowledge you will eventually need.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;I am not a SQL Server expert myself, but between my past as a consultant and now being in a position where I administer a huge TFS instance meant that sooner or later I had to deal with SQL Server on a one-to-one basis. Not always the happiest of encounters to be fair &lt;span style=&quot;font-family: &amp;quot;Segoe UI Emoji&amp;quot;,sans-serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-char-type: symbol-ext; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-symbol-font-family: &amp;quot;Segoe UI Emoji&amp;quot;;&quot;&gt;😊&lt;/span&gt; but still, I learned a lot. So I thought that if you are in my position – where you might be &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;the&lt;/i&gt; TFS Administrator – then hopefully a collection of notes I took over time might be handy for you.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;SQL Server always wins – be prepared for it – and never, ever touch the databases&lt;/h2&gt;&lt;h2&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/h2&gt;&lt;div class=&quot;MsoNormal&quot;&gt;It’s not really a tip, but something to keep in mind: given that Team Foundation Server is essentially a product where you have web services in front of a set of databases, hence if the databases have problems the whole product is down. Remember that – when something goes (very) wrong, keep in mind the Data Tier, sometimes it is silly stuff like the drive where the master database resides being full…&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Also, never, ever touch the databases manually unless instructed by the Microsoft Support Team. Don’t be tempted to &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;optimise &lt;/i&gt;the databases, the number of things that can go wrong is simply too high to risk being in a corrupted state or unsupported situation. Don’t do that.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Use the TFS Administration Console built-in backup tool if you can&lt;/h2&gt;&lt;h2&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/h2&gt;&lt;div class=&quot;MsoNormal&quot;&gt;The temptation of letting &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;someone else&lt;/i&gt; (the IT department, a DBA, etc.) deal with the menial task of backing up your Data Tier can be very high, but if you can just use the built-in backup tool. It makes it transparent to you and takes away the hassle of creating maintenance plans.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;If you have databases in Full Recovery Mode, it will take care of your Transaction Logs backup in an atomic manner – it is very important. If you take backups at different times for example, you might end up in a situation where you have identities in a Collection database which does not correlate with the Configuration database. To avoid this, you should &lt;span class=&quot;MsoHyperlink&quot;&gt;&lt;a href=&quot;https://docs.microsoft.com/en-gb/tfs/server/admin/backup/manually-backup-tfs?view=vsts&quot;&gt;mark your transactions&lt;/a&gt;&lt;/span&gt; as part of your backup plan.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Also don’t forget to backup your SSRS Encryption Key, otherwise you might be restoring a useless set of databases in a Disaster Recovery scenario!&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;High Availability means AlwaysOn!&lt;/h2&gt;&lt;h2&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/h2&gt;&lt;div class=&quot;MsoNormal&quot;&gt;To be fair it is not really the case, but it makes your life so much simpler. AlwaysOn makes Highly Available deployments a breeze, and even if you have to factor in &lt;span class=&quot;MsoHyperlink&quot;&gt;&lt;a href=&quot;https://mattvsts.blogspot.com/2014/08/tfs-transaction-marking-on-sql-server.html&quot;&gt;some adjustments&lt;/a&gt;&lt;/span&gt; to your habits it is worth it every single time.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Beware though: even if you implement AlwaysOn for your Database Engine, you will not get Analysis Services for free on the same setup – that is a different deployment altogether.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Keep an eye on your drives&lt;/h2&gt;&lt;div class=&quot;MsoNormal&quot;&gt;This is something I experienced fairly recently – aside from the usual recommendation on where to put your databases (system or otherwise), if you have a very large database you could run into file system limitations that prevent DBCC CHECKDB from running and make you lose sleep. If you happen to experience these, it is worth knowing that not everything is lost and you might not even need to restore from a backup.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;NTFS has a switch (/L) that is designed around large files, it is an excellent starting point although you need to format your drives. Another solution revolves around using ReFS instead of NTFS – it is something somehow unknown, but after running it for a while in my homelab and using it to solve a portion of this problem I can say that ReFS is a powerful “tool” (I can’t really consider a file system a tool, but for lack of a better word…) to resort to in case you find the dreaded error 665 in your logs.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Remember to check what is going on&lt;/h2&gt;&lt;div class=&quot;MsoNormal&quot;&gt;I use this &lt;span class=&quot;MsoHyperlink&quot;&gt;&lt;a href=&quot;https://mattvsts.blogspot.com/2015/01/useful-sql-queries-for-tfs-administrator.html&quot;&gt;couple of queries&lt;/a&gt;&lt;/span&gt; since… I don’t know, ages. They help, because they show in a transparent way what is going on within a SQL Server instance (especially if you need to understand what AlwaysOn is doing) and they provide information that can help diagnosing certain errors.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</description>
        <pubDate>Mon, 20 Aug 2018 19:56:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/08/20/a-collection-of-sql-server-related-tips/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/08/20/a-collection-of-sql-server-related-tips/</guid>
      </item>
    
      <item>
        <title>How VSTS Sync Migrator is going to change then way you migrate to VSTS</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Like I said in my &lt;a href=&quot;https://mattvsts.blogspot.com/2018/07/a-set-of-tools-to-deal-with-granular.html&quot;&gt;last post&lt;/a&gt;, I really enjoy using &lt;a href=&quot;https://vsts-bulk-editor.readthedocs.io/en/latest/&quot;&gt;VSTS Sync Migrator&lt;/a&gt;&amp;nbsp;for Work Item migrations.&lt;br /&gt;There are a few reasons why I believe this tool stands out from the rest, and it is not just because of its complexity - in a nutshell, you can use it not just for tip migrations, but to actually filter and sanitise what you are importing into your target TFS or VSTS.&lt;br /&gt;&lt;br /&gt;Firstly, you can run each processor (call them &lt;i&gt;steps&lt;/i&gt;&amp;nbsp;if you want) independently. That is very important when it comes to understanding what each one of them does. You don&apos;t really want to use something that starts, does &lt;i&gt;stuff&lt;/i&gt;&amp;nbsp;and then fails with an enormous log file.&lt;br /&gt;&lt;br /&gt;Each processor is extremely specialised and usually backed by a WIQL - again, quite complex sometimes but extremely powerful and flexible.&lt;br /&gt;&lt;br /&gt;You can also run multiple instances of the Migrator, targeting different Team Projects in VSTS - having them side by side isn&apos;t usually a problem.&lt;br /&gt;&lt;br /&gt;Then, you have a really powerful capability for shaping your data in the best possible way. By &quot;shaping&quot; I mean &quot;mapping&quot;: field to field, replacing values, even replacing values via Regular Expressions or mapping different Work Item Types.&lt;br /&gt;&lt;br /&gt;This can enable all sorts of scenarios where you can change a Process Template, or make your very verbose customised form much more readable by merging or moving around fields&apos; data.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-e1D1AjUzWDw/W2yr_Z4ssDI/AAAAAAAAE9E/_tEni84LwjErJEg9M-Ote_WGYN2i98uIQCLcBGAs/s1600/sync.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;922&quot; data-original-width=&quot;1012&quot; height=&quot;364&quot; src=&quot;https://2.bp.blogspot.com/-e1D1AjUzWDw/W2yr_Z4ssDI/AAAAAAAAE9E/_tEni84LwjErJEg9M-Ote_WGYN2i98uIQCLcBGAs/s400/sync.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Eventually, no ancillary item is left behind, including Work Item Queries (which carry a huge business value IMHO) and commit information. You can link commits to Work Items even if you migrated the repository with a different name.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-CtdwmwZZFIg/W2ysowD-xBI/AAAAAAAAE9M/hoOQjjZBXlEVrs2qS0e1TRyCPrD6PufSACLcBGAs/s1600/extra.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;300&quot; data-original-width=&quot;1077&quot; height=&quot;110&quot; src=&quot;https://4.bp.blogspot.com/-CtdwmwZZFIg/W2ysowD-xBI/AAAAAAAAE9M/hoOQjjZBXlEVrs2qS0e1TRyCPrD6PufSACLcBGAs/s400/extra.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It takes a while to get all the bits right - there are lots of options, but the &lt;a href=&quot;https://vsts-bulk-editor.readthedocs.io/en/latest/getting-started/&quot;&gt;documentation &lt;/a&gt;is quite good and it will easily guide you through. Fellow MVP Mohamed Radwan also recorded a &lt;a href=&quot;http://mohamedradwan.com/2017/09/15/tfs-2017-migration-to-vsts-with-vsts-sync-migrator/&quot;&gt;quick demo&lt;/a&gt; of how to use it.&lt;br /&gt;&lt;br /&gt;Now, onto more VSTS migrations 😀&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</description>
        <pubDate>Thu, 09 Aug 2018 21:12:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/08/09/how-vsts-sync-migrator-is-going-to/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/08/09/how-vsts-sync-migrator-is-going-to/</guid>
      </item>
    
      <item>
        <title>A set of tools to deal with granular VSTS migrations</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;I am in the middle of a TFS to VSTS migration, and unfortunately I cannot use the &lt;a href=&quot;https://visualstudio.microsoft.com/team-services/migrate-tfs-vsts/&quot;&gt;TFS Database Import Service&lt;/a&gt; this time around. So I put together this list of tools to use for a granular migration, together with scenarios.&lt;br /&gt;&lt;br /&gt;It is going to be mostly on the Work Item side to be fair - if you want to move code quickly look at the &lt;a href=&quot;https://mattvsts.blogspot.com/2018/07/i-want-to-move-my-project-from-tfvc-on.html&quot;&gt;last post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;TFS Integration Platform&lt;/h3&gt;&lt;div&gt;Yes, I start from the &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=Willy-PSchaub.TeamFoundationServerIntegrationToolsMarch2012Relea&quot;&gt;oldest &lt;/a&gt;of the bunch. While unsupported and fairly old, the Integration Platform still works decently given the chance.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are lots of limitations though: you are limited to the Client OM, and you need some tricks to make it work, like creating fake registry entry to make it believe you actually have Team Explorer 2012 (unless you install it, of course).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I reckon the Integration Platform these days works well with a limited scope migration. The pain here is that everything needs to be sorted manually and it gets sluggish after a while, for some reason.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;TfsCmdlets&lt;/h3&gt;&lt;div&gt;Say that you want to quickly work with Areas and Iterations, or that you want to script them. This is an example where the &lt;a href=&quot;https://github.com/igoravl/tfscmdlets&quot;&gt;TfsCmdlets&lt;/a&gt;&amp;nbsp;are extremely powerful.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In my case, I am using them extensively to prepare empty target Team Projects. It is basic PowerShell, hence you can manipulate your objects as you like and they make your life extremely easy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You don&apos;t migrate stuff with the TfsCmdlets, but it is a really invaluable tool for all the ancillary items around the migration itself.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;VSTS Work Item Migrator&lt;/h3&gt;&lt;div style=&quot;text-align: left;&quot;&gt;The &lt;a href=&quot;https://github.com/Microsoft/vsts-work-item-migrator&quot;&gt;Work Item Migrator&lt;/a&gt; is an open source project from Microsoft that leverages the REST API layer of TFS and VSTS.&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;It is more of a sample of how to deal with the APIs IMHO, but it is an excellent starting point. It is based off a Work Item Query as a source, which means you can easily scope what you want. Areas and Iterations need to be created beforehand.&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;One note here: if the validation succeeds, it is not guaranteed that the tool will migrate everything, but that depends on many factors.&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;VSTS Sync Migrator&lt;/h3&gt;&lt;div&gt;Martin Hinshelwood&apos;s &lt;a href=&quot;https://vsts-bulk-editor.readthedocs.io/en/latest/getting-started/&quot;&gt;VSTS Sync Migrator&lt;/a&gt; is a real powerhouse - it is quite complex and it has lots of features (including reconnecting commits to Work Items), it can take a little while to refine the result but it is great.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can also do remaps with this tool, so you can easily migrate from one Process Template to another. It is easy to do because you will configure it yourself in the configuration file. What I really like about this tool is that I can have a very complex configuration but keep some of the steps in a disabled state - so I can have a nice incremental experience.&lt;/div&gt;&lt;/div&gt;</description>
        <pubDate>Tue, 31 Jul 2018 16:11:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/07/31/a-set-of-tools-to-deal-with-granular/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/07/31/a-set-of-tools-to-deal-with-granular/</guid>
      </item>
    
      <item>
        <title>I want to move my project from TFVC on TFS to Git on VSTS, without command-line tools. Can I do it?</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Many often do not realise how easy is to consume technology to make it accomplish a certain scenario. This happened just last week to me.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;For example: you have a project on a Team Foundation Server, which uses TFVC. TFS is only available via the corporate LAN, while you want to move it to the new company’s VSTS account and you also want to move to Git. Throwing an extra spanner in the works, you want something easy to use which does not require any kind of command-line use.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Does it sound too complicated? It is actually a matter of a couple of clicks.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;The first step is to use the &lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/vsts/git/import-from-tfvc?view=vsts&quot;&gt;Import Repository&lt;/a&gt;&lt;/b&gt; feature on your local TFS – what you will do is to convert a branch from TFVC (&lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;$/MyProject/main&lt;/i&gt;for example) to a new Git repository:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-5zgIK98UnQY/W0TGTyJjrlI/AAAAAAAAE8s/bTIKM4IAxsc7b8Bw9lrAJYTLLsaI9cHQACLcBGAs/s1600/git0.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;508&quot; data-original-width=&quot;567&quot; src=&quot;https://1.bp.blogspot.com/-5zgIK98UnQY/W0TGTyJjrlI/AAAAAAAAE8s/bTIKM4IAxsc7b8Bw9lrAJYTLLsaI9cHQACLcBGAs/s1600/git0.PNG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;You can retain as much as 180 days of history, which is more than enough IMHO. If you need more, you can keep the old system around and look it out there. Why? Because of how TFVC and Git differ – it would not really make sense, and you are just adding stuff to a repository that should be as nimble as possible. Also, you are limited to 1GB per imported branch.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Once you are happy with it you can add your VSTS target repository as a remote, and push it there. Job done.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</description>
        <pubDate>Tue, 17 Jul 2018 10:08:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/07/17/i-want-to-move-my-project-from-tfvc-on/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/07/17/i-want-to-move-my-project-from-tfvc-on/</guid>
      </item>
    
      <item>
        <title>Review – Accelerate</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;As you know, I am not only a technology enthusiast but also very into the business side of DevOps. And as a fan of The Phoenix Project, I really could not refrain from purchasing it &lt;span style=&quot;font-family: &amp;quot;Segoe UI Emoji&amp;quot;,sans-serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-char-type: symbol-ext; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-symbol-font-family: &amp;quot;Segoe UI Emoji&amp;quot;;&quot;&gt;😊&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Also, the focus is on &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;High Performing Technology Organisations &lt;/i&gt;(HPTO from now on), which is a very broad subject intertwining technology, management, strategy. Enough to keep me interested.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://pbs.twimg.com/media/DfKY5xiXUAAh1Hr.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;800&quot; data-original-width=&quot;600&quot; height=&quot;640&quot; src=&quot;https://pbs.twimg.com/media/DfKY5xiXUAAh1Hr.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;I read it twice before writing this review. Yes, twice. And the conclusion is very simple: it carries a huge horizontal value. This book is not the typical technical or business book, its approach is more scientific, almost academic. &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;A real HPTO is a well-oiled machine that requires lots of work all across the board. And that is where it shines for business value: despite this approach, the result is that each chapter can be picked by any company as a project on its own to improve itself and go towards the required maturity to ‘be’ an HPTO.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Technical best practices? Chapter four. Infosec and the shift left on security? Chapter six. Employee empowerment through management? Chapter nine. Each chapter has enough stuff to keep you, your teams and your companies busy for months, if you actually start a project on it. And given that I do not think every reader of this book works in a HPTO, you definitely should start some projects &lt;span style=&quot;font-family: &amp;quot;Segoe UI Emoji&amp;quot;,sans-serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-char-type: symbol-ext; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-symbol-font-family: &amp;quot;Segoe UI Emoji&amp;quot;;&quot;&gt;😊&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Summarising it in a single sentence, the issue at heart is that software is the actual business engine. That is what the book underlines as well - without a good software factory you simply cannot deliver value to your users, and if you don’t deliver value…&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</description>
        <pubDate>Tue, 10 Jul 2018 11:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/07/10/review-accelerate/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/07/10/review-accelerate/</guid>
      </item>
    
      <item>
        <title>A set of tricky situations with HTTPS and TFS </title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;HTTPS is more and more common-place, not just for public websites but also for internal websites. This is extremely good for a number of reasons, but from an administration standpoint there are a few bits to keep in mind.&lt;br /&gt;&lt;br /&gt;In particular, when it comes to Team Foundation Server this is a list of errors and problems that go away with a common denominator: the right certificate.&lt;br /&gt;&lt;br /&gt;The number one offender is of course the &lt;i&gt;out-of-domain machine&lt;/i&gt;. If you have a domain-joined machines these problems simply do not happen because the internal certificate is deployed by the domain GPO - hence you don&apos;t have to fiddle with it. When your machine is not domain-joined, things can easily &lt;i&gt;go south&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Bear in mind - these are not &lt;i&gt;security&lt;/i&gt;&amp;nbsp;tips, this is just a collection of situations which you will face if you deploy HTTPS with TFS.&lt;br /&gt;&lt;br /&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Non domain-joined machines&lt;/h2&gt;&lt;div&gt;If you are running a non domain-joined machine then you need to procure the root certificate for your domain and install it in the Trusted Root Certification Authorities store on your machine. This needs to be done on any machine not part of your domain, otherwise you won&apos;t be able to do pretty much anything.&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;Build agents&lt;/h2&gt;&lt;div&gt;Build agents need to be reconfigured. You can&apos;t run away from this, if you don&apos;t do that they will be working until the authentication token expires, and then you will start seeing this error in the Event Log after they go offline:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Agent connect error: The audience of the token is invalid.. Retrying every 30 seconds until reconnected&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;You need to de-register (&lt;i&gt;config.cmd remove&lt;/i&gt;) and re-register your build agents in any pool. Not too bad, but it needs to be planned for.&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;The Deploy Test Agent task in Build and Release&lt;/h2&gt;If you don&apos;t have your certificate installed on both the Agent (if outside the domain) and the target machine (again, if outside the domain) then you will get this cryptic error:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;The running command stopped because the preference variable &quot;ErrorActionPreference&quot; or common parameter is set to Stop: Exception calling &quot;.ctor&quot; with &quot;2&quot; argument(s): &quot;One or more errors occurred.&quot;&lt;/i&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It&apos;s a communication issue between the target machine and TFS. Once the certificate is installed it goes away and the task works normally. This &lt;a href=&quot;https://www.blogger.com/&quot;&gt;&lt;span id=&quot;goog_117591768&quot;&gt;&lt;/span&gt;GitHub issue&lt;span id=&quot;goog_117591769&quot;&gt;&lt;/span&gt;&lt;/a&gt; also recommends enabling TLS v1.2, which is not a bad idea.&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&amp;nbsp;Git&lt;/h2&gt;&lt;div&gt;Git holds a special spot in this collection, because of how it handles SSL. While newer versions of Git for Windows made this really straightforward (hint: they support the Windows Credential Manager), but if you aren&apos;t running the latest and greatest then this is what could happen with Git on your local machine, even if it is joined to the domain:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;i&gt;C:\&amp;gt;git clone https://myserver/Collection/_git/Project&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;Cloning into &apos;Project&apos;...&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;fatal: unable to access &apos;https://myserver/Collection/_git/Project/&apos;: SSL certificate problem: unable to get local issuer certificate&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;div style=&quot;background-color: white; box-sizing: border-box; margin-bottom: 10px;&quot;&gt;&lt;div style=&quot;color: #333333; font-family: &amp;quot;segoe ui&amp;quot;, tahoma, arial, &amp;quot;helvetica neue&amp;quot;, helvetica, sans-serif; font-size: 14px;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; font-family: &amp;quot;courier new&amp;quot;; font-size: xx-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;color: #333333; font-family: &amp;quot;segoe ui&amp;quot;, tahoma, arial, &amp;quot;helvetica neue&amp;quot;, helvetica, sans-serif; font-size: 14px;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; font-family: &amp;quot;courier new&amp;quot;; font-size: xx-small;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;-webkit-text-stroke-width: 0px; color: black; font-family: &amp;quot;Times New Roman&amp;quot;; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;color: #333333; font-family: &amp;quot;segoe ui&amp;quot;, tahoma, arial, &amp;quot;helvetica neue&amp;quot;, helvetica, sans-serif; font-size: 14px;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; widows: 2;&quot;&gt;You can sort this out in many ways, but the best one is Philip Kelley&apos;s approach. It just works, even if it is a bit of a walkthrough. This applies not only on the client, but also on the build agent if you are not running a recent version of the agent itself. It can be easily corrected by replacing the ca-bundle.crt file over there, it is not going to be replaced until you update the agent to a newer version.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;-webkit-text-stroke-width: 0px; color: black; font-family: &amp;quot;Times New Roman&amp;quot;; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; margin: 0px; text-transform: none; white-space: normal; word-spacing: 0px;&quot;&gt;Also, a false friend:&lt;/div&gt;&lt;div style=&quot;-webkit-text-stroke-width: 0px; color: black; font-family: &amp;quot;Times New Roman&amp;quot;; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; margin: 0px; text-transform: none; white-space: normal; word-spacing: 0px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;i&gt;error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054&lt;/i&gt;&lt;br /&gt;&lt;i&gt;fatal: read error: Invalid argument, 255.05 MiB | 1.35 MiB/s&lt;/i&gt;&lt;br /&gt;&lt;i&gt;fatal: early EOF&lt;/i&gt;&lt;br /&gt;&lt;i&gt;fatal: index-pack failed&lt;/i&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;It can be all sorts of things, especially as the error points at OpenSSL - but check your connection&apos;s stability first before messing up with Git&apos;s postBuffer and compression 😃 if the &lt;i&gt;git clone&lt;/i&gt;&amp;nbsp;operation starts the problem is not the SSL authentication.&lt;br /&gt;&lt;div style=&quot;-webkit-text-stroke-width: 0px; color: black; font-family: &amp;quot;Times New Roman&amp;quot;; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; text-transform: none; white-space: normal; word-spacing: 0px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
        <pubDate>Wed, 27 Jun 2018 16:53:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/06/27/a-set-of-tricky-situations-with-https/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/06/27/a-set-of-tricky-situations-with-https/</guid>
      </item>
    
      <item>
        <title>Easily handle internal settings while orchestrating components&apos; deployments and parameters</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;After ten years of attending, then speaking at conferences it always strikes me what demos often miss are real world details that really make the difference.&lt;br /&gt;&lt;br /&gt;Like...deploying an application with a pipeline. Everybody talks about it, right? And everybody (including myself!) have some demo-ready stuff to show around in case it might be required.&lt;br /&gt;&lt;br /&gt;I am working on a sample application right now, and I realised how blind I was - even if I am deploying stuff to different slots and environments and whatnot, I am still treating everything as a single monolith. Not really what you want these days, right?&lt;br /&gt;&lt;br /&gt;Well&apos; let&apos;s sort it out. Say that you have an API component and a Frontend component, the best thing to do is to decouple the two of them so they can be independently deployed *and* mix-matched depending on the requirement.&lt;br /&gt;&lt;br /&gt;It is .NET Core in my case, so in my Frontend component&apos;s appsettings.json I created this section:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-cjUM2YV1o-M/WyocpxO0sfI/AAAAAAAAE70/oByyz9agb0ESsWz3CP2M_TSXeSMd5RYXQCLcBGAs/s1600/set0.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;77&quot; data-original-width=&quot;348&quot; src=&quot;https://2.bp.blogspot.com/-cjUM2YV1o-M/WyocpxO0sfI/AAAAAAAAE70/oByyz9agb0ESsWz3CP2M_TSXeSMd5RYXQCLcBGAs/s1600/set0.PNG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Of course I modified the application so I could add the configuration in my ConfigureServices method and consume it in my Controller. The variable part in this case is the Slot property.&lt;br /&gt;&lt;br /&gt;Now comes the fun side of the story - of course I have a pipeline in place. How do I handle these settings?&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/--ahuv9WIfYY/Wyocp4I8B1I/AAAAAAAAE74/3_OYjvW6o3wItq4iOVUwqMWfoaywJZSjwCLcBGAs/s1600/set1.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;249&quot; data-original-width=&quot;1268&quot; height=&quot;123&quot; src=&quot;https://1.bp.blogspot.com/--ahuv9WIfYY/Wyocp4I8B1I/AAAAAAAAE74/3_OYjvW6o3wItq4iOVUwqMWfoaywJZSjwCLcBGAs/s640/set1.PNG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The best approach here, given the relative complexity of this exercise, is to scope the relevant value by environment. The Dev environment will always point at the Dev environment, Staging to Staging, and the last two environments are effectively production so I do not need to worry about adding a slot. It&apos;s not like I have cross-environment settings here.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-gmZfBUP6Q9s/WyocpxxBF_I/AAAAAAAAE78/rCqkhFA9Iw421bQiWDncBfpCsgb9Yg0ggCLcBGAs/s1600/set2.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;115&quot; data-original-width=&quot;988&quot; height=&quot;72&quot; src=&quot;https://2.bp.blogspot.com/-gmZfBUP6Q9s/WyocpxxBF_I/AAAAAAAAE78/rCqkhFA9Iw421bQiWDncBfpCsgb9Yg0ggCLcBGAs/s640/set2.PNG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The reason why the variables are named that way is because I am using the JSON variable substitution option in the Azure App Service Deploy task, and as my property is not on the first level then it needs to be explicitly written that way.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-vfM2D6Yi_wk/WyocqTIjtPI/AAAAAAAAE8A/Z65pV4iXO0AcVwgRMcazv-WBckUWtMvTgCLcBGAs/s1600/set3.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;286&quot; data-original-width=&quot;1010&quot; height=&quot;179&quot; src=&quot;https://4.bp.blogspot.com/-vfM2D6Yi_wk/WyocqTIjtPI/AAAAAAAAE8A/Z65pV4iXO0AcVwgRMcazv-WBckUWtMvTgCLcBGAs/s640/set3.PNG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Doing it ensures that each environment has its own setting, and it also makes sure you remain sane while handling internal app settings across your applications and environments 😉 it is really easy to do as well, so there is really no reason to skimp on it.&lt;/div&gt;</description>
        <pubDate>Wed, 20 Jun 2018 09:24:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/06/20/easily-handle-internal-settings-while/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/06/20/easily-handle-internal-settings-while/</guid>
      </item>
    
      <item>
        <title>Quickly deploy a baseline SQL database with VSTS</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;i&gt;&quot;Sometimes we go full steam ahead with a complex solution for a very simple problem...&quot;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;That was the answer I gave to a friend of mine who asked me how to feed some baseline database for testing purposes with VSTS in Azure.&lt;br /&gt;&lt;br /&gt;The obvious one would be to have your versioned SQL scripts in a dedicated repository which you can use to rebuild the whole thing from code (which is by all accounts the most correct solution to this problem). But in this case there are other avenues.&lt;br /&gt;&lt;br /&gt;Databases have been treated like second class citizens for years - by tools and practices. For example, why not using BACPAC files for this exercise? At the end of the day, a BACPAC file contains the packaged version of a database at a certain point in time, including its data.&lt;br /&gt;&lt;br /&gt;So if you have your BACPAC somewhere, get to an Azure storage account and run this SQLPackage command inside a VSTS PowerShell Script task (of course you need to replace the variables and provide the actual path):&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;amp; &apos;C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\130\sqlpackage.exe&apos; /Action:Import&amp;nbsp; /TargetServerName:$(DBUrl) /TargetDatabaseName:$(DBName) /TargetUser:$(DBAdmin) /TargetPassword:$(DBPassword) /SourceFile:&quot;&amp;lt;your location&amp;gt;/sample.bacpac&quot;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Don&apos;t get me wrong, I love seeing a database fully integrated with the pipeline and that&apos;s how it should be. But in this specific case, I feel the tradeoff is worth it.&lt;br /&gt;&lt;br /&gt;Also - this is a baseline database, nobody prevents us from running delta scripts against it depending on needs. But given it was for testing purposes, I highly doubt there is going to be much development on it in the future!&lt;/div&gt;</description>
        <pubDate>Sat, 16 Jun 2018 16:53:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/06/16/quickly-deploy-baseline-sql-database/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/06/16/quickly-deploy-baseline-sql-database/</guid>
      </item>
    
      <item>
        <title>How to run UI tests in a Deployment Group with TFS and VSTS</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Especially if you are testing client applications, you might want to run UI tests on a Deployment Group instead of a Build Agent. While technology is the same, there are a couple of things to keep in mind.&lt;br /&gt;&lt;br /&gt;In order to enable a machine to run UI tests you need to make sure your &lt;b&gt;InteractiveSession&lt;/b&gt;&amp;nbsp;capability is set to &lt;b&gt;true&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-YO6oA135Bkw/WxkLhwawwQI/AAAAAAAAE7Y/36XutZaoTC8VrXfjog46Z_rC5OqUfCIqACLcBGAs/s1600/property.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;131&quot; data-original-width=&quot;663&quot; height=&quot;78&quot; src=&quot;https://4.bp.blogspot.com/-YO6oA135Bkw/WxkLhwawwQI/AAAAAAAAE7Y/36XutZaoTC8VrXfjog46Z_rC5OqUfCIqACLcBGAs/s400/property.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In order to do so, you need to re-configure or manually change the script used to add a machine to the Deployment Group. Given a standard script the first step is removing the --runasservice switch from it.&lt;br /&gt;&lt;br /&gt;Once you run the configuration script the process will guide you to configure the agent for interactive interaction. You will set it to auto-start so you will get an unattended experience when rebooting the machine, but you will be able to run interactive sessions on it.&lt;br /&gt;&lt;br /&gt;Eventually, I always recommend to use the VSTest Platform Installer task to make sure you have a consistent environment to run your tests from:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-WWDvu0lelEU/WxkMbASMSDI/AAAAAAAAE7k/rqqCM3n1KDYIpprNCnFAEUac-W1uIbTjwCLcBGAs/s1600/vstest0.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;131&quot; data-original-width=&quot;311&quot; src=&quot;https://3.bp.blogspot.com/-WWDvu0lelEU/WxkMbASMSDI/AAAAAAAAE7k/rqqCM3n1KDYIpprNCnFAEUac-W1uIbTjwCLcBGAs/s1600/vstest0.PNG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;and to refer to the tools installed by that in the Visual Studio Test task:&lt;br /&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-Wi1JXZPypvc/WxkMbI_O3HI/AAAAAAAAE7g/sb4lhCau9PMSxXRPxssuxJvR1MNgJBRGQCLcBGAs/s1600/vstest1.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;192&quot; data-original-width=&quot;260&quot; src=&quot;https://1.bp.blogspot.com/-Wi1JXZPypvc/WxkMbI_O3HI/AAAAAAAAE7g/sb4lhCau9PMSxXRPxssuxJvR1MNgJBRGQCLcBGAs/s1600/vstest1.PNG&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</description>
        <pubDate>Thu, 07 Jun 2018 10:45:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/06/07/how-to-run-ui-tests-in-deployment-group/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/06/07/how-to-run-ui-tests-in-deployment-group/</guid>
      </item>
    
      <item>
        <title>A story of high availability with SQL Server AlwaysOn and TFS</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;A few weeks ago something happened on our TFS instance - we discovered that DBCC CHECKDB under certain conditions can mark a database as corrupted.&lt;br /&gt;&lt;br /&gt;Long story short, this was due to a peculiar condition related to a high volume of transactions during that operation, not something you see every day. Microsoft Support was really good helping us getting back to normality.&lt;br /&gt;&lt;br /&gt;In retrospective, what really hit me was how resilient TFS was thanks to SQL Server AlwaysOn. As you know, I am a huge fan of AlwaysOn because of how transparent it makes High Availability.&lt;br /&gt;&lt;br /&gt;For us, maintaining availability meant a simple failover to the other node. Given that we are running the Availability Group with &lt;b&gt;Synchronous-Commit Mode&lt;/b&gt;&amp;nbsp;(my default choice when it comes to TFS) the then-Primary Replica was already updated to the latest transaction, so there was no data loss.&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;Team Foundation Server did not lose a single heartbeat. When things go south like this, during the issue itself and if you are doing something during the failover you will get a &lt;b&gt;JobInitializationError&lt;/b&gt;, which is self-explanative. As this is a transactional system by design, nothing is left hanging in the balance like good ol&apos; SourceSafe :)&lt;br /&gt;&lt;br /&gt;Of course we were in limited availability while we were troubleshooting and fixing this problem (&lt;b&gt;always change the Failover Mode to Manual&amp;nbsp;when you are doing so&lt;/b&gt;), but there was no downtime.&lt;br /&gt;&lt;br /&gt;Also talking recovery, at the end of the day we had to restore backups on the Secondary Replica to get back to a proper synchronisation. Again, a bit tedious and time consuming given the sizes involved, but it was flawless.&lt;/div&gt;</description>
        <pubDate>Wed, 30 May 2018 11:20:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/05/30/a-story-of-high-availability-with-sql/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/05/30/a-story-of-high-availability-with-sql/</guid>
      </item>
    
      <item>
        <title>Small details carrying a huge value</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;I was reading this &lt;a href=&quot;https://blogs.msdn.microsoft.com/premier_developer/2018/05/19/assigning-work-items-to-a-group-in-visual-studio-team-services/&quot;&gt;post &lt;/a&gt;by Microsoft Premier Developer’s blog, and it was a nice throwback to past times where I had to deal with these type of requests because of the existing process in place.&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;I also thought about how easy it became customising a process with VSTS compared to TFS, and the first thing that sprung to mind was to pair this up with the Board Styling options:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-wyx3Mn-2ZNE/WwQzyRS4T2I/AAAAAAAAE6s/70X1XY-7KrISSaYjOKiC4-ElJWJrjlSVgCLcBGAs/s1600/style0.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;631&quot; data-original-width=&quot;832&quot; height=&quot;302&quot; src=&quot;https://1.bp.blogspot.com/-wyx3Mn-2ZNE/WwQzyRS4T2I/AAAAAAAAE6s/70X1XY-7KrISSaYjOKiC4-ElJWJrjlSVgCLcBGAs/s400/style0.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;This will cause cards that are unassigned to a single individual but assigned to a group to be highlighted in the board:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-nlSPMkH6Oig/WwQzyRMIg7I/AAAAAAAAE6w/myS9mC3IGekXFaczoHOtGQFGVbkn_S1PgCLcBGAs/s1600/style1.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;208&quot; data-original-width=&quot;324&quot; height=&quot;256&quot; src=&quot;https://4.bp.blogspot.com/-nlSPMkH6Oig/WwQzyRMIg7I/AAAAAAAAE6w/myS9mC3IGekXFaczoHOtGQFGVbkn_S1PgCLcBGAs/s400/style1.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;There can be so may reasons why a team might choose to do this – and it does not just apply to product development. Think about situations where telemetry operators escalate events or tickets are integrated in the backlog.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Why am I focusing on such small details? Well, this is the kind of personalisation (I cannot really call them customisations &lt;span style=&quot;font-family: &amp;quot;segoe ui emoji&amp;quot; , sans-serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-char-type: symbol-ext; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-symbol-font-family: &amp;quot;Segoe UI Emoji&amp;quot;;&quot;&gt;😊&lt;/span&gt;) that enable cross-role consumption of the stack.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;It does not have to be anything extremely complicated, but whenever you can bring an existing process inside the tool in a frictionless manner you are already paving the way for a better reception and adoption of the tool itself.&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</description>
        <pubDate>Tue, 22 May 2018 15:16:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/05/22/small-details-carrying-huge-value/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/05/22/small-details-carrying-huge-value/</guid>
      </item>
    
      <item>
        <title>Elevate your telemetry from silo to valuable data source</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;I am going to speak at DevOpsDays Kiel next week about telemetry, and I was thinking about how much Application Insights evolved in the last few years.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Without mentioning the awesome Application Insights Analytics, I was really pleased with how easy it is to bring valuable data to the forefront.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;For example, this was there pretty much since the inception:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;br /&gt; &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-m8lr7nSU8Sk/WvVEnr01NkI/AAAAAAAAE6I/_1OU3r28kNg7uRtkhCZhOpXwjPRURwG6QCLcBGAs/s1600/ai0.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;216&quot; data-original-width=&quot;1600&quot; height=&quot;84&quot; src=&quot;https://2.bp.blogspot.com/-m8lr7nSU8Sk/WvVEnr01NkI/AAAAAAAAE6I/_1OU3r28kNg7uRtkhCZhOpXwjPRURwG6QCLcBGAs/s640/ai0.PNG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;It’s great, but it is kind-of-buried in the detailed information provided. What I really enjoyed on the other hand, was this:&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-XHt5j7n4VrU/WvVEn7R46DI/AAAAAAAAE6M/6wF86C7fKBAYPLHVmmXdFWKgaJNzZmsywCLcBGAs/s1600/ai1.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;479&quot; data-original-width=&quot;1600&quot; height=&quot;188&quot; src=&quot;https://2.bp.blogspot.com/-XHt5j7n4VrU/WvVEn7R46DI/AAAAAAAAE6M/6wF86C7fKBAYPLHVmmXdFWKgaJNzZmsywCLcBGAs/s640/ai1.PNG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;This is an organic and straightforward way to escalate a single piece of information. Why you ask?&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Well, because the previous screen is a summary, with a single button named &lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt;Operations &lt;/b&gt;in a pane called &lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt;Take Action&lt;/b&gt;.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;So, from a UX point of view, it comes natural to dig into the details of a single request raising an exception and promote that information to an actionable backlog item.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;A development team does not (usually) need quantity, it needs quality in order to fix problems raised by telemetry. It is the natural evolution of telemetry systems to be able to integrate with DevOps stacks in an effortless way – the real challenge is doing so without being excessively verbose, but still providing the much needed value to close the loop.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</description>
        <pubDate>Fri, 11 May 2018 07:23:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/05/11/elevate-your-telemetry-from-silo-to/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/05/11/elevate-your-telemetry-from-silo-to/</guid>
      </item>
    
      <item>
        <title>Review – Professional Visual Studio 2017</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;I recently gave a go to this book, because I feel it is important as a stepping stone to whoever is approaching the IDE – remember, there is always somebody who is starting around &lt;span style=&quot;font-family: &amp;quot;segoe ui emoji&amp;quot; , sans-serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-char-type: symbol-ext; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-symbol-font-family: &amp;quot;Segoe UI Emoji&amp;quot;;&quot;&gt;😊&lt;/span&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;segoe ui emoji&amp;quot; , sans-serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-char-type: symbol-ext; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-symbol-font-family: &amp;quot;Segoe UI Emoji&amp;quot;;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-72UxAI-iGuA/WucbCx-zDDI/AAAAAAAAE5s/i4WH7osYXkwe5RQ6Qf4POwgvPAj6RHewQCLcBGAs/s1600/provs.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;721&quot; data-original-width=&quot;577&quot; height=&quot;320&quot; src=&quot;https://1.bp.blogspot.com/-72UxAI-iGuA/WucbCx-zDDI/AAAAAAAAE5s/i4WH7osYXkwe5RQ6Qf4POwgvPAj6RHewQCLcBGAs/s320/provs.PNG&quot; width=&quot;256&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;It does its job well to be fair, it covers pretty well all the features and it is pretty up-to-date with the RTM release of the IDE. The only problem I find with it is that the Visual Studio release cadence is going pretty fast, so it will always be a matter of playing catch-up with the team. There is so much that is added and updated on a regular basis that it is almost inevitable for a book like this to fall behind.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Regardless of that, there is also a nice introduction to the Continuous Delivery Tools for Visual Studio that happens to be a nice starting point to the DevOps and CD pipelines tools as well – including Code Analysis. &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Visual Studio Team Services is mentioned at the end, instead of Team Foundation Server. It is a change that makes sense, as it is extremely quick and easy to get started there instead of installing TFS.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</description>
        <pubDate>Mon, 30 Apr 2018 13:33:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/04/30/review-professional-visual-studio-2017/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/04/30/review-professional-visual-studio-2017/</guid>
      </item>
    
      <item>
        <title>On-premise Blue-Green deployments with TFS 2018 Update 2</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Like I said in the previous post, modern deployment patterns are not an exclusive of the OTT providers and they are not something that requires using cloud technologies.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;After &lt;a href=&quot;https://mattvsts.blogspot.co.uk/2018/04/on-premise-rolling-deployments-with-tfs.html&quot;&gt;Rolling Deployments&lt;/a&gt;, another very common pattern you might want to tackle is Blue-Green deployments. In a nutshell, it means having two identical environments to use in order to deploy new versions of your application with minimal downtime. &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;It is a bit harder compared to a Rolling Deployment – mainly because there could be countless variations on the technical details, depending on how your environment is composed, but let’s try to jot down a skeleton version of a Blue-Green pipeline you can use.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;So in my case, I am using the same application I used in the previous post, with an additional environment (which happen to be a cluster, just to keep things a little more realistic). This is what my pipeline looks like:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-zAP3wvvMRjo/Ws4z3MJZ5PI/AAAAAAAAE5E/-xSUAVMotDUmA6yDoJ0EPjHN_XG3kY9aACLcBGAs/s1600/bg.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;340&quot; data-original-width=&quot;952&quot; height=&quot;142&quot; src=&quot;https://1.bp.blogspot.com/-zAP3wvvMRjo/Ws4z3MJZ5PI/AAAAAAAAE5E/-xSUAVMotDUmA6yDoJ0EPjHN_XG3kY9aACLcBGAs/s400/bg.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;mso-no-proof: yes;&quot;&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shapetype  id=&quot;_x0000_t75&quot; coordsize=&quot;21600,21600&quot; o:spt=&quot;75&quot; o:preferrelative=&quot;t&quot;  path=&quot;m@4@5l@4@11@9@11@9@5xe&quot; filled=&quot;f&quot; stroked=&quot;f&quot;&gt; &lt;v:stroke joinstyle=&quot;miter&quot;/&gt; &lt;v:formulas&gt;  &lt;v:f eqn=&quot;if lineDrawn pixelLineWidth 0&quot;/&gt;  &lt;v:f eqn=&quot;sum @0 1 0&quot;/&gt;  &lt;v:f eqn=&quot;sum 0 0 @1&quot;/&gt;  &lt;v:f eqn=&quot;prod @2 1 2&quot;/&gt;  &lt;v:f eqn=&quot;prod @3 21600 pixelWidth&quot;/&gt;  &lt;v:f eqn=&quot;prod @3 21600 pixelHeight&quot;/&gt;  &lt;v:f eqn=&quot;sum @0 0 1&quot;/&gt;  &lt;v:f eqn=&quot;prod @6 1 2&quot;/&gt;  &lt;v:f eqn=&quot;prod @7 21600 pixelWidth&quot;/&gt;  &lt;v:f eqn=&quot;sum @8 21600 0&quot;/&gt;  &lt;v:f eqn=&quot;prod @7 21600 pixelHeight&quot;/&gt;  &lt;v:f eqn=&quot;sum @10 21600 0&quot;/&gt; &lt;/v:formulas&gt; &lt;v:path o:extrusionok=&quot;f&quot; gradientshapeok=&quot;t&quot; o:connecttype=&quot;rect&quot;/&gt; &lt;o:lock v:ext=&quot;edit&quot; aspectratio=&quot;t&quot;/&gt;&lt;/v:shapetype&gt;&lt;v:shape id=&quot;Picture_x0020_1&quot; o:spid=&quot;_x0000_i1026&quot; type=&quot;#_x0000_t75&quot;  style=&apos;width:451.5pt;height:161.25pt;visibility:visible;mso-wrap-style:square&apos;&gt; &lt;v:imagedata src=&quot;file:///C:/Users/MATTEO~1.ACM/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png&quot;   o:title=&quot;&quot;/&gt;&lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Each environments follows the following process:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;mso-no-proof: yes;&quot;&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape  id=&quot;Picture_x0020_2&quot; o:spid=&quot;_x0000_i1025&quot; type=&quot;#_x0000_t75&quot; style=&apos;width:450.75pt;  height:589.5pt;visibility:visible;mso-wrap-style:square&apos;&gt; &lt;v:imagedata src=&quot;file:///C:/Users/MATTEO~1.ACM/AppData/Local/Temp/msohtmlclip1/01/clip_image003.png&quot;   o:title=&quot;&quot;/&gt;&lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-c01omk32Jpw/Ws4z3M12XxI/AAAAAAAAE5I/-4yH3_ceHBAQ7hxWsUsu7SSyR3H802tDwCLcBGAs/s1600/bg1.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;804&quot; data-original-width=&quot;615&quot; height=&quot;640&quot; src=&quot;https://2.bp.blogspot.com/-c01omk32Jpw/Ws4z3M12XxI/AAAAAAAAE5I/-4yH3_ceHBAQ7hxWsUsu7SSyR3H802tDwCLcBGAs/s640/bg1.png&quot; width=&quot;488&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Let’s say we are running all of this against the blue cluster, which is currently production. &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;The first phase is an Agent Phase – it swaps production traffic from the blue cluster to the green one.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;I want it to be independent from the environments so that it can deal with the router that manages traffic between the two clusters. As I do not have an appliance or anything special in front of them (I am just playing with CNAME records in my lab domain) this ensures the process is not tied to any machine.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Moreover, this pipeline is designed to be used just after everything is deemed production-ready, so if it fails it is not meant to be ran again without a hitch.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;The reason behind this choice is that I wanted to share a general idea of how to do this on-premise, and there might be so many permutations of what you might need to do or what could go wrong that my example with all the possible fail safes in place would have been way too complex.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Up next, the Rolling Deployment we saw in the last post for both nodes of the blue cluster, one at a time.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Then, even if you are running this for a production application you still need to make sure your smoke tests are passing. This is literally the last line of defense before the switch.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Eventually, a warm-up script to ensure that my application is responding correctly when it is going to be used from my users. &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Now the magic happens: as soon as you move to the second Environment, traffic is switched to the blue cluster again (which is done with the v2, and warm enough for production traffic) in a seamless way while the whole process goes on against the green cluster.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Of course, there are some things to consider. The first one, is that this pipeline is not designed to be a commit-to-production pipeline: there is no backup mechanism in it and no revert process if one environment fails (this lives with the fact that you should already have the pipelines defined in the previous post though &lt;span style=&quot;font-family: &amp;quot;Segoe UI Emoji&amp;quot;,sans-serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-char-type: symbol-ext; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-symbol-font-family: &amp;quot;Segoe UI Emoji&amp;quot;;&quot;&gt;😊&lt;/span&gt;). &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;You want to use approvals to manage the switch from green to blue, so that only when it is checked then you can go ahead.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Eventually (this is quite important though), your application must be able to cope with environment change – it should be message-based, or stateless. Traditional stateful applications can have problems with it, which can be mitigated with message queues for example, so we are back to square one &lt;span style=&quot;font-family: &amp;quot;Segoe UI Emoji&amp;quot;,sans-serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-char-type: symbol-ext; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-symbol-font-family: &amp;quot;Segoe UI Emoji&amp;quot;;&quot;&gt;😊&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</description>
        <pubDate>Wed, 11 Apr 2018 16:13:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/04/11/on-premise-blue-green-deployments-with/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/04/11/on-premise-blue-green-deployments-with/</guid>
      </item>
    
      <item>
        <title>On-premise rolling deployments with TFS 2018 Update 2</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Team Foundation Server &lt;a href=&quot;https://docs.microsoft.com/en-us/visualstudio/releasenotes/tfs2018-update2&quot;&gt;delivers&lt;/a&gt;– as usual – the periodic snapshot of VSTS goodness on-premise.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;One particular feature I am really happy landed in our datacentres is Deployment Groups. With it you can target sets of machines where you are going to deploy your applications on.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;It is really amazing because it enables scenarios like Rolling Deployments for your existing applications running on-premise. These patterns are not an exclusive of the big boys!&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;For example, I am targeting a two node cluster with a very simple ASP.NET MVC application (running on full .NET Framework, so no .NET Core or anything that fancy, pretty much the run of the mill internal application you might find in pretty much any company) like this:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;mso-no-proof: yes;&quot;&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shapetype  id=&quot;_x0000_t75&quot; coordsize=&quot;21600,21600&quot; o:spt=&quot;75&quot; o:preferrelative=&quot;t&quot;  path=&quot;m@4@5l@4@11@9@11@9@5xe&quot; filled=&quot;f&quot; stroked=&quot;f&quot;&gt; &lt;v:stroke joinstyle=&quot;miter&quot;/&gt; &lt;v:formulas&gt;  &lt;v:f eqn=&quot;if lineDrawn pixelLineWidth 0&quot;/&gt;  &lt;v:f eqn=&quot;sum @0 1 0&quot;/&gt;  &lt;v:f eqn=&quot;sum 0 0 @1&quot;/&gt;  &lt;v:f eqn=&quot;prod @2 1 2&quot;/&gt;  &lt;v:f eqn=&quot;prod @3 21600 pixelWidth&quot;/&gt;  &lt;v:f eqn=&quot;prod @3 21600 pixelHeight&quot;/&gt;  &lt;v:f eqn=&quot;sum @0 0 1&quot;/&gt;  &lt;v:f eqn=&quot;prod @6 1 2&quot;/&gt;  &lt;v:f eqn=&quot;prod @7 21600 pixelWidth&quot;/&gt;  &lt;v:f eqn=&quot;sum @8 21600 0&quot;/&gt;  &lt;v:f eqn=&quot;prod @7 21600 pixelHeight&quot;/&gt;  &lt;v:f eqn=&quot;sum @10 21600 0&quot;/&gt; &lt;/v:formulas&gt; &lt;v:path o:extrusionok=&quot;f&quot; gradientshapeok=&quot;t&quot; o:connecttype=&quot;rect&quot;/&gt; &lt;o:lock v:ext=&quot;edit&quot; aspectratio=&quot;t&quot;/&gt;&lt;/v:shapetype&gt;&lt;v:shape id=&quot;Picture_x0020_1&quot; o:spid=&quot;_x0000_i1028&quot; type=&quot;#_x0000_t75&quot;  style=&apos;width:451.5pt;height:361.5pt;visibility:visible;mso-wrap-style:square&apos;&gt; &lt;v:imagedata src=&quot;file:///C:/Users/MATTEO~1.ACM/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png&quot;   o:title=&quot;&quot;/&gt;&lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-rf435yzH_sE/WsTVVWUTULI/AAAAAAAAE4k/VAhAw3fHjDwSZNxx56dvWdhJEV8Qc2gXgCLcBGAs/s1600/dg0.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;452&quot; data-original-width=&quot;580&quot; height=&quot;311&quot; src=&quot;https://2.bp.blogspot.com/-rf435yzH_sE/WsTVVWUTULI/AAAAAAAAE4k/VAhAw3fHjDwSZNxx56dvWdhJEV8Qc2gXgCLcBGAs/s400/dg0.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;I am targeting one server at a time – it comes as a simple option but this is crucial, as you could do them in parallel.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-KyDX5zKyj5w/WsTVh3Bz7rI/AAAAAAAAE4s/p-a6P72Jz3Mizej4gDm8_ve4E62VWf_rgCLcBGAs/s1600/dg1.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;98&quot; data-original-width=&quot;400&quot; src=&quot;https://3.bp.blogspot.com/-KyDX5zKyj5w/WsTVh3Bz7rI/AAAAAAAAE4s/p-a6P72Jz3Mizej4gDm8_ve4E62VWf_rgCLcBGAs/s1600/dg1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;mso-no-proof: yes;&quot;&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape  id=&quot;Picture_x0020_2&quot; o:spid=&quot;_x0000_i1027&quot; type=&quot;#_x0000_t75&quot; style=&apos;width:300pt;  height:72.75pt;visibility:visible;mso-wrap-style:square&apos;&gt; &lt;v:imagedata src=&quot;file:///C:/Users/MATTEO~1.ACM/AppData/Local/Temp/msohtmlclip1/01/clip_image003.png&quot;   o:title=&quot;&quot;/&gt;&lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Then it is fairly straightforward: stop the node draining all the connections (this is quite important) stop the website, deploy the package via the trusted MSDeploy, restart the website and re-join the node.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;To handle the cluster nodes, you can easily use the NLB PowerShell cmdlets:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;mso-no-proof: yes;&quot;&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape  id=&quot;Picture_x0020_3&quot; o:spid=&quot;_x0000_i1026&quot; type=&quot;#_x0000_t75&quot; style=&apos;width:3in;  height:46.5pt;visibility:visible;mso-wrap-style:square&apos;&gt; &lt;v:imagedata src=&quot;file:///C:/Users/MATTEO~1.ACM/AppData/Local/Temp/msohtmlclip1/01/clip_image004.png&quot;   o:title=&quot;&quot;/&gt;&lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;!--[endif]--&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape id=&quot;Picture_x0020_4&quot;  o:spid=&quot;_x0000_i1025&quot; type=&quot;#_x0000_t75&quot; style=&apos;width:132pt;height:42pt;  visibility:visible;mso-wrap-style:square&apos;&gt; &lt;v:imagedata src=&quot;file:///C:/Users/MATTEO~1.ACM/AppData/Local/Temp/msohtmlclip1/01/clip_image005.png&quot;   o:title=&quot;&quot;/&gt;&lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-ZAjrD3aqKb8/WsTVhx-7GlI/AAAAAAAAE4o/IuFewJRiP-g0a-QE282NuTYuA9JlOkxTgCLcBGAs/s1600/dg2.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;62&quot; data-original-width=&quot;288&quot; src=&quot;https://3.bp.blogspot.com/-ZAjrD3aqKb8/WsTVhx-7GlI/AAAAAAAAE4o/IuFewJRiP-g0a-QE282NuTYuA9JlOkxTgCLcBGAs/s1600/dg2.PNG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;This Release definition is going to run against each of the nodes, making individual node management very easy. Of course it is just a starting point and I am simplifying some of the situations you might find, but all the foundation is there!&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</description>
        <pubDate>Wed, 04 Apr 2018 13:40:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/04/04/on-premise-rolling-deployments-with-tfs/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/04/04/on-premise-rolling-deployments-with-tfs/</guid>
      </item>
    
      <item>
        <title>Selective branch indexing with TFS and the Search Server</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Team Foundation Server’s Search Server can be tough. I mean, it works really well but it takes a certain degree of planning, otherwise it can easily sink your instance’s performance.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;I’ve &lt;a href=&quot;https://mattvsts.blogspot.co.uk/2017/06/some-tips-on-search-server-for-tfs-2017.html&quot;&gt;mentioned&lt;/a&gt;&amp;nbsp;in the past that there are scripts from the Product Team that help with the daily administration of the server, they are still the number one choice IMHO from an admin point of view. &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;But it’s not all command-line. For example, if you look into the Version Control settings of your Team Project, you will discover that each Git repository has a nice setting for selective indexing.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-DOxPgV3rulQ/Wry96Qo-1aI/AAAAAAAAE4I/-WvjUoEXEG8ngYR_14Ki-ic7PXQoGod4wCLcBGAs/s1600/es.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;122&quot; data-original-width=&quot;323&quot; src=&quot;https://4.bp.blogspot.com/-DOxPgV3rulQ/Wry96Qo-1aI/AAAAAAAAE4I/-WvjUoEXEG8ngYR_14Ki-ic7PXQoGod4wCLcBGAs/s1600/es.PNG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt; &lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;This makes a lot of sense, so you can only index the common branches and have a rational use of your Elastic Search instance.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;There is an excellent reason for that: you don’t want *all of your branches* to be searchable. They will feature a ridiculous amount of duplicates, hence you would be wasting resources. &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</description>
        <pubDate>Thu, 29 Mar 2018 10:21:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/03/29/selective-branch-indexing-with-tfs-and/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/03/29/selective-branch-indexing-with-tfs-and/</guid>
      </item>
    
      <item>
        <title>Something strange with SQL Server AlwaysOn Automatic Seeding and TFS</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;I ran into this strange issue the other day in my homelab, and it is worth sharing it: I was trying to setup a highly available Team Foundation Server data tier with AlwaysOn Automatic Seeding instead of the usual backup and restore process, but the TFS_Configuration database (for some reason) was not collaborating.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;i&gt;Automatic seeding of availability database &apos;Tfs_Configuration&apos; in availability group &apos;TFSAG&apos; failed with an unrecoverable error. Correct the problem, then issue an ALTER AVAILABILITY GROUP command to set SEEDING_MODE = AUTOMATIC on the replica to restart seeding.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;We are talking about a plain, empty instance, so... it was a bit of a needle in a haystack!&lt;br /&gt;&lt;br /&gt;Let&apos;s take a step back: SQL Server AlwaysOn Automatic Seeding is a new feature of SQL Server 2016 and above that manages to sync up a database in an Availability Group without leveraging backup and restore. This is a life saver in certain situations, so that you can avoid the computational load of a backup and of a restore that might take a long time.&lt;br /&gt;&lt;br /&gt;There are some constraints - above all, the instances making up the Availability Group must be *identical*. Yes, identical in everything, including paths used by SQL Server. It is a very cloud-first approach at the end of the day, where you have identical, commodity resources at your disposal and your actual target is to provide a friction-less experience to whom is going to consume the service you&apos;ll offer.&lt;br /&gt;&lt;br /&gt;So cool, right? Still, for some reason, my Configuration database didn&apos;t stream from Primary to Secondary replica. I checked the DMV, and I got an obscure 1200 failed_state error - Internal Error.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-ZFahYwfAO4w/WrtP_tep2KI/AAAAAAAAE3k/wMyGAqmZMeY37cZW0JLrDJ0x4gyxGyo8gCLcBGAs/s1600/sql0.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;567&quot; data-original-width=&quot;815&quot; height=&quot;277&quot; src=&quot;https://2.bp.blogspot.com/-ZFahYwfAO4w/WrtP_tep2KI/AAAAAAAAE3k/wMyGAqmZMeY37cZW0JLrDJ0x4gyxGyo8gCLcBGAs/s400/sql0.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The first thing I did (as the instances are really identical, they were provisioned the day before) was to check that I was on the latest CU, as there are &lt;a href=&quot;https://support.microsoft.com/en-us/help/4040519/fix-automatic-seeding-in-availability-groups-randomly-causes-error-411&quot;&gt;fixes available&lt;/a&gt; for Automatic Seeding. Check.&lt;br /&gt;&lt;br /&gt;I had a look at the script used by the wizard to add the databases to the Availability Group, nothing too fancy to be fair. &lt;a href=&quot;https://www.brentozar.com/archive/2016/06/availability-group-direct-seeding-fix-database-wont-sync/&quot;&gt;Reading around&lt;/a&gt; seems that there is still a chance that things might suddenly break, so I took another path.&lt;br /&gt;&lt;br /&gt;Yes, a Full Backup (taken with the TFS Administration Console nonetheless) was supposed to be enough to enable Automatic Seeding as the recovery chain is started. Would another Transaction Log backup hurt? I don&apos;t think so.&lt;br /&gt;&lt;br /&gt;After taking the &lt;i&gt;faulty&lt;/i&gt;&amp;nbsp;database off the Availability Group, I ran the speedy Transaction Log backup and added the database back in the Availability Group with the script. Guess what, it worked! And my new TFS instance is up-and-running.&lt;br /&gt;&lt;br /&gt;Of course this is totally transparent as usual for TFS, as the configuration wizard is smart enough to set the right connection string from the beginning. But you still need to make sure the Availability Group is correctly set, otherwise at the first failover you will be left with nothing.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</description>
        <pubDate>Wed, 28 Mar 2018 08:44:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/03/28/something-strange-with-sql-server/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/03/28/something-strange-with-sql-server/</guid>
      </item>
    
      <item>
        <title>How Team Foundation Server saves you from a potential mess with IIS and SSL</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;This is an example of how TFS is robust enough to prevent you doing silly and potentially costly (in terms of time) mistakes.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Let’s say you are configuring a new instance, and you just got your SSL certificate installed on the machine. So you select the HTTPS and HTTP option in the configuration settings, and you select your certificate. And you get an error:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-3z1oMGaBaiY/WqkP4S3tKfI/AAAAAAAAE2o/wk9fMUg1MScy6WvyTMhxya_xT2nXtQwNwCLcBGAs/s1600/ssl0.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;162&quot; data-original-width=&quot;630&quot; height=&quot;102&quot; src=&quot;https://4.bp.blogspot.com/-3z1oMGaBaiY/WqkP4S3tKfI/AAAAAAAAE2o/wk9fMUg1MScy6WvyTMhxya_xT2nXtQwNwCLcBGAs/s400/ssl0.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Clicking on that link creates the correct bindings for that certificate. Fair enough.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;But the Public URL is not what you like, so you change it to &lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt;something else&lt;/b&gt;. And you go ahead. The result?&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-oJlzEuT4Dtg/WqkP4fTQafI/AAAAAAAAE2g/wuPQoGZv0qoprKCsAnabwE55qV6CIKClwCLcBGAs/s1600/ssl1.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;71&quot; data-original-width=&quot;674&quot; height=&quot;41&quot; src=&quot;https://3.bp.blogspot.com/-oJlzEuT4Dtg/WqkP4fTQafI/AAAAAAAAE2g/wuPQoGZv0qoprKCsAnabwE55qV6CIKClwCLcBGAs/s400/ssl1.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;The readiness checks prevent you from doing this. It also checks for SNI validity amongst the other things, something that comes handy when you deal with Chrome.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-g3U8Aq1KCVM/WqkQfkOVakI/AAAAAAAAE24/736Ysu0JZ6Mt0iyOPGF1SGsTgIL3GR0vACLcBGAs/s1600/ssl2.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;81&quot; data-original-width=&quot;814&quot; height=&quot;39&quot; src=&quot;https://4.bp.blogspot.com/-g3U8Aq1KCVM/WqkQfkOVakI/AAAAAAAAE24/736Ysu0JZ6Mt0iyOPGF1SGsTgIL3GR0vACLcBGAs/s400/ssl2.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</description>
        <pubDate>Wed, 14 Mar 2018 12:07:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/03/14/how-team-foundation-server-saves-you/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/03/14/how-team-foundation-server-saves-you/</guid>
      </item>
    
      <item>
        <title>Not all is lost if your cube gets corrupted…</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;I ran into this very odd situation yesterday with the Reporting capability of my production TFS instance – I realised the Incremental Analysis Database Sync job and the Optimize Databases job were running for hours!&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-tW3fVdhdkrw/WpggWu5c-0I/AAAAAAAAE1k/FG9wQhCAh9EE-g35pFdxGrhE3To9k2wwwCHMYCw/s1600-h/image_thumb2%255B2%255D&quot;&gt;&lt;img alt=&quot;image_thumb2&quot; border=&quot;0&quot; height=&quot;110&quot; src=&quot;https://lh3.googleusercontent.com/-ZZOMTSZBZsI/WpggXo3a8iI/AAAAAAAAE1s/_4NyDsvzMzUiIipe5ifxdeTXlQw1sL5dwCHMYCw/image_thumb2_thumb?imgmax=800&quot; style=&quot;background-image: none; border: 0px currentcolor; display: inline; margin: 0px;&quot; title=&quot;image_thumb2&quot; width=&quot;504&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I stopped the Incremental Analysis, and the Optimize Databases job completed successfully. Fine. &lt;br /&gt;But – for whatever reason – my SSAS cube got corrupted! I couldn’t even connect to the Analysis Engine with SSMS. I also found errors in the Event Viewer pointing at a corrupted cube:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-I6FMsvyItWk/WpggY1aimtI/AAAAAAAAE1w/p1xgG9tBU5YnVSFttzkJA5bmpCHXPuTOgCHMYCw/s1600-h/image_thumb1%255B2%255D&quot;&gt;&lt;img alt=&quot;image_thumb1&quot; border=&quot;0&quot; height=&quot;163&quot; src=&quot;https://lh3.googleusercontent.com/-cwc91A2EaJ8/WpggaDBm5fI/AAAAAAAAE10/fDzk24pxpikNhZYH68MFWIRLL-BoTJCIACHMYCw/image_thumb1_thumb?imgmax=800&quot; style=&quot;background-image: none; border: 0px currentcolor; display: inline; margin: 0px;&quot; title=&quot;image_thumb1&quot; width=&quot;453&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Errors in the metadata manager. An error occurred when loading the &apos;Team System&apos; cube, from the file, &apos;\\?\&amp;lt;path&amp;gt;\Tfs_Analysis.0.db\Team System.3330.cub.xml&apos;.&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Errors in the metadata manager. An error occurred when loading the &apos;Test Configuration&apos; dimension, from the file, &apos;\\?\&amp;lt;path&amp;gt;\Tfs_Analysis.0.db\Configuration.254.dim.xml&apos;.&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;Now, what to do? It looked like a full-blown &lt;a href=&quot;https://docs.microsoft.com/en-us/vsts/report/admin/rebuild-data-warehouse-and-cube&quot;&gt;rebuild&lt;/a&gt; was in order, and it is a costly operation, given that what the rebuild does is dropping both the data warehouse and the SSAS cube, rebuilds the warehouse with data from the TFS databases and then rebuilds the cube. &lt;br /&gt;&lt;br /&gt;It is not like being without source code or Work Items, but still… it is an outage, and it is painful to swallow.&lt;br /&gt;&lt;br /&gt;Now, in this case the data warehouse was perfectly healthy – the report shown an update age just a few minutes old. So all the raw data in this case is fine, and all you need to do is to rebuild how you &lt;em&gt;look&lt;/em&gt; at this data.&lt;br /&gt;&lt;br /&gt;The SSAS cube is just &lt;em&gt;a way of looking at&lt;/em&gt; the data warehouse. If your warehouse is fine, just wait for the next scheduled Incremental Analysis Database Sync job to run, it will recreate the cube (thus making the Analysis Database Sync job a Full one rather than an Incremental one) without going through the full rebuild.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-Url8Yr1Fc6E/Wpgga4dNvrI/AAAAAAAAE14/6idHIBYIrJ4pdDcIW_yl4MjQsAYRce5OACHMYCw/s1600-h/clip_image0025_thumb1%255B2%255D&quot;&gt;&lt;img alt=&quot;clip_image0025_thumb1&quot; border=&quot;0&quot; height=&quot;94&quot; src=&quot;https://lh3.googleusercontent.com/-bRSWWnbW77w/Wpggbw6abQI/AAAAAAAAE18/E55g-_tKsDQmlvY32Zr-gEAZNU2zJwbxQCHMYCw/clip_image0025_thumb1_thumb?imgmax=800&quot; style=&quot;background-image: none; border: 0px currentcolor; display: inline;&quot; title=&quot;clip_image0025_thumb1&quot; width=&quot;504&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Why didn’t I process this myself by using the WarehouseControlService? Simply because the less you mess with the scheduled jobs the better it is &lt;img alt=&quot;Smile&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; src=&quot;https://lh3.googleusercontent.com/-rT1mTrOwZCM/WpggdJFpw1I/AAAAAAAAE2A/nYRwXyyWbDcvOChRrNqkmkU2V6ulH_ZlgCHMYCw/wlEmoticon-smile%255B2%255D?imgmax=800&quot; /&gt;hiccups happen, but the system is robust enough to withstand such problems and pretty much self-heal itself once the stumbling block is removed.&lt;/div&gt;</description>
        <pubDate>Thu, 01 Mar 2018 15:47:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/03/01/not-all-is-lost-if-your-cube-gets_1/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/03/01/not-all-is-lost-if-your-cube-gets_1/</guid>
      </item>
    
      <item>
        <title>Containers and DevOps: where are we? Some of my thoughts.</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;I spent most of February talking about &lt;i&gt;Containers from the DevOps perspective&lt;/i&gt; – why you (might) ask? Well, the reason is pretty straightforward: if you are a newbie and you are trying to find resources on containerisation technologies (not just Docker and Kubernetes then!) you will mostly find developer-focused articles, closely followed by C-suite overviews.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: inherit; margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;822&quot; data-original-width=&quot;790&quot; height=&quot;400&quot; src=&quot;https://3.bp.blogspot.com/-V_qFunwGFDU/WpXBdD8ItEI/AAAAAAAAE0M/v7-wJGF7zpYWc95zwFbd6K6TjsXl82Y-ACLcBGAs/s400/pic1.png&quot; width=&quot;384&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;mso-no-proof: yes;&quot;&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shapetype  id=&quot;_x0000_t75&quot; coordsize=&quot;21600,21600&quot; o:spt=&quot;75&quot; o:preferrelative=&quot;t&quot;  path=&quot;m@4@5l@4@11@9@11@9@5xe&quot; filled=&quot;f&quot; stroked=&quot;f&quot;&gt; &lt;v:stroke joinstyle=&quot;miter&quot;/&gt; &lt;v:formulas&gt;  &lt;v:f eqn=&quot;if lineDrawn pixelLineWidth 0&quot;/&gt;  &lt;v:f eqn=&quot;sum @0 1 0&quot;/&gt;  &lt;v:f eqn=&quot;sum 0 0 @1&quot;/&gt;  &lt;v:f eqn=&quot;prod @2 1 2&quot;/&gt;  &lt;v:f eqn=&quot;prod @3 21600 pixelWidth&quot;/&gt;  &lt;v:f eqn=&quot;prod @3 21600 pixelHeight&quot;/&gt;  &lt;v:f eqn=&quot;sum @0 0 1&quot;/&gt;  &lt;v:f eqn=&quot;prod @6 1 2&quot;/&gt;  &lt;v:f eqn=&quot;prod @7 21600 pixelWidth&quot;/&gt;  &lt;v:f eqn=&quot;sum @8 21600 0&quot;/&gt;  &lt;v:f eqn=&quot;prod @7 21600 pixelHeight&quot;/&gt;  &lt;v:f eqn=&quot;sum @10 21600 0&quot;/&gt; &lt;/v:formulas&gt; &lt;v:path o:extrusionok=&quot;f&quot; gradientshapeok=&quot;t&quot; o:connecttype=&quot;rect&quot;/&gt; &lt;o:lock v:ext=&quot;edit&quot; aspectratio=&quot;t&quot;/&gt;&lt;/v:shapetype&gt;&lt;v:shape id=&quot;Picture_x0020_1&quot; o:spid=&quot;_x0000_i1026&quot; type=&quot;#_x0000_t75&quot;  style=&apos;width:451.5pt;height:469.5pt;visibility:visible;mso-wrap-style:square&apos;&gt; &lt;v:imagedata src=&quot;file:///C:/Users/MATTEO~1.ACM/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png&quot;   o:title=&quot;&quot;/&gt;&lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;mso-no-proof: yes;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Hey, it is totally understandable, don’t get me wrong. They are the hip and cool technology to be aware of in 2018, the market moved and – admittedly – they are a brilliant idea. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;The problem is that I believe (and this is a personal opinion) this drive to understand what containers are is skewing the market. Containers are not “&lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;like VMs, but better/cooler&lt;/i&gt;”, they exist to serve a business purpose.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;This business purpose is twin-faced: one appeals to the technological person – you can run the same &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;bits&lt;/i&gt;(meant as code, configuration, and toolset) everywhere with some resource tuning, and you are basically pushing Infrastructure as Code (another buzzword, but &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;so 2017…&lt;/i&gt;) to the limit. And this is very cool. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;But the other side of the business purpose – and the most important one IMHO – is that you can literally change how complex applications are deployed, maximising resource usage and enabling scenarios (blue-green is the first one I can think about) that were exclusive to the OTT before.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;mso-no-proof: yes;&quot;&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape  id=&quot;Picture_x0020_2&quot; o:spid=&quot;_x0000_i1025&quot; type=&quot;#_x0000_t75&quot; style=&apos;width:451.5pt;  height:472.5pt;visibility:visible;mso-wrap-style:square&apos;&gt; &lt;v:imagedata src=&quot;file:///C:/Users/MATTEO~1.ACM/AppData/Local/Temp/msohtmlclip1/01/clip_image003.png&quot;   o:title=&quot;&quot;/&gt;&lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-pZNfNHcVVq8/WpXBdGuf--I/AAAAAAAAE0I/P_lHdde2J7gN_r7wMI8MFBElxWiW6QaWgCLcBGAs/s1600/pic2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;677&quot; data-original-width=&quot;647&quot; height=&quot;400&quot; src=&quot;https://4.bp.blogspot.com/-pZNfNHcVVq8/WpXBdGuf--I/AAAAAAAAE0I/P_lHdde2J7gN_r7wMI8MFBElxWiW6QaWgCLcBGAs/s400/pic2.png&quot; width=&quot;381&quot; /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;This is what really matters. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;And to be totally fair with you, containerising an application is not that hard – but it won’t magically improve, it would remain a legacy application running in a container instead of a VM or a physical host.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;On the other hand, an application which actually adopts the philosophy behind containers has more chances to actually bring a tangible benefit to the company as it naturally adopts many best practices from DevOps.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;Yes, it is unavoidable – whenever you see &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;Containers&lt;/i&gt;you cannot avoid &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;DevOps&lt;/i&gt;. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;There is only a mistake you should never do. Containers &lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt;are not DevOps&lt;/b&gt;. DevOps collates together practices and concepts that fit in perfectly when using Containers, it’s not enabled by Containers. You can do DevOps with anything, including Containers.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;The two together are a &lt;i style=&quot;mso-bidi-font-style: normal;&quot;&gt;match made in heaven&lt;/i&gt;. Just don’t forget they are not the same thing.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;</description>
        <pubDate>Tue, 27 Feb 2018 20:39:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/02/27/containers-and-devops-where-are-we-some/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/02/27/containers-and-devops-where-are-we-some/</guid>
      </item>
    
      <item>
        <title>A quick look at the new SonarQube tasks for TFS and VSTS</title>
        <description>&lt;p&gt;Last week SonarSource released &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=SonarSource.sonarqube&quot;&gt;a new version&lt;/a&gt; of their tasks for TFS and VSTS, with a couple of very welcome additions.&lt;/p&gt;&lt;p&gt;Up to v3, we basically had to do everything manually – especially passing parameters with the /d:… switch.&lt;/p&gt;&lt;p&gt;v4 introduces a context-aware switch where you can specify what you are using for your build:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;a href=&quot;https://lh3.googleusercontent.com/-o8UZsylThcs/WocNjsgZXzI/AAAAAAAAEzU/Ictl3Ueaxcs3e3ncMBTP_20gsUFV0LU5wCHMYCw/s1600-h/image3&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;54&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-R_nGj80lirE/WocNkl5wiWI/AAAAAAAAEzY/OGeAUS1UsNAFljOOWu1-_Lbx54bhJoe7ACHMYCw/image_thumb1?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The &lt;strong&gt;Use standalone scanner&lt;/strong&gt; is quite interesting, as it guides you towards providing a .properties file:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-8H1xpcTHZ44/WocNlsy2mHI/AAAAAAAAEzc/WKUMJFur3HUZt-g6XKvJKPGlC8LP2nbgwCHMYCw/s1600-h/image7&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;144&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-J3r4LCvP8gs/WocNmkrR_pI/AAAAAAAAEzg/Y6XrtyqFQBwkwFfBHyJum01-3HH5dOMdACHMYCw/image_thumb3?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Also, gone are the days of using /d:… inline. There is a very handy &lt;strong&gt;Additional Properties&lt;/strong&gt; textbox to use with a line-by-line parsing, which makes property override very easy to do:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-eHOwq4oqrow/WocNngBwbbI/AAAAAAAAEzk/Jneq4OYDxhkBcNBxi4AcPWpvk5iTGfoWgCHMYCw/s1600-h/image11&quot;&gt;&lt;img width=&quot;404&quot; height=&quot;158&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-Kt3ic-7paOo/WocNoYar_0I/AAAAAAAAEzo/Rmi4kOwhcQ4hlWFB_PXGr5VUth5mAp8nQCHMYCw/image_thumb5?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Tasks are also split now into Prepare Analysis, Run Code Analysis and Publish Analysis Result, to allow a more streamlined design of your Build Definition.&lt;/p&gt;</description>
        <pubDate>Fri, 16 Feb 2018 16:58:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/02/16/a-quick-look-at-new-sonarqube-tasks-for/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/02/16/a-quick-look-at-new-sonarqube-tasks-for/</guid>
      </item>
    
      <item>
        <title>Build Agents losing connection after switch to HTTPS</title>
        <description>&lt;p&gt;A quick one I am dealing with these days – if you switch the Public URL of your Team Foundation Server to HTTPS you might see your Build Agents losing connection with the server.&lt;/p&gt;&lt;p&gt;This usually happens because of a &lt;a href=&quot;https://github.com/Microsoft/vsts-agent/issues/759&quot;&gt;known bug in TFS&lt;/a&gt; an OAuth token isn’t registered so all the authentication tokens on the agents expire.&lt;/p&gt;&lt;p&gt;Of course YMMV, so &lt;u&gt;always double check&lt;/u&gt; with Support before running a Stored Procedure on your production instance.&lt;/p&gt;&lt;p&gt;If you happen to get into this problem, you can mitigate it by reverting your HTTPS switch-on and changing the Public URL back to the HTTP version. Doing that will re-establish the connection between the server and the agents.&lt;/p&gt;</description>
        <pubDate>Thu, 08 Feb 2018 12:04:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/02/08/build-agents-losing-connection-after/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/02/08/build-agents-losing-connection-after/</guid>
      </item>
    
      <item>
        <title>Tips on dealing with WinRM and remoting using the Test Agent</title>
        <description>&lt;p&gt;Despite the push we’ve seen in the last few years, the Hosted Build Service might not be the right product for you for whatever reason.&lt;/p&gt;&lt;p&gt;Then, if you are in a situation where your agents aren’t running in the same domain as Team Foundation Server’s and you want to use the Test Agent then you really risk opening the Pandora’s box, courtesy of WinRM and PowerShell remoting.&lt;/p&gt;&lt;p&gt;And to be completely clear – I have nothing against them &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-trV7supafkQ/WmYfXU0TCHI/AAAAAAAAEyI/I4XS-DbSc4gvqT-Ri7HOVjC1diliJgiFQCHMYCw/wlEmoticon-smile%255B2%255D?imgmax=800&quot;&gt; the only downside is that they need to be approached in the right way, otherwise the can-of-worms effect is just behind the corner.&lt;/p&gt;&lt;p&gt;First and foremost, remember that whenever you target a machine for Test Agent deployment you only need to consider the Build Agent-Test Agent relationship. All the errors you will get are going to be from the Test box, not the build box.&lt;/p&gt;&lt;p&gt;So when you need to configure WinRM, the Test box is the machine that is going to be accepting the connections. While it sounds straightforward, sometimes things happen and one is tempted to look at the Build box first: don’t.&lt;/p&gt;&lt;p&gt;Also, if you really want to use HTTP and WinRM, remember that this is the trickiest combination – so think twice before going down that route!&lt;/p&gt;&lt;p&gt;Then in terms of errors – you will likely face WinRM errors of all sorts. The most common is this:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-zhVwUNaP2t8/WmYfYbGi0PI/AAAAAAAAEyM/-c_GHmzxEyM_QeS8puuf6dpraHcg57ebACHMYCw/s1600-h/image%255B4%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;152&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-FiLTS1-_qIU/WmYfZrI0q1I/AAAAAAAAEyQ/duF0bPDJj-MF1Mkb0p27rmiwNZHn5pLAwCHMYCw/image_thumb%255B2%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;If you are outside a domain then REMEMBER about &lt;a href=&quot;https://mattvsts.blogspot.co.uk/2012/05/standard-environment-in-visual-studio.html&quot;&gt;Shadow Accounts&lt;/a&gt; – it is the only way to keep identity issues to a minimum. You’ll also need to set the TrustedHosts value to the machines &lt;strong&gt;pushing&lt;/strong&gt; the agent.&lt;/p&gt;&lt;p&gt;Then this:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-p8riQ1-eO50/WmYfatY6dxI/AAAAAAAAEyU/s5k3Gi7rvm4vJY-eK_uyzV7igEcuoO4KgCHMYCw/s1600-h/image%255B8%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;85&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-WjAx-nuN9NE/WmYfboGKX4I/AAAAAAAAEyY/SOzAJW0CuisQPCB47NnllmfU9RO7hGBOwCHMYCw/image_thumb%255B4%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Remember that passwords need to match, and that mixing users at setup time isn’t really a good idea if you are going down the workgroup/non-trusted domain route. &lt;/p&gt;&lt;p&gt;Always triple check passwords, and I recommend to use the same account for both provisioning and execution, at least as a baseline. This will make sure you have a safety net incase things don’t pan out as expected.&lt;/p&gt;&lt;p&gt;Eventually there is this error, that really puzzles me:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-JH0gflOdw-w/WmYfcWBDRnI/AAAAAAAAEyc/arBo6omyJkAbyyxaxsXitMTdAmk7ymnEQCHMYCw/s1600-h/image%255B11%255D&quot;&gt;&lt;img width=&quot;244&quot; height=&quot;25&quot; title=&quot;image&quot; style=&quot;margin: 0px; display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-Qhz5mZk-NZQ/WmYfdM-0e_I/AAAAAAAAEyg/v1PxXzLwk3k_i8AetVEp_s4Pt14hy4BNACHMYCw/image_thumb%255B5%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This is actually an aggregated exception:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-mJdw9imuYfM/WmYfd6VlajI/AAAAAAAAEyk/6bg1Fs7yqGMXoOAVCFQ51A43XQPCCMPrwCHMYCw/s1600-h/image%255B15%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;66&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-t7RR61hmCCI/WmYfe0r5eZI/AAAAAAAAEyo/LVkqbmPm7MI8AV-cMVpxmea1yzK_RY_YgCHMYCw/image_thumb%255B7%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Look at UAC and execution context for this – it always happens when you are not running stuff as Administrator when that’s supposed to be elevated. It always drives me mad.&lt;/p&gt;</description>
        <pubDate>Mon, 22 Jan 2018 17:29:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/01/22/tips-on-dealing-with-winrm-and-remoting/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/01/22/tips-on-dealing-with-winrm-and-remoting/</guid>
      </item>
    
      <item>
        <title>Don’t overlook the details during a TFS outage</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Two weeks ago I dealt with a head-scratching outage. A few minutes of downtime, for a very stupid reason.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;So, we are starting in a situation of total outage. All the services which rely on the production AlwaysOn Availability Group cannot connect to the server. People start screaming, emails flow in at a rate of tens-per-second… well it wasn&apos;t that bad, but you get the idea &lt;span style=&quot;font-family: &amp;quot;Segoe UI Emoji&amp;quot;,sans-serif; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-char-type: symbol-ext; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-symbol-font-family: &amp;quot;Segoe UI Emoji&amp;quot;;&quot;&gt;😊&lt;/span&gt; outages are always annoying.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;So off we go with the usual stuff – the TFS Management Console does not load any data from the Data Tier, so the first point of call is checking the database servers.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Which are humming along totally fine. What the hell?! The network stack works as expected, I can ping all the machines involved!&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;When checking the database servers, I can see that the Availability Group is totally fine – everything is green, synchronised and with no issues. While this is very good on its own (no backups to restore, nothing to sweat too much about), it still does not explain why the Application Tier cannot talk to the Data Tier.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Then the awakening – whenever I try to connect to the AlwaysOn Listener I get a network error, while going directly to the database server works without problems. There it is!&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Pinging the Listener does not work indeed. But why? All the cluster resources were green, online.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;But for some reason the affected resource failed to perform its duties.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Given that all the other moving pieces were perfectly fine, a manual AlwaysOn failover solved the problem. The lesson learned here is that in a complex architecture there is always something unnoticeable but critical – it’s like breaking a malleolus.&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;/div&gt;</description>
        <pubDate>Wed, 10 Jan 2018 21:11:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2018/01/10/dont-overlook-details-during-tfs-outage/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2018/01/10/dont-overlook-details-during-tfs-outage/</guid>
      </item>
    
      <item>
        <title>Help! My TFS automatically redirects HTTPS to HTTP!</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;If you are deploying HTTPS to TFS and you want to keep HTTP for a while, you might experience a strange behaviour: despite following the &lt;a href=&quot;https://www.visualstudio.com/team-services/support/can-setup-https-secure-sockets-layer-ssl-team-foundation-server/&quot;&gt;documentation&lt;/a&gt;, every time you browse to your TFS Web Access with HTTPS you are redirected to HTTP.&lt;br /&gt;&lt;br /&gt;Fairly simple answer to this, and it is not because of any extra tool or technology: it has to do with the &lt;a href=&quot;https://docs.microsoft.com/en-us/vsts/security/websitesettings&quot;&gt;Public URL&lt;/a&gt; (it used to be called Notification URL) you set on the TFS itself.&lt;br /&gt;&lt;br /&gt;If you leave the HTTP version over there you will always get the HTTP version – even with HTTPS&amp;nbsp; – otherwise if you switch to an HTTPS URL there you will get the HTTPS version by default, and explicitly browsing the HTTP version keeps you on the non-secured protocol so you can keep them side by side.&lt;/div&gt;</description>
        <pubDate>Thu, 21 Dec 2017 08:01:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/12/21/help-my-tfs-automatically-redirects/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/12/21/help-my-tfs-automatically-redirects/</guid>
      </item>
    
      <item>
        <title>The impact of an upgrade to Team Foundation Server 2018</title>
        <description>&lt;p&gt;Usually upgrading Team Foundation Server is smooth and easy, but there is an exception this time around. It is not strictly related to TFS per-se, instead the &lt;em&gt;issue&lt;/em&gt; lies with the new deprecations introduced with version 2018.&lt;/p&gt;&lt;p&gt;If you have a local server with just a few users it might not be a huge deal, if you have hundred of users spanning across timezones all over the world things can get hot pretty quickly. I am not going to cover pre-requisites like versions of Windows, SQL Server, etc. but I want to focus on which are the deprecated features of the product.&lt;/p&gt;&lt;p&gt;Let’s take a look at what these deprecations are, and how to approach them to minimise service disruption.&lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;strong&gt;XAML Team Build&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;The elephant in the room is clearly about saying &lt;em&gt;farewell&lt;/em&gt; to the XAML Build. After 12 years it is time to say goodbye to the old system and move to the new Team Build.&lt;/p&gt;&lt;p&gt;While this is good news for some, it can be troublesome for others, especially if you have a complex Build Definition which hasn’t been updated for years.&lt;/p&gt;&lt;p&gt;The way to go here is to have a clear idea of what the build process does and try to replace it with as many OOB tasks as possible. Second choice would be to cherry-pick from the Marketplace, and eventually write PowerShell scripts.&lt;/p&gt;&lt;p&gt;You might be tempted to reuse existing scripts or automations – which is good – but my suggestion is about maintenance: less legacy scripts mean less problems when it comes to maintaining the process, and using OOB tasks makes easy to take advantage of the constant flow of upgrades you will get from the tasks.&lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;strong&gt;SharePoint integration&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;SharePoint and TFS 2018 is &lt;a href=&quot;https://webmailuk.quest.com/OWA/redir.aspx?REF=0odNuobr7dhin99rFTt6E6tauQ854X-jrBeVD4Zl-6qOAt88A0fVCAFodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy92c3RzL3JlcG9ydC9zaGFyZXBvaW50LWRhc2hib2FyZHMvZGVwcmVjYXRpb24vZGlzY29udGludWUtcHJlLXRmcy0yMDE3LXNoYXJlcG9pbnQtaW50ZWdyYXRpb24.&quot;&gt;no longer&lt;/a&gt; tightly coupled with SharePoint. This does not mean you will lose any of your Document Library, but only that some features won’t work anymore.&lt;/p&gt;&lt;p&gt;The impacted features are:&lt;p&gt;· SharePoint site creation when requesting a new Team Project&lt;p&gt;· Web Parts integration&lt;p&gt;· The Documents pane within Team Explorer&lt;p&gt;While this is a major change in the history of the product, it is not unexpected. In an era of APIs and extensibility, relying on some opaque integration which isn’t really fit for purpose anymore – it does not work with Office 365… – isn’t the way to go. But remember: the hyperlink field in Work Item Types is not changing, so you can still link your (now external) documents to Work Items.&lt;p&gt;The existing Excel reports and the Reporting Services reports are not affected by this change, they will still work normally as they leverage on different features of the product. What is going away is the tailor-made integration which nobody else can use, really.&lt;p&gt;&lt;b&gt;&lt;font size=&quot;2&quot;&gt;Lab Management deprecation&lt;/font&gt;&lt;/b&gt;&lt;p&gt;Lab Management in its current form will be deprecated and removed. This does not mean you cannot use virtual testing environments anymore – there are a couple of choices. You can use &lt;a href=&quot;https://webmailuk.quest.com/OWA/redir.aspx?REF=8im3TlJfYs2P3Z7T1-IPK9gGuFTF5ymCnd53DrG6dMiOAt88A0fVCAFodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy92c3RzL2J1aWxkLXJlbGVhc2UvY29uY2VwdHMvZGVmaW5pdGlvbnMvcmVsZWFzZS9kZXBsb3ltZW50LWdyb3Vwcy8.&quot;&gt;Deployment Groups&lt;/a&gt; or the &lt;a href=&quot;https://webmailuk.quest.com/OWA/redir.aspx?REF=-mpi429NYY4D8Sf7oyDc-g2fWMc7fGlTnkZY3QrWGtKOAt88A0fVCAFodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy92c3RzL2J1aWxkLXJlbGVhc2UvYXBwcy9jZC9zY3ZtbS9tYW5hZ2Utdm1zLXVzaW5nLXNjdm1t&quot;&gt;SCVMM task&lt;/a&gt; if you want to keep using what you are used to.&lt;p&gt;It is also worth mentioning that the MTM integration for Lab is going away too – not a huge surprise given how good the web interface is, but it is worth mentioning if you are a heavy user of Lab Management.&lt;p&gt;&lt;b&gt;&lt;font size=&quot;2&quot;&gt;Team Rooms&lt;/font&gt;&lt;/b&gt;&lt;p&gt;This is pretty much the only feature that is removed with no replacement – again, for good reason: Teams, Slack and others are such good collaboration tools, which focus only on having a good communication experience so they are the prime candidates for adoption.</description>
        <pubDate>Tue, 19 Dec 2017 17:17:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/12/19/the-impact-of-upgrade-to-team/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/12/19/the-impact-of-upgrade-to-team/</guid>
      </item>
    
      <item>
        <title>An unusual scenario for Release Management, part 2: production SonarQube upgrades</title>
        <description>&lt;p&gt;In the previous post we saw how you can automate SonarQube test upgrades, but now it is time for production.&lt;/p&gt;&lt;p&gt;As mentioned, my artifacts here will be the TFVC repository, and I am going to have just one environment as target: Production.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-aJ14SndfH7w/WiUYVlfUQnI/AAAAAAAAEwc/zLf3wLwAucIWmJkakK9-ZS6nzGixFoQ0QCHMYCw/s1600-h/image6&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;304&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-Hs9c3ASrL-Y/WiUYWi5Wq1I/AAAAAAAAEwg/Djmu61GWHcQb9c_Rv2bgB9VePGfi8RbZwCHMYCw/image_thumb2?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;There are three phases here, two Deployment Group phases and an Agentless phase. This is also where Tags come into play:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-9kw0TNAUZh8/WiUYXuf9JyI/AAAAAAAAEwk/rQBrF8HqwjsUBIt0IIshlnO-O_4Ao2wDACHMYCw/s1600-h/image10&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;283&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-e73w2xgeFN4/WiUYYvoWIzI/AAAAAAAAEwo/3rHuN576TioIMa9if2vuXvdJ8qsjdqNZACHMYCw/image_thumb4?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The Release Definition itself is going to be fairly straightforward – after all, I am assuming testing already happened so this automation is just aimed at saving time:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-zvF49XbM_Ag/WiUYZYvicrI/AAAAAAAAEws/obMdnmMGiOwdRCF9C-jzvVYYiTS90fT9ACHMYCw/s1600-h/image14&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;706&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-yRocixZAsvw/WiUYaUMgALI/AAAAAAAAEww/jQ3m8rV-Egw41k1mjTa4IrB7NdLTz1ewACHMYCw/image_thumb6?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The first phase will prepare the environment for the upgrade itself. It is going to copy the zip file to the location we’d like to use, unblock and extract the ZIP file, copy the plugins in use to the new instance and so on.&lt;/p&gt;&lt;p&gt;I am also using these variables to keep the process reusable, and I am taking the ALM Rangers template as a starting point, so everything will happen into C:\sq\:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-D4b2NAN0T74/WiUYbEpA1pI/AAAAAAAAEw0/t54hA4ljcJgbA9mqc8woyvy6ks_F9xGIgCHMYCw/s1600-h/image19&quot;&gt;&lt;img width=&quot;503&quot; height=&quot;112&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-J1woEB3wE10/WiUYcJH-gdI/AAAAAAAAEw4/9Bv2JcOh8u4NVMEYWCqwN7NopTj-6cHfgCHMYCw/image_thumb9?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/--MjEpRxdoQo/WiUYc_1qR0I/AAAAAAAAEw8/tS98ADgMAI82Jb-0YfYDiBBhujitNU9OwCHMYCw/s1600-h/image22&quot;&gt;&lt;img width=&quot;186&quot; height=&quot;76&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-4tFB5o3h8b0/WiUYd5PsJlI/AAAAAAAAExA/NRro-gNnb581smQ20Kn8GxDX3hNBQjgTQCHMYCw/image_thumb10?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-EYmq4FByvzA/WiUYeyaBy7I/AAAAAAAAExE/763OZ6hv9lUoedykm8x0dMXIAxn_TCabwCHMYCw/s1600-h/image27&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;305&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-31ELn0qoctU/WiUYf1jP9ZI/AAAAAAAAExI/xGhmf6iJd5wdtbrqufNxg7d0feHT8vMRQCHMYCw/image_thumb13?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The &lt;strong&gt;Start SonarQube Interactive&lt;/strong&gt; launches StartSonar.bat from PowerShell to make sure it is not going to make the task hang and run indefinitely.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-diT2iPyY9q0/WiUYgt_upAI/AAAAAAAAExM/gg32_0T9gMoEwOrkZMImkZibOlcZSev7QCHMYCw/s1600-h/image32&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;87&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-w4sGfRzk9WA/WiUYhjFE0WI/AAAAAAAAExQ/4BDEOk3oJ6QK3O6saQh9yInYb9iZ_3_TwCHMYCw/image_thumb16?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The Agentless phase is required because once you launch StartSonar.bat you will have to browse to the /setup URL and start the upgrade process. &lt;/p&gt;&lt;p&gt;I am going to get a notification (it could be anyone else here, even a group) and I am going to start the process. You could automate that, but it is surely better to do so manually IMHO. &lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-pWaSa70Ewc8/WiUYinbf3tI/AAAAAAAAExU/q6ZnVriRKOItZvun_17juUqII711LopXACHMYCw/s1600-h/image36&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;500&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-lTmYxf5BX-s/WiUYjTTNAEI/AAAAAAAAExY/3YvIAeur_38chg21lD_7N6qrIoFXm7uuACHMYCw/image_thumb18?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Once the upgrade is completed (and you stopped the StartSonar batch job, again I could automate this too but I am happy to have it included in the manual interaction for now) you can resume the pipeline with the second Deployment Group phase, which is going to remove the old service, install the new one and start it using the OOB batch scripts in your SonarQube instance.&lt;/p&gt;&lt;p&gt;This saves time (remember you can schedule this Release Definition too &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-Hxsd9LLXGuI/WiUYkbvXw2I/AAAAAAAAExc/PeB92aLqwl4Z25Hc6of59yAffnp7GfHZACHMYCw/wlEmoticon-smile2?imgmax=800&quot;&gt;) but the most important takeaway here is the value you get from automating the process and versioning your configurations. &lt;/p&gt;&lt;p&gt;It might be unorthodox, but it works quite well IMHO.&lt;/p&gt;</description>
        <pubDate>Mon, 04 Dec 2017 09:42:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/12/04/an-unusual-scenario-for-release_4/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/12/04/an-unusual-scenario-for-release_4/</guid>
      </item>
    
      <item>
        <title>An unusual scenario for Release Management, part 1: testing SonarQube upgrades</title>
        <description>&lt;p&gt;Among the many things I do I manage a SonarQube instance. Not a big deal to be fair with you, but it is a valuable tool and it has its quirks. You need to spend time on it.&lt;/p&gt;&lt;p&gt;So I thought about automating this process a little bit. It is a bit unusual, but it brings some value, so why not!&lt;/p&gt;&lt;p&gt;The result is a TFS or VSTS Team Project with a TFVC repository (TFVC is perfect for handling binary files!) and two Release Definitions, one for Test and one for Production. &lt;/p&gt;&lt;p&gt;The reason why there are two Definitions is because – oddly enough – the Test one came after the Production one (which is easier, you’ll discover why later on). I might revamp the whole thing in the future to have sequential environments, but this is it as of now &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-VFSoMmFTico/WiEoPIcE9HI/AAAAAAAAEvI/D5k6wnVGNXwiYMkHB8IRminLvdybiY2UgCHMYCw/wlEmoticon-smile2?imgmax=800&quot;&gt;&lt;/p&gt;&lt;p&gt;In the TFVC repository you are going to find folders for each SonarQube version I deployed on my server, together with the relevant sonar.properties file filled with the values you want, and a scripts folder with some utility scripts. &lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/--C1r4yfEYbQ/WiEoQtxV9cI/AAAAAAAAEvM/3PYPaftp3cMA9haHY3BITEiGGxhClPhJgCHMYCw/s1600-h/image2&quot;&gt;&lt;img width=&quot;244&quot; height=&quot;226&quot; title=&quot;image&quot; style=&quot;margin: 0px; display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-CsHYVMgFscQ/WiEoSKsNxOI/AAAAAAAAEvQ/DTBWm7wuE6knM6lZGRziaIqOAkBzXiSXACHMYCw/image_thumb?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The reason why I am not automating the configuration file creation (via a find-and-replace operation for example) is because you are explicitly told by SonarSource not to just replace this file with an existing version &lt;a href=&quot;https://docs.sonarqube.org/display/SONAR/Upgrading&quot;&gt;but to start from scratch&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;While testing your configuration you will need to work on it anyway, so it is a good idea to put it in a repository, and you will get versioning for free as well. Bonus.&lt;/p&gt;&lt;p&gt;Both my Release Definitions feature a Deployment Group: guess what, it contains my SonarQube server &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-VFSoMmFTico/WiEoPIcE9HI/AAAAAAAAEvI/D5k6wnVGNXwiYMkHB8IRminLvdybiY2UgCHMYCw/wlEmoticon-smile2?imgmax=800&quot;&gt;I also leveraged on Tags, in case I might want to have completely separate enviromnents, as the Deployment Group phases are marked to run only on machines that sport the right tag for the Release Definition. It isn’t the case for now though.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-Fbvoc59IBBk/WiEoTDOdrFI/AAAAAAAAEvU/VIfl0FRJuqgcyQVIIHOFBNmD_tOeaa4HgCHMYCw/s1600-h/image8&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;99&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-lRgNn2h8uTg/WiEoUG_DgRI/AAAAAAAAEvY/5wpBXDarR6IyrkM-IKKt2I5yitHT_prqACHMYCw/image_thumb4?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Now it comes the fun part, let’s start with the test upgrades. My process for testing SonarQube is as it follows:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Restore a backup of the production database&lt;/li&gt;&lt;li&gt;Get the new SonarQube version on the VM that hosts its services&lt;/li&gt;&lt;li&gt;Extract the new version, set the right values in the sonar.properties file (like different ports and java switches)&lt;/li&gt;&lt;li&gt;Check that the upgrade runs successfully&lt;/li&gt;&lt;li&gt;Verify all the involved plugins&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Like I said I am not going to automatically find and replace values in the sonar.properties file, and the latter steps aren’t really worth scripting, but the first two steps can benefit from an automated process.&lt;/p&gt;&lt;p&gt;This is what my &lt;strong&gt;testing pipeline &lt;/strong&gt;looks like:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-gEa1ziMAImU/WiEoVG0vKEI/AAAAAAAAEvc/VQTJHuPB3v8un4Tb71OICKrrhNW3EHcoACHMYCw/s1600-h/image12&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;335&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-ULwjSfjPTDk/WiEoWObeE_I/AAAAAAAAEvg/dHH33mAIjTYroMyQXdDt_0PZ52Zfk8FqgCHMYCw/image_thumb6?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Nothing too fancy, but it saves time. &lt;/p&gt;&lt;p&gt;The cool bit here IMHO is the Azure PowerShell script I am running to restore the database: given the Resource Group, Server, Database and SonarQube version (which is used to form the name) I can check if I already have a testing database – if not it starts restoring a backup copy from ten minutes before.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-1a-bgqPc6RM/WiEoXBCc4rI/AAAAAAAAEvk/Wka0o_-VmO0kEiWfeUUWSPRP2jIQBxWFwCHMYCw/s1600-h/image17&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;71&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-iScl3xEAhiI/WiEoX6TeMdI/AAAAAAAAEvo/lNByNBEjCB8DV8R_kMVtodlXNVmWgZfowCHMYCw/image_thumb9?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;If this &lt;em&gt;prerequisite check&lt;/em&gt; fails, I integrated the error handling so it stops the task immediately and marks the release as failed:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-2cmp17bQo5g/WiEoY_MHsBI/AAAAAAAAEvs/zXZ_70HsJawlzr19MG_S4xF-7vQiDRqlQCHMYCw/s1600-h/image21&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;144&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-bHlV_qpD-zE/WiEoZ_3AgyI/AAAAAAAAEvw/j8Yc7ghbM60fSnRq_AJ7CVU4NCYVm0h_QCHMYCw/image_thumb11?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-czfgBSNWob0/WiEoa4F2zaI/AAAAAAAAEv0/kTin1y427IMsXqW0LBotnApLRcdaTvhxgCHMYCw/s1600-h/image25&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;73&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-pJYWgjksdl4/WiEobgAQifI/AAAAAAAAEv4/ov7eabSXAs4RpL1zsTxhiDns4D6Z6TjXwCHMYCw/image_thumb13?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;How? Like this:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-nS3U3YuMZcE/WiEocvi1F0I/AAAAAAAAEv8/pZ9egVwm598Q6KqjwaBHDtRIl8MCrSOlACHMYCw/s1600-h/image30&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;129&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-pey2fZvC5jA/WiEodmXkV7I/AAAAAAAAEwA/WWO8qreQQE0iqycaVWRxITxS5RtFoh_SwCHMYCw/image_thumb16?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The &lt;strong&gt;Write-Error&lt;/strong&gt; statement stops the task execution and raises the error message, the &lt;strong&gt;Write-Host&lt;/strong&gt; statement with the specific ##vso line marks the task result as failed and the &lt;strong&gt;exit 1&lt;/strong&gt; line terminates the sessions so that whatever is next (the database restore!) is not executed.&lt;/p&gt;&lt;p&gt;Eventually at the end there is an Agentless phase which is just manual intervention with the required things to do:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-5_J-ql0bmmQ/WiEoenX58HI/AAAAAAAAEwE/YfXnfbz9rGgcailZqwsntDAd9whtjiUggCHMYCw/s1600-h/image34&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;389&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-CHZnU70FlvY/WiEof0ZYslI/AAAAAAAAEwI/hsoVedqlbX80isY4AXmygAl4-dIAPpY8ACHMYCw/image_thumb18?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I will go through the &lt;strong&gt;production pipeline&lt;/strong&gt; in the next post, as it is different &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-VFSoMmFTico/WiEoPIcE9HI/AAAAAAAAEvI/D5k6wnVGNXwiYMkHB8IRminLvdybiY2UgCHMYCw/wlEmoticon-smile2?imgmax=800&quot;&gt;&lt;/p&gt;</description>
        <pubDate>Fri, 01 Dec 2017 10:01:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/12/01/an-unusual-scenario-for-release/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/12/01/an-unusual-scenario-for-release/</guid>
      </item>
    
      <item>
        <title>Old but still very good, SlowCheetah with VSTS!</title>
        <description>&lt;p&gt;I was asked if there is a way of transforming configuration files at build time. Nothing else than the good, old and reliable SlowCheetah if you ask me &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-BsdOV47Xip0/WhLS5a15xvI/AAAAAAAAEt0/RHmd1lenvdE4HmNWmxztyLSz2ixDlN_UACHMYCw/wlEmoticon-smile%255B2%255D?imgmax=800&quot;&gt;&lt;/p&gt;&lt;p&gt;Just install the &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.SlowCheetah-XMLTransforms&quot;&gt;Extension&lt;/a&gt;, and you will be able to add your transformations by right clicking the .config file and selecting &lt;strong&gt;Add Transform&lt;/strong&gt;:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-EnW31WQE0aY/WhLS7JOzO1I/AAAAAAAAEt4/SH3SkUKaUV4I7oXMb6kngejIaJbvHZqJgCHMYCw/s1600-h/image%255B2%255D&quot;&gt;&lt;img width=&quot;244&quot; height=&quot;209&quot; title=&quot;image&quot; style=&quot;margin: 0px; display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-3429pB0Tc9E/WhLS86RqA6I/AAAAAAAAEt8/9HNQs3TNofgX6AivH6XRr05zTWmnl26cwCHMYCw/image_thumb?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;These are going to be based off the BuildConfiguration you defined in your Solution. Once this is done you can define your own settings, like this:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-v14FlmPMdR4/WhLS-DjWpzI/AAAAAAAAEuA/kmPYEzDQ3wwfjntubUcBebIvp0nugA4swCHMYCw/s1600-h/image%255B5%255D&quot;&gt;&lt;img width=&quot;244&quot; height=&quot;42&quot; title=&quot;image&quot; style=&quot;margin: 0px; display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-qGX6oDHQEDY/WhLS_pvoivI/AAAAAAAAEuE/wWvoLjVnr-khPrfoDNGYrmaa28b-ptkcgCHMYCw/image_thumb%255B1%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;where a transformation can be something like this:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-puz3Mmzv4uw/WhLTBGDDm_I/AAAAAAAAEuI/Xn7C6DGHYkYwOGRQq8WU7d-F1YjOmgFSACHMYCw/s1600-h/image%255B9%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;54&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-f_9eFosbPP4/WhLTCvtjV8I/AAAAAAAAEuM/mYMvmPeTGSYhFdY2agKk2AdsoHrpoIbHQCHMYCw/image_thumb%255B3%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;There are so many examples on how to do this, so please do not shoot on the pianist &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-BsdOV47Xip0/WhLS5a15xvI/AAAAAAAAEt0/RHmd1lenvdE4HmNWmxztyLSz2ixDlN_UACHMYCw/wlEmoticon-smile%255B2%255D?imgmax=800&quot;&gt;all of that goes into a Version Control System of sorts, and it can be built by VSTS or TFS or any other Build Engine.&lt;/p&gt;&lt;p&gt;Your Build Definition needs to specify a Configuration, either at Queue time or embedded into the Build Definition itself.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-MVLr2lm46fs/WhLTDxZpF4I/AAAAAAAAEuQ/M-W4wSlQHBsI0VzlE-uCveeoBvx_vTYIwCHMYCw/s1600-h/image%255B12%255D&quot;&gt;&lt;img width=&quot;185&quot; height=&quot;111&quot; title=&quot;image&quot; style=&quot;margin: 0px; display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-E6jZ_2LLSNo/WhLTFbHcS7I/AAAAAAAAEuU/hjvgHB_UeJMO4wc76rZOyCtaS-M9lFyyQCHMYCw/image_thumb%255B4%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-8Ibn0OG8tkU/WhLTGj1AZNI/AAAAAAAAEuY/CZjpFbsFBKID5Fm0s0OFxOPWQeEuMuZ9gCHMYCw/s1600-h/image%255B15%255D&quot;&gt;&lt;img width=&quot;244&quot; height=&quot;82&quot; title=&quot;image&quot; style=&quot;margin: 0px; display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-bPy94MMsfls/WhLTH1UqUhI/AAAAAAAAEuc/xgKpczsuUQQBUN1flpQy-jXSfHpQTAAxwCHMYCw/image_thumb%255B5%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The result? As expected:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-2iE_JyAFCaw/WhLTJZ3vz9I/AAAAAAAAEug/1livusSrk8oDAhHca3vVW96-77MJpcFYwCHMYCw/s1600-h/image%255B19%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;252&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-mwXY47q6cTo/WhLTKoZsimI/AAAAAAAAEuk/_M7IEOG-_tQiAHvkrJy7fXFyzcAROD4hwCHMYCw/image_thumb%255B7%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This isn’t really about VSTS or TFS per-se, but it is always a valuable approach to configuration management, and it was worth a refresher &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-BsdOV47Xip0/WhLS5a15xvI/AAAAAAAAEt0/RHmd1lenvdE4HmNWmxztyLSz2ixDlN_UACHMYCw/wlEmoticon-smile%255B2%255D?imgmax=800&quot;&gt;&lt;/p&gt;</description>
        <pubDate>Mon, 20 Nov 2017 13:05:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/11/20/old-but-still-very-good-slowcheetah/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/11/20/old-but-still-very-good-slowcheetah/</guid>
      </item>
    
      <item>
        <title>YAML Build Definitions in the Team Build, now what?</title>
        <description>&lt;p&gt;Among the news and announcements from Connect() you surely saw YAML Build Definitions mentioned, and you might wonder – what’s coming? How does this fit into the overall TFS/VSTS product?&lt;/p&gt;&lt;p&gt;Let’s start from the past, from 2011 – &lt;a href=&quot;https://visualstudio.uservoice.com/forums/330519-visual-studio-team-services/suggestions/2037625-provide-a-way-to-version-control-build-definitions&quot;&gt;this UserVoice&lt;/a&gt; request asks for something that enables versioning for Build Definitions.&lt;/p&gt;&lt;p&gt;Being 2011 many things weren’t as available or as robust as of today, and the current Team Build was not remotely on the horizon. Fast-forward six years, and we’ve got YAML Build Definitions. &lt;/p&gt;&lt;p&gt;Didn’t we have a way of tracing Build Definitions without YAML? Really? Six years to implement some kind of traceability? Well…:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-9k-EowfjTxw/WhKtad1fHnI/AAAAAAAAEtE/qP0prEfpw6U2vBiZ2FWqi5-YA6G4YKEmACHMYCw/s1600-h/image%255B3%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;169&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-io8pUl5q56s/WhKtb5bfk3I/AAAAAAAAEtI/EF_88Eh7oNAnet53FCg2jtx_PKetgEMMACHMYCw/image_thumb%255B1%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-SPXDiu96xAw/WhKtddXBroI/AAAAAAAAEtM/tsYH2v9luEkwYjuVuZua18Hw20Of1MVVQCHMYCw/s1600-h/image%255B7%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;337&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-QkerKq5wLUY/WhKtfVoajJI/AAAAAAAAEtQ/Tn9UTScmt1EdsaAdAZFnAsrJb899hlQSACHMYCw/image_thumb%255B3%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;There is a built-in &lt;strong&gt;Compare Difference&lt;/strong&gt; feature in both TFS and VSTS, and you can export your Build Definitions in a JSON file. So no, it is not just about traceability.&lt;/p&gt;&lt;p&gt;In the age of Continuous Delivery, Infrastructure as Code is critical. It saves an enormous amount of time and resources, and it is an extremely reliable way of automating the build and release process. &lt;/p&gt;&lt;p&gt;That is where YAML Build Definitions fit into the equation: they represent the concept of Infrastructure as Code pushed to the limit. You are not just treating the &lt;em&gt;deployed infrastructure&lt;/em&gt; as code, you are also adding the &lt;em&gt;deployment infrastructure &lt;/em&gt;in this definition, where as long as you have the required resources at your disposals (agent queues, build tasks, etc.) you are good to go.&lt;/p&gt;&lt;p&gt;This also does not mean the current Build Definitions are leaving – YAML is just for the Build Definitions, but the underlying technology is still the same. Also, with YAML you don’t get a visual breakdown of the tasks of the Build Definition:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-1OmSbGFb3rw/WhKtg-gEH2I/AAAAAAAAEtU/AaqrGf5EyKI0jVXrF-s66RBU71FWNUrBgCHMYCw/s1600-h/image%255B14%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;235&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-MUFLoFc1gqA/WhKtiPGnD8I/AAAAAAAAEtY/aKzjSHGu8V0aTOuCNiTXez0E0VIZfWPeACHMYCw/image_thumb%255B6%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-ZIKBHUFgsls/WhKtj_X4iwI/AAAAAAAAEtc/bzn77yyPszg0swWk_Zd3pCdFtZnTD_lOgCHMYCw/s1600-h/image%255B15%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;379&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-w2HQMbE4K6A/WhKtlS8UijI/AAAAAAAAEtg/z-RjXBH_OUwVt3LpdgoMDIrZsMqHF6CqgCHMYCw/image_thumb%255B7%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;It is a different way of doing the same thing – it might not cater for everybody (I am a big fan of the current Definition UI because it makes it understandable for everybody regardless of the expertise and the role), but it adds options for someone who needs a different experience and has different requirements. &lt;/p&gt;&lt;p&gt;At the end of the day, the more the better &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-svNpExlyTw4/WhKtmnd8nbI/AAAAAAAAEtk/y7ObcT0aFEYvbwiYjqvHdDtFpnL7ZB1SwCHMYCw/wlEmoticon-smile%255B2%255D?imgmax=800&quot;&gt;&lt;/p&gt;</description>
        <pubDate>Mon, 20 Nov 2017 10:25:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/11/20/yaml-build-definitions-in-team-build/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/11/20/yaml-build-definitions-in-team-build/</guid>
      </item>
    
      <item>
        <title>Unorthodox reporting with TFS/VSTS and PowerQuery</title>
        <description>&lt;p&gt;I am a huge Excel fan, because it allows easy data transformation and its flexibility is second to none, despite its complexity. But I also use other tools, depending on the requirements.&lt;/p&gt;&lt;p&gt;Many users instead only use Excel, with no possible alternative. Good or bad, this is the norm in many organisations and trying to change this habit too early while trying to push new concepts or ideas only puts strain on these users, raising barriers and potentially preventing the very change we are pursuing.&lt;/p&gt;&lt;p&gt;That is where PowerQuery comes to the rescue. Ironically enough, I discovered it &lt;em&gt;by accident&lt;/em&gt; trying to help my partner with some stuff from her work (she is a heavy Excel user) – PowerQuery is a very powerful data analysis engine (it goes hand to hand with &lt;a href=&quot;https://mattvsts.blogspot.co.uk/2014/07/tfs-audits-how-to-create-reports-on.html&quot;&gt;PowerPivot&lt;/a&gt;, another Excel Data Modelling tool I am really fond of!) that, in a nutshell and from a developer point of view, enables database-like querying and reporting scenarios.&lt;/p&gt;&lt;p&gt;So what can you do with it? Well, let’s take a very easy example: you have a TFS/VSTS query which returns all the non-done PBIs in a backlog, and you want to report on this query so you will know how many Work Items you have in a certain state, but &lt;strong&gt;without using TFS or VSTS at all&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-RxMgRl5l8SU/WgBQoPSWrCI/AAAAAAAAEqA/Cq67KDR2MlMQfYy5klWQsCjjQZy9urANwCHMYCw/s1600-h/image%255B3%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;142&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-fbetLY7P8II/WgBQpfpIj5I/AAAAAAAAEqE/vxOKPIp0i_4H93iEAva1-gB9sZqIF8yMACHMYCw/image_thumb%255B1%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;That is where Excel comes easily to the rescue: you can connect it to TFS/VSTS with the Team Add-in, downloading the raw data from the query you saved there:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-J6-bVbcS1Dg/WgBQqwoKNaI/AAAAAAAAEqI/vSO3_ro4VbYKGLVTaq19aT6xUmcJyiiZQCHMYCw/s1600-h/image%255B10%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;152&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-yzyc_LS9Z_8/WgBQsVoaBtI/AAAAAAAAEqM/yaNxZVoyUwA_S75MhSBAMeuYb-ZhDJaBgCHMYCw/image_thumb%255B4%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-pfJMlo8JKS4/WgBQtrjPnPI/AAAAAAAAEqQ/KmR87WfTz_sMVT5Q7swGNMglPkqMDJAugCHMYCw/s1600-h/image%255B14%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;104&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-B-IEVQZdyuM/WgBQuy_fulI/AAAAAAAAEqU/c4OzIFiajmAHCp2Q4PEz47my5qDzUbEaACHMYCw/image_thumb%255B6%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Select the raw data you want to use and from the Data ribbon, select &lt;strong&gt;From Table&lt;/strong&gt;. Excel will automatically recognise the data source you want to use, if you don’t select data beforehand you’d have to input the range manually.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-vCUBkhawaLY/WgBQweR5BII/AAAAAAAAEqY/JSf2jCI1OZw9ngvRpCGA4Z0_dHC47mcswCHMYCw/s1600-h/image%255B17%255D&quot;&gt;&lt;img width=&quot;208&quot; height=&quot;142&quot; title=&quot;image&quot; style=&quot;margin: 0px; display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-LwaJL7gEr84/WgBQxvyC0OI/AAAAAAAAEqc/v1lDW8PDhzQ4vuDEyD6jDzDxL2-94ACWwCHMYCw/image_thumb%255B7%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;PowerQuery now kicks in:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-vOauBQGPqvk/WgBQzQrD7YI/AAAAAAAAEqg/h274YB7TLNg0zK1tod0fEwm7mGtdbKOdQCHMYCw/s1600-h/image%255B21%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;192&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-IyCe8AGjwfc/WgBQ1DDDjXI/AAAAAAAAEqk/iYd1pGaggAw70OSR2-TzMd8sznBm7NbygCHMYCw/image_thumb%255B9%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;What we want to do is pretty easy and straightforward, so we are going to use &lt;strong&gt;Group By&lt;/strong&gt;:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-xvmrAfyfEUk/WgBQ2Qu2pOI/AAAAAAAAEqo/epzJzxiwRmo3N_m1yWZ87NU_sHJ-ie8xgCHMYCw/s1600-h/image%255B24%255D&quot;&gt;&lt;img width=&quot;244&quot; height=&quot;94&quot; title=&quot;image&quot; style=&quot;margin: 0px; display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-dvJaGVr8eBE/WgBQ3xjT8_I/AAAAAAAAEqs/nOflwm5Vmd8fl_88eknXySmiQ8I13JQaQCHMYCw/image_thumb%255B10%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;A basic group by works well here:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-ftoZuEd8_sg/WgBQ5Pv-RBI/AAAAAAAAEqw/DOXaJOcajL4tAotk63Tb-A409oxk3ufAwCHMYCw/s1600-h/image%255B37%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;314&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-RCFL2TPQEDc/WgBQ6kbr69I/AAAAAAAAEq0/VKyZujDYKesAdVWL6oX_VqloL_snwN8PgCHMYCw/image_thumb%255B15%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-i4LBU2vE2n8/WgBQ7khGrdI/AAAAAAAAEq4/8jnx5BrpQiopVFaeOp0H8gPw7qlIZILSQCHMYCw/s1600-h/image%255B40%255D&quot;&gt;&lt;img width=&quot;308&quot; height=&quot;116&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-wDSVM3gae84/WgBQ8vs-cwI/AAAAAAAAEq8/vRIH9ECCdXszojsw2_7YElHcH4v1P_SRgCHMYCw/image_thumb%255B18%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;If you use an advanced one you can group by based on multiple columns. If you have bugs as well as PBIs as requirements, that’s what you want:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-PMTdEes_3HY/WgBQ-JgwUQI/AAAAAAAAErA/7zQnXCdDN4YIymtXMcQGWUIrgv264rKbgCHMYCw/s1600-h/image%255B38%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;554&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-Yd7n2_aIHXc/WgBQ_MuJnfI/AAAAAAAAErE/2wZVLUNdaJkxrt41tIFG5gnDUkpeMuiMwCHMYCw/image_thumb%255B16%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-K5xTXRFf6To/WgBRAQ8xmJI/AAAAAAAAErI/BaSeF-ddYtU_vA8ac_UC18QL7eMokfTXwCHMYCw/s1600-h/image%255B39%255D&quot;&gt;&lt;img width=&quot;454&quot; height=&quot;111&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/--jvtput52wY/WgBRBtzySjI/AAAAAAAAErM/QSgY3SVrlow8sJpOVdQGAuVjRRoBNo-9wCHMYCw/image_thumb%255B17%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Now, if you Close &amp;amp; Load, you are done. How is this useful in any way?&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-HW8J8EQSm0o/WgBRCyEvX3I/AAAAAAAAErQ/5igGaLFvkcYsiyO3s2CwhZWxLtujNJSNQCHMYCw/s1600-h/image%255B43%255D&quot;&gt;&lt;img width=&quot;78&quot; height=&quot;144&quot; title=&quot;image&quot; style=&quot;margin: 0px; display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-J7fOA05KhIk/WgBREcPRYJI/AAAAAAAAErU/dz2cR1Aw0Eg8jXpsNPlqks2U9aRHetu6wCHMYCw/image_thumb%255B19%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Easy: this query is going to show on the side of your spreadsheet:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-S4bQXoddXtc/WgBRFxY6G3I/AAAAAAAAErY/zs2-gQAOYhImajnoaXMVcptisMPn4ISywCHMYCw/s1600-h/image%255B47%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;248&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-8GYeGHFyngs/WgBRHv7q1HI/AAAAAAAAErg/MfA2K2SlOZwkZSy6VRVltcFs06W4u-pBQCHMYCw/image_thumb%255B21%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Click on the Query you created, and you will be immediately shown the result:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-TcSPpqIyYGs/WgBRIz2W4QI/AAAAAAAAErk/97tdJLAl2pY-DZy9QGmkvnM-51sTdilhACHMYCw/s1600-h/image%255B54%255D&quot;&gt;&lt;img width=&quot;204&quot; height=&quot;96&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-I-zKyDJzE7k/WgBRKJmDHcI/AAAAAAAAEro/0KmatsIaMg0vh_4ash5GVk3iFLyM4xEFwCHMYCw/image_thumb%255B24%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;or &lt;a href=&quot;https://lh3.googleusercontent.com/-ZTyA7ecd1UQ/WgBRLbrENfI/AAAAAAAAErs/2pVDL_3KCqUrZ4yet4TgH6wIX5X6STjlgCHMYCw/s1600-h/image%255B55%255D&quot;&gt;&lt;img width=&quot;204&quot; height=&quot;64&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/--BK6qd5jwwo/WgBRNIpjjMI/AAAAAAAAErw/B_dv46w5__coiiank7gTXzUFOP_SfWXiwCHMYCw/image_thumb%255B25%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Moreover, it is quite dynamic.&lt;/p&gt;&lt;p&gt;Going deeper on it, the name isn’t cool at all – VSTS_&amp;lt;GUID&amp;gt; doesn’t say much. You can change it in the Query Editor:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-B1RYP-_GpWI/WgBROAdCkiI/AAAAAAAAEr0/fh-XdPZtEacfSd0cTGUfUL70P_NKCxDdQCHMYCw/s1600-h/image%255B58%255D&quot;&gt;&lt;img width=&quot;244&quot; height=&quot;171&quot; title=&quot;image&quot; style=&quot;margin: 0px; display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-M6_EZdb2SF8/WgBRPqu8U_I/AAAAAAAAEr4/iqwmUfPQ6BAD9eZUzhXUwV7xZg8xSUWxQCHMYCw/image_thumb%255B26%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Underneath you can see the Applied Steps – that is where things get interesting:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-orlNUxtAEck/WgBRQ5cma6I/AAAAAAAAEr8/Jfej2fSPUsYijGUYZMVdbXq0RPqu5P0nACHMYCw/s1600-h/image%255B61%255D&quot;&gt;&lt;img width=&quot;244&quot; height=&quot;109&quot; title=&quot;image&quot; style=&quot;margin: 0px; display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-FJ3XMeFa9ek/WgBRSL3BatI/AAAAAAAAEsA/dp226DRgCUc7-oD_d6aYMoHBME7vNG4VgCHMYCw/image_thumb%255B27%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;It is the visual representation of all the data transformation you applied. If you want to access these steps and change them, click on the Advanced Editor:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-bvL5J-gPFV4/WgBRTciVfRI/AAAAAAAAEsE/N5LBUKpLtpsuh0Y70zINxlK9Ap3bIe1_wCHMYCw/s1600-h/image%255B64%255D&quot;&gt;&lt;img width=&quot;244&quot; height=&quot;143&quot; title=&quot;image&quot; style=&quot;margin: 0px; display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-DqQ21Y0S2Ec/WgBRVCedGUI/AAAAAAAAEsI/sv1yIyJM7wg_klcpcODwxNs3aYRJ4JcvwCHMYCw/image_thumb%255B28%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;You will get the actual PowerQuery &lt;em&gt;raw&lt;/em&gt; &lt;em&gt;language &lt;/em&gt;(it is a &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/mt211003.aspx&quot;&gt;functional language&lt;/a&gt; called M by the way &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-6WMsjYyU5hU/WgBRWf9kWWI/AAAAAAAAEsM/6uOJsxKUt8MuLOJJ7igiU7wd5uom91p2wCHMYCw/wlEmoticon-smile%255B2%255D?imgmax=800&quot;&gt;):&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-VRJo2Ty-6uo/WgBRXkRXNrI/AAAAAAAAEsQ/Ol5B7YF6zcIgQsaXQd4skElNgaCeyj-RACHMYCw/s1600-h/image%255B68%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;106&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-Ki_YKKti4D8/WgBRY3lNdCI/AAAAAAAAEsU/OtsaOYPjeKow_t7zsao9x5qCNliDMUtPACHMYCw/image_thumb%255B30%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This is where you can start creating your custom transformations, leading to dynamic custom reports based on TFS/VSTS data. &lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-Ni638a-LJ0g/WgBRbmopzlI/AAAAAAAAEsY/a3movPFRsR4duwqmPUzWyWyfhwNQ2tGJACHMYCw/s1600-h/image%255B72%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;135&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-gT2LyXB8lHA/WgBRc8mNdVI/AAAAAAAAEsc/l-sd_dH9h-wNFT1kOhPK1pNExWHobYuZwCHMYCw/image_thumb%255B32%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-ZkuwrVq0dvI/WgBReoi5n3I/AAAAAAAAEsg/Mw2fZR-qmXgYBL6fG4Bqv9ssuGtIA1xuQCHMYCw/s1600-h/image%255B76%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;329&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-Rw9eUUYDfyQ/WgBRgVw4aGI/AAAAAAAAEsk/qVz_dtfqAEkGBBnTHAEwVyBBOOJ-r220ACHMYCw/image_thumb%255B34%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I really find it cool and fascinating to be fair, bringing together such different user requirements and scenarios – without mentioning that you can up your percentage of Excel knowledge by a notch, which is always a great skill to master &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-6WMsjYyU5hU/WgBRWf9kWWI/AAAAAAAAEsM/6uOJsxKUt8MuLOJJ7igiU7wd5uom91p2wCHMYCw/wlEmoticon-smile%255B2%255D?imgmax=800&quot;&gt;&lt;/p&gt;</description>
        <pubDate>Mon, 06 Nov 2017 12:11:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/11/06/unorthodox-reporting-with-tfsvsts-and/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/11/06/unorthodox-reporting-with-tfsvsts-and/</guid>
      </item>
    
      <item>
        <title>Help! I cannot complete my Pull Request in TFS!</title>
        <description>&lt;p&gt;A quick one today: if the &lt;strong&gt;Complete &lt;/strong&gt;button is greyed out in your Pull Request UI, ask your TFS Administrator to start the TFS Job Agent.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-EIrj7lo0-fY/WeCLfhhlzoI/AAAAAAAAEpc/mPJLW8Wvza4KJ8kcMPbco7ovHYhmMOseACHMYCw/s1600-h/image%255B2%255D&quot;&gt;&lt;img width=&quot;244&quot; height=&quot;53&quot; title=&quot;image&quot; style=&quot;margin: 0px; display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-7nbbOZ9tepE/WeCLgt2mf7I/AAAAAAAAEpg/NGBSxEjDkPcB5Lsi61XR1-XeWUCePkIdwCHMYCw/image_thumb?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The TFS Job Agent &lt;a href=&quot;https://docs.microsoft.com/en-us/vsts/tfs-server/architecture/background-job-agent&quot;&gt;does many things&lt;/a&gt; – including handling Pull Requests completion.&lt;/p&gt;</description>
        <pubDate>Fri, 13 Oct 2017 09:46:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/10/13/help-i-cannot-complete-my-pull-request/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/10/13/help-i-cannot-complete-my-pull-request/</guid>
      </item>
    
      <item>
        <title>Successfully handle disruptive changes with no downtime: the TFS 2015 example</title>
        <description>&lt;p&gt;It is something I’ve &lt;a href=&quot;https://mattvsts.blogspot.de/2015/08/pre-upgrading-large-team-project.html&quot;&gt;mentioned&lt;/a&gt; a few years ago but the question came out again during my presentation at &lt;a href=&quot;https://www.x-celerate.de/&quot;&gt;x-celerate.de&lt;/a&gt;:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;How should I handle a breaking change without service interruptions?&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This is a brilliant question, and the best example I can give out is the &lt;a href=&quot;https://docs.microsoft.com/en-us/vsts/tfs-server/upgrade/pre-upgrade&quot;&gt;TFS 2015 Upgrade&lt;/a&gt; that introduced support for renaming Team Projects.&lt;/p&gt;&lt;p&gt;If you don’t want to have downtime for your users the only mitigation is to introduce an intermediate migration layer which is going to be pouring data from the production stack and transform it into what you want.&lt;/p&gt;&lt;p&gt;The upside of this is that you are performing a very expensive and time-consuming operation out-of-band, so you can apply all the usual patterns for highly available application deployments.&lt;/p&gt;&lt;p&gt;The downside is that it is a costly operation, it could be compute, storage or something else but it will cost something out of it.&lt;/p&gt;&lt;p&gt;In my specific case I was able to perform a scheduled upgrade into the mandatory weekend window (yes, there was still a bit of downtime but it was due to the nature of the product and it was expected – you can overcome the hurdle if you are building your own product though) instead of having days of downtime due to the migration of data from a schema to another, at the cost of lots of storage space for the temporary tables and a dedicated server to run the tool.&lt;/p&gt;</description>
        <pubDate>Tue, 10 Oct 2017 10:10:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/10/10/successfully-handle-disruptive-changes/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/10/10/successfully-handle-disruptive-changes/</guid>
      </item>
    
      <item>
        <title>Re-release to an environment, don’t spin up a whole new deployment!</title>
        <description>&lt;p&gt;I know this happens on a regular basis – but it caught up my eye this morning as I am finishing up preparation for &lt;a href=&quot;https://www.x-celerate.de/home&quot;&gt;X-Celerate.de&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Let’s say your Release fails:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-AOwlU7HlI1M/Wdn-b3O051I/AAAAAAAAEoU/gg_7fkm9FacPw2fKs1N89CqJsjbi4NpPACHMYCw/s1600-h/image%255B3%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;204&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-J-mnN3s_FJ0/Wdn-dIIQatI/AAAAAAAAEoY/dErZ0FANqvcoYuWs-ER0OIogPuIYuX9ZQCHMYCw/image_thumb%255B1%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;What many do is to actually spin up a whole new instance of the Release itself. While this works ok, you are missing out on something important: traceability.&lt;/p&gt;&lt;p&gt;In a sea of releases, with microservices and multiple moving pieces, how would you be able to trace back what happened during that failed release?&lt;/p&gt;&lt;p&gt;Why don’t you actually try to re-deploy the same failed bits instead?&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-N42WmHpN9QE/Wdn-eGPUpcI/AAAAAAAAEoc/HcsPWWGKtaED9PmJJbAekxhgkUACVAoBQCHMYCw/s1600-h/image%255B6%255D&quot;&gt;&lt;img width=&quot;225&quot; height=&quot;127&quot; title=&quot;image&quot; style=&quot;margin: 0px; display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-rSY2JSai-CQ/Wdn-fMIhHPI/AAAAAAAAEog/sW7-c_7R9hwj5nHpWn9-XKUZ4qqkQOv4wCHMYCw/image_thumb%255B2%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Doing this provides you all the details about the previous failures, and it is going to be much easier to recall in case you might need to refer to the scenario in the future.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-rthSX9imMTI/Wdn-gQ8BJDI/AAAAAAAAEok/eKNgF7mBqVcswdB8BpiwozhTPhKf1u7rwCHMYCw/s1600-h/image%255B10%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;327&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-5gG2mG_WuiM/Wdn-hTJnsaI/AAAAAAAAEoo/8eUJC03QZUA-d1H3y_lcxxSeIJ-oNXTpACHMYCw/image_thumb%255B4%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Oh in case you were wondering… it was all about my lab’s DNS server, which cached the Kudu website of an App Service I was deploying as 404 &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-wkcEkSu9yiU/Wdn-iVm8dfI/AAAAAAAAEos/3_wZI4s8n-IUTnDJ1C9iJtomRrOcDrR1wCHMYCw/wlEmoticon-smile%255B2%255D?imgmax=800&quot;&gt; but it is Sunday after all…&lt;/p&gt;</description>
        <pubDate>Sun, 08 Oct 2017 10:31:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/10/08/re-release-to-environment-dont-spin-up/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/10/08/re-release-to-environment-dont-spin-up/</guid>
      </item>
    
      <item>
        <title>If you don’t package your stuff you are doing it wrong!</title>
        <description>&lt;p&gt;Packages are a thing, exactly like containers are.&lt;/p&gt;&lt;p&gt;I mean – who wants to spend countless time in moving files, editing configuration files and the likes? Nobody, I know, but still so many people don’t take advantage of application packaging when it comes to deploying stuff!&lt;/p&gt;&lt;p&gt;Let’s take an average web application as an example. What is the reason that pushes you to actually move stuff from a certain folder (DLLs, .configs, etc.) to the target server, instead of packaging your application’s components and move these instead?&lt;/p&gt;&lt;p&gt;All you need to do is adding &lt;strong&gt;/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true &lt;/strong&gt;to the MSBuild Arguments if you are using a traditional Build task. &lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-xbfD0PcyoUI/WdZJQJrZ8mI/AAAAAAAAEnk/uqJtAPgrj4Q5DFBLsLoSs8n8SlvazOvSgCHMYCw/s1600-h/image%255B7%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;58&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-1CMOVJ967Lo/WdZJR4LMlPI/AAAAAAAAEno/H9d6nWvWksMaEDD7NQVRx79lxxG5NArvQCHMYCw/image_thumb%255B3%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;If you are using .NET Core you just need to select the Zip Published Projects in the Publish task!&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-sk6zKnB9Yxs/WdZJS0wSVhI/AAAAAAAAEns/PkFmRL1LMyoQYoWnZMYKn9t7IWY1XQD2QCHMYCw/s1600-h/image%255B3%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;137&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-fjiQngAEHAk/WdZJT3cAUbI/AAAAAAAAEnw/k-YUIFwhTuoM9nle52x_Sk8TPFNshFzmwCHMYCw/image_thumb%255B1%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I just love the MSDeploy comeback. I am a huge supporter of this technology, because it makes life so much easier. It also has the side effect of enabling deployment to Azure in a snap, as it is one of the three supported delivery methods!&lt;/p&gt;&lt;p&gt;Let’s say you have a Build Definition and a Release Pipeline for this application. You want to deploy it to Azure – this is what you need to do:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-5A9SPxZMX3U/WdZJUw9BCSI/AAAAAAAAEn0/d3sod8H9_L0FaDhqj5sEIUqmvP0tMIHPgCHMYCw/s1600-h/image%255B11%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;262&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-tiogZRRNiKY/WdZJWALwl6I/AAAAAAAAEn4/7VPf5zq_7hki8pl8utzfD5ZfvaTlUSqDwCHMYCw/image_thumb%255B5%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;What if you want to run the same application (providing it actually works on-premise as well and it does not specifically require any technology not available in your datacentre) on your own servers?&lt;/p&gt;&lt;p&gt;Firstly you’ll need to create a Deployment Group in VSTS – this can be done either by statically running the appropriate PowerShell script on your machines (interactively, via RDP) or dynamically with a bit of PowerShell or Azure if you are using IaaS. It is required because IaaS/on-premise machines in a Deployment Group will run an agent.&lt;/p&gt;&lt;p&gt;Then you can run whatever script you need to install the pre-requisites your application requires and configure all the settings, and eventually you can use the IIS Web App tasks to interact with IIS. Focusing on the IIS Web App Deploy task…&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-IRFk6velfrA/WdZJXEgBAAI/AAAAAAAAEn8/VkHR1mKls-sZ9-SYG0p6-g8e42eP8ob8ACHMYCw/s1600-h/image%255B15%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;421&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-JvXoJeoEw54/WdZJYVBrinI/AAAAAAAAEoA/Rg30tRhBgZYzPEljIDPKp5VWh1vu8P90gCHMYCw/image_thumb%255B7%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;That Package is exactly the same package I used in the Azure deployment above. So you can easily have a Continuous Delivery pipeline on Azure and a different one (with the same cadence or a different one, your call) for on-premise, both starting from the same artifacts.&lt;/p&gt;&lt;p&gt;Containers are better – of course – but they require a minimum or ramp up or learning in order to actually implement them in a production environment. Moving to MSDeploy on the other hand is a matter of minutes at most, and it will provide a tangible improvement.&lt;/p&gt;</description>
        <pubDate>Thu, 05 Oct 2017 15:01:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/10/05/if-you-dont-package-your-stuff-you-are/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/10/05/if-you-dont-package-your-stuff-you-are/</guid>
      </item>
    
      <item>
        <title>A few catches on customising the new Work Item form</title>
        <description>&lt;p&gt;If you use Team Foundation Server 2017 you already know this:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-LcD_Ydfiz50/Wc4JfgTC8JI/AAAAAAAAEmg/aDTfhf0Ie8MVnvgYRipi425oN7FlqXGJgCHMYCw/s1600-h/image3&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;69&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-RidhBy7Y3YU/Wc4Jg_aYKsI/AAAAAAAAEmk/71OPFhsN9YQ8lnpSQKFZSETZq43VHBMYACHMYCw/image_thumb1?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The new form is brilliant: it makes a much better use of the screen space, with a better UX in general.&lt;/p&gt;&lt;p&gt;But what if you have forms that were already using customised fields and a specific arrangement of controls?&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-b1ptlJbeNmk/Wc4JhyMrFKI/AAAAAAAAEmo/4CBOMKxkIE0Z9ccWXsQub7efrKagACTPwCHMYCw/s1600-h/image7&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;237&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-CNn4y8Sb9Sg/Wc4JjOM_4_I/AAAAAAAAEms/qyc75vEpJ8Q4nKC4xBXuZep2P_u8WfwbACHMYCw/image_thumb3?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://docs.microsoft.com/en-gb/vsts/work/customize/manage-new-form-rollout#related-notes&quot;&gt;The answer&lt;/a&gt; is that Microsoft uses a best-effort transformation system to automatically migrate your old form to the new, but for some reason I found myself in this situation – these two tabs won’t migrate to the new layout.&lt;/p&gt;&lt;p&gt;The new customisation model is brilliant – everything is now much cleaner and easier to use. All you need to do is add what you want to the &lt;strong&gt;&amp;lt;WebLayout&amp;gt;&lt;/strong&gt; tag:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-gztbQ7jX0ig/Wc4JkMf0hDI/AAAAAAAAEmw/U43woXAt0SkpDrQsoogMREdszw3elt1fgCHMYCw/s1600-h/image11&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;248&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-u0iUgDsD8q8/Wc4JlNf8FtI/AAAAAAAAEm0/XkUHhCnV5PcZU1hCUTu09vaXkHDxyU7eQCHMYCw/image_thumb5?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;You can see that you now have Page, Group, Section as containers for controls, making life actually much easier when it comes to customisation. In my case I added two new &lt;strong&gt;Pages &lt;/strong&gt;with the relevant control in there:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-29qPjRIxiwY/Wc4JmcxqTyI/AAAAAAAAEm4/j0s0BuT-UKoLCc_havED60ZM5-QNCgbvACHMYCw/s1600-h/image22&quot;&gt;&lt;img width=&quot;145&quot; height=&quot;52&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-QaX8N29qstg/Wc4JnbYvqdI/AAAAAAAAEm8/KhB-7grrfX4IYblu4Kb2iY5tfi1J1LoqACHMYCw/image_thumb10?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-Z8nl2AlgzqI/Wc4JohkfERI/AAAAAAAAEnA/mQHBkthK2RUT8NlfQ4Xx62H2RP43d2tzwCHMYCw/s1600-h/image26&quot;&gt;&lt;img width=&quot;312&quot; height=&quot;612&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-BWSOFyhCiM4/Wc4JplnE8LI/AAAAAAAAEnE/ze1eHtiTyU0ut7qpsJRJCEi7QBOb8rExgCHMYCw/image_thumb12?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Of course you can customise the display layout by using the &lt;strong&gt;LayoutMode&lt;/strong&gt; attribute. All the documentation is available &lt;a href=&quot;https://docs.microsoft.com/en-gb/vsts/work/customize/reference/weblayout-xml-elements&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
        <pubDate>Fri, 29 Sep 2017 08:51:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/09/29/a-few-catches-on-customising-new-work_29/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/09/29/a-few-catches-on-customising-new-work_29/</guid>
      </item>
    
      <item>
        <title>How to encrypt your Team Foundation Server data tier</title>
        <description>&lt;p&gt;For all sorts of reasons (including GDPR looming on you) you might feel the need to encrypt your Team Foundation Server databases. Proper encryption at rest.&lt;/p&gt;&lt;p&gt;I realised this is not a really well documented scenario, but it is surprisingly easy to achieve.&lt;/p&gt;&lt;p&gt;What you need to do is leverage SQL Server TDE (Transparent Data Encryption), which is out-of-the-box since SQL Server 2008 onwards. It acts at page level and it is transparent, with little overhead.&lt;/p&gt;&lt;p&gt;The process of enabling TDE is very &lt;a href=&quot;https://docs.microsoft.com/en-us/sql/relational-databases/security/encryption/transparent-data-encryption&quot;&gt;well documented&lt;/a&gt;, and it is based off two keys (the &lt;strong&gt;master key&lt;/strong&gt; and the &lt;strong&gt;encryption key&lt;/strong&gt;) and a certificate. It is very straightforward if you have a single server as a data tier, off you go.&lt;/p&gt;&lt;p&gt;Now, this gets slightly more &lt;em&gt;complicated&lt;/em&gt; if you have (like me &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-G6GkCbCxQXQ/WcJQSU_1D3I/AAAAAAAAEks/t3o5Ee-5Rdo9qetz8wgqlMSw-SgU_OdFwCHMYCw/wlEmoticon-smile%255B2%255D?imgmax=800&quot;&gt;) AlwaysOn protecting your High Availability. Well, &lt;em&gt;complicated &lt;/em&gt;if it is the first time you approach the topic.&lt;/p&gt;&lt;p&gt;Working with AlwaysOn requires:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;On the &lt;strong&gt;Primary Replica&lt;/strong&gt; - creating the master key, the certificate and the encryption key. Remember to backup the master key and the certificate.&lt;/li&gt;&lt;li&gt;On the &lt;strong&gt;Secondary Replica&lt;/strong&gt; - creating the master key and the certificate. The certificate must be created from the backup of the Primary Replica!&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;After these two steps you can enable TDE on the database hosted on the Primary Replica, which then will propagate on the Secondary as per AlwaysOn schedule.&lt;/p&gt;&lt;p&gt;If your databases are already encrypted and you want to add them to an Availability Group you’ll need to do so manually – the wizard is not going to show encrypted databases to be added to the AG. &lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.sqlservercentral.com/articles/always+on/135432/&quot;&gt;This&lt;/a&gt; SQLServerCentral.com article features a set of queries I found really helpful to get started. &lt;/p&gt;&lt;p&gt;A suggestion though: prepare a single query for the Primary Replica preparation, run it, prepare a single one for the Secondary Replica preparation, run it, and eventually encrypt from a separate query. &lt;/p&gt;&lt;p&gt;The reason why I say this is simple: if anything goes wrong before you encrypt the database you can easily drop the master key, the certificate or the encryption key and start again.&lt;/p&gt;&lt;p&gt;Eventually, remember that encryption for large databases can take a long time. During this time, the process might stop because of database size, so remember to &lt;a href=&quot;https://blogs.msdn.microsoft.com/samlester/2015/06/23/transparent-data-encryption-tde-stuck-in-state-2-encryption-in-progress/&quot;&gt;check the logs&lt;/a&gt; as well so you can restart it if you need to.&lt;/p&gt;</description>
        <pubDate>Wed, 20 Sep 2017 11:26:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/09/20/how-to-encrypt-your-team-foundation/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/09/20/how-to-encrypt-your-team-foundation/</guid>
      </item>
    
      <item>
        <title>Why Work Item rules are so important</title>
        <description>&lt;p&gt;I was on holiday for the last couple of weeks so I had only a limited coverage of what happened since the beginning of the month &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-6I2ErKhIjmQ/WcElBwSVYoI/AAAAAAAAEkA/2e39hLHibqgMDeAwl_df0eWejeGMYvUAwCHMYCw/wlEmoticon-smile%255B2%255D?imgmax=800&quot;&gt; but I could not miss the release of &lt;a href=&quot;https://docs.microsoft.com/en-us/vsts/release-notes/2017/aug-28-team-services#customizable-work-item-rules&quot;&gt;custom Work Item rules&lt;/a&gt; on VSTS.&lt;/p&gt;&lt;p&gt;Why such an emphasis on my end? Well, because custom rules on Work Items involved fiddling with xml files and command line tools or using the &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=KarthikBalasubramanianMSFT.TFSProcessTemplateEditor&quot;&gt;Process Template Editor&lt;/a&gt; in Visual Studio and a UI that is &lt;em&gt;a bit tough&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-dxZrt-V--Xs/WcElDARU5LI/AAAAAAAAEkE/_e03XYt6KzwLiRSwuRJM1HVb9XhVV7I0ACHMYCw/s1600-h/image%255B4%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;348&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-MTPF8tUsUCk/WcElEVkRqmI/AAAAAAAAEkI/QKw_ZQ-D4oETkL_QYLP0IMh6F8xRLUnNACHMYCw/image_thumb%255B2%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-CPsPyTFHqUw/WcElFfBFarI/AAAAAAAAEkM/woEAfV7HUZwO32wH0CmxBiNE06ww_pcbQCHMYCw/s1600-h/image%255B8%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;389&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-Upnl46z8KLE/WcElGZa11FI/AAAAAAAAEkQ/Gdrr-CBh4S8wqBF4Sbiq_hD7x5ZI9Os4gCHMYCw/image_thumb%255B4%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;It is something that any TFS administrator does on a regular basis though. Now &lt;a href=&quot;https://docs.microsoft.com/en-us/vsts/work/process/custom-rules&quot;&gt;rules&lt;/a&gt; in VSTS can now be defined in a web UI with a consistent experience and multiple sets of conditions and actions can be defined easily in the same page.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-iz1PAUaXXMo/WcElHiIKgdI/AAAAAAAAEkU/7pCcx5p6JTAIMfzCAuAJ7mWbr676CfpCACHMYCw/s1600-h/image%255B12%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;526&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-9wEY7JqNYec/WcElI9X8MbI/AAAAAAAAEkY/VGzUH6eTHush7MtxY2ZlrcSKci3VU-FdgCHMYCw/image_thumb%255B6%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Also, this makes involving team managers in the definition of these rules extremely easy, as there is no Visual Studio, XML, command line involved anymore. &lt;/p&gt;</description>
        <pubDate>Tue, 19 Sep 2017 14:09:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/09/19/why-work-item-rules-are-so-important/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/09/19/why-work-item-rules-are-so-important/</guid>
      </item>
    
      <item>
        <title>You might not know this: Service Execution History in VSTS</title>
        <description>&lt;p&gt;How would you know how many times your Service Endpoint is invoked, with what result and by who?&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-BL-JBaFDH_E/Wabi2tTW6oI/AAAAAAAAEjU/5xMsHuAVMXoF1B8IeyNezCNuRi-BNW74gCHMYCw/s1600-h/image%255B3%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;139&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-YfNK0pPEaik/Wabi37RKBcI/AAAAAAAAEjY/QRK-OlX3gk005yYUPf92J9Z9TBPQjl6HACHMYCw/image_thumb%255B1%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;It is neatly after the Details and Roles tabs in the Service Endpoint list for each Service Endpoint &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-jcAVM5YddtU/Wabi5NZyvfI/AAAAAAAAEjc/9aazn5EckZMlpMiPM7rwo-PYx4a7XG54QCHMYCw/wlEmoticon-smile%255B2%255D?imgmax=800&quot;&gt;&lt;/p&gt;</description>
        <pubDate>Wed, 30 Aug 2017 16:08:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/08/30/you-might-not-know-this-service/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/08/30/you-might-not-know-this-service/</guid>
      </item>
    
      <item>
        <title>Shadow code indexing jobs after upgrading to TFS 2017.2</title>
        <description>&lt;p&gt;Just a quick one – if you remove the Search Server before upgrading to TFS 2017.2, you might see failing Git_RepositoryCodeIndexing or TFVC_RepositoryCodeIndexing jobs raising a &lt;i&gt;Microsoft.VisualStudio.Services.Search.Common.FeederException: Lots of files rejected by Elasticsearch, failing this job &lt;/i&gt;error.&lt;/p&gt;&lt;p&gt;The reason why this happens is because the extension is automatically enabled on the collections, triggering these jobs.&lt;/p&gt;&lt;p&gt;So check your extensions after the upgrade &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-b4sNRPWrMOs/WZb6VJg3luI/AAAAAAAAEi0/WQFdFFalKdQqiLSfJZzXBDvYlYN_8g6NACHMYCw/wlEmoticon-smile%255B2%255D?imgmax=800&quot;&gt;&lt;/p&gt;</description>
        <pubDate>Fri, 18 Aug 2017 14:31:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/08/18/shadow-code-indexing-jobs-after/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/08/18/shadow-code-indexing-jobs-after/</guid>
      </item>
    
      <item>
        <title>Run a SonarQube analysis in VSTS for unsupported .NET Core projects</title>
        <description>&lt;p&gt;With some projects you might face this:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;error MSB4062: The &quot;IsTestFileByName&quot; task could not be loaded from the assembly &amp;lt;path&amp;gt;\.sonarqube\bin\SonarQube.Integration.Tasks.dll.&lt;/strong&gt;&lt;p&gt;It is a &lt;a href=&quot;https://jira.sonarsource.com/browse/SONARMSBRU-310&quot;&gt;known issue&lt;/a&gt; I’m afraid, involving (among the others) .NET Standard. &lt;p&gt;There is a fairly straightforward workaround IMHO. Instead of using the Scanner for MSBuild as you would, use the CLI scanner that is now provided by VSTS:&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-Fcpm7Xuu7Dk/WYwdwnCYlgI/AAAAAAAAEiQ/enQs6NSg-mYaCQujqqyEhmW36TueloOyQCHMYCw/s1600-h/sq0%255B2%255D&quot;&gt;&lt;img width=&quot;244&quot; height=&quot;109&quot; title=&quot;sq0&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;sq0&quot; src=&quot;https://lh3.googleusercontent.com/-1DhR-Ez_vQU/WYwdxvUN_XI/AAAAAAAAEiU/jOiPsx1fCHIR9VrJGnGakxCtn_n00XIZgCHMYCw/sq0_thumb?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;p&gt;This is enough to let the scanner do its job. This approach can bring a different issue – if you &lt;a href=&quot;http://mattvsts.blogspot.co.uk/2017/06/a-few-nuggets-from-using-tfsvsts-and.html&quot;&gt;use branches&lt;/a&gt; to identify projects in SonarQube, or if you have dynamically set properties, and having a fixed, static properties file doesn’t really work.&lt;p&gt;Still, nothing really blocking. Do you see the PowerShell Script above? &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-Q8FAyUPbyb0/WYwdyZMy9aI/AAAAAAAAEiY/FFH2HgZqqPQgtD0suyQGRDrBUTdBy0cNACHMYCw/wlEmoticon-smile%255B2%255D?imgmax=800&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-tM20oUejKHM/WYwdzd_xeYI/AAAAAAAAEic/tgyo2hYpTVgGNRGGcsHfDA3722j02Vl7wCHMYCw/s1600-h/sq1%255B3%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;264&quot; title=&quot;sq1&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;sq1&quot; src=&quot;https://lh3.googleusercontent.com/-KvvUE4xENBA/WYwd0fyDcjI/AAAAAAAAEig/ePY_5DcmNtEIwsmCTXYMUHhOd4BPZOS_wCHMYCw/sq1_thumb%255B1%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;p&gt;This is an example of what you can do – a bit rough, it just adds a line at the end of the file stating the branch to analyse. It can also be much cleaner, but still &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-Q8FAyUPbyb0/WYwdyZMy9aI/AAAAAAAAEiY/FFH2HgZqqPQgtD0suyQGRDrBUTdBy0cNACHMYCw/wlEmoticon-smile%255B2%255D?imgmax=800&quot;&gt;&lt;/p&gt;&lt;p&gt;Remember that you can always manipulate files in the agent, and that’s what I do. Add whatever line you want with a script like this so that you have granular control in the same way as adding &lt;strong&gt;/d:…&lt;/strong&gt; to the parameters in the regular MSBuild task.&lt;/p&gt;</description>
        <pubDate>Thu, 10 Aug 2017 08:48:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/08/10/run-sonarqube-analysis-in-vsts-for/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/08/10/run-sonarqube-analysis-in-vsts-for/</guid>
      </item>
    
      <item>
        <title>My take on build pools optimisation for the larger deployments</title>
        <description>&lt;p&gt;If you have a large pool of Build Agents it can be easy to incur in a terrible headache: plenty of hardware resources to handle, capabilities, pools, queues, etc.&lt;/p&gt;&lt;p&gt;Bearing this in mind, having a single &lt;em&gt;default &lt;/em&gt;pool is the last thing you want IMHO:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-fHA4q1f-1C8/WX-OSlLNFDI/AAAAAAAAEhQ/yNuzLAflhm8-8AIUyRPTtbrcZfuh1p06wCHMYCw/s1600-h/image%255B2%255D&quot;&gt;&lt;img width=&quot;151&quot; height=&quot;82&quot; title=&quot;image&quot; style=&quot;margin: 0px; display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-Ur71mdLmeS4/WX-OTpnX1RI/AAAAAAAAEhU/Uod9XawdSQs9Jbo1dnSIeR4mpUmw25PuwCHMYCw/image_thumb?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;There are exceptions to this of course, like if you work on a single &lt;em&gt;system&lt;/em&gt; (loosely defined, like a single product or a single suite of applications) or if you have a massive, horizontal team across the company. &lt;/p&gt;&lt;p&gt;Otherwise pulling all the resources together can be a bit of a nightmare, especially if company policy gets in the way – what if each development group/product team/etc. needs to provide hardware for their pools?&lt;/p&gt;&lt;p&gt;Breaking this down means you can create pools based on corporate organisation (build/division/team/whatever), on products (one pool per product or service) or on geography.&lt;/p&gt;&lt;p&gt;Performance should be taken into account in any case: you can add &lt;strong&gt;custom capabilities&lt;/strong&gt; marking something special about your machines:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-jzcEVhwKYFg/WX-OUjWTbSI/AAAAAAAAEhY/2iHjfgPg6DEsU1BNlX2EHlxDj25hvGlvACHMYCw/s1600-h/image%255B5%255D&quot;&gt;&lt;img width=&quot;244&quot; height=&quot;100&quot; title=&quot;image&quot; style=&quot;margin: 0px; display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-Bo5qFFgO3EU/WX-OVjik5EI/AAAAAAAAEhc/MUf0VkVlAtM2wh_VKb8D2QkeQnwIwgwDQCHMYCw/image_thumb%255B1%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Do you need a CUDA-enabled build agent for some SDKs you are using? Add a capability. Is your codebase so legacy or massive that takes advantage of fast, NVMe SSDs? Add a capability. You get the gist of it after a while.&lt;/p&gt;&lt;p&gt;That becomes very nice, because with capabilities you can define your perfect build requirements when you trigger the build, and the system is going to choose the one that has all you need – saving you the hassle of manually finding what you need.&lt;/p&gt;&lt;p&gt;Maintaining these Build Agents is also important – that is why a &lt;strong&gt;Maintenance Job&lt;/strong&gt; can be scheduled to clean up the _work folder in the agent:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-wP2fTsSSr8E/WX-OWb-jxqI/AAAAAAAAEhg/bPanKJywidgteopvtH7cy5RV4Xzo7rsjgCHMYCw/s1600-h/image%255B10%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;259&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-4t28wXszKKk/WX-OXZOBC1I/AAAAAAAAEhk/6UHYXRGIUMotURWLO_kl6TEMK6BAfQOFQCHMYCw/image_thumb%255B4%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This can have an impact on your pools – that is why you can specify that only a certain percentage is going to undergo the job at once. Everything is also audited, in case you need to track down things going south.&lt;/p&gt;</description>
        <pubDate>Mon, 31 Jul 2017 20:09:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/07/31/my-take-on-build-pools-optimisation-for/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/07/31/my-take-on-build-pools-optimisation-for/</guid>
      </item>
    
      <item>
        <title>So many things I like in the new Release Editor!</title>
        <description>&lt;p&gt;Change is hard to swallow, it is the human nature and we cannot do anything about it &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-IjbNOa5MwAQ/WXjNp2cFbTI/AAAAAAAAEgI/9iTljzHLV7o3RgDAHZCOPm-T_0iFUuX2QCHMYCw/wlEmoticon-smile%255B2%255D?imgmax=800&quot;&gt; so like every change, the new Release Editor can be a surprise for some.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-pXE75405SOw/WXjNrMWFcKI/AAAAAAAAEgM/udQ00yZukBMTyfcKkkQADXUW1MNRDURIQCHMYCw/s1600-h/image%255B3%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;304&quot; title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-8yasNGRjE8A/WXjNsHcJw3I/AAAAAAAAEgQ/_6BXACuFWCQVyPbDAgIefvpt_76TZkqFgCHMYCw/image_thumb%255B1%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;To be fair with you, I think it is a major step ahead, for a few reasons. Usability is on top of the pile of course, as I can have a high level overview of what my pipeline does without digging into the technical details of the process.&lt;/p&gt;&lt;p&gt;Then if you look at the Artifacts section, you will see the amount of sources you can choose from:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-4ny9fZ1_bzM/WXjNtNd8x2I/AAAAAAAAEgU/xAJMtP64laEeigq3EBdhuDO9pojyI4mdgCHMYCw/s1600-h/image%255B6%255D&quot;&gt;&lt;img width=&quot;227&quot; height=&quot;244&quot; title=&quot;image&quot; style=&quot;margin: 0px; display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-hKX0AH7FQF8/WXjNuA1hBfI/AAAAAAAAEgY/JNuSNDmyusUEcvAuJ6TNeNh6-NQRsFnxACHMYCw/image_thumb%255B2%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Being VSTS a truly interoperable DevOps platform spoils you for choice – I really appreciate the having Package Management in such a prominent place, because it enables all sorts of consumption scenarios for NuGet packages as a build output, including a &lt;strong&gt;cross-organisation&lt;/strong&gt; open model.&lt;/p&gt;&lt;p&gt;Then on the &lt;strong&gt;Environments &lt;/strong&gt;section, the templates provided cover lots of scenarios and not only with cloud technologies. One that is going to be really appreciated in hybrid DevOps situations is the &lt;strong&gt;IIS Website and SQL Database Deployment&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-XnXeiI7F1BU/WXjNvIzMdOI/AAAAAAAAEgc/KGu55vVHhDgRujTBjoKbcEBaXLRwvl7-QCHMYCw/s1600-h/image%255B9%255D&quot;&gt;&lt;img width=&quot;244&quot; height=&quot;54&quot; title=&quot;image&quot; style=&quot;margin: 0px; display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-qQ08l_At3Io/WXjNwG7IViI/AAAAAAAAEgg/QsA1DEksGicqDuxm1kSvb4Clrr70vhUAQCHMYCw/image_thumb%255B3%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This template creates a two phase deployment that serves as a starting point for most on-premise deployments with IIS and SQL Server. &lt;/p&gt;&lt;p&gt;The Web App Deployment supports XML transformations and substitutions by default:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-3_eoPvp3te0/WXjNxNBFPVI/AAAAAAAAEgk/xhio0jWZkTEh7nUGFcToUYno37wmCrnKwCHMYCw/s1600-h/image%255B12%255D&quot;&gt;&lt;img width=&quot;244&quot; height=&quot;143&quot; title=&quot;image&quot; style=&quot;margin: 0px; display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-OQh8FcjnFbU/WXjNybzdELI/AAAAAAAAEgo/KjoFm7Iv3-43oxSG3mdJzQtH5bem55kLgCHMYCw/image_thumb%255B4%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The data side of the story is really interesting IMHO as it employs DACPACs by default, together with a .sql file and inline SQL options:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-jQJGkHiaY3E/WXjNzd6Jm-I/AAAAAAAAEgs/88EbnDqxjL8B9O-IbzNgOXMOmutdELcYQCHMYCw/s1600-h/image%255B15%255D&quot;&gt;&lt;img width=&quot;186&quot; height=&quot;169&quot; title=&quot;image&quot; style=&quot;margin: 0px; display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-AzbLjmO-2kY/WXjN0RKvcjI/AAAAAAAAEgw/CdtFGtrMgUsxgKGu84ARe8rRzRpTtz4NgCHMYCw/image_thumb%255B5%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I think it is clear I really like it &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-IjbNOa5MwAQ/WXjNp2cFbTI/AAAAAAAAEgI/9iTljzHLV7o3RgDAHZCOPm-T_0iFUuX2QCHMYCw/wlEmoticon-smile%255B2%255D?imgmax=800&quot;&gt;&lt;/p&gt;</description>
        <pubDate>Wed, 26 Jul 2017 17:13:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/07/26/so-many-things-i-like-in-new-release/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/07/26/so-many-things-i-like-in-new-release/</guid>
      </item>
    
      <item>
        <title>Git, TFS and the Credential Manager</title>
        <description>&lt;p&gt;A colleague rang up saying he could not clone anything from the command line, but everything was fine in Visual Studio. All he got from PowerShell was an error stating he was not authorised to access the project.&lt;/p&gt;&lt;p&gt;He did not want to setup a PAT or SSH keys, and this behaviour was quite odd to say the least. There was also a VPN in the mix.&lt;/p&gt;&lt;p&gt;At the end of the day the easiest way to get around this was using the Windows Credential Manager:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-UBuWZ9ab7LA/WWTL3hBhRgI/AAAAAAAAEfk/_PPxGkozdBgqY9ZyM3kHqyjMg4IH_MVtgCHMYCw/s1600-h/image%255B6%255D&quot;&gt;&lt;img width=&quot;504&quot; height=&quot;154&quot; title=&quot;image&quot; align=&quot;left&quot; style=&quot;float: left; display: inline; background-image: none;&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-jOVW0WysrZk/WWTL4yJ5WhI/AAAAAAAAEfo/sggSo83QrQY0M-VEI-yBinJN_jnITd0qACHMYCw/image_thumb%255B4%255D?imgmax=800&quot; border=&quot;0&quot;&gt;&lt;br&gt;&lt;/a&gt;&lt;/p&gt;</description>
        <pubDate>Tue, 11 Jul 2017 13:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/07/11/git-tfs-and-credential-manager/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/07/11/git-tfs-and-credential-manager/</guid>
      </item>
    
      <item>
        <title>Some tips on Search Server for TFS 2017</title>
        <description>&lt;p&gt;Code Search is a brilliant feature based off Elastic Search. I wanted to summarise a few tips from my relatively limited experience with Search Server for TFS 2017, which adds Code Search to your instance.&lt;/p&gt;&lt;p&gt;The first thing to remember is that the size of the index can be quite large (up to 30% the size of a collection in the worst case) so plan for it in advance.&lt;/p&gt;&lt;p&gt;CPU and RAM should not be underestimated as well. Elastic Search can be a quite intensive process. &lt;/p&gt;&lt;p&gt;If you are not an expert on it (like me &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-AnbOJzQZ3YY/WVTs4x0aS6I/AAAAAAAAEfE/6BB1G_q7APAvVs_S20IdAZ090Ei6WusjgCHMYCw/wlEmoticon-smile%255B2%255D?imgmax=800&quot;&gt;) you want to use &lt;a href=&quot;https://github.com/Microsoft/Code-Search&quot;&gt;these script&lt;/a&gt; the TFS Product Team provided. They are straightforward and extremely useful. Also take a look at the &lt;a href=&quot;https://www.visualstudio.com/en-gb/docs/search/code/administration&quot;&gt;documentation&lt;/a&gt;, it is very useful as well.&lt;/p&gt;&lt;p&gt;The indexing process can be quite tough on the TFS scheduler, so bear in mind this when you install it – otherwise you will see some jobs delayed. &lt;/p&gt;&lt;p&gt;This should not have an impact on the users (all the core jobs have higher priority anyway), but it is worth remembering that the indexing job will have a similar priority to the reporting jobs, so there is a risk of slowing reporting down.&lt;/p&gt;</description>
        <pubDate>Thu, 29 Jun 2017 12:04:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/06/29/some-tips-on-search-server-for-tfs-2017/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/06/29/some-tips-on-search-server-for-tfs-2017/</guid>
      </item>
    
      <item>
        <title>A few nuggets from using TFS/VSTS and SonarQube in your builds</title>
        <description>&lt;p&gt;The cool thing about SonarQube is that once it is set up it works immediately and it provides a lot of value for your teams.&lt;/p&gt;&lt;p&gt;After a while you will notice there are things that might be refined or improved in how you integrated the two tools, here are some I feel can be quite useful.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h3&gt;Bind variables between Team Build and SonarQube properties&lt;/h3&gt;&lt;p&gt;I feel this is quite important – instead of manually entering Key, Project Name, Version, etc. you should be using your &lt;a href=&quot;https://www.visualstudio.com/en-us/docs/build/define/variables&quot;&gt;variables&lt;/a&gt;. Try to reduce manual input to a minimum.&lt;/p&gt;&lt;h3&gt;Branch support&lt;/h3&gt;&lt;p&gt;SonarQube supports branches with the &lt;a href=&quot;https://docs.sonarqube.org/display/SONAR/Local+and+Branch+Analysis&quot;&gt;sonar.branch&lt;/a&gt;&lt;em&gt;&lt;/em&gt; property. This would create a separate SonarQube project you can use for comparison with other branches.&lt;/p&gt;&lt;h3&gt;Analyse your solution once&lt;/h3&gt;&lt;p&gt;Don’t be lazy and add just a task at the beginning and one at the bottom - you should scan one solution at the time and complete the analysis. This will solve the typical &lt;strong&gt;Duplicate project GUID&lt;/strong&gt; warning you will get if you have multiple solutions in the same scan.&lt;/p&gt;&lt;h3&gt;Exclude unnecessary files&lt;/h3&gt;&lt;p&gt;It is so easy to add a &lt;a href=&quot;https://docs.sonarqube.org/display/SONAR/Narrowing+the+Focus&quot;&gt;&lt;em&gt;sonar.exclusion&lt;/em&gt;&lt;/a&gt; pattern, do it to avoid scanning files you are not interested in. &lt;/p&gt;</description>
        <pubDate>Thu, 22 Jun 2017 14:39:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/06/22/a-few-nuggets-from-using-tfsvsts-and/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/06/22/a-few-nuggets-from-using-tfsvsts-and/</guid>
      </item>
    
      <item>
        <title>How a (home)lab helps a TFS admin</title>
        <description>&lt;p&gt;I’ve always been a fan of homelabs. It is common knowledge that I am a huge advocate of virtualisation technologies, and pretty much all my machines feature at least Hyper-V running on them. &lt;/p&gt;&lt;p&gt;If you are not familiar with this, a homelab is a set of machines you run at home which simulate a proper enterprise environment. This does not mean a 42U cabinet full of massive servers, but even just a decently-sized workstation acting as VM host would do. The key here is &lt;strong&gt;enterprise&lt;/strong&gt;, so ADDS, DNS, DHCP, the usual suspects indeed, plus your services. &lt;/p&gt;&lt;p&gt;What I am going to talk about is applicable to &lt;em&gt;corporate labs&lt;/em&gt; as well, albeit this can be less fun &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-9uq9EDbElMM/WUE_lPbJZNI/AAAAAAAAEek/OjQzS00KRt8zCNgXmlBq8KJwLqPdRQbuwCHMYCw/wlEmoticon-smile%255B2%255D?imgmax=800&quot;&gt;&lt;/p&gt;&lt;p&gt;So, if you are a TFS administrator, what are the advantages of a lab?&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Testing upgrades!&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Yes, test upgrades are one of the uses of a lab. But not just testing the upgrade itself, it also helps understanding how long an upgrade will take and what are the crucial areas you need to be aware of.&lt;/p&gt;&lt;p&gt;In an ideal world, you will have an exact copy of the production hardware so you might be able to have a very accurate forecast. This helps of course, but it will also hide what are the critical areas in your deployment.&lt;/p&gt;&lt;p&gt;Let’s take TFS 2017&amp;nbsp; – one of the most expensive steps is the &lt;a href=&quot;https://blogs.msdn.microsoft.com/visualstudioalm/2016/11/16/test-result-storage-improvements-and-impact-on-upgrading-to-team-foundation-server-2017/&quot;&gt;migration&lt;/a&gt; of all the test results data in a collection to a different schema. &lt;/p&gt;&lt;p&gt;This is a very intensive operation, and having a lab where you know inside-out any finer detail about your hardware really helps when it comes to planning the proper upgrade, especially if you have a large deployment. &lt;/p&gt;&lt;p&gt;Without mentioning that in case of failure you are not breaking anybody’s day and you can work on your own schedule.&lt;/p&gt;&lt;p&gt;Also, you will find that sometimes you might need to experiment with settings that require a service interruption. The lab is yours, so you are not affecting anybody again and you can go straight to the solution when it comes to the production environment.&lt;/p&gt;&lt;p&gt;All of that sounds reasonable and maybe too simplicistic, but I saw too many instances where there was no lab and the only strategy was &lt;em&gt;test-and-revert-if-fails, &lt;/em&gt;given that Team Foundation Server is &lt;em&gt;“just a DB and IIS” &lt;/em&gt;(yeah…). &lt;/p&gt;&lt;p&gt;Definitely not something you want to see or hear, trust me &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-9uq9EDbElMM/WUE_lPbJZNI/AAAAAAAAEek/OjQzS00KRt8zCNgXmlBq8KJwLqPdRQbuwCHMYCw/wlEmoticon-smile%255B2%255D?imgmax=800&quot;&gt;&lt;/p&gt;</description>
        <pubDate>Wed, 14 Jun 2017 13:52:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/06/14/how-homelab-helps-tfs-admin/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/06/14/how-homelab-helps-tfs-admin/</guid>
      </item>
    
      <item>
        <title>What can you learn from The DevOps Handbook</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;I thought about reviewing The DevOps Handbook, but then I realised its real reference value. Books like this, with multiple layers of usage are really invaluable.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-1t4P3Dyn-TY/WS7e-KsqtdI/AAAAAAAAEdg/VCuvyjZPDMsY3knyPtZL3fsUULjD6Hr5ACLcB/s1600/DSC_0052.JPG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;400&quot; src=&quot;https://2.bp.blogspot.com/-1t4P3Dyn-TY/WS7e-KsqtdI/AAAAAAAAEdg/VCuvyjZPDMsY3knyPtZL3fsUULjD6Hr5ACLcB/s400/DSC_0052.JPG&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This book is gold IMHO, and not just for its cover colour. But let’s rewind a bit.&lt;br /&gt;&lt;br /&gt;I bought the book in January, I read the first few chapters then I forgot it at my parents’. Fast forward a few months, my brother comes visiting and he brings the book back, but it is then then left on the &lt;em&gt;to read&lt;/em&gt; pile for a while.&lt;br /&gt;&lt;br /&gt;Eventually I managed to find time to read it and here I am writing this post.&lt;br /&gt;So why isn’t this a regular review? &lt;em&gt;What&lt;/em&gt; did I realise, all of a sudden?&lt;br /&gt;&lt;br /&gt;Well, books can be easily read in a few days, a couple of weeks tops. What happened is that each chapter I read was providing insights or mirrored situations I experienced during these months.&lt;br /&gt;&lt;br /&gt;Each chapter can be cherry-picked and adapted to your situation, because it starts from a real scenario with real requirements and targets. You will notice patterns going through the book, all the concepts are there but applied in a tailored way to fit the problems one has to face.&lt;br /&gt;&lt;br /&gt;I can see this book being a useful guide you might want to refer to when you are tackling a problem, just pick the chapter more akin to the approach you are using and you will feel guided. &lt;/div&gt;</description>
        <pubDate>Wed, 31 May 2017 15:19:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/05/31/what-can-you-learn-from-devops-handbook/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/05/31/what-can-you-learn-from-devops-handbook/</guid>
      </item>
    
      <item>
        <title>Review - Professional Git</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;I am asked at least twice in three months about a good book on Git.&lt;br /&gt;&lt;br /&gt;Despite the information available at &lt;cite&gt;&lt;a href=&quot;https://git-scm.com/book&quot;&gt;https://git-scm.com/book&lt;/a&gt;&lt;/cite&gt; is very  comprehensive, there is value out of a published book to be consumed as a  reference, especially when onboarding a new team member or when you &lt;em&gt;finally  &lt;/em&gt;want to get a firm grip on this (sometimes dreaded) Version Control  System.&lt;br /&gt;&lt;br /&gt;So I contacted Wrox to get a copy of Professional Git, which was published in  December 2016 hence it is not only a reference book but also an updated  reference book.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-Q8Q4Ej95jSc/WR60hm9a8gI/AAAAAAAAEdE/bQHfuQ2T5Mc5Gx1P4Edawbmnmoi8gpf5wCLcB/s1600/DSC_0096.JPG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://3.bp.blogspot.com/-Q8Q4Ej95jSc/WR60hm9a8gI/AAAAAAAAEdE/bQHfuQ2T5Mc5Gx1P4Edawbmnmoi8gpf5wCLcB/s400/DSC_0096.JPG&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You might wonder why is this so important to me. Well, it is fairly simple after  all. Git became a mainstream tool a few years ago, but its history goes much  further back. Documentation on its usage might be older, aimed at advanced users  or fragmented, so it is important to have a book not only covering all the  important topics, but crucially covering them from the right point of view.&lt;br /&gt;&lt;br /&gt;Brent Laster did a brilliant job with this book. I felt the level of depth  was perfect, neither too shallow nor too deep. Topics like Submodules – often  troublesome for some and quite challenging anyway – are covered with a clarity  that would make the essential information memorable.&lt;br /&gt;&lt;br /&gt;The book has companion exercises and labs to keep you busy if you are a total  newbie. If you are a bit more experienced it is still very valuable, putting  down in plain language with straightforward samples even the trickiest of  topics. &lt;br /&gt;       &lt;br /&gt;Just remember that the syntax used for the examples is UNIX-style – hence  lots of ls!&amp;nbsp;But aside from that I cannot refrain from suggesting it to who wants to start  with Git and is looking for a comprehensive guide.&lt;/div&gt;</description>
        <pubDate>Fri, 19 May 2017 09:03:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/05/19/review-professional-git/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/05/19/review-professional-git/</guid>
      </item>
    
      <item>
        <title>Error 404 when uploading the SonarQube Analysis Report from the Build</title>
        <description>&lt;p&gt;That can be something hard to catch if you don’t know where to look!&lt;/p&gt; &lt;p&gt;I spent some time on this issue – SonarQube’s End Analysis task fails, with either an unhandled exception (version 2.1.1 of the extension) or a 404 page in plain text in the log (with the older 2.0.0).&lt;/p&gt; &lt;p&gt;What was really odd was that the issue happened only on certain projects – some were fine, some others were failing, And it happened regardless of the build server used by TFS – whatever the agent, this randomness was there.&lt;/p&gt; &lt;p&gt;At the end of the day, don’t underestimate logs collected from the Web Server you are using: I found an error 404.13 in the logs, meaning the Analysis Report was &lt;strong&gt;exceeding the size limit &lt;/strong&gt;for the upload.&lt;/p&gt;</description>
        <pubDate>Tue, 09 May 2017 15:31:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/05/09/error-404-when-uploading-sonarqube/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/05/09/error-404-when-uploading-sonarqube/</guid>
      </item>
    
      <item>
        <title>What to do with WMI errors and Team Foundation Server</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Last week I spent some time on trying to sort out WMI errors in a test environment. That was not fun, but at the end of the day there is something to learn out of it.&lt;br /&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Everything starts with this set of errors with an AT-only installation:&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-fn4RZzSAb5U/WQmWoaEKoMI/AAAAAAAAEcc/9nA26a5w4TY7RD4Dxgpe-6fCCxmWHCk5QCPcB/s1600/wmi2.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;122&quot; src=&quot;https://4.bp.blogspot.com/-fn4RZzSAb5U/WQmWoaEKoMI/AAAAAAAAEcc/9nA26a5w4TY7RD4Dxgpe-6fCCxmWHCk5QCPcB/s400/wmi2.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Looking at the logs you can see it is pretty bad stuff:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-yYffpMmNE3U/WQmWoJ93w5I/AAAAAAAAEcc/0MpB4BqlviEYEfMKJmj4HKCZaxZKcZREwCPcB/s1600/wmi0.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;62&quot; src=&quot;https://4.bp.blogspot.com/-yYffpMmNE3U/WQmWoJ93w5I/AAAAAAAAEcc/0MpB4BqlviEYEfMKJmj4HKCZaxZKcZREwCPcB/s400/wmi0.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I tried with the usual suspects (&lt;strong&gt;wmimgmt /verifyrepository&lt;/strong&gt;, setting the involved machines as standalone hosts, etc), but they all run fine. One of the suggestions you can find around is to reinstall the IIS 6 Management Tools on the Application Tier:&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-DeRNdSWVA7c/WQmWoKM91-I/AAAAAAAAEcc/JlP1eHIc20Y8qB3fzAuz6l08SCRgjD3iACPcB/s1600/wmi1.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://4.bp.blogspot.com/-DeRNdSWVA7c/WQmWoKM91-I/AAAAAAAAEcc/JlP1eHIc20Y8qB3fzAuz6l08SCRgjD3iACPcB/s1600/wmi1.PNG&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Still no luck. I tried connecting with &lt;strong&gt;wmimgmt.msc&lt;/strong&gt; and I got all sorts of errors. At the end of the day I temporarily reset the WMI repository on that machine and I then decided to move these test services to another VM. Why?&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;The WMI repository is not supposed to be rebuilt lightly. It should be the last resort, and I did not want to tie up this testing environment with a potentially problematic machine.&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Don’t forget that the Application Tier is &lt;em&gt;just&lt;/em&gt; a front-end for Team Foundation Server. You can replace it with another machine and scale out as needed. &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;/div&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Also, the errors above appear in both the Application Tier and Data Tier readiness check category for the AT-only install, despite they only apply to the AT. That is because the machine could not communicate with anything beyond itself (not even itself I would add), so it would report that the Data Tier isn’t reachable. Do not touch the database servers unless you really have to, and the &lt;strong&gt;logs &lt;/strong&gt;are going to tell you if you have.&lt;/div&gt;&lt;/div&gt;</description>
        <pubDate>Wed, 03 May 2017 09:08:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/05/03/what-to-do-with-wmi-errors-and-team/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/05/03/what-to-do-with-wmi-errors-and-team/</guid>
      </item>
    
      <item>
        <title>Quickly share query results with the Web Access</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;If you really like the &lt;b&gt;Copy Query URL &lt;/b&gt;button because it opens a full-screen page with no other link to TFS or VSTS...&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-X3jKV7EuP90/WPYti3LmXfI/AAAAAAAAEbo/g3VxlM2wDOERUKRligEDd5SdvM_J4LyHgCLcB/s1600/Query0.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;156&quot; src=&quot;https://4.bp.blogspot.com/-X3jKV7EuP90/WPYti3LmXfI/AAAAAAAAEbo/g3VxlM2wDOERUKRligEDd5SdvM_J4LyHgCLcB/s400/Query0.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;You would also know that the query link expires after 90 days. Too bad. Is there a way of getting the same behaviour (without taking into consideration any ACL-specific configuration) without using that link?&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Well yes - just add&amp;nbsp;&lt;i&gt;&amp;amp;fullScreen=True&amp;nbsp;&lt;/i&gt;to the Web Access URL:&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-tq4XdXnKcww/WPYvJSzNAiI/AAAAAAAAEbs/JU4YjRYI73UCZaU52LoBOzvlcyXuSl8uACLcB/s1600/Query1.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://2.bp.blogspot.com/-tq4XdXnKcww/WPYvJSzNAiI/AAAAAAAAEbs/JU4YjRYI73UCZaU52LoBOzvlcyXuSl8uACLcB/s1600/Query1.PNG&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</description>
        <pubDate>Tue, 18 Apr 2017 15:22:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/04/18/quickly-share-query-results-with-web/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/04/18/quickly-share-query-results-with-web/</guid>
      </item>
    
      <item>
        <title>“We don’t ship so often”: why? A reflection on Delivery hurdles.</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;The last Stack Overflow Developer Survey Results shows that &lt;em&gt;&lt;a href=&quot;https://stackoverflow.com/insights/survey/2017#work-how-are-job-satisfaction-and-committing-code-related&quot;&gt;the  more a developer ships the happier (s)he is.&lt;/a&gt;&amp;nbsp;&lt;/em&gt;&lt;br /&gt;Of course we see a huge  amount of people checking in multiple times a day, but also a large amount of  people checking in (so potentially building and deploying) much less than  that.&lt;br /&gt;&lt;br /&gt;So, looking at the other side of the medal: &lt;i&gt;why &lt;/i&gt;aren’t you shipping  often?&lt;br /&gt;&lt;br /&gt;Reasons – as usual – are varied. There might be process constraints  (certifications, etc.), hard requirements, but I’ve often seen a heavy reliance  on older deployment procedures which are considered too expensive to be  replaced by automation. Don’t touch what works, right?&lt;br /&gt;&lt;br /&gt;Web applications are a stellar example of this. You might have the most  complex web app in the world, but why should you manually move stuff around when  you can pack everything in a MSDeploy package?&lt;br /&gt;&lt;br /&gt;“&lt;em&gt;But that is for Azure and cloud technology and stuff!&lt;/em&gt;”&lt;br /&gt;&lt;br /&gt;Wrong answer!&amp;nbsp;MSDeploy is around since &lt;a href=&quot;https://blogs.iis.net/msdeploy/web-deployment-tool-1-0-has-shipped&quot;&gt;2009&lt;/a&gt;  and it is well supported on-premise as well! So why aren’t you using it for your  existing application? It is, after all, the same concept Tomcat uses for its  .war files.&lt;br /&gt;&lt;br /&gt;      &lt;br /&gt;This isn’t about throwing years of valuable content in the sink. It is often  a matter of trying to split the larger problem into smaller components, and  approaching different delivery vehicles. You can retain your existing application &lt;b&gt;as-is&lt;/b&gt;, just replacing how you bring it into your production environments.&lt;/div&gt;</description>
        <pubDate>Fri, 07 Apr 2017 12:58:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/04/07/we-dont-ship-so-often-why-reflection-on/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/04/07/we-dont-ship-so-often-why-reflection-on/</guid>
      </item>
    
      <item>
        <title>How can I monitor my AlwaysOn synchronisation status?</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;As a Team Foundation Server administrator it is critical to have knowledge of  all the components involved by your deployment, and SQL Server is the lion’s  share (of course).&lt;br /&gt;&lt;br /&gt;As you know I am a huge fan of SQL Server AlwaysOn, a really brilliant High  Availability solution. I was wondering if there is a way of having an estimation  of where the Database Engine is when you see the &lt;strong&gt;Synchronizing&lt;/strong&gt;  state in the AlwaysOn dashboard…&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-EpclSycZvaU/WOCjuTKjraI/AAAAAAAAEbI/0q6JKrjBG9w96rnuPVYIrDDik3oDZQx1wCEw/s1600/AOSync0.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://3.bp.blogspot.com/-EpclSycZvaU/WOCjuTKjraI/AAAAAAAAEbI/0q6JKrjBG9w96rnuPVYIrDDik3oDZQx1wCEw/s1600/AOSync0.PNG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I found out there is a way, and it doesn’t even require any SQL at all. All  you need to do is to add the &lt;strong&gt;Last Commit Time&lt;/strong&gt; column on the  Dashboard, so you will see the time of the last synchronised commit from the  Primary Replica to the Secondary.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-qsaiOgcGXYc/WOCjuU3DR_I/AAAAAAAAEbE/ZossXuD6QTUEIFs83XNLoH3lE_uaZYS4QCEw/s1600/AOSync1.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://3.bp.blogspot.com/-qsaiOgcGXYc/WOCjuU3DR_I/AAAAAAAAEbE/ZossXuD6QTUEIFs83XNLoH3lE_uaZYS4QCEw/s1600/AOSync1.PNG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Of course it is not an ETA, but it gives a rough idea of how much work is  left for the synchronisation. &lt;br /&gt;     &lt;br /&gt;During this state Team Foundation Server is still available because it relies  on the Primary Replica, but remember to &lt;strong&gt;not perform any  failover&lt;/strong&gt; otherwise you are going to lose data! If it is a long  synchronisation you are doing I strongly suggest to set the Failover Mode to  Manual, downtime is always a better trade-off than data loss.&lt;/div&gt;</description>
        <pubDate>Sun, 02 Apr 2017 07:11:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/04/02/how-can-i-monitor-my-alwayson/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/04/02/how-can-i-monitor-my-alwayson/</guid>
      </item>
    
      <item>
        <title>Move TFS databases with no downtime, thanks to SQL Server AlwaysOn</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;If you follow this blog or my Twitter feed you should know I am a massive fan of SQL Server AlwaysOn.&lt;br /&gt;&lt;br /&gt;Recently I restored and moved some TFS databases around, and one of them remained on a temporary storage because of the massive size involved. After a while I managed to sort out the primary storage so I could move this database (and its Transaction Log) back to it.&lt;br /&gt;&lt;br /&gt;This what I did, no warranties of course but &lt;i&gt;it worked on my machines!&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;First of all, you need to be aware that you will have a limited availability during this period. It doesn&apos;t mean you are going to have an outage, but that you cannot rely on the Secondary Replica while you work on it. Why? Because you need to disable the Automatic Failover and make any Secondary non-readable:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-ynIJXwmkaJs/WM7B0nSDLwI/AAAAAAAAEaI/mMU7yw4GqdcfRACPEIcLk0EN010hAf4bwCLcB/s1600/0.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;81&quot; src=&quot;https://2.bp.blogspot.com/-ynIJXwmkaJs/WM7B0nSDLwI/AAAAAAAAEaI/mMU7yw4GqdcfRACPEIcLk0EN010hAf4bwCLcB/s400/0.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Then suspend Data Movement from the Primary. This means your Primary Replica is not going to sync with the Secondary.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-HrxNghvOTG8/WM7B0kaTTeI/AAAAAAAAEaA/2eLe2x1jPxo4h5zBR6uEWEWfJ6JBim8oQCLcB/s1600/1.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://3.bp.blogspot.com/-HrxNghvOTG8/WM7B0kaTTeI/AAAAAAAAEaA/2eLe2x1jPxo4h5zBR6uEWEWfJ6JBim8oQCLcB/s1600/1.PNG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You will get your database to move in a non synchronised state.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-a6eK1_gY6sE/WM7B0qeDZYI/AAAAAAAAEaE/mCJUSSlIO7Qd8eJ7CB-kIcEp40f39CvWQCLcB/s1600/2.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://2.bp.blogspot.com/-a6eK1_gY6sE/WM7B0qeDZYI/AAAAAAAAEaE/mCJUSSlIO7Qd8eJ7CB-kIcEp40f39CvWQCLcB/s1600/2.PNG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now note down your logical names for the files you need to move. Use these in the following query, the path in the FILENAME is going to be the new destination:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-AI33gnSQeQI/WM7B0wvf9qI/AAAAAAAAEaQ/YUTnwDU7HtkIHpzlmiHd_0LONHpO6ZnpACLcB/s1600/3.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://3.bp.blogspot.com/-AI33gnSQeQI/WM7B0wvf9qI/AAAAAAAAEaQ/YUTnwDU7HtkIHpzlmiHd_0LONHpO6ZnpACLcB/s1600/3.PNG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-nuHzaJpoycM/WM7B0wlE-fI/AAAAAAAAEaM/I05gwyEvKCoaO1RP0GCxYUUw2WHmw97KACLcB/s1600/4.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;121&quot; src=&quot;https://4.bp.blogspot.com/-nuHzaJpoycM/WM7B0wlE-fI/AAAAAAAAEaM/I05gwyEvKCoaO1RP0GCxYUUw2WHmw97KACLcB/s400/4.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Run this on all servers. You might want to wait for the Secondary to be up-and-running, but don&apos;t forget to run it against the Primary too!&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-U5Hz7FbfKDk/WM7B0zxi5EI/AAAAAAAAEaU/n_NohgyL-OQ_KqoFLUMoX_Ckf9gI7rO-ACLcB/s1600/5.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;35&quot; src=&quot;https://1.bp.blogspot.com/-U5Hz7FbfKDk/WM7B0zxi5EI/AAAAAAAAEaU/n_NohgyL-OQ_KqoFLUMoX_Ckf9gI7rO-ACLcB/s400/5.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Copy all the files to the new destination, once done restart SQL Server on the Secondary:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-tg1t54-LIwY/WM7B1IYDgRI/AAAAAAAAEaY/ENUpKs1v2RklMjaUyYJ3tfAuAqaOl58zgCLcB/s1600/6.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://1.bp.blogspot.com/-tg1t54-LIwY/WM7B1IYDgRI/AAAAAAAAEaY/ENUpKs1v2RklMjaUyYJ3tfAuAqaOl58zgCLcB/s1600/6.PNG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now check that if Secondary is in a green state.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-11kPZWY4ZKs/WM7B1MsaMaI/AAAAAAAAEac/iSQBeeXXAk49t0hjnlZE9dFc3xvYnJo2QCLcB/s1600/7.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://3.bp.blogspot.com/-11kPZWY4ZKs/WM7B1MsaMaI/AAAAAAAAEac/iSQBeeXXAk49t0hjnlZE9dFc3xvYnJo2QCLcB/s1600/7.PNG&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If the Secondary is green, resume Data Movement and after the status is Synchronised again perform a manual Failover so that the roles are swapped. Then perform all of the above on the &lt;i&gt;new Secondary &lt;/i&gt;and you will be done.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-11kPZWY4ZKs/WM7B1MsaMaI/AAAAAAAAEac/iSQBeeXXAk49t0hjnlZE9dFc3xvYnJo2QCLcB/s1600/7.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://2.bp.blogspot.com/-XwGrJOM7kdo/WM7B1I9OAeI/AAAAAAAAEag/GlU_zqSw_wE2jYqWDICk_Art55uuisLMgCLcB/s1600/8.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://2.bp.blogspot.com/-XwGrJOM7kdo/WM7B1I9OAeI/AAAAAAAAEag/GlU_zqSw_wE2jYqWDICk_Art55uuisLMgCLcB/s1600/8.PNG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Eventually, don&apos;t forget to re-enable any configuration you disabled before performing this!&lt;/div&gt;</description>
        <pubDate>Tue, 21 Mar 2017 14:14:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/03/21/move-tfs-databases-with-no-downtime/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/03/21/move-tfs-databases-with-no-downtime/</guid>
      </item>
    
      <item>
        <title>Settle your team&apos;s disputes with an EditorConfig file</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Ok, this is a bit too much :) but it is actually possible to settle some disputes on Visual Studio settings by  leveraging on an EditorConfig file.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://editorconfig.org/&quot;&gt;EditorConfig&lt;/a&gt; is a broadly adopted  open-source file format that enables IDEs to be set in a pre-defined way so that  you can have a consistent set of rules across tools. This is an ideal tool for  creating a standard set of settings and guidelines to be adopted across the  team, and Visual Studio 2017 now &lt;a href=&quot;https://github.com/editorconfig/editorconfig-visualstudio&quot;&gt;supports&lt;/a&gt;  this format!&lt;br /&gt;&lt;br /&gt;Kasey Uhlenhuth wrote a &lt;a href=&quot;https://blogs.msdn.microsoft.com/dotnet/2016/12/15/code-style-configuration-in-the-vs2017-rc-update/&quot;&gt;brilliant  description&lt;/a&gt; of what is supported in the IDE, and the setting area is very  well done with an actual example of what you are setting up. &lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-1cWyEyAzBqY/WMvE1WN45ZI/AAAAAAAAEZY/m7ueOX2rnmEAIUStzJRokhqDla2kNMwSgCLcB/s1600/CodeBlock0.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;144&quot; src=&quot;https://1.bp.blogspot.com/-1cWyEyAzBqY/WMvE1WN45ZI/AAAAAAAAEZY/m7ueOX2rnmEAIUStzJRokhqDla2kNMwSgCLcB/s400/CodeBlock0.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-sDEu4bCO5Es/WMvE1dhyG-I/AAAAAAAAEZc/Xwm2p4ZJNjgyHlh1a_ba69oas9X0xwMIwCLcB/s1600/CodeBlock1.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;166&quot; src=&quot;https://3.bp.blogspot.com/-sDEu4bCO5Es/WMvE1dhyG-I/AAAAAAAAEZc/Xwm2p4ZJNjgyHlh1a_ba69oas9X0xwMIwCLcB/s400/CodeBlock1.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Then you can configure how to enforce your style rules - bear in mind that errors are treated as such, so they would prevent a successful build!&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-xRDgV-gv2Yg/WMvE1U3u0cI/AAAAAAAAEZg/tVCbeBwxV3szYiCkftlDsj6LmH_qkrfrgCEw/s1600/CodeBlock2.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://1.bp.blogspot.com/-xRDgV-gv2Yg/WMvE1U3u0cI/AAAAAAAAEZg/tVCbeBwxV3szYiCkftlDsj6LmH_qkrfrgCEw/s1600/CodeBlock2.PNG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If found in a solution, the .editorconfig file will override the default  settings of the IDE – so to have a team-shared convention all you need to do is  put the file into the root of the project folder, job done!&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</description>
        <pubDate>Fri, 17 Mar 2017 11:14:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/03/17/settle-your-teams-disputes-with/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/03/17/settle-your-teams-disputes-with/</guid>
      </item>
    
      <item>
        <title>The new connected marketplace experience: how to buy Package Management for TFS</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;It is not news that in a Hybrid DevOps stack you might have stuff on-premise  and stuff in the cloud, Package Management is a prime example of this.&lt;br /&gt;&lt;br /&gt;If you don’t have a Visual Studio Enterprise license for any user in your  organisation you’d need to buy some users’ licenses for this service. It is  billed through Azure even if you are on-premise and totally disconnected from  the internet.&lt;br /&gt;&lt;br /&gt;You install it on-premise, but you would still set your billing to an Azure  subscription when buying it:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-MGIYYsAk59k/WL_XS7_BNNI/AAAAAAAAEY8/As21EFnXbGMSJgwNlhBzvedVi_GYk9-0wCLcB/s1600/sn0.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;280&quot; src=&quot;https://1.bp.blogspot.com/-MGIYYsAk59k/WL_XS7_BNNI/AAAAAAAAEY8/As21EFnXbGMSJgwNlhBzvedVi_GYk9-0wCLcB/s400/sn0.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Once you are done you can install the extension. Remember: if you have an  Enterprise license (either with or without MSDN) you are already entitled to  Package Management so you can install the extension straight away.&lt;br /&gt;&lt;br /&gt;Also, if you need to manage your users you can browse to the Users hub  (&amp;lt;your TFS&amp;gt;/&amp;lt;your collection&amp;gt;/_admin/_userHub) and assign licenses  to whoever requires them:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-0rMmnvgT2xQ/WL_XbPpKWRI/AAAAAAAAEZA/EpBu_IIO4CkKOZ10q0MyVe9Tvz-TRqwggCLcB/s1600/sn1.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;100&quot; src=&quot;https://3.bp.blogspot.com/-0rMmnvgT2xQ/WL_XbPpKWRI/AAAAAAAAEZA/EpBu_IIO4CkKOZ10q0MyVe9Tvz-TRqwggCLcB/s400/sn1.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;br /&gt;       &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This is exactly like VSTS, but on your on-premise TFS.&lt;/div&gt;</description>
        <pubDate>Wed, 08 Mar 2017 10:06:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/03/08/the-new-connected-marketplace/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/03/08/the-new-connected-marketplace/</guid>
      </item>
    
      <item>
        <title>Handle your NuGet packages’ qualities with Release Views</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Are you building NuGet packages for your tools, utilities and libraries?  Check.&lt;br /&gt;&lt;br /&gt;Are you using SemVer for versioning? Check.&lt;br /&gt;&lt;br /&gt;Then you might want an easy way of offering your (internal) packages, sorting  them between Release and Prerelease for example. &lt;a href=&quot;https://www.visualstudio.com/en-us/docs/package/feeds/views&quot;&gt;Release  Views&lt;/a&gt; is what you are looking for.&lt;br /&gt;&lt;br /&gt;What is really brilliant is that you already have a baseline set: Release and  Prerelease. You don’t have to configure anything, it is already there for  you.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-8UhZ5e7aUP8/WLM-s4cLQAI/AAAAAAAAEXg/1nD5bpxe-LgOqossSVmUJY_hM22xQSQRwCLcB/s1600/views.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;213&quot; src=&quot;https://1.bp.blogspot.com/-8UhZ5e7aUP8/WLM-s4cLQAI/AAAAAAAAEXg/1nD5bpxe-LgOqossSVmUJY_hM22xQSQRwCLcB/s400/views.PNG&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;What makes lots of sense IMHO is to divide them into Release, Prerelease and  CI.&lt;br /&gt;&lt;br /&gt;That’s because even if we would all love to have a single feed where you can  get all the packages in an independent fashion, it is highly likely that some  users might not need a CI package but something more refined instead.&lt;br /&gt;With the latter it is clear that the package is not as good as a beta, making it easier to section your offer for the user as you like. CI is really bleeding edge sometimes, and I believe it is good to have it separated from other builds.&lt;/div&gt;</description>
        <pubDate>Sun, 26 Feb 2017 20:49:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/02/26/handle-your-nuget-packages-qualities/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/02/26/handle-your-nuget-packages-qualities/</guid>
      </item>
    
      <item>
        <title>A note on TFSConfig OfflineDetach</title>
        <description>&lt;p&gt; I already mentioned the very useful &lt;a href=&quot;http://mattvsts.blogspot.com/2016/09/simplifying-tfs-restores-with-tfsconfig.html&quot;&gt;TFSConfig OfflineDetach&lt;/a&gt; in the past. Today I used it once again, and I realised a very important information is missing.&lt;/p&gt; &lt;p&gt;What you need to remember is that the Configuration Database you need to use is the one which has the Collection you want to detach in it. And it must be offline as well.&lt;/p&gt; &lt;p&gt;So in today’s situation (moving a collection across domains in a new instance) I had to restore the configuration database as well as the collection’s.&lt;/p&gt;</description>
        <pubDate>Tue, 14 Feb 2017 16:16:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/02/14/a-note-on-tfsconfig-offlinedetach/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/02/14/a-note-on-tfsconfig-offlinedetach/</guid>
      </item>
    
      <item>
        <title>PRs and ‘Unable to queue Build’ with VSTS</title>
        <description>&lt;p&gt;This should never happen, but if it does…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-B9wcp6gwPpw/WJiIzLgJrMI/AAAAAAAAEWU/T8I6lkhkOiI/s1600-h/Policy1%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;Policy1&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;Policy1&quot; src=&quot;https://lh3.googleusercontent.com/-Kcjj5IfmcDw/WJiI0WW_qPI/AAAAAAAAEWc/F9nsEHGndj4/Policy1_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;120&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Just go checking the PR settings to verify that there actually is a build linked!&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-cL7EG8nuaWk/WJiI1fdxFiI/AAAAAAAAEWk/cGFG92KfD4g/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-nWv0kZC73Ko/WJiI2VMMTDI/AAAAAAAAEWs/YKz56LTNvtc/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;65&quot;&gt;&lt;/a&gt;&lt;/p&gt;</description>
        <pubDate>Mon, 06 Feb 2017 14:31:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/02/06/prs-and-unable-to-queue-build-with-vsts/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/02/06/prs-and-unable-to-queue-build-with-vsts/</guid>
      </item>
    
      <item>
        <title>Getting started with Delivery Plans in VSTS</title>
        <description>&lt;p&gt;Last week Microsoft released a very interesting extension for VSTS – &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms.vss-plans&quot;&gt;Delivery Plans&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;It is still a very early preview, it will be associated with a business model (so it is likely it won’t be free), and this feature represents a very important expansion of VSTS’ field of execution. &lt;/p&gt; &lt;p&gt;This extension brings a way of tracking the work undertaken by multiple teams at the same time, with the possibility of focusing only on a &lt;strong&gt;certain level of detail&lt;/strong&gt;, and enables scenarios of delivery forecast previously quite hard to achieve.&lt;/p&gt; &lt;p&gt;To easily get started, I suggest installing the &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-devlabs.SampleDataWidget&quot;&gt;Sample Data Widget&lt;/a&gt; extension and deploy the “SAFe with VSTS” package. I went for this package because it creates a nice set of Work Items, not because there is any relationship between Delivery Plans and SAFe.&lt;/p&gt; &lt;p&gt;Once this is done, customise the iteration dates and the teams you like – I would go with two sub-teams part of a large team - then assign what you feel is better suited to each team (pretty randomly I reckon given we are just using sample data &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-CMHkkKAK1Mw/WI8Xu3V894I/AAAAAAAAEUw/Gl5ub0gqobw/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;) and create a Plan like this:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-sxJgyaL33gY/WI8Xvg3Zs5I/AAAAAAAAEU4/wrF8xe9WeBQ/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-AttMp0VJ1Ic/WI8XwqO3f0I/AAAAAAAAEVA/ucAiSMbXjOk/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;116&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This is a plan designed to give you a full breadth of information, from the larger parts to the finer details. The result is brilliant:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-MQhizUN4RxE/WI8XxZSrFiI/AAAAAAAAEVI/gjrpRp4A09M/s1600-h/image%25255B11%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-r1p664eG_9g/WI8XyYPpPWI/AAAAAAAAEVQ/IjMJIrXfHsU/image_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;1066&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;In a single page you will get a timeline view of Epics and Features delivered per-sprint by the whole team, plus the User Stories delivered by each sub-team. This is obviously overkill for the real world – you will want two different plans depending on the level of detail you would like to provide – but it explains why this feature is so powerful and game-changing for me.&lt;/p&gt;  &lt;p&gt;Delivery Plans will enable scenarios where stakeholders can easily understand the status of their value streams without using external reporting tools, and this is a crucial step to allow VSTS to grow from a developement-focused tool to a more general purpose in a company.&lt;/p&gt; &lt;p&gt;The &lt;a href=&quot;https://www.visualstudio.com/en-us/docs/work/scale/review-team-plans&quot;&gt;documentation&lt;/a&gt; is already very comprehensive, take a look there and I strongly suggest to give a go to this extension, given the value it brings.&lt;/p&gt;</description>
        <pubDate>Mon, 30 Jan 2017 10:39:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/01/30/getting-started-with-delivery-plans-in/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/01/30/getting-started-with-delivery-plans-in/</guid>
      </item>
    
      <item>
        <title>Do not forget: only leaves are shown on a board!</title>
        <description>&lt;p&gt;This is a classic question I get at least once a year, regardless of TFS, VSTS, versions, etc.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;I cannot see my Product Backlog Item on the board anymore! Is it gone? Are we losing data?&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;No, we are not losing data, but you need to remember that if you are linking a PBI/User Story as a child to another one the parent won’t be shown in the board, and that is by design.&lt;/p&gt; &lt;p&gt;This is something that dates back a few year – Willy &lt;a href=&quot;https://blogs.msdn.microsoft.com/willy-peter_schaub/2013/09/27/the-hunt-for-stealth-tasks-what-happened-to-my-task-on-the-tfs-task-board/&quot;&gt;covered&lt;/a&gt; it in 2013 but it is an older discussion theme, always worth remembering it though &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-ILkDRCvY9EE/WIYBXey9FNI/AAAAAAAAEUQ/BdB2uura_O4/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt;</description>
        <pubDate>Mon, 23 Jan 2017 13:13:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/01/23/do-not-forget-only-leaves-are-shown-on/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/01/23/do-not-forget-only-leaves-are-shown-on/</guid>
      </item>
    
      <item>
        <title>Help! My PowerShell path in the prompt is gone!</title>
        <description>&lt;p&gt;If you follow my speeches you surely know I am a huge fan of &lt;a href=&quot;https://github.com/dahlbyk/posh-git&quot;&gt;posh-git&lt;/a&gt;, an extremely handy PowerShell module to display inline repository information.&lt;/p&gt; &lt;p&gt;Today I installed it in a Virtual Machine I am going to use for demos at a &lt;a href=&quot;http://lanyrd.com/2017/devopsatwork/&quot;&gt;conference&lt;/a&gt; &lt;a href=&quot;https://www.eventbrite.it/e/biglietti-devopswork-2017-30931208076&quot;&gt;next month&lt;/a&gt; and I noticed something odd at first sight:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-Rd14hTdrViA/WHoQW7qtbzI/AAAAAAAAESg/mej-9CbATBw/s1600-h/image9.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-WmvnGUQKFJ4/WHoQX2KGjXI/AAAAAAAAESo/AAlHs5vMUoY/image_thumb3.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;27&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Where is my path?!&lt;/p&gt; &lt;p&gt;Thanks to &lt;a href=&quot;http://twitter.com/turibbio&quot;&gt;Antonio&lt;/a&gt; I realised that maybe it was a good idea to check the documentation. It was indeed…&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href=&quot;https://lh3.googleusercontent.com/-nCfqsLlJXCA/WHoQYzWrGCI/AAAAAAAAESw/wJamwcs4hts/s1600-h/image6.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-Q_-E4b3chKw/WHoQZyFcsWI/AAAAAAAAES4/u-5Gq01_MSo/image_thumb2.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;225&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The whole step 2 section explains how to customise the PowerShell prompt – so it was trivial to restore it to the full path as I like it &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-D6aR0FLjXj4/WHoQa_F8rQI/AAAAAAAAETA/iGhR7FdbEJM/wlEmoticon-smile2.png?imgmax=800&quot;&gt;&lt;/p&gt;</description>
        <pubDate>Sat, 14 Jan 2017 11:50:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/01/14/help-my-powershell-path-in-prompt-is/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/01/14/help-my-powershell-path-in-prompt-is/</guid>
      </item>
    
      <item>
        <title>Error AADSTS90093 with SonarQube and AAD, why?</title>
        <description>&lt;p&gt;&lt;br&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-QwlrTZcUrqo/WG0XgVIHTMI/AAAAAAAAERg/ijr98JoT-xU/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-GY7Mn-lZ6E0/WG0XhvuZnmI/AAAAAAAAERo/9yz9mBKDW04/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;421&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;It happens. And the reason here is extremely easy and straightforward: if you have any permission on your AAD application for SonarQube which &lt;strong&gt;you don’t need&lt;/strong&gt; you will be denied access &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-EQZaP9WBJQs/WG0XimnoepI/AAAAAAAAERw/uOZHpJwI9Qs/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;The documentation was &lt;a href=&quot;https://github.com/SonarQubeCommunity/sonar-auth-aad/commits/master/README.md&quot;&gt;updated&lt;/a&gt; in June but this error came out recently on an old instance set up before then.&lt;/p&gt;</description>
        <pubDate>Wed, 04 Jan 2017 15:40:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2017/01/04/error-aadsts90093-with-sonarqube-and/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2017/01/04/error-aadsts90093-with-sonarqube-and/</guid>
      </item>
    
      <item>
        <title>Use the SonarQube Scanner with the new activity for the Team Build</title>
        <description>&lt;p&gt;As I &lt;a href=&quot;http://mattvsts.blogspot.co.uk/2016/12/what-happened-to-sonarqube-extension.html&quot;&gt;mentioned&lt;/a&gt; the new SonarSource-maintained activity allows for the SonarQube scanner to be run independently of MSBuild – very useful for repositories containing only JavaScript files for example, where you cannot use the MSBuild-based task because of the lack of a .*proj file.&lt;/p&gt; &lt;p&gt;So all you need to do is to add the relevant task to your build definition:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-7Gfa0DZSXqo/WFeyarsmSVI/AAAAAAAAEQQ/3ozt3FJL0tQ/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-jhyneU27tMY/WFeybxZq-NI/AAAAAAAAEQY/K2Llp8kSLO4/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;61&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;You only need to configure the required options in the task - it comes with a pre-configured sonar-scanner.properties file so you are ready to go! &lt;/p&gt; &lt;p&gt;You need to create a SonarQube Endpoint like described in the other post, add the typical project key/name/version property triplet and, if you want, you can change the folder containing the source files. Also, if you have your own sonar-scanner.properties ready for use you can supply it in the Advanced pan:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-LysHsrkTdSE/WFeycqzAMjI/AAAAAAAAEQg/ldRjsv0Efv8/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-ONrORbE7iyk/WFeyd4MigJI/AAAAAAAAEQo/eVSgM_MJrJM/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;131&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Scenarios where you might want to use this task are where you don’t have a MSBuild-based project system supporting your code, so the other task would not work. Also, it is very handy with heterogeneous projects.&lt;/p&gt;</description>
        <pubDate>Mon, 19 Dec 2016 10:12:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/12/19/use-sonarqube-scanner-with-new-activity/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/12/19/use-sonarqube-scanner-with-new-activity/</guid>
      </item>
    
      <item>
        <title>The new connected extension installation experience in TFS 2017</title>
        <description>&lt;p&gt;A few months ago I &lt;a href=&quot;http://mattvsts.blogspot.co.uk/2016/03/advantages-of-shared-architecture.html&quot;&gt;blogged&lt;/a&gt; about how the Marketplace takes advantage of the shared TFS and VSTS architecture to provide a good experience to the administrator when it comes to Extensions.&lt;/p&gt; &lt;p&gt;Now the experience goes from good to excellent with &lt;a href=&quot;https://www.visualstudio.com/en-us/news/releasenotes/tfs2017-relnotes#Marketplace&quot;&gt;TFS 2017&lt;/a&gt;!&lt;/p&gt; &lt;p&gt;The installation experience is now completely seamless. From my local TFS Gallery I can browse the Marketplace like I always did:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-qlGApXdwk2Y/WE_V33FHt7I/AAAAAAAAEM4/inT0AWYjRgY/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-7ERcsBpSfY8/WE_V47vFgpI/AAAAAAAAENA/UVhYPyH2a78/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;133&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;By clicking that link I am going to be redirected to the Marketplace, but even if I am not logged in as a user I will be logged in as a server:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-sxrxHmnCB50/WE_V5-TTGiI/AAAAAAAAENI/r-77GM3tHbI/s1600-h/image%25255B6%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-Vw2raKs7qq0/WE_V6_WYbAI/AAAAAAAAENQ/ZyhY76rPg6M/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;233&quot; height=&quot;85&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This is done on the Team Foundation Server instance you are using, if you look at the URL you clicked you can see a &lt;em&gt;serverKey &lt;/em&gt;attribute in the query string.&lt;/p&gt; &lt;p&gt;Now I can browse the Marketplace and select whatever I am interested in. Let’s say the Countdown Widget:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-9J20uzqAGzQ/WE_V79nbkqI/AAAAAAAAENY/I5W87iGfVUc/s1600-h/image%25255B10%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-mM8yRl2VII8/WE_V8zsCi4I/AAAAAAAAENg/lSBAthi1ixU/image_thumb%25255B4%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;221&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Clicking on Install is going to trigger the installation, already pointing at the local TFS Gallery – the extension was already downloaded for you, this happened as soon as you clicked on Install:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-pP4kvkt4-OM/WE_V99s_r_I/AAAAAAAAENo/eTmAhhnOpiI/s1600-h/image%25255B14%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-Jwb3jX92VW8/WE_V-_tf8CI/AAAAAAAAENw/4BcFR8DuADM/image_thumb%25255B6%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;229&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-S-Cn91gIRso/WE_V_84a02I/AAAAAAAAEN4/ThgIVhJFTdI/s1600-h/image%25255B18%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/--hoKkcEqsMk/WE_WBJjBWCI/AAAAAAAAEOA/gRFE077cBA4/image_thumb%25255B8%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;439&quot;&gt;&lt;/a&gt;&lt;/p&gt;     &lt;p&gt;That’s it!&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-d1GZ2mxjuxE/WE_WCLBiYzI/AAAAAAAAEOI/cwpCUm7WX2g/s1600-h/image%25255B22%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-43XQsiIDEzM/WE_WDEsDdaI/AAAAAAAAEOQ/VPQdVUkBSzQ/image_thumb%25255B10%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;346&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;It is a great improvement as the experience now no longer requires manual interaction with the server. &lt;/p&gt; &lt;p&gt;This is also an excellent example of a good experience in a context of a &lt;em&gt;Hybrid DevOps Stack&lt;/em&gt;, where the Marketplace providing the extensions is part of the stack and it provides the very same service both on-premise and as a service.&lt;/p&gt;</description>
        <pubDate>Tue, 13 Dec 2016 11:05:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/12/13/the-new-connected-extension/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/12/13/the-new-connected-extension/</guid>
      </item>
    
      <item>
        <title>What happened to the SonarQube extension?</title>
        <description>&lt;p&gt;If you run a SonarQube analysis in your pipeline you might have noticed this:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-VxTmB1h4ckg/WElyECKpuBI/AAAAAAAAEKs/3aseiI2oRNs/s1600-h/image4.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-6S22QpwHUWc/WElyFKmjL5I/AAAAAAAAEK0/jp9BbQz4MRQ/image_thumb2.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;50&quot;&gt;&lt;/a&gt;It is actually &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-sonarsource.sonarqube&quot;&gt;the case&lt;/a&gt; – the SonarQube extension is being spun off the product and transferred to SonarSource for further development.&lt;/p&gt; &lt;p&gt;This is not bad news, as we already gained the possibility of running the command-line scanner in the Team Build, both on-premise and (that is where it is important!) on the hosted one.&lt;/p&gt; &lt;p&gt;Also, there is a new integration type – a native &lt;strong&gt;SonarQube &lt;/strong&gt;one:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-5ikkreFXahs/WElyGGj_IwI/AAAAAAAAEK8/qhctbsXPs4E/s1600-h/image7.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-0G3CH7II3sg/WElyG9-9F2I/AAAAAAAAELE/WAR3cwJaODA/image_thumb3.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;140&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Here you can define your server and use a &lt;a href=&quot;http://docs.sonarqube.org/display/SONAR/User+Token&quot;&gt;token&lt;/a&gt; for authentication, which is much better than credentials.&lt;/p&gt;</description>
        <pubDate>Thu, 08 Dec 2016 14:45:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/12/08/what-happened-to-sonarqube-extension/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/12/08/what-happened-to-sonarqube-extension/</guid>
      </item>
    
      <item>
        <title>Review – Professional C# 6 and .NET Core 1.0</title>
        <description>&lt;p&gt;.NET Core brings so many changes, even if you don’t write production code on a daily basis you might want to have a refresh &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-4ZvhmBtSN9g/WDxZSPEdG7I/AAAAAAAAEJs/adFOmEl8X1k/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt; and that’s what I did with &lt;a href=&quot;http://twitter.com/christiannagel&quot;&gt;Christian Nagel’s&lt;/a&gt; book.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-W2zXLS6etvI/WDxZTDs8-YI/AAAAAAAAEJ0/qzu9dNpF_A0/s1600-h/DSC_0024%25255B3%25255D.jpg&quot;&gt;&lt;img title=&quot;DSC_0024&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;DSC_0024&quot; src=&quot;https://lh3.googleusercontent.com/-DZjZ7Pe1jpE/WDxZUNCnUlI/AAAAAAAAEJ8/IGfEYOGL6GA/DSC_0024_thumb.jpg?imgmax=800&quot; width=&quot;184&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;It is very well flowing and never too near a knowledge base article – Christian writes very well. The content in there is for Visual Studio 2015, but you can definitely use it with 2017 as well.&lt;/p&gt; &lt;p&gt;I was particularly interested in the .NET Core and ASP.NET Core sections, and I reckon they are really a fresh and clear starting point on the matter. Given we are talking about a printed book it might not be fully updated, but again it is a matter of a few touches here and there. It is worth remembering that it is stuff in continuous evolution, so I would expect it.&lt;/p&gt; &lt;p&gt;But the book definitely isn’t just about .NET Core and ASP.NET Core. It covers extremely well the stack from top to bottom, and I quite enjoyed the &lt;em&gt;What’s new in C# 6.0&lt;strong&gt; &lt;/strong&gt;&lt;/em&gt;section&lt;em&gt; &lt;/em&gt;and the &lt;em&gt;recap&lt;/em&gt; from C# 1.0 to 6.0 in the first pages. As I said it is about the whole stack, so once you are off the first 450 pages (Part I is all about the language) you can tackle the IDE, the Compiler Platform and more.&lt;/p&gt; &lt;p&gt;I particularly liked how broad the approach was. The &lt;strong&gt;Testing section &lt;/strong&gt;for example mentions not only MSTest but also xUnit, and in both .NET Core and .NET Framework, the &lt;strong&gt;Diagnostics section &lt;/strong&gt;mentions Application Insights, etc. Christian did an amazing job summarising these broad but also specialist topics, and the result is really well-integrated&lt;/p&gt; &lt;p&gt;I am a huge fan of books, and I really enjoy having a well-written reference I can dive into instead of going straight to Google, losing context in the meantime. This is one of these, and I also strongly suggest this book to whoever needs a refresh or is tackling C# and the Microsoft stack with a bit of past experience.&lt;/p&gt;</description>
        <pubDate>Mon, 28 Nov 2016 16:20:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/11/28/review-professional-c-6-and-net-core-10/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/11/28/review-professional-c-6-and-net-core-10/</guid>
      </item>
    
      <item>
        <title>Safely add tasks to an on-premise Build Agent from the vsts-tasks repository</title>
        <description>&lt;p&gt;In my &lt;a href=&quot;http://mattvsts.blogspot.co.uk/2016/11/start-building-aspnet-core-11-with-tfs.html&quot;&gt;last post&lt;/a&gt; I uploaded a task from the &lt;a href=&quot;https://github.com/Microsoft/vsts-tasks&quot;&gt;vsts-tasks&lt;/a&gt; GitHub repository to my on-premise Build Agent. How did I know it was going to work in the same way as with VSTS?&lt;/p&gt; &lt;p&gt;First of all you need to check the minimum agent version in the task you are interested in. Let’s take the .NET Core task I used as an example, that task has a minimum version of 1.95:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-wQf4j6xU4MY/WDRAaW7q0uI/AAAAAAAAEIc/H7x4imYI6Po/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-66J6JQdgwjs/WDRAbTJK9GI/AAAAAAAAEIk/6vLFsr2oM0g/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;227&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This means that the task is going to work from version 95 of the closed-source version on Windows. How do I know that?&lt;/p&gt; &lt;p&gt;Before TFS 2017 there were two different agents – a Windows-only, closed-source version and a Xplat, &lt;a href=&quot;https://github.com/Microsoft/vso-agent&quot;&gt;open-source&lt;/a&gt; one. The closed-source version was v1.x, the open-source version was v0.x. This version number can be retrieved in the Agent.Version property of your Build Agent:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-Eer5O4xmecg/WDRAcD-uL7I/AAAAAAAAEIs/3IxxVKEe9bY/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-Y98xwUxEdFc/WDRAdH03fOI/AAAAAAAAEI0/CE43bdMOVc0/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;28&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Now the agents come from a single &lt;a href=&quot;https://github.com/Microsoft/vsts-agent&quot;&gt;repository&lt;/a&gt; and they are written in .NET Core as a single code base. This version of the agents is marked with &lt;a href=&quot;https://github.com/Microsoft/vsts-agent/releases/tag/v2.105.7&quot;&gt;v2.x&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;So whenever you want to add a task from the tasks repository always check for the minimum agent version required for it. Generally, if you are on the latest version you won’t have problems adding new tasks unless there are breaking changes – and these are really well documented, if any.&lt;/p&gt;</description>
        <pubDate>Tue, 22 Nov 2016 12:56:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/11/22/safely-add-tasks-to-on-premise-build/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/11/22/safely-add-tasks-to-on-premise-build/</guid>
      </item>
    
      <item>
        <title>Start building ASP.NET Core 1.1 with TFS</title>
        <description>&lt;p&gt;In my spare time I am looking at ASP.NET Core – it brings so much change that you can’t really ignore it even if you are not a web developer.&lt;/p&gt; &lt;p&gt;After putting together the first samples (thanks to the help of a book as well, review coming in a few weeks) I wanted to build something in my lab with a TFS build, so totally on-premise and with no connection to the shiny VSTS.&lt;/p&gt; &lt;p&gt;After installing all the prerequisites (Visual Studio 2017 RC is a great starting point, and I added &lt;a href=&quot;https://go.microsoft.com/fwlink/?LinkID=835014&quot;&gt;this&lt;/a&gt; on top as well) you can easily get up and running by using command-line tools in the build:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-YIljU3JXbeE/WDHZIB9nr8I/AAAAAAAAEGA/nVu6JYeepXE/s1600-h/0%25255B6%25255D.png&quot;&gt;&lt;img title=&quot;0&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;0&quot; src=&quot;https://lh3.googleusercontent.com/-pCOoi_myBRE/WDHZKfFgX8I/AAAAAAAAEGI/dr6zIDPnDhQ/0_thumb%25255B4%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;122&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;But it isn’t really what I wanted… and in Team Foundation Server 2017 there are no OOB tools for .NET Core. Not everything is lost though.&lt;/p&gt; &lt;p&gt;Firstly, install &lt;a href=&quot;https://github.com/Microsoft/tfs-cli&quot;&gt;tfx-cli&lt;/a&gt;. Not only it works perfectly on-premise as well as with VSTS, but given that TFS now has a Personal Access Token system we can stop using basic authentication with it. Awesome.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-MGvpjlvVR9Y/WDHZLbHgyOI/AAAAAAAAEGQ/WcJPBqSWt9s/s1600-h/image%25255B12%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-8Lrp6f_YR9k/WDHZMWwNljI/AAAAAAAAEGY/Otfo97bxk8M/image_thumb%25255B4%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;271&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Then, we need the nice task VSTS &lt;a href=&quot;http://mattvsts.blogspot.co.uk/2016/11/net-core-support-in-new-team-build-with.html&quot;&gt;uses&lt;/a&gt;. You can get it from &lt;a href=&quot;https://github.com/Microsoft/vsts-tasks/tree/master/Tasks/DotNetCoreCLI&quot;&gt;here&lt;/a&gt; and upload it to your local TFS by using &lt;strong&gt;tfx build tasks upload --task-path &amp;lt;your path&amp;gt;&lt;/strong&gt;. Simple as that.&lt;/p&gt; &lt;p&gt;So you can start using it! Instead of using a .json file as a Project file you can totally point it at a .csproj file – what the task does is nothing but wrapping calls to dotnet.exe so as long as it is updated you are totally fine.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-sxxAyLhE2Vc/WDHZNRkdEII/AAAAAAAAEGg/VWV7SBWXex0/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-hplGS-2BHLQ/WDHZORuGKVI/AAAAAAAAEGo/QdCywFUlQSo/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;190&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;As I am using a basically empty ASP.NET Core application I unchecked the &lt;strong&gt;Publish Web Project&lt;/strong&gt; option in the &lt;strong&gt;dotnet publish&lt;/strong&gt; step – I want total control over the command. &lt;strong&gt;Zip Published Projects&lt;/strong&gt; is fine as it just zips the artifacts.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-s1u7Kz2K88I/WDHZPb5FRlI/AAAAAAAAEGw/2iqGqk8hxKU/s1600-h/image%25255B8%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-MSF57Ev54j0/WDHZQpYMvJI/AAAAAAAAEG4/9NuXA1QuUvg/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;100&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This is it – I now have a CI build running in…say five minutes? &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-FKtZI7qMO_4/WDHZR5VHlDI/AAAAAAAAEHA/b6hHjE05DTs/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt;</description>
        <pubDate>Sun, 20 Nov 2016 17:11:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/11/20/start-building-aspnet-core-11-with-tfs/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/11/20/start-building-aspnet-core-11-with-tfs/</guid>
      </item>
    
      <item>
        <title>.NET Core support in the new Team Build with VSTS</title>
        <description>&lt;p&gt;Technology on its own is not really helpful IMHO – having an ecosystem really helps. So I noticed that VSTS now &lt;a href=&quot;https://www.visualstudio.com/en-us/articles/news/2016/nov-02-team-services&quot;&gt;supports&lt;/a&gt; .NET Core in the Team Build, and obviously I wanted to give it a go &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-pQ_VMC6-Us0/WCdeyiGkYFI/AAAAAAAAEDA/EtKenZx3k6Y/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;I started by creating a Team Project in VSTS and adding a sample application created with &lt;strong&gt;dotnet new –t web&lt;/strong&gt; to its Git repository:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-dv58ozZItoI/WCdez1dDHHI/AAAAAAAAEDI/_oDW7b08-dE/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-f256T2wVq6k/WCde0v6re0I/AAAAAAAAEDQ/IwuVJTzxiX0/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;169&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;So it is time to build it:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-z43eYl67fY4/WCde179HtbI/AAAAAAAAEDY/LWBa3IbZ2SA/s1600-h/image%25255B6%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-gyn9UBBMmQQ/WCde27xgWOI/AAAAAAAAEDg/TscfHu7sWCs/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;157&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;There is now a Build Definition Template for .NET Core – long are the days when you had only a couple of them…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-VytcDdwaLRs/WCde30uwzqI/AAAAAAAAEDo/VuX2bP_MAIk/s1600-h/image%25255B9%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-pRcDM1B0zo4/WCde5BCGq3I/AAAAAAAAEDw/3YGYP9N8Ur4/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;173&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;What this Template does is nothing really fancy – it encapsulated the basic commands from &lt;strong&gt;dotnet&lt;/strong&gt; to tasks. You could have done the same with a command line task yourself, but the key point here is that this is all &lt;strong&gt;out-of-the-box&lt;/strong&gt; now.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-s9wHawrYqGs/WCde5xSZiYI/AAAAAAAAED4/2CxT-rZwmIs/s1600-h/image%25255B12%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-GVaRxa3fbsw/WCde65vCiwI/AAAAAAAAEEA/xKWbZvzM_Fw/image_thumb%25255B4%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;177&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;I just accepted all the default settings and triggered a new build. It is successful of course…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-BPrxXuU0FUs/WCde7_pnhcI/AAAAAAAAEEI/Na2K7VaooJM/s1600-h/image%25255B15%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-VEuAwOtwQSc/WCde8_Pim3I/AAAAAAAAEEQ/QeSIaIJ2JMQ/image_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;104&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;But again, the point here isn’t about the template itself (which you’ll customise anyway). &lt;/p&gt; &lt;p&gt;The big point is providing support to cutting edge technology, without support and an ecosystem technology alone, regardless of how cool and innovative it is, is pretty much useless.&lt;/p&gt;</description>
        <pubDate>Sat, 12 Nov 2016 18:27:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/11/12/net-core-support-in-new-team-build-with/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/11/12/net-core-support-in-new-team-build-with/</guid>
      </item>
    
      <item>
        <title>Don’t just chuck your stuff in VSTS, take advantage of the artifact repository!</title>
        <description>&lt;p&gt;If I’d get a penny for any question on this activity I would be a billionaire by today:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-Xcbt7bUlvLs/WCCkjHh7JmI/AAAAAAAAD_E/sL8hoylfwcc/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-AxnDDFd3ztI/WCCkkCa8r0I/AAAAAAAAD_M/T1lQrlOzs7I/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;64&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;It is a waste of time not sorting and creating proper folders for your artifacts – why should you dig into subfolders when you can create the best possible structure?&lt;/p&gt; &lt;p&gt;Firstly, start by splitting any infrastructural definition. There is no point in handling the json files or anything else related to the infrastructure with the packages, binaries and application-specific scripts.&lt;/p&gt; &lt;p&gt;Then try to divide your output into &lt;em&gt;groups&lt;/em&gt;. In my case I really like to split between Infrastructure, Packages and Scripts. This is more than enough 99% of the time.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-VoJtan5X24s/WCCklPl-0tI/AAAAAAAAD_U/-0Ho64S0Vjg/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-gzcCG2hozhE/WCCkmeW6PXI/AAAAAAAAD_c/DvX5nstPGj4/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;161&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This is way clearer than this:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-fQ29XpScNUg/WCCknZR912I/AAAAAAAAD_k/PTn8iiMXW-0/s1600-h/image%25255B8%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-lhTTCok2Vyc/WCCkoao64NI/AAAAAAAAD_s/2VfNpXnM1FQ/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;96&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Without mentioning the folder structure…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-qdghc093t-8/WCCkpdR1nEI/AAAAAAAAD_0/nmnIVxweCSE/s1600-h/image%25255B14%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-WPUXU8OM5VM/WCCkqYmEZFI/AAAAAAAAD_8/U5IeOqodRVU/image_thumb%25255B4%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;140&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-nZ1QLAunn7U/WCCkrZoNSDI/AAAAAAAAEAE/iZqrPRyWUm8/s1600-h/image%25255B17%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-XMfJ3xmLryI/WCCksdb4hAI/AAAAAAAAEAM/ecLkqosnpPU/image_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;143&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-IXtoBgKxNX8/WCCktao0FRI/AAAAAAAAEAU/QGtBe9HEVR0/s1600-h/image%25255B20%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-r9XUHLGENYI/WCCkuf28b3I/AAAAAAAAEAc/VqyjoIOwzpY/image_thumb%25255B6%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;169&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-9a1aA-esGQI/WCCkvmI9c1I/AAAAAAAAEAk/nWmV26Gv_AQ/s1600-h/image%25255B11%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-_K0u4POpTME/WCCkwhwluFI/AAAAAAAAEAs/5pE5AFspFJc/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;216&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;That is because the default activity will collect everything you specify in your matching pattern regardless of the folder structure, while the &lt;em&gt;custom activity &lt;/em&gt;(where you just add a new one basically, there is nothing really custom there) gets only the final leaf.&lt;/p&gt;</description>
        <pubDate>Mon, 07 Nov 2016 15:58:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/11/07/dont-just-chuck-your-stuff-in-vsts-take/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/11/07/dont-just-chuck-your-stuff-in-vsts-take/</guid>
      </item>
    
      <item>
        <title>Track service usage data in VSTS</title>
        <description>&lt;p&gt;Every TFS admin knows about the &lt;a href=&quot;http://mattvsts.blogspot.co.uk/2014/05/troubleshooting-users-issues-with-team.html&quot;&gt;Operational Intelligence&lt;/a&gt; page. It is a very important tool for managing Team Foundation Server, which provides lots of useful information about service usage.&lt;/p&gt; &lt;p&gt;Nothing like that existed for VSTS, up until a few sprints ago. Now if you look at the Account level settings…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-ADMCxYh2U8E/WAihWZoeJhI/AAAAAAAAD9s/SCLSIn5dFTU/s1600-h/image%25255B7%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-smoIrdBJ9fA/WAihXXJ_fZI/AAAAAAAAD90/GOGH042keg8/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;73&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The Usage tab is a revamped version of Operational Intelligence for VSTS! Of course you won’t be interested in the server-side jobs as it is a service, but here you can get all the usage audit about a certain user:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-JvMi5_wm82E/WAihYXkDLjI/AAAAAAAAD98/SW1PSUnZkKo/s1600-h/image%25255B6%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-QQzXb8y6nqs/WAihZeEds9I/AAAAAAAAD-E/nLSDIcdWgb4/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;183&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;It is worth noting that there are rate limits (the Usage column, expressed in Team Services Throughput Units), so you can be throttled or stopped if you are exceeding these – usually with an automated tool or a script. More about this &lt;a href=&quot;https://www.visualstudio.com/docs/reference/rate-limits&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
        <pubDate>Thu, 20 Oct 2016 10:50:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/10/20/track-service-usage-data-in-vsts/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/10/20/track-service-usage-data-in-vsts/</guid>
      </item>
    
      <item>
        <title>Easy Service Endpoints ACL management in VSTS</title>
        <description>&lt;p&gt;It is amazing how quickly VSTS changes and evolves – of course you need to keep up with it as well &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-1QQ_Y32FtAo/V_0RsUMLf7I/AAAAAAAAD8E/BFYeWmJBolk/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;This is todays discovery – the new Service Endpoint’s ACL management UI. In the past Service Endpoints were shown pretty much just as a key-value field with an URL, in reality they have two security groups behind the scenes:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Endpoint Administrators&lt;/li&gt; &lt;li&gt;Endpoint Creators&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;You knew that (didn’t you?), but managing the ACL per-endpoint wasn’t as straightforward as it is today.&lt;/p&gt; &lt;p&gt;The &lt;strong&gt;Roles&lt;/strong&gt; tab in each Endpoint now has a much clearer view of the users’ assignments:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-Q5pkH3E4K2w/V_0Rto9ouLI/AAAAAAAAD8M/O8KV4egfvIg/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-u0FgvgDT71E/V_0RveNYQrI/AAAAAAAAD8U/Sw-GB9mmsGk/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;139&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;And adding an user is a much better experience now – with an immediate explanation of the role and the associated permissions:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-JKYB7Hurxk8/V_0RwbiAJaI/AAAAAAAAD8c/UEAvLWaRvIM/s1600-h/image%25255B7%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-b-WvNvI4gwk/V_0RxT4RgwI/AAAAAAAAD8k/uTai7MRX2vc/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;348&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;What really strikes me here is the possibility of having the Access inheritance shown immediately – this is a very welcome change for me &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-1QQ_Y32FtAo/V_0RsUMLf7I/AAAAAAAAD8E/BFYeWmJBolk/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt;</description>
        <pubDate>Tue, 11 Oct 2016 16:22:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/10/11/easy-service-endpoints-acl-management/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/10/11/easy-service-endpoints-acl-management/</guid>
      </item>
    
      <item>
        <title>A pipeline is not just as vertical fall! Triggers in Visual Studio Release Management</title>
        <description>&lt;p&gt;It is great to see people approaching the Pipeline model, but of course the more people adopt it the more we need to go deep into the products we use to get the very best value for us.&lt;/p&gt; &lt;p&gt;An example of this is when you start getting comfortable with pipelines. If you get too comfortable too soon, it is because your pipeline looks like this:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-1QwYrbFMkXM/V_aKUI79wsI/AAAAAAAAD5k/c8or29dBYd8/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-uOg0PSRSmlw/V_aKWU5g50I/AAAAAAAAD5s/ooW7vGOrrjM/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;157&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;I am not saying it is wrong. There are countless situations where you want or need to keep it that way. What I want to stress is that it isn’t the only way to shape the pipeline!&lt;/p&gt; &lt;p&gt;For example, let’s say you are facing performance issues while deploying because of some reason, or you want to do &lt;em&gt;something else&lt;/em&gt; (like initialise the database with real data while deploying your PaaS application, running certain tests while deploying other non-core components of your application, examples are countless here really) – can you do that?&lt;/p&gt; &lt;p&gt;The answer is a strong and definite &lt;strong&gt;yes&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Let’s say you want to do this:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-v5EnYr5qk3o/V_aKXaaCDuI/AAAAAAAAD50/Rq4W85fLMyA/s1600-h/image%25255B8%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-ZUHumtcEtbc/V_aKYqG-xRI/AAAAAAAAD58/TpKXVgLFrrc/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;157&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;“&lt;em&gt;QA – deploy DB&lt;/em&gt;” happens first, and then I would like to execute “&lt;em&gt;QA – initialise DB&lt;/em&gt;” and “&lt;em&gt;QA – deploy app&lt;/em&gt;” in parallel. How? With a proper management of triggers in Visual Studio Release Management &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-P0YDghYVTtg/V_aKZ4AJEDI/AAAAAAAAD6E/MpR3Tz3-Mds/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;The first environment is automatically triggered by a build, what is interesting is that you can set &lt;strong&gt;more than one environment&lt;/strong&gt; to be triggered by another successful deployment:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-5nD4PnD3myk/V_aKa5OLLLI/AAAAAAAAD6M/3tVIX5oia1g/s1600-h/image%25255B14%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-cqum_5aBERA/V_aKb8qzsOI/AAAAAAAAD6U/4SK8uAFZGRs/image_thumb%25255B6%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;145&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Also, you can set an environment to be triggered by all of the previous environments:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-ghjWEh0FpZI/V_aKc4TiVxI/AAAAAAAAD6c/JQ_5Pi6m5A8/s1600-h/image%25255B18%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-YSH08w_lc7A/V_aKd9dSS_I/AAAAAAAAD6k/v5AUJImhK1E/image_thumb%25255B8%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;48&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;So you aren’t forced to use a Niagara Falls pipeline, but something more akin to the estuary of a river &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-P0YDghYVTtg/V_aKZ4AJEDI/AAAAAAAAD6E/MpR3Tz3-Mds/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt;</description>
        <pubDate>Thu, 06 Oct 2016 17:31:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/10/06/a-pipeline-is-not-just-as-vertical-fall/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/10/06/a-pipeline-is-not-just-as-vertical-fall/</guid>
      </item>
    
      <item>
        <title>Too long forgotten, the Activity field in TFS</title>
        <description>&lt;p&gt;Team Foundation Server is around since 2005, and many features seem to be forgotten despite being in the same place as usual.&lt;/p&gt; &lt;p&gt;If I asked for a dollar/euro/pound every time I was asked this I would be a billionaire as of now:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;Can I have a Development Task, Testing Task, Documentation Task Work Item Type in TFS?&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;You can definitely have such a WIT, but would this make any sense? Excluding any consideration about your methodology (this unfortunately is a question I keep getting regardless of Scrum/Agile/Waterfall/CMMI/etc.), why would you have a different WIT for different &lt;em&gt;flavours&lt;/em&gt; of the same?&lt;/p&gt; &lt;p&gt;Usually reasons here vary, but one of the most consistent is this:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;I would like to visually understand how the requirement is split and this also makes life easier for team members with different roles in the team.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;I mean – the first part is fair enough. But as for the second… it is all about the human rejection of changes &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-zf9gbJRlO-8/V-ziqqG5M2I/AAAAAAAAD3E/j01OH0Juzng/wlEmoticon-smile2.png?imgmax=800&quot;&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;So, in my opinion the best way of tackling this request (I can’t even class it as a &lt;em&gt;problem&lt;/em&gt;…) is to use the Activity field which every Work Item has. Simple as that.&lt;/p&gt; &lt;p&gt;Let’s take this for example:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-UBIV31FLRB4/V-zir0OYOdI/AAAAAAAAD3M/kQ3oOJmYts8/s1600-h/clip_image002%25255B3%25255D.jpg&quot;&gt;&lt;img title=&quot;clip_image002&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;clip_image002&quot; src=&quot;https://lh3.googleusercontent.com/-69JcDGRQHYs/V-zitK9V_9I/AAAAAAAAD3U/KM7v1yuoe_o/clip_image002_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;78&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This comes from the backlog, and all the children tasks are…tasks &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-zf9gbJRlO-8/V-ziqqG5M2I/AAAAAAAAD3E/j01OH0Juzng/wlEmoticon-smile2.png?imgmax=800&quot;&gt;but leveraging the Activity field you can categorise these children tasks:&lt;/p&gt; &lt;p&gt;&lt;b&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-Y7AL_SxHjrI/V-ziu1KLUTI/AAAAAAAAD3c/isioiNa7nj8/s1600-h/clip_image002%25255B4%25255D%25255B2%25255D.jpg&quot;&gt;&lt;img title=&quot;clip_image002[4]&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;clip_image002[4]&quot; src=&quot;https://lh3.googleusercontent.com/-7BNrB9WoBPw/V-ziwN-fIrI/AAAAAAAAD3k/xmI6feeEbgA/clip_image002%25255B4%25255D_thumb.jpg?imgmax=800&quot; width=&quot;212&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt; &lt;p&gt;Needless to say the Activity list can be customised. Once you do that, you might want to apply some styling rules to the task board, leading to something like this:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-Hz-PbNFlqQU/V-zixV1pLyI/AAAAAAAAD3s/CuSbA_dBEtU/s1600-h/clip_image002%25255B6%25255D%25255B3%25255D.jpg&quot;&gt;&lt;img title=&quot;clip_image002[6]&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;clip_image002[6]&quot; src=&quot;https://lh3.googleusercontent.com/-cUV2vvtdLXY/V-ziykBwAzI/AAAAAAAAD30/gc8iMgfdZSo/clip_image002%25255B6%25255D_thumb%25255B1%25255D.jpg?imgmax=800&quot; width=&quot;504&quot; height=&quot;198&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;And as a side-effect, if you use the Remaining Work field as well – as many do, regardless of the methodology as well, given that you might need to report on it – you’ll get a nice breakdown by Activity:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-AUohVRSUKMg/V-ziz4sygoI/AAAAAAAAD38/RaAozCUruMc/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-Zw0_Znc_-2U/V-zi1Fd9uAI/AAAAAAAAD4E/ZUv3X4LEkaM/image_thumb.png?imgmax=800&quot; width=&quot;200&quot; height=&quot;228&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;It is worth mentioning that this field is around since at least &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/aa337627(v=vs.90).aspx&quot;&gt;TFS 2008&lt;/a&gt;.&lt;/p&gt;</description>
        <pubDate>Thu, 29 Sep 2016 09:45:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/09/29/too-long-forgotten-activity-field-in-tfs/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/09/29/too-long-forgotten-activity-field-in-tfs/</guid>
      </item>
    
      <item>
        <title>Removing Analysis Services references when moving a TFS deployment</title>
        <description>&lt;p&gt;When you need to stand up a testing environment, a DR situation or simply a new instance from existing backups you might want to forget about SSAS altogether and go ahead with just the core Team Foundation Server’s databases – something you can’t do if you use the Application Tier Only option.&lt;/p&gt; &lt;p&gt;The error you will get is a &lt;strong&gt;TF400952:&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;An unexpected error occurred during Analysis Services validation, see logs for details. The component might be damaged or not installed properly. You must exit the Team Foundation Administration Console and install either SQL Server Analysis Services or the SQL Server Client Tools on the application tier to ensure that the Analysis Service object model is present for warehouse processing. Once you have installed the necessary components, open the administration console and re-run the wizard.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;If you run into this, it means you did not follow the &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/ms404869(v=vs.120).aspx#clone&quot;&gt;documentation&lt;/a&gt; about how to setup a deployment on a new hardware &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-I8An_YdTQ_c/V-voM0QdWZI/AAAAAAAAD2s/uDtblJAtVw4/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt; so back to it, you will run &lt;strong&gt;TFSConfig RemapDBs&lt;/strong&gt; at some point, and that is where you need to pay attention.&lt;/p&gt; &lt;p&gt;If you run TFSConfig RemapDBs without the &lt;strong&gt;/continue&lt;/strong&gt; switch you will just get an error:&lt;/p&gt; &lt;p&gt;&lt;em&gt;Unable to find any compatible SQL Analysis Services database within the specified instance. The host with name ‘TEAM FOUNDATION’ has been assigned a new connection string.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;So you are stuck. Instead, if you run it with the /continue switch, you will see the command will be executed on the other databases as well, removing the old SSAS reference.&lt;/p&gt;</description>
        <pubDate>Wed, 28 Sep 2016 15:56:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/09/28/removing-analysis-services-references/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/09/28/removing-analysis-services-references/</guid>
      </item>
    
      <item>
        <title>A pragmatic look at why TFS and VSTS can be customised in a different way</title>
        <description>&lt;p&gt;If you paid attention to the latest releases of both TFS and VSTS you can see that the main path where they are diverging is on Process Template Customisation.&lt;/p&gt; &lt;p&gt;And hey presto! I was asked why, and why is it that different from the usual TFS experience. So here is my opinion on the matter &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-SHHco2AHv0w/V-OjYv6v4KI/AAAAAAAAD2I/WZvABBEGKWE/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;Historically, &lt;strong&gt;*no*&lt;/strong&gt; customisations were allowed for Team Projects hosted on the service. The reason behind this was very pragmatic: being a service, the provider must ensure that any upgrade are not going to break the system for its users, and that includes customisations as well.&lt;/p&gt; &lt;p&gt;Enabling the typical task witadmin.exe can do means they can’t ensure that “&lt;em&gt;the trick you used with Global Lists to show something on a certain field&lt;/em&gt;” is going to continue working, with no changes, for each upgrade the service receives without testing it. And of course, the service provider neither can test users’ customisations nor rely on users to test their own customisations according to the service release schedule. It wouldn’t work, and it would cause unnecessary churn and technical debt.&lt;/p&gt; &lt;p&gt;Normally – and this applies to Team Foundation Server as well – you would test your customisations in a sandbox or a test environment. With your own on-premise product you can duplicate the instance (especially with the new pre-production upgrade feature) and start messing around with it. It makes total sense, because hardware is cheap as chips these days and you (or the admins) are responsible for the uptime and availability of the server.&lt;/p&gt; &lt;p&gt;But you can’t have it and you can’t do it on the service, there is no test environment, &lt;strong&gt;a service is live by definition!&lt;/strong&gt; Even with DevOps properly in place there is no way of providing this with the appropriate safeguards.&lt;/p&gt; &lt;p&gt;There is a major difference between providing APIs to extend specific components of your service (usually with a limited scope) and providing a way to easily customise the overall user experience. This difference sometimes is overlooked (unfortunately) when in full-swing with the DevOps infatuation: introducing breaking changes (because you will, everybody does, at some point) on a large portion of the user experience that non-technical users will face is something to are going to regret, because non-technical users are usually more vocal and reactive to UX changes.&lt;/p&gt;UX changes aren’t like &lt;em&gt;custom release task using the VSTS APIs “somehow”&lt;/em&gt;, they are all about consistency in the overall experience a user has, and it is critical to understand what is going to happen the second you break &lt;em&gt;something you can see&lt;/em&gt;. Can you imagine the mayhem when a non-technical user, who heavily relies on that customisation, is going to get an error and his critical feature isn’t there anymore?  &lt;p&gt;It was the right decision, because the team was missing a way of &lt;em&gt;funneling&lt;/em&gt; the customisations in a sanitised and reliable way.&lt;/p&gt; &lt;p&gt;But now they have! And they are doing a great job at enabling these Process Customisation scenarios – usually a big blocker in Enterprise situations.&lt;/p&gt;</description>
        <pubDate>Thu, 22 Sep 2016 09:24:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/09/22/a-pragmatic-look-at-why-tfs-and-vsts/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/09/22/a-pragmatic-look-at-why-tfs-and-vsts/</guid>
      </item>
    
      <item>
        <title>Simplifying TFS restores with TFSConfig OfflineDetach</title>
        <description>&lt;p&gt;Before TFS 2015 Update 3, if you want to restore an instance you need to restore all the collection databases of the instance. This might be an extremely long and time-consuming activity.&lt;/p&gt; &lt;p&gt;Very quietly, Microsoft introduced the &lt;strong&gt;&lt;a href=&quot;https://www.visualstudio.com/en-us/docs/setup-admin/command-line/tfsconfig-cmd&quot;&gt;OfflineDetach&lt;/a&gt; &lt;/strong&gt;command for TFSConfig. What is that?&lt;/p&gt; &lt;p&gt;It is a new command you can use to restore only a specific collection (and configuration database) so you can simplify the restore operation and save time.&lt;/p&gt; &lt;p&gt;Aside from that, you can also use it to restore non-detached databases (useful for DR).&lt;/p&gt;</description>
        <pubDate>Fri, 09 Sep 2016 15:20:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/09/09/simplifying-tfs-restores-with-tfsconfig/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/09/09/simplifying-tfs-restores-with-tfsconfig/</guid>
      </item>
    
      <item>
        <title>SonarQube 6.0 and the StyleCop plugin</title>
        <description>&lt;p&gt;For one of our projects we use the &lt;a href=&quot;http://docs.sonarqube.org/pages/viewpage.action?pageId=1441942&quot;&gt;StyleCop plugin&lt;/a&gt; for SonarQube during the analysis. As you can see it was recently deprecated.&lt;/p&gt; &lt;p&gt;I successfully updated the instance used by this product to SonarQube 6.0, when I was told an exception was raised while building:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-0wI7E-qXzq8/V7WqbDhbH2I/AAAAAAAAD1I/qh2gCsTU_4A/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-WHGwbQy96PU/V7WqcdOy5sI/AAAAAAAAD1Q/dOiV_Zn6Ix4/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;79&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;To make things worse, there are no workarounds or quick fixes to unblock it as you can see from &lt;a href=&quot;https://groups.google.com/forum/#!topic/sonarqube/XXtAcKj32kU&quot;&gt;here&lt;/a&gt;. The reason behind this is because it isn’t using the .NET Compiler Platform.&lt;/p&gt; &lt;p&gt;Long story short – the plugin is deprecated &lt;strong&gt;and &lt;/strong&gt;it won’t work with SonarQube 6.0. You can either disable the plugin and keep SonarQube 6.0 running or revert back to SonarQube 5.6.1.&lt;/p&gt;</description>
        <pubDate>Thu, 18 Aug 2016 12:30:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/08/18/sonarqube-60-and-stylecop-plugin/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/08/18/sonarqube-60-and-stylecop-plugin/</guid>
      </item>
    
      <item>
        <title>SonarQube analysis of Java code with VSTS</title>
        <description>&lt;p&gt;As &lt;a href=&quot;http://mattvsts.blogspot.co.uk/2016/06/a-simple-vsts-based-pipeline-for-java.html&quot;&gt;we know&lt;/a&gt;, we can use VSTS to build Java code as well as .NET code thanks to the Maven instance provided by the service. It is one of the reasons why we can forget about the build engine with VSTS – it just works.&lt;/p&gt; &lt;p&gt;If I use Maven on VSTS I don’t even need to add a SonarQube task in the Build Definition. All I need to do is to tick the checkbox and point Maven to my SonarQube instance:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-sunL4bRF5Wc/V63f7oumJgI/AAAAAAAAD0E/VWvRPpye6fc/s1600-h/image%25255B7%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-AGl0yMBHfmI/V63f8lmg4NI/AAAAAAAAD0M/C38ZqAafZ1E/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;225&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This is literally all I have to do. Maven is already configured so I will get my SonarQube analysis in two clicks:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-Hjhre24kZW0/V63f9nDxlkI/AAAAAAAAD0U/k5YZcDeB2I4/s1600-h/image%25255B6%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-9jT2jf-BCdc/V63gCDNppmI/AAAAAAAAD0c/OIxbcDCObRs/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;189&quot;&gt;&lt;/a&gt;&lt;/p&gt;</description>
        <pubDate>Fri, 12 Aug 2016 14:41:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/08/12/sonarqube-analysis-of-java-code-with/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/08/12/sonarqube-analysis-of-java-code-with/</guid>
      </item>
    
      <item>
        <title>Package Management in TFS15 RC1</title>
        <description>&lt;p&gt;If there was a missing feature in TFS 2015, it was the lack of an integrated Package Management solution. Long are these days, the Package Management &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms.feed&quot;&gt;extension&lt;/a&gt; is bundled in TFS 15 RC1! &lt;/p&gt; &lt;p&gt;You just need to install it via your &lt;a href=&quot;http://YOURTFSURL/_gallery/items?itemName=ms.feed&quot;&gt;Local Extension Gallery&lt;/a&gt; and you are good to go:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-CVhjFDY0qxA/V6r2ySyUPFI/AAAAAAAADwc/hcDDqsR1Yq4/s1600-h/image%25255B9%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-LusUqegh17M/V6r20bkxREI/AAAAAAAADwk/2YoBMt7fciU/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;201&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-LFVjT3w2HIc/V6r21FZ6uBI/AAAAAAAADws/i01PteyGoPU/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-vARU9Ya6nlw/V6r22NIo9CI/AAAAAAAADw0/brAk88wV5Zs/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;212&quot;&gt;&lt;/a&gt;&lt;/p&gt;     &lt;p&gt;You can then create a new feed:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-0z0y5ZQXyyY/V6r23DKtoaI/AAAAAAAADw8/Az24Mj8coo8/s1600-h/image%25255B13%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-e0MDj40FXLE/V6r24ITLpbI/AAAAAAAADxE/xyEwQxQBW1k/image_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;416&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;and you are going to get a very nice guidance page to get started:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-tWAStZZ_8bw/V6r25FePM7I/AAAAAAAADxM/hLTLXxoSJwE/s1600-h/image%25255B17%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-MoIE0LjB_cA/V6r26Jy2SlI/AAAAAAAADxU/FSrBVMPa6nE/image_thumb%25255B7%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;277&quot;&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;These are the default permissions:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-OgKxR6D8h0Q/V6r27M_U12I/AAAAAAAADxc/qMuJ8Bc7XLk/s1600-h/image%25255B21%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-5PPUbknx3HY/V6r28BtSBdI/AAAAAAAADxk/EZ3ZMB-bkR8/image_thumb%25255B9%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;248&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;After that you’ll add the feed as usual in Visual Studio:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-PWfLGKO8buA/V6r29Ctk0-I/AAAAAAAADxs/rFW8p_adpFo/s1600-h/image%25255B25%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-BlzIDzJW5CQ/V6r2-LJ8jkI/AAAAAAAADx0/BBsbWQYPHgk/image_thumb%25255B11%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;127&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;so you can start pushing something up there!&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-k7aMOuM7V28/V6r2_P6KIQI/AAAAAAAADx8/1FzY-DJXhD8/s1600-h/image%25255B28%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-v0-Pn8Wmjvo/V6r2_00c0QI/AAAAAAAADyE/9tNOw9-WpSE/image_thumb%25255B12%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;131&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Delivery of stuff via NuGet package is more and more frequent these days and you had to rely on a third-party tool like ProGet (on-premises) or MyGet (in the cloud). It is great to have it integrated in Team Foundation Server, extending the ALM platform with out-of-the-box features.&lt;/p&gt;</description>
        <pubDate>Wed, 10 Aug 2016 09:42:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/08/10/package-management-in-tfs15-rc1/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/08/10/package-management-in-tfs15-rc1/</guid>
      </item>
    
      <item>
        <title>Metatasks in TFS 15 RC1</title>
        <description>&lt;p&gt;It isn’t really about TFS 15 RC1 this time, but now the UI is totally out for it so it is very prominent &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-s_VCnI-8gxI/V6mTOl2inhI/AAAAAAAADsk/sifT7xvB3Xs/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt; there is a very nice feature I usually see being overlooked when talking about the new build: meta-tasks.&lt;/p&gt; &lt;p&gt;Meta-tasks were added &lt;a href=&quot;https://www.visualstudio.com/en-us/docs/release/getting-started/release-notes#update-jul18-16&quot;&gt;a couple of weeks ago&lt;/a&gt; to the service, and they are a very easy way of collating a set of tasks you keep repeating in your build definitions.&lt;/p&gt; &lt;p&gt;For example, let’s say you start a VM and then extract files to it all the times:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-V0cCcQGcRY0/V6mTPpLHMvI/AAAAAAAADss/gWh_7ZEkW94/s1600-h/meta0%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;meta0&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;meta0&quot; src=&quot;https://lh3.googleusercontent.com/-w0-CbgVmWnU/V6mTQ2aMiDI/AAAAAAAADs0/qdz-qU1ZyLM/meta0_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;103&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;You can group this as a meta-task so you can reuse this set of tasks elsewhere:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-gNr9vjfsm4k/V6mTR2l8IzI/AAAAAAAADs8/VN1N8joNsy4/s1600-h/meta1%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;meta1&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;meta1&quot; src=&quot;https://lh3.googleusercontent.com/-jZA3NkrwkFE/V6mTS0AjrfI/AAAAAAAADtE/15UQIfzsvkY/meta1_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;140&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-4ITuN1tCsHg/V6mTTuPtBnI/AAAAAAAADtM/7tghDnKauNE/s1600-h/meta2%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;meta2&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;meta2&quot; src=&quot;https://lh3.googleusercontent.com/-N5B3ppv0H1Q/V6mTUhvGWlI/AAAAAAAADtU/HgM-nVtNXcI/meta2_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;93&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Once a meta-task is created its configuration is retained, so you can just drop the meta-task in the definition and you are ready to go!&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-QVdE9z9ImzM/V6mTVv3sksI/AAAAAAAADtc/EXK86a0N1_g/s1600-h/meta3%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;meta3&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;meta3&quot; src=&quot;https://lh3.googleusercontent.com/-0Qccn-VSedA/V6mTWhMNkVI/AAAAAAAADtk/ICuoZEHkZt0/meta3_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;73&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-GnQ2HvWkxzo/V6mTXg6AYuI/AAAAAAAADts/_EvyNd1fYwk/s1600-h/meta4%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;meta4&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;meta4&quot; src=&quot;https://lh3.googleusercontent.com/-DyhaK6ufJqs/V6mTYkCIYFI/AAAAAAAADt0/2JafdTucJHo/meta4_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;109&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Meta-tasks can be managed in the same hub as Build and Release Definitions…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-ZNY40OegPNE/V6mTZRAQMOI/AAAAAAAADt8/7AvUa_Xq8X0/s1600-h/meta5%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;meta5&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;meta5&quot; src=&quot;https://lh3.googleusercontent.com/-CfCjW2PtvWA/V6mTakVyGSI/AAAAAAAADuE/YSdz4mt_ENw/meta5_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;146&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;…and they come with their own set of ACLs, so you can restrict access to them if you want.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-wbvPpXzlioA/V6mTbrvgARI/AAAAAAAADuM/A9jWFoIRaD0/s1600-h/meta7%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;meta7&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;meta7&quot; src=&quot;https://lh3.googleusercontent.com/-BTWVix1Dgt4/V6mTciA6cyI/AAAAAAAADuU/bU8LLp4nO4w/meta7_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;187&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The very nice side effect is that once you start creating your meta-tasks and make them available to the team, you can start bringing a new Definition up to speed very quickly because you already have some &lt;em&gt;building blocks&lt;/em&gt; to use instead of relying on heavy documentation and long configurations with variables and such.&lt;/p&gt;</description>
        <pubDate>Tue, 09 Aug 2016 08:25:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/08/09/metatasks-in-tfs-15-rc1/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/08/09/metatasks-in-tfs-15-rc1/</guid>
      </item>
    
      <item>
        <title>Easy HTTPS with TFS 15 RC1</title>
        <description>&lt;p&gt;There are a number of changes in &lt;a href=&quot;https://blogs.msdn.microsoft.com/bharry/2016/08/08/tfs-15-rc1-is-available/&quot;&gt;TFS 15 RC1&lt;/a&gt;, and one I really like is the HTTPS configuration.&lt;/p&gt; &lt;p&gt;When you configure the Application Tier you can now select the bindings you want:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-kJQx4ort6Q4/V6Rdns6skrI/AAAAAAAADqI/N1ViG1Jtxz0/s1600-h/https0%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;https0&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;https0&quot; src=&quot;https://lh3.googleusercontent.com/-17J4jB59T6g/V6RdoSmt7SI/AAAAAAAADqQ/TUNJSm9zjpE/https0_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;173&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Clicking on the dropdown shows all the configurations – HTTP, HTTPS or both:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-Zq6ZZ6bFNkQ/V6RdpeV1ZHI/AAAAAAAADqY/FRTa8rPD3mU/s1600-h/https1%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;https1&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;https1&quot; src=&quot;https://lh3.googleusercontent.com/-dwFVk2gSbAQ/V6RdqlkaYFI/AAAAAAAADqg/k_Y2y7khGO0/https1_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;133&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;with the possibility of selecting the certificate straight from the wizard!&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-ToSbDCiYayk/V6RdrYmNxXI/AAAAAAAADqo/h5DEUzZHr-g/s1600-h/clip_image002%25255B5%25255D.jpg&quot;&gt;&lt;img title=&quot;clip_image002&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;clip_image002&quot; src=&quot;https://lh3.googleusercontent.com/-bOypGcC8JcQ/V6RdsVFXKbI/AAAAAAAADqw/Lf_dG2mQloI/clip_image002_thumb%25255B2%25255D.jpg?imgmax=800&quot; width=&quot;504&quot; height=&quot;79&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;You can also change the bindings, the virtual directory and the URL if needed:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/--Tak7Xe8WIk/V6SCq7fm2gI/AAAAAAAADsA/NwNo9E-tHmw/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-JoENDd262IU/V6SCsExemLI/AAAAAAAADsI/oGR0CevmCDw/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;356&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;It is just a convenience, true, but it is really handy to use instead of doing &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/aa833872(v=vs.120).aspx&quot;&gt;this&lt;/a&gt;&lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-Vi3vfzXD9oM/V6RdtWYkUiI/AAAAAAAADq4/b-fO5ygPXxk/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt;</description>
        <pubDate>Fri, 05 Aug 2016 09:34:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/08/05/easy-https-with-tfs-15-rc1/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/08/05/easy-https-with-tfs-15-rc1/</guid>
      </item>
    
      <item>
        <title>Review – Professional Visual Studio 2015</title>
        <description>&lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-o9HruZ8hQHk/V5DKqFz7RhI/AAAAAAAADpU/2opytbDOZM8/s1600-h/WP_20160720_001%25255B7%25255D.jpg&quot;&gt;&lt;img title=&quot;WP_20160720_001&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;WP_20160720_001&quot; src=&quot;https://lh3.googleusercontent.com/-oKBLLghDABo/V5DKrLEZbNI/AAAAAAAADpc/5T_5guug5bo/WP_20160720_001_thumb%25255B4%25255D.jpg?imgmax=800&quot; width=&quot;274&quot; height=&quot;484&quot;&gt;&lt;/a&gt; This is a book I keep reviewing at every release, and for good reason: it is not mainly aimed at seasoned users of Visual Studio but at beginners approaching this IDE for the first time.&lt;/p&gt; &lt;p&gt;This is why you won’t find many changes from 2013 to 2015 – because an IDE doesn’t change as much. But I still recommend it, because of its role as a &lt;em&gt;one size fits all&lt;/em&gt; overview of the development stack we use these days.&lt;/p&gt; &lt;p&gt;It is still worth it if you need a reference on your shelve (like I do &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-2zKlltyfjuk/V5DKr4Xqg5I/AAAAAAAADpk/kHue7CulmCI/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;), or because it also has good and quick code examples. Eventually I realised one of the biggest improvement is the size of the font from last version’s – it is more &lt;em&gt;readable&lt;/em&gt;.&lt;/p&gt;</description>
        <pubDate>Thu, 21 Jul 2016 13:14:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/07/21/review-professional-visual-studio-2015/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/07/21/review-professional-visual-studio-2015/</guid>
      </item>
    
      <item>
        <title>A first look at TFS 15: the new Build Agent</title>
        <description>&lt;p&gt;Another big change in TFS 15 Preview is the new Build Agent.&lt;/p&gt; &lt;p&gt;This doesn’t mean there is yet another build server (the new Team Build is here to stay &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-V-U3Ou759eM/V4T-CyMJKBI/AAAAAAAADng/1PXKIPhs2CQ/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;), the big news here is that the new Agent is cross-platform by default, because it is written in .NET Core!&lt;/p&gt; &lt;p&gt;You can set it up as usual from the main _admin page. Once you add the new Agent, you can select &lt;strong&gt;Windows (preview)&lt;/strong&gt;:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-eXpypQaCyPI/V4T-Du6w5SI/AAAAAAAADno/xdG9J-eTfU4/s1600-h/na0%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;na0&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;na0&quot; src=&quot;https://lh3.googleusercontent.com/-a7hEx1aqCtI/V4T-EgZMboI/AAAAAAAADnw/oHoa_ZcvoSw/na0_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;566&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;You need to add a user as Agent Pool Administrator to run this new agent, as per documentation:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-e1hSKCVB6LM/V4T-FgJgLOI/AAAAAAAADn4/fjCvaegvyn4/s1600-h/na1%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;na1&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;na1&quot; src=&quot;https://lh3.googleusercontent.com/-OMRNKs-6rtM/V4T-GvTbNaI/AAAAAAAADoA/fSLkOQTZqAQ/na1_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;93&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Once you start it, you would be prompted for some configuration settings. It is very easy and similar to the &lt;em&gt;old&lt;/em&gt; agent:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-fojFsMN4afE/V4T-HYy1EJI/AAAAAAAADoI/wYMpfieB1yQ/s1600-h/na2%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;na2&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;na2&quot; src=&quot;https://lh3.googleusercontent.com/-vr_FDroDv8s/V4T-IcQMwVI/AAAAAAAADoQ/D5cmoSxh4mo/na2_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;223&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;All done!&lt;/p&gt; &lt;p&gt;Remember it is a preview, and if you want to start using it that this agent is a replacement for the Node.JS agent. So if you want to keep using TFS 2015 in the meantime do not replace the Windows Agent that comes with it.&lt;/p&gt; &lt;p&gt;As usual, the code for the agent is on &lt;a href=&quot;https://github.com/Microsoft/vsts-agent&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</description>
        <pubDate>Tue, 12 Jul 2016 14:26:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/07/12/a-first-look-at-tfs-15-new-build-agent/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/07/12/a-first-look-at-tfs-15-new-build-agent/</guid>
      </item>
    
      <item>
        <title>A first look at TFS 15: pre-production upgrades</title>
        <description>&lt;p&gt;In the last post we saw how to install and configure TFS 15. What about upgrades?&lt;/p&gt; &lt;p&gt;Well, there are some changes… &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-sWPIlZ0o1h4/V3_OdeELHoI/AAAAAAAADfo/yBtixVflrB8/wlEmoticon-smile2.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;Starting from the usual wizard, you will select the option for existing databases:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-DVKoNavT2Yw/V3_OeVowScI/AAAAAAAADfw/N4PYGTM46dc/s1600-h/image3.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-SVlV-uPr9wI/V3_OfTqkAsI/AAAAAAAADf4/E-AYLR6cexA/image_thumb1.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;214&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Then you need to point it to the appropriate database server – nothing new here:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-eoRDhF7VeIo/V3_OgD8LZFI/AAAAAAAADgA/vt8PWzIrhME/s1600-h/image7.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-qXKsK_cJZWc/V3_OhPz8w6I/AAAAAAAADgI/NqKFw_f8dXc/image_thumb3.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;362&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Now, this is great. Do you want to run a &lt;strong&gt;Production Upgrade &lt;/strong&gt;or a &lt;strong&gt;Pre-Production&lt;/strong&gt; (testing!) &lt;strong&gt;Upgrade&lt;/strong&gt;? &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-8uck83PqSDQ/V3_OiMb0OJI/AAAAAAAADgQ/OSH1UvLtf_Q/s1600-h/image11.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-_ZsKGV0X3IY/V3_OiwnCWFI/AAAAAAAADgY/fw__XFpO3Ok/image_thumb5.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;364&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Let’s go for the latter, as the Production Upgrade is exactly what we have in the current version and there are no changes to that (except for Search).&lt;/p&gt; &lt;p&gt;The next step is &lt;strong&gt;pure guidance&lt;/strong&gt;:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-eydZvC7I1Ao/V3_Oj4ua-TI/AAAAAAAADgg/JYiTHCW3q14/s1600-h/image19.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-JZ3yn5KnXZY/V3_OkurFgVI/AAAAAAAADgo/Lxebpyt9bCg/image_thumb9.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;362&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;All the TFSConfig commands are going to be executed by the wizard, which means that the headaches from test upgrades and the risk of conflicting with a production instance are now gone!&lt;/p&gt; &lt;p&gt;This is the list of what actually happens at this stage:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/--7Q15Rp1scE/V3_OlS2qYxI/AAAAAAAADgw/IHIT_8tKpmo/s1600-h/image18.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-ykb6VOstcnA/V3_OmQ9y4lI/AAAAAAAADg4/XxmpoEYRMHE/image_thumb8.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;294&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;There are &lt;strong&gt;suggestions&lt;/strong&gt;, as you can now see:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-9iGyXSPWkjs/V3_OnfQLfKI/AAAAAAAADhA/x3Qn7BHCIio/s1600-h/image23.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-L-zC3ovQLh4/V3_OoMRpXkI/AAAAAAAADhI/EAd_p0pi14A/image_thumb11.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;277&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-vrKGYAcKMqk/V3_OppOaB9I/AAAAAAAADhQ/eAT885MRZMA/s1600-h/image27.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-RTp_qpmaoCg/V3_Oqi949AI/AAAAAAAADhY/MI8xy2cM2RQ/image_thumb13.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;266&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-aEHh8HmJFCc/V3_Or-J79-I/AAAAAAAADhg/NgUP-O-lAns/s1600-h/image43.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-mjjPV4O4lk0/V3_OshVaxAI/AAAAAAAADho/SaWAdntJOXc/image_thumb19.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;125&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-bRNRJnYhoLA/V3_OtXvwzaI/AAAAAAAADhw/fQBdQDjVItw/s1600-h/image44.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-YmCmMK1-8r0/V3_OuesjjrI/AAAAAAAADh4/o54tsFpUFOU/image_thumb20.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;108&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-Cu_KSpCSk0c/V3_OvddzXdI/AAAAAAAADiA/pH00wAf-gyE/s1600-h/image45.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-M3a8Lq9EJeY/V3_OwdIqd0I/AAAAAAAADiI/xpk17XEVoZk/image_thumb21.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;97&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-dQShRWdTw10/V3_OxJcjMWI/AAAAAAAADiQ/RoANT8SqMso/s1600-h/image46.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-ZblFu3WagCg/V3_OyPbdidI/AAAAAAAADiY/ErP-dyJ15YA/image_thumb22.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;121&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-ePoQcyYO_Bc/V3_OzPb9LlI/AAAAAAAADig/brbiHNP5pas/s1600-h/image47.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-EqdQ_H-riL8/V3_O0H1lxaI/AAAAAAAADio/isgWWDB7RkY/image_thumb23.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;117&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This is really brillant. All the steps are actually the same as a production upgrade, but with all these added tips and especially with the automated cloning steps at the beginning this new wizard really brings value to the TFS Administrator.&lt;/p&gt; &lt;p&gt;Here is the result:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-m61GViEUavE/V3_O066GlcI/AAAAAAAADiw/sV_0t-LC6tM/s1600-h/image51.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-RoxQG9kJt-g/V3_O13p58FI/AAAAAAAADi4/KI-hnlPuBSU/image_thumb25.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;242&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Note that Search is not automatically installed during an upgrade, because it is an opt-in service and given the deployment size it might lead to performance issues installing it by default.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-7dSOhvhguCE/V3_O2hSfVkI/AAAAAAAADjA/WP2Jar0zNs0/s1600-h/image55.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-EEmHwsICrNQ/V3_O3oyV6wI/AAAAAAAADjI/qZXufFvAlUg/image_thumb27.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;394&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Upgrading also means the new Work Item Form is disabled – it is another opt-in feature. Once you enable it, you can configure who can request it:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-PhWjH5oPXKY/V3_O4l8rC9I/AAAAAAAADjQ/DhbGN3oIfBI/s1600-h/image59.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-bNjF6DeieIw/V3_O5gr9drI/AAAAAAAADjY/iDnW22uejJg/image_thumb29.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;234&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This is really a fantastic job by the TFS team!&lt;/p&gt;</description>
        <pubDate>Fri, 08 Jul 2016 16:03:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/07/08/a-first-look-at-tfs-15-pre-production/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/07/08/a-first-look-at-tfs-15-pre-production/</guid>
      </item>
    
      <item>
        <title>A first look at TFS 15: installation</title>
        <description>&lt;p&gt;Yesterday Microsoft released Team Foundation Server 15 Preview, and I could not resist installing it as soon as possible &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-pQ2Vt2DR57o/V3-rEKUbUoI/AAAAAAAADZQ/LIdY3zlE_Ek/wlEmoticon-smile2.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;The installation process is the same:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-hraEvS8FiIU/V3-rFLEUHCI/AAAAAAAADZY/iiT90IVpz2k/s1600-h/tfs15_05.png&quot;&gt;&lt;img title=&quot;tfs15_0&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;tfs15_0&quot; src=&quot;https://lh3.googleusercontent.com/-A0uqDKDe_do/V3-rF3c353I/AAAAAAAADZg/paE6O2S-U6U/tfs15_0_thumb3.png?imgmax=800&quot; width=&quot;351&quot; height=&quot;484&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;What changed is the configuration process:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-_bdUAVuMaFo/V3-rGq8_ERI/AAAAAAAADZo/qBOMCX7pD2k/s1600-h/tfs15_14.png&quot;&gt;&lt;img title=&quot;tfs15_1&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;tfs15_1&quot; src=&quot;https://lh3.googleusercontent.com/-l0OIpzLQxO0/V3-rHpTe4nI/AAAAAAAADZw/wu5tVRntPVI/tfs15_1_thumb2.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;431&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The configuration of TFS changed to make it more streamlined in its own wizard, but the first thing I saw was the possibility of configuring a &lt;strong&gt;Search Server&lt;/strong&gt;. &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-XzZAQf9l0M0/V3-rIR1V6UI/AAAAAAAADZ4/U8o3hwpZ1r0/s1600-h/tfs15_24.png&quot;&gt;&lt;img title=&quot;tfs15_2&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;tfs15_2&quot; src=&quot;https://lh3.googleusercontent.com/-MskbCxmd2U0/V3-rJSGjT-I/AAAAAAAADaA/t2ID8TQ1koY/tfs15_2_thumb2.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;211&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This is because the Code Search feature relies on Elastic Search, and if you have a large deployment it is really suggested to have the Search Server on its own with high performance disks supporting it. More on that later &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-pQ2Vt2DR57o/V3-rEKUbUoI/AAAAAAAADZQ/LIdY3zlE_Ek/wlEmoticon-smile2.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;The TFS configuration now asks for the deployment topology you are using or you are planning to use.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-J2p458VVfrU/V3-rKeTNDsI/AAAAAAAADaI/b0E0Ol3HbCk/s1600-h/tfs15_33.png&quot;&gt;&lt;img title=&quot;tfs15_3&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;tfs15_3&quot; src=&quot;https://lh3.googleusercontent.com/-Av7zyftABuI/V3-rLVI8ROI/AAAAAAAADaQ/C09PnkvSeVI/tfs15_3_thumb1.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;158&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Let’s go ahead with a new deployment, and we will be immediately faced with a choice:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-9t2cpMn3pOM/V3-rMmyRyDI/AAAAAAAADaY/aLLqPquJf94/s1600-h/tfs15_613.png&quot;&gt;&lt;img title=&quot;tfs15_6&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;tfs15_6&quot; src=&quot;https://lh3.googleusercontent.com/-qxjzq5pBsCw/V3-rNp7GT0I/AAAAAAAADag/KFC-B5Y8q6s/tfs15_6_thumb5.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;234&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Selecting the Basic scenario the only two things we need to set are the SQL Instance (SQL Express as a default, otherwise an existing SQL Server. Nothing changed from the previous versions):&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/--e18w4xbe5M/V3-rOWoA7MI/AAAAAAAADao/BaaEHpf4YZs/s1600-h/tfs15_43.png&quot;&gt;&lt;img title=&quot;tfs15_4&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;tfs15_4&quot; src=&quot;https://lh3.googleusercontent.com/--AYGPBiDAuQ/V3-rPQNZ40I/AAAAAAAADaw/mhOYWWoFCPc/tfs15_4_thumb1.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;180&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;and Search:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-J6KHS5J0sKw/V3-rQEtGsrI/AAAAAAAADa4/Cgm_EU5z9Ek/s1600-h/tfs15_53.png&quot;&gt;&lt;img title=&quot;tfs15_5&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;tfs15_5&quot; src=&quot;https://lh3.googleusercontent.com/-dUub_YnQuPQ/V3-rRK-b3EI/AAAAAAAADbA/kziri19SImg/tfs15_5_thumb1.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;281&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Note that the wizard explicitly suggests using SSDs for Elastic Search. I can tell you, they really help here.&lt;/p&gt; &lt;p&gt;If instead we are going to choose an &lt;strong&gt;Advanced&lt;/strong&gt; scenario…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-MKVZ43NJPxQ/V3-rSVn2_pI/AAAAAAAADbI/l3q_D_BXGSU/s1600-h/tfs15_612.png&quot;&gt;&lt;img title=&quot;tfs15_6&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;tfs15_6&quot; src=&quot;https://lh3.googleusercontent.com/-TmPzQbDnXw8/V3-rTBYHFnI/AAAAAAAADbQ/VhWGVZBKdyE/tfs15_6_thumb4.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;235&quot;&gt;&lt;/a&gt;…we are going to configure the database settings first:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-RQHYBA8VtPs/V3-rUHolFsI/AAAAAAAADbY/oerC5fHVaHo/s1600-h/tfs15_73.png&quot;&gt;&lt;img title=&quot;tfs15_7&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;tfs15_7&quot; src=&quot;https://lh3.googleusercontent.com/-mwrQzj5ehiA/V3-rVBna5UI/AAAAAAAADbg/Kc191EVLmTA/tfs15_7_thumb1.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;279&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Then the service account and the IIS configuration – nothing changed from previous versions. Search is up next and we already saw the configuration required, then Reporting Services and SharePoint. &lt;/p&gt; &lt;p&gt;Nothing changed for SSRS and SharePoint, but I really like the &lt;em&gt;recommended suggestion &lt;/em&gt;(&lt;strong&gt;enabled by default&lt;/strong&gt;! &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-pQ2Vt2DR57o/V3-rEKUbUoI/AAAAAAAADZQ/LIdY3zlE_Ek/wlEmoticon-smile2.png?imgmax=800&quot;&gt;) of using separate accounts for SSRS and Service Account.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-xRLHzDdkSSo/V3-rV2vvKNI/AAAAAAAADbo/QA3w_PzvPWs/s1600-h/tfs15_83.png&quot;&gt;&lt;img title=&quot;tfs15_8&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;tfs15_8&quot; src=&quot;https://lh3.googleusercontent.com/-Evl9yVo7mkc/V3-rW-72mxI/AAAAAAAADbw/lQFvGpBbYeQ/tfs15_8_thumb1.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;169&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Eventually, change the name of the &lt;strong&gt;DefaultCollection&lt;/strong&gt; if you wish:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-nnrEPjHqLqs/V3-rXuWPNyI/AAAAAAAADb4/xm_8L813Kj4/s1600-h/tfs15_93.png&quot;&gt;&lt;img title=&quot;tfs15_9&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;tfs15_9&quot; src=&quot;https://lh3.googleusercontent.com/-iSVZCCLjBTE/V3-rY6h9M4I/AAAAAAAADcA/mwloay2TyXY/tfs15_9_thumb1.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;232&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Is that it? Not really. During the pre-requisite checks you will surely see this error:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-6GTY4v8R87E/V3-rZsnNBVI/AAAAAAAADcI/Fqbaaw1Logk/s1600-h/tfs15_104.png&quot;&gt;&lt;img title=&quot;tfs15_10&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;tfs15_10&quot; src=&quot;https://lh3.googleusercontent.com/-S3d50sgg6QU/V3-ravJ_uNI/AAAAAAAADcQ/ZvsGYfHnYEk/tfs15_10_thumb2.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;97&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Elastic Search is a Java product, hence a JRE is automatically installed if not found on the machine. Beware, this is always the latest version of the &lt;strong&gt;server JRE&lt;/strong&gt;, so it is slightly different than the usual JRE (it doesn’t feature in the Installed Programs list, it doesn’t have a browser plug-in, etc.).&lt;/p&gt; &lt;p&gt;There is also a new port to open for it, 9200.&lt;/p&gt;</description>
        <pubDate>Fri, 08 Jul 2016 13:32:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/07/08/a-first-look-at-tfs-15-installation/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/07/08/a-first-look-at-tfs-15-installation/</guid>
      </item>
    
      <item>
        <title>Small but noticeable: SSH Service in TFS 2015 Update 3</title>
        <description>&lt;p&gt;One of the &lt;a href=&quot;https://www.visualstudio.com/en-us/news/releasenotes/tfs2015-update3-vs&quot;&gt;features&lt;/a&gt; introduced in TFS 2015 Update 3 is the backport from VSTS of SSH access for Git repositories.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/--6S867rBCFM/V3KfGdqo1DI/AAAAAAAADW8/yyjf_vy1r7s/s1600-h/ssh2%25255B4%25255D.png&quot;&gt;&lt;img title=&quot;ssh2&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;ssh2&quot; src=&quot;https://lh3.googleusercontent.com/-QcRsMJJ1SUE/V3KfHQQ6YjI/AAAAAAAADXI/pjOlwANNUQI/ssh2_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;249&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;There is a very nice &lt;a href=&quot;https://www.visualstudio.com/en-us/docs/git/use-ssh-keys-to-authenticate&quot;&gt;document&lt;/a&gt; on how to use it, so I am not going to look at that, but what is interesting is what happens on the server at upgrade time.&lt;/p&gt; &lt;p&gt;You can decide whether to enable the service or not:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-1hiMPkZupR4/V3KfIb6BHII/AAAAAAAADXU/ukKtRRBqMKU/s1600-h/ssh0%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;ssh0&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;ssh0&quot; src=&quot;https://lh3.googleusercontent.com/-PF98_rfK7-Y/V3KfJQ3fncI/AAAAAAAADXg/71F38USS2ME/ssh0_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;216&quot; height=&quot;101&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;and this will automatically create its firewall rule:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-P_8sw_vzivo/V3KfKQG-4AI/AAAAAAAADXs/3Es7CFeSDp4/s1600-h/ssh1%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;ssh1&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;ssh1&quot; src=&quot;https://lh3.googleusercontent.com/-pyUOU7XJGFs/V3KfLX6qmeI/AAAAAAAADX4/3-mh_8Omyvc/ssh1_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;371&quot; height=&quot;35&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Moreover, you can manage the service from the Administration Console:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-c9Iwv6YbC0Y/V3KfMm7g8mI/AAAAAAAADYE/stH9vJkGOZk/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-3SAyamVFZMk/V3KfNgZGMqI/AAAAAAAADYQ/uYMFNHnjrBE/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;193&quot; height=&quot;298&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;A small touch, but much appreciated from an administrative point of view &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-3ctGx7r2uv4/V3KfOp_khRI/AAAAAAAADYc/MUpMsuOGFSg/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt;</description>
        <pubDate>Tue, 28 Jun 2016 16:01:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/06/28/small-but-noticeable-ssh-service-in-tfs/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/06/28/small-but-noticeable-ssh-service-in-tfs/</guid>
      </item>
    
      <item>
        <title>A simple VSTS-based pipeline for Java Web Applications</title>
        <description>&lt;p&gt;I took the plunge last weekend about building a pipeline for a very simple Java application, and it was very, very easy to do so.&lt;/p&gt; &lt;p&gt;The app in question is &lt;a href=&quot;https://github.com/Microsoft/deep-space&quot;&gt;DeepSpace&lt;/a&gt;. It is written in Java and AngularJS, so it looked like it was perfect for my requirement. It is used in the VSTS Java demos, but I didn’t want to go down that route because of the deployment approach.&lt;/p&gt; &lt;p&gt;What I wanted to throw in the mix is Azure Resource Manager of course, I am not going to use FTP and manual credentials from a .publishsettings file anymore! So the first thing I did was to create an ARM template for my website.&lt;/p&gt; &lt;p&gt;What does it take to deploy such an application on VSTS? Well, I would say around ten minutes, tops. I realised Donovan Brown &lt;a href=&quot;http://donovanbrown.com/post/2016/03/04/Deploying-Maven-project-to-Azure-Web-App&quot;&gt;did&lt;/a&gt; the same thing, it would have saved me a bit of research!&lt;/p&gt; &lt;p&gt;Start with the build: VSTS has Maven running in the Hosted Build, so there is no setup cost you need to factor in for the build server:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-b3-wfSJkpKc/V16ph7n-baI/AAAAAAAADU0/gX12dp3wcOU/s1600-h/j1%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;j1&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;j1&quot; src=&quot;https://lh3.googleusercontent.com/-tkrNjhosbSg/V16pimhgwsI/AAAAAAAADVA/3DClSFbmCuM/j1_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;221&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The &lt;strong&gt;pom.xml&lt;/strong&gt; file is kindly provided by DeepSpace, but it would not take long to have one. You can see I am packaging the application (so I would get a .war file, more to come later on the matter) and I am using &lt;strong&gt;JaCoCo&lt;/strong&gt; for Code Coverage – again provided by the Hosted Build.&lt;/p&gt; &lt;p&gt;The next step is publishing the artifacts to VSTS. Nothing really fancy here – just push the &lt;strong&gt;.json&lt;/strong&gt; and &lt;strong&gt;.war&lt;/strong&gt; files.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-yPJfc5w5RZY/V16pjVRkNLI/AAAAAAAADVM/7KOBQh73PRI/s1600-h/j2%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;j2&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;j2&quot; src=&quot;https://lh3.googleusercontent.com/-qdpWiPjIKG8/V16pkDi243I/AAAAAAAADVY/Vag1yn33y40/j2_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;123&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;So, we built our stuff. Now we want to push it to Azure I reckon. Release Management is definitely the right tool for this job.&lt;/p&gt; &lt;p&gt;I am using the Trackyon Advantage task like Donovan because I realised Tomcat is not exposed if you create a Java-based Azure Web Site with ARM, and you can’t change its configuration because it would be running under &lt;strong&gt;Program Files&lt;/strong&gt;, where the user doesn’t have edit permissions. &lt;/p&gt; &lt;p&gt;By the way, if you want to have a look at what happens to your Azure Web Site, at what’s inside and if you want to run a cmd, browse to &lt;a href=&quot;http://yoursite.scm.azurewebsites.net&quot;&gt;http://yoursite.scm.azurewebsites.net&lt;/a&gt;, where Kodu would provide a great amount of information and you can actually browse and edit (where possible) things.&lt;/p&gt; &lt;p&gt;So, back to RM – I am going to change the format of the .war file to a .zip &lt;strong&gt;compatible with MSDeploy&lt;/strong&gt; so I can reuse the &lt;strong&gt;Azure Web App Deployment&lt;/strong&gt; task and I am not going to fiddle with Tomcat (which means not getting near any credential or custom file modifications, which in turn is very good for automation!). If instead you need/can access Tomcat, use the &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-vscs-rm.apachetomcat&quot;&gt;VSTS extension&lt;/a&gt; for this.&lt;/p&gt; &lt;p&gt;I am literally just providing paths here:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-6iW2s08zkFE/V16plIt-iLI/AAAAAAAADVk/_wl2IuxHenY/s1600-h/j3%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;j3&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;j3&quot; src=&quot;https://lh3.googleusercontent.com/-00LfkOaqLOo/V16plz-dWHI/AAAAAAAADVw/bHWQxGqFmUQ/j3_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;149&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Then I am going to deploy my ARM template as usual (it is made of a single Website and Azure App Service at the minute), and I am pushing my Web App as well:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-zz5_0lHeLXc/V16pmqW35YI/AAAAAAAADV8/G-ZdoGwcrEc/s1600-h/j4%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;j4&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;j4&quot; src=&quot;https://lh3.googleusercontent.com/-lR3y8LOQ3t0/V16pnO3pUYI/AAAAAAAADWI/7khgLDKgBpA/j4_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;166&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;That’s it! I wasn’t expecting it to be that easy – the only place where I stumbled was the war to zip conversion.&lt;/p&gt; &lt;p&gt;What I did was searching on the Marketplace for “&lt;a href=&quot;https://marketplace.visualstudio.com/search?term=war%20zip&amp;amp;target=VSTS&amp;amp;sortBy=Relevance&quot;&gt;war zip&lt;/a&gt;”, I had a look and Trackyon Advantage was there among the other five results. I looked at the description and it did what I was searching for. There is literally an extension for everything these days!&lt;/p&gt; &lt;p&gt;Of course the pipeline lacks stages, approvals and all the rest. But this is what I put together in around an hour, so it is a great starting point!&lt;/p&gt;</description>
        <pubDate>Mon, 13 Jun 2016 10:19:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/06/13/a-simple-vsts-based-pipeline-for-java/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/06/13/a-simple-vsts-based-pipeline-for-java/</guid>
      </item>
    
      <item>
        <title>Moving a SonarQube installation to SQL Azure Database</title>
        <description>&lt;p&gt;There might be a tons of reasons behind it – you might want to take advantage of SonarQube’s support for SQL Azure Database, and it is totally fair enough.&lt;/p&gt; &lt;p&gt;There was a showstopper in the past if you were on 5.5 – &lt;a href=&quot;https://jira.sonarsource.com/browse/SONAR-7589&quot;&gt;this bug&lt;/a&gt;, fixed with the 5.6 release.&lt;/p&gt; &lt;p&gt;So let’s move! But upgrade to 5.6 first, on-premise &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-y4iqqCueYhk/V1qbQrKSPrI/AAAAAAAADSY/-G2BpCp32WM/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt; so you are going to have a clear starting point.&lt;/p&gt; &lt;p&gt;The first thing you need to do is to create a new SQL Azure Database in your subscription. Call it like the one you have on-premise, and use the same collation (tip: remember &lt;strong&gt;CS_AS&lt;/strong&gt;…) for peace of mind.&lt;/p&gt; &lt;p&gt;Then (unless you are using SQL Server 2016) run the &lt;a href=&quot;https://sqlazuremw.codeplex.com/&quot;&gt;SQL Azure Migration Wizard&lt;/a&gt;. This tool will do everything on your behalf, and it is going to migrate the database in the cloud.&lt;/p&gt; &lt;p&gt;If you get any connection error here, remember that SQL Azure is locked down for external access – you need to add the IP address for client connectivity to the Azure Firewall:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-3Qt9IGHzTXM/V1qbRnVqMdI/AAAAAAAADSk/oPv8kgzsxBg/s1600-h/image%25255B4%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-pPVC2B3x6uw/V1qbScrMF8I/AAAAAAAADSw/2G7DZaBNHWA/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;114&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-NNYTuGBg7kQ/V1qbTIKzC3I/AAAAAAAADS8/0dyIvPBLJk8/s1600-h/image%25255B7%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-xdj3IigpuNE/V1qbT3DJX_I/AAAAAAAADTI/MDyXA3GywFo/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;160&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-nRFwx1aMcAU/V1qbUxMmzbI/AAAAAAAADTU/fJCt8ZZtKGA/s1600-h/image%25255B10%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-kvfmyTe8SkQ/V1qbVjzMPbI/AAAAAAAADTg/7SLMuAWEBPE/image_thumb%25255B4%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;142&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;As you would be using SQL Server Authentication, you also need to create a SQL User for SonarQube. Even if you already used that, the users are not migrated by the tool so it is something to do anyway.&lt;/p&gt; &lt;p&gt;Eventually, change the SonarQube database connection string to your new &amp;lt;azure DB&amp;gt;.database.windows.net in the sonar.properties file:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-M0R3-9IilRk/V1qbWU5gs5I/AAAAAAAADTs/39roEO_z6vY/s1600-h/image%25255B14%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-5biUNBKD5Rg/V1qbXJpClYI/AAAAAAAADT4/RmLRJvBDpzM/image_thumb%25255B6%25255D.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;60&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Done! It is really easy, and if you are moving from a SQL Server Enterprise Edition it is also cheaper.&lt;/p&gt;</description>
        <pubDate>Fri, 10 Jun 2016 10:50:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/06/10/moving-sonarqube-installation-to-sql/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/06/10/moving-sonarqube-installation-to-sql/</guid>
      </item>
    
      <item>
        <title>I updated SonarQube to 5.6 and nothing works any longer, should I panic?</title>
        <description>&lt;p&gt;SonarQube 5.6 is the new LTS release, hence there are lots of changes.&lt;/p&gt; &lt;p&gt;The first step where you might panic is when you launch it for the first time, you will find this:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-vwTU9oUxqQM/V1fiwMIcTHI/AAAAAAAADRQ/NihtR5RHE0A/s1600-h/image%25255B4%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-zCIbaquy33g/V1fiwyksTII/AAAAAAAADRc/NrpRJSYvi8s/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;544&quot; height=&quot;176&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;ce is the Compute Engine, a process for data aggregation on the server.&lt;/p&gt; &lt;p&gt;Don’t worry, &lt;strong&gt;Process[ce] &lt;/strong&gt;will eventually go up &lt;strong&gt;after &lt;/strong&gt;you run http://&amp;lt;your SonarQube&amp;gt;/setup and migrate to 5.6.&lt;/p&gt; &lt;p&gt;Then, this at build time:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-tljRcR1ArLg/V1fixlN5sHI/AAAAAAAADRo/eljl8FvyK4U/s1600-h/image%25255B8%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-qNYzZ4iWZPE/V1fiyVdhuRI/AAAAAAAADR0/t1OZ1F0SlNQ/image_thumb%25255B4%25255D.png?imgmax=800&quot; width=&quot;544&quot; height=&quot;116&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;SonarQube comes with no plugins out-of-the-box! Remember to bring yours from the old installation and update them after the system check..&lt;/p&gt;</description>
        <pubDate>Wed, 08 Jun 2016 09:18:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/06/08/i-updated-sonarqube-to-56-and-nothing/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/06/08/i-updated-sonarqube-to-56-and-nothing/</guid>
      </item>
    
      <item>
        <title>Getting started with LaunchDarkly and client-side feature flags</title>
        <description>&lt;p&gt;These days it is extremely easy to start using Feature Flags, especially with a service like LaunchDarkly.&lt;/p&gt; &lt;p&gt;In my case, I just wanted to setup a quick demo of client-side feature flags using only plain JavaScript and LaunchDarkly – I am pleased to say it is extremely easy even for a Web 0.9 chap like me! (Yep, I never really got into the Web 2.0 and the WhateverJS frameworks craze of the last few years &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-q8TjAv26v1I/V0VlC6vNtSI/AAAAAAAADMw/ZkWlp4p4pAE/wlEmoticon-smile2.png?imgmax=800&quot;&gt;)&lt;/p&gt; &lt;p&gt;Let’s start with a few assumptions:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;I want to use LaunchDarkly to manage my Feature Flags (and there might be many reasons behind this choice)  &lt;li&gt;I want to show features only for authenticated users&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;I am not going to authenticate users myself&amp;nbsp; so in this case I am going to rely on LaunchDarkly acting as an authentication backend as well. This is totally done on purpose – when a feature is going public then no authentication is required to use it, otherwise a user would be &lt;em&gt;authenticated&lt;/em&gt; against LaunchDarkly.&lt;/p&gt; &lt;p&gt;So, I need to create Feature Flags on launchdarkly.com:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-J730pKH_fQ4/V0VlDjncutI/AAAAAAAADM4/L7BA0-dFDDQ/s1600-h/image7.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-5DwzcYZdiqY/V0VlEQebK6I/AAAAAAAADNA/TGyUnirXKIU/image_thumb3.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;138&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Each Feature Flag has a key (&lt;strong&gt;feature-*&lt;/strong&gt; might be a good naming convention), and it is important to set any feature as &lt;strong&gt;Available in client-side snippet&lt;/strong&gt; to access them via JavaScript.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-uH0p50PRPbk/V0VlE3jBFYI/AAAAAAAADNI/Il3bH5QrzMg/s1600-h/image5.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-P5aJU1yGrj4/V0VlFjQbHBI/AAAAAAAADNQ/lHuaVaGJ7PY/image_thumb1.png?imgmax=800&quot; width=&quot;200&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Then add the JavaScript SDK as per the documentation:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-89jGFH3R-Uk/V0VlGeHiAhI/AAAAAAAADNY/pNBR9q8gX8c/s1600-h/image11.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-tbNgglOnXFM/V0VlHeeQFiI/AAAAAAAADNg/vCHZ4HLNq1w/image_thumb5.png?imgmax=800&quot; width=&quot;524&quot; height=&quot;65&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Now, all I am doing is extremely easy: starting with the empty ASP.NET Application, I am going to remove the views statically referred by the Controller in the list on the navbar, and I am going to add an id attribute to this list:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-FOSxCJSP3i4/V0VlIJmlR-I/AAAAAAAADNo/djpIb2CT5FM/s1600-h/image14.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-ahU9xpjTwkQ/V0VlI58Ri5I/AAAAAAAADNw/wu5Zcoj2j-Q/image_thumb6.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;42&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Then I am going to add this series of scripts:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-PzEbSZzcvFk/V0VlJ5GL2PI/AAAAAAAADN4/RGeLM5J-JJE/s1600-h/image17.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-uajT40y6A-U/V0VlKlg0obI/AAAAAAAADOA/2OIBA-WjkyI/image_thumb7.png?imgmax=800&quot; width=&quot;179&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The EnableFlags() function is going to retrieve the potentially authenticated user from the Local Storage (I am using it as a mean to save the authenticated user – there is no real backend in this application &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-q8TjAv26v1I/V0VlC6vNtSI/AAAAAAAADMw/ZkWlp4p4pAE/wlEmoticon-smile2.png?imgmax=800&quot;&gt;), authenticate this user against Launch Darkly, clean the list, and then check if any of my feature flags is turned on for the user. If so, the aforementioned list is dynamically populated.&lt;/p&gt; &lt;p&gt;Bear in mind – this works also for non authenticated users.If a feature is available for them it will show up.&lt;/p&gt; &lt;p&gt;The two other functions are Login() and Logout() – the first sets the user in the local storage and the second one deletes the user. Again, this is not cool or production JavaScript but it is for demo purposes and it works &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-q8TjAv26v1I/V0VlC6vNtSI/AAAAAAAADMw/ZkWlp4p4pAE/wlEmoticon-smile2.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;What happens is very nice: I can start deploying my application only to the users I want to:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-JXNYqSssm8Q/V0VlLiCvQKI/AAAAAAAADOI/dQPG-UdBRVI/s1600-h/image20.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-BYV53sLlyUU/V0VlMerCh5I/AAAAAAAADOQ/NvL8vnH-QdM/image_thumb8.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;97&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Once I am confident with my code, I can rollout the feature to all or a percentage of my anonymous users:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-UEeVmzXuDtc/V0VlNLLUW0I/AAAAAAAADOY/s_8feK5nAr4/s1600-h/image23.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-W37TXaUO1kU/V0VlNzEeohI/AAAAAAAADOg/hlM-eVKbyoE/image_thumb9.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;139&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This is just a starting point, the coolest part about LaunchDarkly is that you can integrate it with VSTS so you can rollout a feature at release time:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/--0todg75onA/V0VlOpY4OrI/AAAAAAAADOo/bkSW0mUbaCw/s1600-h/image26.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-aK_JpcDnAYw/V0VlPt7zcTI/AAAAAAAADOw/zOhC4j1KE8w/image_thumb10.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;203&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Use Feature Flags, &lt;a href=&quot;http://featureflags.io/resources/&quot;&gt;implement&lt;/a&gt; them with either OSS libraries or with Launch Darkly, they make life so easier when it comes to delivering value for your customers! &lt;/p&gt;</description>
        <pubDate>Wed, 25 May 2016 08:41:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/05/25/getting-started-with-launchdarkly-and/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/05/25/getting-started-with-launchdarkly-and/</guid>
      </item>
    
      <item>
        <title>Simple pipeline with UWP and HockeyApp</title>
        <description>&lt;p&gt;Everybody needs a starting point here and there, so this post would be pretty much about what I did with a very similar situation – a very basic pipeline to push UWP builds to HockeyApp&lt;/p&gt; &lt;p&gt;What I wanted was a carefree, easy way of pushing CI builds to HockeyApp so I could enable manual testing for users. Let me add another requirement to the mix – in my case, we are talking about sideloaded apps, and only for x86 and x64. This doesn’t change the actual result though, we’ll talk about ARM at the end.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-L4x1FgSyK_M/Vy91IMqByuI/AAAAAAAADIU/7r2MqVrXaqM/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-WKQAbMjw1Wk/Vy91I2LpRAI/AAAAAAAADIc/Jwtck9rlX0w/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;161&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This is the pipeline I was talking about.&lt;/p&gt; &lt;p&gt;The first step is a PowerShell script – what it does is to change the value of the last build number in the appxmanifest so that each build will upload a new version of the app to HockeyApp. The service identifies a new build from its build number, so what I did is just changing the revision number with the BuildId of my Build. Simple as that.&lt;/p&gt; &lt;p&gt;Then the build restores the NuGet packages, and builds my app for x86 first and x64 then. The reason why I went down this route is because I wanted to keep things as simple as possible, with a very intuitive tree structure and preparing the folder for the Zip task I used next.&lt;/p&gt; &lt;p&gt;I decided to use a Zip Directories &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=petergroenewegen.PeterGroenewegen-Xpirit-Vsts-Build-Zip&quot;&gt;task&lt;/a&gt; from fellow MVP &lt;a href=&quot;https://twitter.com/pgroene&quot;&gt;Peter Groenewegen&lt;/a&gt;. Building a task from scratch wasn’t in the cards because of time constraints in this case, and Peter’s did the job as required.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-n0KisXH_9-w/Vy91JrUWseI/AAAAAAAADIk/oVZ0lHW9ZWw/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-sGGzLT-RVe8/Vy91KSv_M4I/AAAAAAAADIs/TjQdi6lOfzY/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;38&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The task would create a zip file of the &lt;strong&gt;App_1.0.0.$(Build.BuildId)_Test&lt;/strong&gt; folder. This zip file contains the build artifacts I am feeding to VSTS and HockeyApp.&lt;/p&gt; &lt;p&gt;Small shortcut, but this works well &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-9In634VZ2bA/Vy91K_YuAFI/AAAAAAAADI0/2h_WeunWb58/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt; basically this name comes out from the AppxBundle process, and the BuildId is there because I changed the appxmanifest file with it so it is nicely available everywhere in my build. This could be extended with a build variable though.&lt;/p&gt; &lt;p&gt;After uploading the symbols, the build uploads the artifacts:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-H_jrMaOU7j0/Vy91LzhB4DI/AAAAAAAADI8/hefQ-y-QmgU/s1600-h/image%25255B8%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-0Mjj3HERI7Y/Vy91MceLhcI/AAAAAAAADJE/7lBi3JN_v5A/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;100&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;from the folder I used as a destination when building, the build engine searches for the zip file I created previously with the task. It is a Server artifacts, meaning it is stored in VSTS.&lt;/p&gt; &lt;p&gt;Eventually, HockeyApp is fed with this file:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-3hK4w16t9YY/Vy91NPD213I/AAAAAAAADJM/9sUxFCKmcts/s1600-h/image%25255B11%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-LPIEcn5O3hI/Vy91OC7CERI/AAAAAAAADJU/zRs3QXXzn-w/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;31&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-3wY1AlICYXM/Vy91O6q6ufI/AAAAAAAADJc/9bG860wVHbI/s1600-h/image%25255B17%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-rhk27_-A-FM/Vy91PxcD0vI/AAAAAAAADJk/1AdKzkpOAhI/image_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;61&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The connection comes from the &lt;strong&gt;Service Endpoint&lt;/strong&gt; you need with HockeyApp. The App ID is the one you’ll find on HockeyApp and the Binary File Path is where the source for the zip file you need to upload is. Simple as that.&lt;/p&gt; &lt;p&gt;In HockeyApp you’ll see the build as soon as the process is over:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-LIPXhp4l3hY/Vy91QkxeqHI/AAAAAAAADJs/gXceIinV2Lg/s1600-h/image%25255B20%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-yRNRKrTvbtk/Vy91RD1iiFI/AAAAAAAADJ0/Hn7LOnp2-xc/image_thumb%25255B6%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;75&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The zip files the build uploads contains these files:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-iYouQ4Qi8kk/Vy91R3AWMQI/AAAAAAAADJ8/olqzKriTYi4/s1600-h/image%25255B23%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-FzD14Awf3sE/Vy91StNQ1XI/AAAAAAAADKE/wafUQZ88Cgc/image_thumb%25255B7%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;180&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;which is exactly what you would get from the &lt;strong&gt;Create Package&lt;/strong&gt; wizard in Visual Studio. Running the PowerShell script installs the app on the target system.&lt;/p&gt; &lt;p&gt;I mentioned ARM at the beginning – to add ARM to this pipeline you’ll need to add another build step for ARM, and then uploading the appx file generated by the build. &lt;/p&gt; &lt;p&gt;It is a slightly different process at the moment, and this requires a different provision on HockeyApp as well: the ARM app needs to be separate from the UWP one at the moment so you can upload the build artifact.&lt;/p&gt;</description>
        <pubDate>Sun, 08 May 2016 17:20:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/05/08/simple-pipeline-with-uwp-and-hockeyapp/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/05/08/simple-pipeline-with-uwp-and-hockeyapp/</guid>
      </item>
    
      <item>
        <title>Application Insights Live Metrics Stream with ASP.NET 5</title>
        <description>&lt;p&gt;The single feature I deeply loved from the old Visual Studio Online Application Insights (before it was handed over to the Azure Team) was the &lt;strong&gt;Developer Dashboard&lt;/strong&gt;, a real-time overview of how your application was faring.&lt;/p&gt; &lt;p&gt;&lt;img alt=&quot;Improve your product by analysing real world usage data with Visual Studio Online Application Insights&quot; src=&quot;https://www.microsoft.com/en-gb/developers/images/articles/content/487-04.png?v=1.0&quot; width=&quot;484&quot; height=&quot;366&quot;&gt;&lt;/p&gt; &lt;p&gt;There is a replacement though: &lt;strong&gt;Live Metrics Stream&lt;/strong&gt;. It is very powerful, way more than the old Developer Dashboard:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-stDkYk0M-lM/Vyh8-r3a1xI/AAAAAAAADGs/Zn0Br8FHF-8/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-e8KEdRTy_7o/Vyh8_u88bKI/AAAAAAAADG0/54b_tYZzG7o/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;154&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The problem is that if you try to configure it with an out-of-the-box ASP.NET 5 Application you will never manage to make it work:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-OW-lQ0V1Dmk/Vyh9AexwCsI/AAAAAAAADG8/8Nx-yPP_jc8/s1600-h/clip_image002%25255B5%25255D.jpg&quot;&gt;&lt;img title=&quot;clip_image002&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;clip_image002&quot; src=&quot;https://lh3.googleusercontent.com/-Z3po2cQXid0/Vyh9BOGJnHI/AAAAAAAADHE/uZLc7_kdaTU/clip_image002_thumb%25255B2%25255D.jpg?imgmax=800&quot; width=&quot;513&quot; height=&quot;95&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;…even if you have the latest Application Insights SDK package installed.&lt;/p&gt; &lt;p&gt;The reason is because not all the features of Application Insights are supported out-of-the-box with ASP.NET 5 – if you run it against .NET Core 5.0.&lt;/p&gt; &lt;p&gt;If you want to integrate LMS in an ASP.NET 5 application, you need to add &lt;a href=&quot;https://github.com/Microsoft/ApplicationInsights-aspnetcore/wiki/Telemetry-Processors:-Sampling-and-Metrics-Stream#metrics-stream&quot;&gt;this&lt;/a&gt; code snippet to your startup.cs file and &lt;strong&gt;remove dnxcore50&lt;/strong&gt; from your project.json file.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-dYBHjiMJe0U/Vyh9B1Lx1OI/AAAAAAAADHM/6RC_KQDoiEo/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-xCPy3JjV4lI/Vyh9CoToNlI/AAAAAAAADHU/jFH7zOzawtU/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;236&quot; height=&quot;150&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;I totally expect a full support for all the Application Insights’ features to come soon, but for now if you really need LMS in your application you need to stick with &lt;strong&gt;DNX 4.5.1+&lt;/strong&gt; as a runtime.&lt;/p&gt;</description>
        <pubDate>Tue, 03 May 2016 10:27:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/05/03/application-insights-live-metrics/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/05/03/application-insights-live-metrics/</guid>
      </item>
    
      <item>
        <title>A look at the new Work Item Tracking features in VSTS</title>
        <description>&lt;p&gt;I usually don’t do this, but the VSTS teams are overhauling this area at such a pace that makes a knowledge refresh really needed &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-4Td2QibBh1E/VxoFOw2kD2I/AAAAAAAADCY/eaqkfEn-_Tg/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;Aside from the cards layout a few months ago, there are really compelling features added to the platform. It isn’t easy to define what &lt;em&gt;compelling &lt;/em&gt;is for WIT, as it is much of user interaction scenarios more than pure technical stuff doing &lt;em&gt;magic&lt;/em&gt;, but I find them very, very interesting.&lt;/p&gt; &lt;p&gt;First of all, how many times during a planning meeting you create a Work Item and you then realise you chose the wrong type? Believe it or not, it happens all the times. Now you can just change the type from the UI, easy as that:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-u6FPvt1_QQw/VxoFPhywf5I/AAAAAAAADCg/rzhPhxhnZbE/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-uZKuv15bua8/VxoFQUJtkNI/AAAAAAAADCo/0kwKNJ3XBKw/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;120&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-mW_l4XFXMnM/VxoFRJKJA5I/AAAAAAAADCw/MA_cY8Xt4F8/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-0l6w50z-t6g/VxoFRp8sIfI/AAAAAAAADC4/w5sljZdLS48/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;151&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-sNg1rATMfNk/VxoFSU_H6sI/AAAAAAAADDA/2SnUFwVRwz0/s1600-h/image%25255B8%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-MNCvAW9x8sk/VxoFS8q7zwI/AAAAAAAADDI/3DyiVIq_kMo/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;74&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Another feature worth mentioning is the possibility of moving a Work Item between Team Projects. There might be a ton of reasons behind this need, I even heard of a Team Project used for support and escalation requests for multiple products.&lt;/p&gt; &lt;p&gt;Anyway, it is just like this, and you can also change the type here:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-usNNxGEwpco/VxoFTrmEn2I/AAAAAAAADDQ/AmihZtNMuPU/s1600-h/image%25255B11%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-pPVWiuLB4yU/VxoFUezjmjI/AAAAAAAADDY/3MP6VJtz9lM/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;191&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href=&quot;https://lh3.googleusercontent.com/-sm_H8-usq78/VxoFVS6-6xI/AAAAAAAADDg/GoNuQ5y9gdA/s1600-h/image%25255B14%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-PZMXE7KBrig/VxoFWEtAdUI/AAAAAAAADDo/yc_Kxl8buoU/image_thumb%25255B4%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;184&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;You can also create a new branch from a Work Item (very handy for feature-based development):&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-N-3dX4HjvdU/VxoFWrXbX7I/AAAAAAAADDw/GtUHfCth_p8/s1600-h/image%25255B20%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-q3qSTyh0b3M/VxoFXSe-OlI/AAAAAAAADD4/GivfJN5aCL8/image_thumb%25255B6%25255D.png?imgmax=800&quot; width=&quot;156&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/--LHQQWsgmXI/VxoFYPyjhxI/AAAAAAAADEA/s2b_RWYJZWc/s1600-h/image%25255B23%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-TOr0CLzMHqc/VxoFY2jdLjI/AAAAAAAADEI/Ca8cCORYhzg/image_thumb%25255B7%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;187&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This is a fantastic way of keeping the planning aligned with development, IMHO.&lt;/p&gt; &lt;p&gt;Eventually, you can now follow a Work Item.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-lheyzPpCk84/VxoFZQHcR7I/AAAAAAAADEQ/CGpvGvtciIU/s1600-h/image%25255B17%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-NRNqq2I9JOY/VxoFaNXHpJI/AAAAAAAADEY/qAJrWWB_UZ4/image_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;176&quot; height=&quot;90&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This means you’ll get an email whenever this Work Item is updated by other members of the team – I can already see Product Owners’ hands clapping!&lt;/p&gt;</description>
        <pubDate>Fri, 22 Apr 2016 11:05:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/04/22/a-look-at-new-work-item-tracking/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/04/22/a-look-at-new-work-item-tracking/</guid>
      </item>
    
      <item>
        <title>Considerations on HockeyApp and exception management strategy for apps</title>
        <description>&lt;p&gt;I started to look at HockeyApp recently, and I reckon it is quite an impressive piece of software. Microsoft acquired it in 2014, and now they are pitching it as the solution for Application Monitoring for &lt;em&gt;apps&lt;/em&gt;, regardless of the platform, while Application Insights is the APM solution for web application and services.&lt;/p&gt; &lt;p&gt;With that in mind, the first thing we need to know is that we need to join HockeyApp’s Preseason program – it is an early access program (they are quite into hockey over there &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-dppRMiqIXDU/Vwzkjh5lNAI/AAAAAAAADAg/Xw6NfDihixs/wlEmoticon-smile2.png?imgmax=800&quot;&gt;). With that you will get access to the UWP support but also to another key feature: custom events.&lt;/p&gt; &lt;p&gt;The thing with HockeyApp is that being an app-centric tool the main usage scenario they developed the product around is when the app crashes in an &lt;strong&gt;unmanaged&lt;/strong&gt; way.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-w8DpxgEWLjU/VwzkkiNe92I/AAAAAAAADAo/exJ7iCsTps4/s1600-h/image2.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-mvJGJsBvcZU/VwzklYEzyAI/AAAAAAAADAw/QsAtNv3E9Mk/image_thumb.png?imgmax=800&quot; width=&quot;191&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Unmanaged&lt;/strong&gt; is key here: without Preseason SDK (NuGet package actually) you can only gather crash data at the next application launch. And what if I would like to collect data from exceptions I manage on my own?&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-pq_5BgpFzLA/VwzkmaPa0jI/AAAAAAAADA4/LOYHalepPpA/s1600-h/image5.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-TsBh3FLx2HM/VwzknfGipII/AAAAAAAADBA/ylkmLV3i8-Y/image_thumb1%25255B1%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;237&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;That is where Custom Events come around. They are not as descriptive as unmanaged exceptions (HockeyApp collects stack trace data, device information, etc.) but they are a very handy way of keeping track of this important data distribution.&lt;/p&gt; &lt;p&gt;The exception management strategy here becomes two-folded: unhandled exceptions go straight to HockeyApp &lt;em&gt;with all the trimmings&lt;/em&gt;, while instead you need to separately log the exception data you need when you manage to catch them, and then send the relevant event to HockeyApp.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/--g3vam0Vtng/VwzkoThetlI/AAAAAAAADBI/r9rFSvW8-Ds/s1600-h/image3%25255B1%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-szFaajnnYlA/VwzkpUQs4LI/AAAAAAAADBQ/zLhPp1X9qcY/image_thumb1.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;101&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;In the future I am expecting features to be added from both Application Insights and Xamarin Insights to HockeyApp. The latter two teams &lt;a href=&quot;https://www.xamarin.com/insights&quot;&gt;merged&lt;/a&gt; as of a few weeks ago, and this can only reinforce an already very good platform.&lt;/p&gt;</description>
        <pubDate>Tue, 12 Apr 2016 12:05:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/04/12/considerations-on-hockeyapp-and/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/04/12/considerations-on-hockeyapp-and/</guid>
      </item>
    
      <item>
        <title>Getting started with Kusto a.k.a. Application Insights Analytics</title>
        <description>&lt;p&gt;Last week Brian &lt;a href=&quot;https://blogs.msdn.microsoft.com/bharry/2016/03/28/introducing-application-analytics/&quot;&gt;told us&lt;/a&gt; about Kusto, an internal data analytics tools which then became a component of Application Insights.&lt;/p&gt; &lt;p&gt;You can start using it right away, there is nothing to configure. You’ll find an Analytics button in the Application Insights blade on the Azure portal:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-hllbMBXxw0Q/VwikZNp9d9I/AAAAAAAAC84/JxH9Tv1WQHc/s1600-h/0%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;0&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;0&quot; src=&quot;https://lh3.googleusercontent.com/-NJgblBhMN6w/VwikZyLdZrI/AAAAAAAAC9A/1GDLR1Iyru8/0_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;78&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-Xo-xvCcJE4I/Vwikag_0qZI/AAAAAAAAC9I/7Cru56rXFAE/s1600-h/1%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;1&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;1&quot; src=&quot;https://lh3.googleusercontent.com/-a8g88Mikjpw/Vwikbm1q3fI/AAAAAAAAC9Q/CEMGWDVkUk8/1_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;123&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;There are lots of samples ready to go – let’s take the first one (distribution of response times in the last 24 hours, by response code):&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-ehXQtCXf80I/VwikcoZkh6I/AAAAAAAAC9Y/OoMAzgNzLBI/s1600-h/2%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;2&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;2&quot; src=&quot;https://lh3.googleusercontent.com/-yclTjJvw9Kk/Vwikddy1dAI/AAAAAAAAC9g/i03hOx8ogcg/2_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;157&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The language is very straightforward – there is also a guide &lt;a href=&quot;https://azure.microsoft.com/en-gb/documentation/articles/app-insights-analytics/&quot;&gt;here&lt;/a&gt;. The result will be charted at the bottom:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-VKme5wW65LQ/VwikeIhsdfI/AAAAAAAAC9o/hKQmNMyTK1Q/s1600-h/3%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;3&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;3&quot; src=&quot;https://lh3.googleusercontent.com/-oVkcMtds6j8/VwikfJEilaI/AAAAAAAAC9w/jiBUGGwxBwM/3_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;96&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-Xut3wweFWqk/VwikgMGQPWI/AAAAAAAAC94/yoOPUet8N0s/s1600-h/4%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;4&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;4&quot; src=&quot;https://lh3.googleusercontent.com/-mdGHe8UHgTw/Vwikg6kTK3I/AAAAAAAAC-A/j92nyS_42ic/4_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;88&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This is another good one – application requests comparison over a 24 hours period:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-dkI2Bk-uY5c/Vwikh7EXkYI/AAAAAAAAC-I/uA6bLfcTIKI/s1600-h/5%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;5&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;5&quot; src=&quot;https://lh3.googleusercontent.com/-6HhQfRHryRg/VwikivTNVxI/AAAAAAAAC-Q/gcnc3xK7nA8/5_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;51&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-3PBLLrNu4wc/Vwikj98fCsI/AAAAAAAAC-Y/oC6NoClrJDY/s1600-h/6%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;6&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;6&quot; src=&quot;https://lh3.googleusercontent.com/-8nwzXK3HjMM/VwikkneMLyI/AAAAAAAAC-g/geFrxzTjr5Y/6_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;83&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Data like this is critical for proactive monitoring as well, you can periodically monitor this dashboard and understand where the bottlenecks are in your application. &lt;/p&gt; &lt;p&gt;It is really a great tool!&lt;/p&gt;</description>
        <pubDate>Sat, 09 Apr 2016 06:43:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/04/09/getting-started-with-kusto-aka/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/04/09/getting-started-with-kusto-aka/</guid>
      </item>
    
      <item>
        <title>On the potential of Bash on Windows in a DevOps world</title>
        <description>&lt;p&gt;One of the announcements of todays’ //build is the availability of Bash on Windows, thanks to Ubuntu. I share the excitement as well, but focus on individual developers left something behind IMHO: it is a great step ahead for development purposes on development machines, but also from a DevOps perspective. &lt;p&gt;Let’s put it in this way – if you are developing a cross-platform application, which can run on both Windows and Linux, you now have the potential of a single set of scripts for automation. &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-eRrm2VK7Aug/Vvw1fYa08-I/AAAAAAAAC8E/GUnlOVvoqeI/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-RKwl5M80TAM/Vvw1giW2M2I/AAAAAAAAC8M/yRsOHwKjUQQ/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;49&quot;&gt;&lt;/a&gt; &lt;p&gt;You won’t have to maintain two different sets of scripts. You will be targeting both Windows and non-Windows machines, with the same logic, reducing maintenance costs by roughly half and standardising on procedures which would work on both. &lt;p&gt;I really see it as a game changer in the DevOps world! &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-bd1YZfe10ew/Vvw1h4M1YaI/AAAAAAAAC8U/aNjeEGPge4s/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;</description>
        <pubDate>Wed, 30 Mar 2016 20:22:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/03/30/on-potential-of-bash-on-windows-in/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/03/30/on-potential-of-bash-on-windows-in/</guid>
      </item>
    
      <item>
        <title>SCVMM extension for the new Team Build in action</title>
        <description>&lt;p&gt;I mentioned that a few times – I am a real enthusiast when it comes to certain topics, and Lab Management is one of these.&lt;/p&gt; &lt;p&gt;If you installed the SCVMM extension like I did in the &lt;a href=&quot;http://mattvsts.blogspot.co.uk/2016/03/advantages-of-shared-architecture.html&quot;&gt;last post&lt;/a&gt;, then you will find extremely easy to use it in your build process.&lt;/p&gt; &lt;p&gt;You’ll need to create a &lt;strong&gt;SCVMM Service Endpoint &lt;/strong&gt;to allow the tasks to interact with the server:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-9USJ3yzEXrY/VvAJu0jF-KI/AAAAAAAAC6A/3OqBE5YlZ7c/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-_67qr6CuovU/VvAJvw270YI/AAAAAAAAC6I/A_dKDkBCIAQ/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;111&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Once this is done, you will find the new task under the &lt;strong&gt;Deploy &lt;/strong&gt;tasks:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-5IgjXMPe1uI/VvAJwiRDS9I/AAAAAAAAC6Q/O3Bnl4HgyJU/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-hiLI-z9EQo0/VvAJxXGyGcI/AAAAAAAAC6Y/G-b6PQ1WdJk/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;38&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This task has some actions, and it can interact with both a host or a cloud:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-VOgjGu-clFE/VvAJyL2K1hI/AAAAAAAAC6g/hlwswlxBJxg/s1600-h/image%25255B8%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-Jw-iF3_68LU/VvAJy5q45FI/AAAAAAAAC6o/9h7337EquO8/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;162&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-V6Bo4y80QME/VvAJzVimtVI/AAAAAAAAC6w/MOLxJp3hjow/s1600-h/image%25255B11%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-ag1-hCE18y4/VvAJ0VLfjiI/AAAAAAAAC64/GSK9Iq-Jqhg/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;79&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;There is also a minor bug in this version: if you try to start a VM the task will wait until the end of the specified Wait Time even if the VM is started. THis is going to be fixed soon though.&lt;/p&gt;</description>
        <pubDate>Mon, 21 Mar 2016 14:48:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/03/21/scvmm-extension-for-new-team-build-in/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/03/21/scvmm-extension-for-new-team-build-in/</guid>
      </item>
    
      <item>
        <title>Advantages of a shared architecture: the TFS/VSTS example</title>
        <description>&lt;p&gt;A few months ago I wrote a throwback &lt;a href=&quot;https://www.microsoft.com/en-gb/developers/articles/week04dec15/an-ever-evolving-platform-visual-studio-team-services/&quot;&gt;article&lt;/a&gt; for MSDN about VSTS, its journey from “TFS in the cloud” to a full-fledged service, and its evolution.&lt;/p&gt; &lt;p&gt;It is great to see how things evolved, and now it is pretty much the opposite compared to five years ago – they share the same architecture, but for clear reasons VSTS is updated every three weeks compared to the quarterly TFS updates.&lt;/p&gt; &lt;p&gt;A perfect example of this shared architecture is the Extensions Marketplace. Released late last year, the Marketplace is the major vehicle for Extensions deployment and distribution. &lt;/p&gt; &lt;p&gt;It is not only cosmetic extensions and tweaks – even major changes like the &lt;a href=&quot;https://blogs.msdn.microsoft.com/bharry/2016/03/03/tfs-2015-rc2-and-vs-2015-update-2-rc-are-available/&quot;&gt;SCVMM Integration extension&lt;/a&gt; for the new Team Build is distributed that way, which includes VMWare support for Lab Management!&lt;/p&gt; &lt;p&gt;Anyway – back to topic – if you browse to the _gallery page of your TFS 2015 Update 2 RC2 (and RTM when it will be), you will find this:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-eWs3-KJfgUI/VuA41Jff0LI/AAAAAAAAC1Y/xJse2VzUdmo/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-ulobEc8J9qk/VuA41mZ-gnI/AAAAAAAAC1g/AO5PHLMv-9k/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;100&quot;&gt;&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Which means that extensions built for VSTS can be reused in your on-premise TFS with no changes! For example, let’s take the SCVMM extension I mentioned before:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-X8aDBoODMNs/VuA42cRHuII/AAAAAAAAC1o/lxwN65TKZDQ/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-JZm_VYAuRZQ/VuA43cbIrVI/AAAAAAAAC1w/94sbHeJDIoM/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;89&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;You can download it, and you are going to be presented with the upload instructions:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-qGpdrnJWWFA/VuA433TxgJI/AAAAAAAAC14/Y0jh2P4w0fE/s1600-h/image%25255B8%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-yiSGFfmI77Y/VuA44clMUeI/AAAAAAAAC2A/0-1d2IDU0tU/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;136&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;It is as easy as they say!&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-M__fSK3O_JI/VuA44_i8RyI/AAAAAAAAC2I/aPIFseg_kG4/s1600-h/image%25255B11%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-NXwqCj6c_FE/VuA45ZmNcuI/AAAAAAAAC2Q/aO3N6QkIZwc/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;130&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-3-cdxMAoVjI/VuA46OsewEI/AAAAAAAAC2Y/2WC_hEiJFXw/s1600-h/image%25255B14%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-g0HE9sKjWn4/VuA46hqt9dI/AAAAAAAAC2g/zWF1Uz8VOKQ/image_thumb%25255B4%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;73&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;It is literally it. You now need to install the extension, and this is per-collection:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-cqOjKJafoMM/VuA47SKkaMI/AAAAAAAAC2o/gkCqVCnvSN4/s1600-h/image%25255B17%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-mExbGBmKOOg/VuA48LsKQlI/AAAAAAAAC2w/y-1oI_r8Ens/image_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;70&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-T8_HhrlAt20/VuA48rd0UhI/AAAAAAAAC24/4EcX4SqBvak/s1600-h/image%25255B26%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-Wud0niLjcEI/VuA49IOXNpI/AAAAAAAAC3A/ghLw6HwulQQ/image_thumb%25255B8%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;209&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Once you upload the extension, this is available in the gallery exactly like the VSTS’ counterpart:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-dnfi74dzNr4/VuA49jO6irI/AAAAAAAAC3I/mWAGpPnJRdg/s1600-h/image%25255B20%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-oIGfksqIb7c/VuA4-aPlcZI/AAAAAAAAC3Q/OwYrId656bQ/image_thumb%25255B6%25255D.png?imgmax=800&quot; width=&quot;210&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-JvsumVkA35s/VuA4-x1Y82I/AAAAAAAAC3Y/FMIWqkfJbZo/s1600-h/image%25255B23%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-XxoDbp3rlZ8/VuA4_imE1kI/AAAAAAAAC3g/LlXDXzofXBs/image_thumb%25255B7%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;139&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The great advantage of this architecture choice is that once you deploy something to the cloud, it is much easier to backport it to on-premise and it saves a lot on the maintenance side of the product – once you deploy a fix, the fix is (99% of the time) for both.&lt;/p&gt;</description>
        <pubDate>Wed, 09 Mar 2016 14:53:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/03/09/advantages-of-shared-architecture/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/03/09/advantages-of-shared-architecture/</guid>
      </item>
    
      <item>
        <title>Why a TFS pre-release in production?</title>
        <description>&lt;p&gt;So, big question: why should I run a pre-release Team Foundation Server update in production? Isn’t it risky? And what about support in case things go wrong?&lt;/p&gt; &lt;p&gt;The biggest reason why you’d want to do that is because you really want to allow your users to enjoy the very latest features of the platform. &lt;/p&gt; &lt;p&gt;For example now we have TFS 2015 Update 2 available as a &lt;a href=&quot;https://www.visualstudio.com/news/tfs2015-update2-vs&quot;&gt;Release Candidate 1&lt;/a&gt;, and you might really want to deploy it because it includes the new Release Management features (for the record, I am &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-YgiK6IL8ZTU/VtXm9OOWybI/AAAAAAAAC1A/U_HDVXWBulg/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;). You can also have reasons related to performance problems, very specific bugs, etc. but usually features are the &lt;em&gt;culprit&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;The quality bar is &lt;a href=&quot;https://msdn.microsoft.com/en-US/library/mt656781.aspx&quot;&gt;pretty high&lt;/a&gt;. I ran many non-RTM releases in production and I hit very few problems or blockers, with live loads and real users’ expectations. &lt;/p&gt; &lt;p&gt;The second best thing about running a go-live pre-release is, oddly enough, support in case things go south. If you have a production issue with a pre-release of TFS, you get some kind of special attentions &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-YgiK6IL8ZTU/VtXm9OOWybI/AAAAAAAAC1A/U_HDVXWBulg/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt; and for free! &lt;/p&gt; &lt;p&gt;That is because you are providing some very useful feedback from production scenarios, collaborating to increase the overall quality even more.&lt;/p&gt; &lt;p&gt;And eventually – if you upgrade to a pre-release you are still on the official upgrade path, so you can move off it without problems when the RTM is out.&lt;/p&gt; &lt;p&gt;There is a trick though – you must run only &lt;strong&gt;go-live&lt;/strong&gt; releases in production. It might sound obvious, but think about it for a second: it is a pre-release, but if it carries the go-live license it means the quality is high enough to be trusted in production. Different story if we look at CTPs or betas – they often aren’t go-live supported and they are meant only as an evaluation version for future upgrades.&lt;/p&gt;</description>
        <pubDate>Tue, 01 Mar 2016 19:01:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/03/01/why-tfs-pre-release-in-production/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/03/01/why-tfs-pre-release-in-production/</guid>
      </item>
    
      <item>
        <title>Using custom Quality Profiles with SonarQube and the new Team Build</title>
        <description>&lt;p&gt;When you analyse a project with SonarQube you are running the analyser with a predefined set of rules – they are the most commonly used rules, but not the most comprehensive.  &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-VWtVeOXbZQc/Vs3oBJw8xVI/AAAAAAAACv8/eSwcZHJZgt4/s1600-h/clip_image002%25255B3%25255D.jpg&quot;&gt;&lt;img title=&quot;clip_image002&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;clip_image002&quot; src=&quot;https://lh3.googleusercontent.com/-i88bbYiI4WI/Vs3oCkcmPiI/AAAAAAAACwE/Y8c5YW0Z9t0/clip_image002_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;47&quot;&gt;&lt;/a&gt;  &lt;p&gt;This has a lot of sense, because you might not want to end up cluttering the dashboard with tons of information you don’t actually need or that you can’t work on now.  &lt;p&gt;Here is where custom Quality Profiles come into play. For example, I might want a specific build definition to be used for Code Analysis with all the rules enabled.  &lt;p&gt;After creating a new, empty Quality Profile all I need to do is to search for the rules I want and add them to my custom profile. Searching is quite a powerful experience – you can rely on really a lot of criteria, aside from the simple search on the name.  &lt;p&gt;But in this case, the name (CA, which is the code for each Code Analysis rule ran by Visual Studio) will do:  &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-7xCA6pDztd8/Vs3oDsVTkmI/AAAAAAAACwM/NB31B5-HeLQ/s1600-h/clip_image004%25255B3%25255D.jpg&quot;&gt;&lt;img title=&quot;clip_image004&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;clip_image004&quot; src=&quot;https://lh3.googleusercontent.com/-vY9mRdYLFYE/Vs3oFHc6n0I/AAAAAAAACwU/dUpHJg4irwc/clip_image004_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;158&quot;&gt;&lt;/a&gt;  &lt;p&gt;Here you can select which rules you want to go into the profile. If you want all of them, just go for the &lt;b&gt;Bulk Change &lt;/b&gt;button on the top right hand side:  &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-O-OLsHsTrRg/Vs3oGFFRoQI/AAAAAAAACwc/SueAaKgUGsc/s1600-h/clip_image006%25255B3%25255D.jpg&quot;&gt;&lt;img title=&quot;clip_image006&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;clip_image006&quot; src=&quot;https://lh3.googleusercontent.com/-jC7e76XK3mA/Vs3oHkdB55I/AAAAAAAACwk/SEKM1-V7jE4/clip_image006_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;236&quot;&gt;&lt;/a&gt;  &lt;p&gt;You need to type in the name of the profile now:  &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-GrGwiNR4tMU/Vs3oIlrUAeI/AAAAAAAACws/cxPaHvwsXUk/s1600-h/clip_image008%25255B3%25255D.jpg&quot;&gt;&lt;img title=&quot;clip_image008&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;clip_image008&quot; src=&quot;https://lh3.googleusercontent.com/-FQ-WrGSKKZk/Vs3oKJdr_xI/AAAAAAAACw0/C_HaT2SXAX8/clip_image008_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;75&quot;&gt;&lt;/a&gt;  &lt;p&gt;That’s it!  &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-gdUD7aeB2bw/Vs3oLJRHLGI/AAAAAAAACw8/6oA5gUmC_R0/s1600-h/clip_image010%25255B3%25255D.jpg&quot;&gt;&lt;img title=&quot;clip_image010&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;clip_image010&quot; src=&quot;https://lh3.googleusercontent.com/-JT0tOi98S1A/Vs3oMZMOrqI/AAAAAAAACxE/OX0L6RyQ-Sw/clip_image010_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;82&quot;&gt;&lt;/a&gt;  &lt;p&gt;Now you need to create a new SonarQube project to use this custom quality profile: &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-HRDbxWoVYPg/Vs3oNtK-8bI/AAAAAAAACxM/CJOMwNcThMM/s1600-h/clip_image012%25255B3%25255D.jpg&quot;&gt;&lt;img title=&quot;clip_image012&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;clip_image012&quot; src=&quot;https://lh3.googleusercontent.com/-qhRcHdvNqlM/Vs3oO0SvIgI/AAAAAAAACxU/KQq_eGstZOI/clip_image012_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;114&quot;&gt;&lt;/a&gt;  &lt;p&gt;From the Administration menu, select Quality Profiles so you can change the default one with your custom profile:  &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-G8Z1mEPZgGQ/Vs3oQg_WB9I/AAAAAAAACxc/6V3lrlmMeN8/s1600-h/clip_image014%25255B3%25255D.jpg&quot;&gt;&lt;img title=&quot;clip_image014&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;clip_image014&quot; src=&quot;https://lh3.googleusercontent.com/-QFeITjr99Y4/Vs3oSLmoUEI/AAAAAAAACxk/Ml9NSzES_uY/clip_image014_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;56&quot;&gt;&lt;/a&gt;  &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-pHF7ulv7Gh0/Vs3oTBr2jWI/AAAAAAAACxs/H1FxmGYJG_o/s1600-h/clip_image016%25255B3%25255D.jpg&quot;&gt;&lt;img title=&quot;clip_image016&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;clip_image016&quot; src=&quot;https://lh3.googleusercontent.com/-cQnCZkTb9Oc/Vs3oUetWw-I/AAAAAAAACx0/sHkNHyyHcmY/clip_image016_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;133&quot;&gt;&lt;/a&gt;  &lt;p&gt;Eventually, configure the new build definition with the same parameters for the SonarQube analyser:  &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-vPt-KcSBWUA/Vs3oVR-SC0I/AAAAAAAACx8/VMpWvfVKBYM/s1600-h/clip_image018%25255B3%25255D.jpg&quot;&gt;&lt;img title=&quot;clip_image018&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;clip_image018&quot; src=&quot;https://lh3.googleusercontent.com/-2VioXzh93zc/Vs3oWZPRNxI/AAAAAAAACyE/TyLId23kiAU/clip_image018_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;66&quot;&gt;&lt;/a&gt;  &lt;p&gt;Now you can run the build as usual, and this project will have different results (of course!).  &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-6lggSV8Iy_g/Vs3oX544-LI/AAAAAAAACyM/kZYTYOf_7Uk/s1600-h/clip_image020%25255B3%25255D.jpg&quot;&gt;&lt;img title=&quot;clip_image020&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;clip_image020&quot; src=&quot;https://lh3.googleusercontent.com/-00NfvqQTYo0/Vs3oZGN_imI/AAAAAAAACyU/RUkA45f5rBU/clip_image020_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;53&quot;&gt;&lt;/a&gt;</description>
        <pubDate>Wed, 24 Feb 2016 17:29:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/02/24/using-custom-quality-profiles-with/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/02/24/using-custom-quality-profiles-with/</guid>
      </item>
    
      <item>
        <title>Small but very valuable nuggets about Work Item Tracking in TFS and VSTS</title>
        <description>&lt;p&gt;Have you ever noticed this couple of small but very useful features in Team Foundation Server and Visual Studio Team Services?&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-6s-YhJ3eJHY/VryLKd_9-5I/AAAAAAAACuw/3ULb1PBYJ6Q/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-6v6nRew7Ads/VryLLQBOXbI/AAAAAAAACu4/a_yhhZz_Uv4/image_thumb.png?imgmax=800&quot; width=&quot;163&quot; height=&quot;73&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;You can query across projects – think about it, you can create a cross-project (in case you are not using the &lt;a href=&quot;http://nkdagility.com/one-team-project/&quot;&gt;One Team Project&lt;/a&gt; approach) query which can be pinned in the main dashboard. A very minor thing bringing a lot of value to certain roles.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-2obZQ_eF718/VryLMIMXbDI/AAAAAAAACvA/4IcNx7wsmKI/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-n2UXpp8TwVI/VryLM-n7QWI/AAAAAAAACvI/hJc2X89qvG8/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;238&quot; height=&quot;228&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;You can compare different fields! I realised this a few days ago (my bad!), and I think it dramatically improves the custom queries’ experience, given that you can build a result based on field comparison.&lt;/p&gt;</description>
        <pubDate>Thu, 11 Feb 2016 13:23:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/02/11/small-but-very-valuable-nuggets-about/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/02/11/small-but-very-valuable-nuggets-about/</guid>
      </item>
    
      <item>
        <title>A new experience with Work Items deletion in VSTS</title>
        <description>&lt;p&gt;With Team Foundation Server you can either &lt;em&gt;remove&lt;/em&gt; a Work Item by changing its state (leaving it on the backlog then, not really a removal) or permanently destroy it. No middle ground, no real choice if you need to clear the backlog.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-ipWS_PfPphY/VrXm1z82NqI/AAAAAAAACtM/YK88jje39iY/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-y1rqo_ew76w/VrXm2zynYWI/AAAAAAAACtU/Bsr9v_Cu0nM/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;230&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;With Visual Studio Team Services instead you have this middle ground, with the Recycle Bin.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-K-SY0FU-bsQ/VrXm3ilMIgI/AAAAAAAACtc/ENMAzzDf5pM/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-DXi7dJt1-U4/VrXm4Zw6dZI/AAAAAAAACtk/gh1sUTlC-ks/image_thumb.png?imgmax=800&quot; width=&quot;136&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;It is literally that – you can now delete a Work Item via the context menu and it would be gone, moved to the Bin. Pretty much like a file.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-tSd59Fpp3rc/VrXm5MSdAtI/AAAAAAAACts/8xckENlO6OI/s1600-h/image%25255B8%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-8PqJZQ-seWs/VrXm551Zx6I/AAAAAAAACt0/q8Q5eRDTyDQ/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;154&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Of course it isn’t actually destroyed (only witadmin destroywi can do that, and it needs confirmation for doing that), but it is only hidden from the backlog. All the traceability is retained, which is very handy.&lt;/p&gt;</description>
        <pubDate>Sat, 06 Feb 2016 12:28:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/02/06/a-new-experience-with-work-items/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/02/06/a-new-experience-with-work-items/</guid>
      </item>
    
      <item>
        <title>Help, the backlog is gone!</title>
        <description>&lt;p&gt;Just beware – if you are migrating stuff from a Team Foundation Server to Visual Studio Team Services, it might happen that despite correctly moving all the Work Items involved in the migration you can’t see the backlog as you would expect.&lt;/p&gt; &lt;p&gt;But don’t panic, this doesn’t mean data is lost, it just means that data is not showing up – a completely different matter. That is confirmed by creating some custom queries asking for all of a certain type of Work Item Type (all PBIs for example): you would get all the Work Items you are looking for.&lt;/p&gt; &lt;p&gt;So, what is the problem here? Look at the &lt;strong&gt;areas&lt;/strong&gt;: if you do not allow areas to automatically &lt;strong&gt;link sub-areas&lt;/strong&gt;, your backlog is not going to show what you want.&lt;/p&gt; &lt;p&gt;Lots of panic for nothing &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-3HDGxsWIM-c/VqKcPjVw0lI/AAAAAAAACs4/g16OO-O1KVU/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt;</description>
        <pubDate>Fri, 22 Jan 2016 21:16:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/01/22/help-backlog-is-gone/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/01/22/help-backlog-is-gone/</guid>
      </item>
    
      <item>
        <title>Where are TFS and VSTS heading?</title>
        <description>&lt;p&gt;This week Microsoft made published &lt;a href=&quot;https://www.visualstudio.com/en-us/news/release-archive-vso.aspx&quot;&gt;an update&lt;/a&gt; to the Team Foundation Server and Visual Studio Team Services roadmap, and it looks very promising.&lt;/p&gt; &lt;p&gt;As we already know, TFS and VSTS are an ever evolving platform. This is true for both on-premise with regular updates delivered roughly every quarter and for the cloud service, where the new features are always delivered first.&lt;/p&gt; &lt;p&gt;There are already a few set of features slated for TFS vNext – this is neither a surprise nor a defeat admission, the amount of work for such features is very big – think at the &lt;a href=&quot;http://blogs.msdn.com/b/visualstudioalm/archive/2016/01/11/process-customization-futures.aspx&quot;&gt;listed&lt;/a&gt; &lt;a href=&quot;http://blogs.msdn.com/b/visualstudioalm/archive/2016/01/11/vsts-new-work-item-form-futures-january-2016.aspx&quot;&gt;improvements&lt;/a&gt; for Work Item Tracking alone.&lt;/p&gt; &lt;p&gt;But it isn’t everything for vNext – there is a lot coming in Update 2 and Update 3 as well. The Lab Management overhaul is one of these features, coming in Update 2, like extensions on-premise and the &lt;a href=&quot;http://blogs.msdn.com/b/visualstudioalm/archive/2016/01/08/vsts-release-management-plan-for-2016-h1.aspx&quot;&gt;new Release Management&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Keep an eye on that page for TFS and VSTS, because it is updated on a regular basis and it is a great source of information for planning well in advance.&lt;/p&gt;</description>
        <pubDate>Thu, 14 Jan 2016 19:37:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/01/14/where-are-tfs-and-vsts-heading/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/01/14/where-are-tfs-and-vsts-heading/</guid>
      </item>
    
      <item>
        <title>A cryptic story around Git, VSTS and Azure Active Directory</title>
        <description>&lt;p&gt;This is a short and easy tip with an interesting background. &lt;br&gt;&lt;br&gt;If you try to push stuff to a Git repository hosted in a VSTS account, where this account is backed by Azure Active Directory and you are not logged on with the relevant credentials, you are going to get a quite cryptic error:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-z7aTpGzmCD8/Vo0XYA7AIrI/AAAAAAAACrU/F-MGinSEqe4/s1600-h/image2.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-BS4ps1sJ-jc/Vo0Xbw6IevI/AAAAAAAACrg/GnV6GWNuALs/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;58&quot;&gt;&lt;/a&gt;&lt;br&gt;The Output window is not quite helpful either:&lt;br&gt;&lt;br&gt;&lt;a href=&quot;https://lh3.googleusercontent.com/-HK8_leqYqak/Vo0XffdmGyI/AAAAAAAACrs/Wi9GdCLriD8/s1600-h/image9.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://lh3.googleusercontent.com/-wVOhpr-779w/Vo0XjN5R5VI/AAAAAAAACr4/1tQRldxXVfA/image_thumb3.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;39&quot;&gt;&lt;/a&gt;&amp;nbsp;&lt;br&gt;What is going on here? The reason, as I stated, is simple – I wasn’t using the right credentials. But the problem is that Visual Studio is not warning me, while instead the command line would just ask for the credentials.&lt;br&gt;One of these things you need to &lt;em&gt;just know&lt;/em&gt;, I assume &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;https://lh3.googleusercontent.com/-xQQ1ZfT3FOQ/Vo0XmikUaFI/AAAAAAAACsE/rRxipf2K_CQ/wlEmoticon-smile2.png?imgmax=800&quot;&gt;&lt;/p&gt;</description>
        <pubDate>Wed, 06 Jan 2016 13:33:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2016/01/06/a-cryptic-story-around-git-vsts-and/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2016/01/06/a-cryptic-story-around-git-vsts-and/</guid>
      </item>
    
      <item>
        <title>I updated Release Management and my builds fail: now what?</title>
        <description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;This is a quick but worth tip to remember. &lt;br /&gt;If you upgrade Release Management, you always need to update the Client. Up  to this, fair enough.&lt;br /&gt; &lt;br /&gt;But&amp;nbsp;you are going to start getting errors like “&lt;strong&gt;The account running  the TFS build service needs to be added as a system user in the Release  Management Server&lt;/strong&gt;” in your build.&lt;br /&gt; &lt;br /&gt;What you might be missing is that in order to allow communication between the  two you also need to at least open the client, and if you keep getting errors  you might also want to remove and re-add the Release Management URL into it.&lt;br /&gt; &lt;br /&gt;This operation will recreate the authentication tokens and you can use VSRM  again.&lt;/div&gt;</description>
        <pubDate>Mon, 14 Dec 2015 21:52:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/12/14/i-updated-release-management-and-my/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/12/14/i-updated-release-management-and-my/</guid>
      </item>
    
      <item>
        <title>Things to remember when you work with Azure and the new Team Build</title>
        <description>&lt;p&gt;Azure is an amazing piece of technology – its capabilities are immense and there is always something new to learn and use for solving our problems.&lt;/p&gt; &lt;p&gt;It is quite a while I am spending time on it, together with the new Team Build and a few other bits and pieces all around. I thought about summarising these little issues you might face as well, so you should save some time &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh3.googleusercontent.com/-FyUnAYDxoHw/VmRdxMvf_9I/AAAAAAAACps/LqViIv3b6HY/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;First of all, please remember this: if you don’t have a build task OOB, and you don’t want to write your own, you can still use &lt;strong&gt;PowerShell&lt;/strong&gt;! Never forget how powerful it is, because it can be used in literally thousands of ways.&lt;/p&gt; &lt;p&gt;If you are working with TFS 2015 RTM you won’t have the new build tasks bundled with the Update 1 or support for Service Principals, but don’t worry – you can achieve the same results with a bit of PowerShell.&lt;/p&gt; &lt;p&gt;For example, bearing in mind that creating a Service Principal for your Azure Active Directory is as easy as the first part (steps 1, 2 and 3) of this &lt;a href=&quot;http://blogs.msdn.com/b/visualstudioalm/archive/2015/10/04/automating-azure-resource-group-deployment-using-a-service-principal-in-visual-studio-online-build-release-management.aspx&quot;&gt;blog post&lt;/a&gt;, this is all you need to do in a PowerShell script to use the Service Principal for authentication:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-gP-mq9XT25o/VmRdxq_2f8I/AAAAAAAACp4/okTIpyEZ9vc/s1600-h/image%25255B6%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-lV_NqPycddo/VmRdyUBAdcI/AAAAAAAACqE/LfTjIWOn2pw/image_thumb%25255B4%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;76&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;At the moment support for Service Principals is limited to &lt;strong&gt;Azure Resource Manager&lt;/strong&gt;, so for deploying any components you might want you still need to rely on the &lt;em&gt;old &lt;/em&gt;certificate-based authentication.&lt;/p&gt; &lt;p&gt;The &lt;em&gt;issue &lt;/em&gt;here is that the combobox in the build task for Web App Deployment (VSTS or TFS 2015.1) &lt;strong&gt;doesn’t specify&lt;/strong&gt; anything like that. What I suggest is to follow the following approach and add the Azure subscription with both authentications:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-uHw7lpKDoB0/VmRdy-uZBjI/AAAAAAAACqQ/GDnaanoFVaQ/s1600-h/image%25255B9%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-2VnoH92QZE0/VmRdziCdBVI/AAAAAAAACqY/5j15Vae_WVg/image_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;190&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;So you would get a subscription in the comboboxes anyway, regardless of the &lt;strong&gt;authentication method&lt;/strong&gt; you chose.&lt;/p&gt; &lt;p&gt;Eventually, bear in mind that the new build agents expose capabilities – so if you want a specific agent with Azure PowerShell installed you would need to specify &lt;strong&gt;AzurePS &lt;/strong&gt;as a demand in the build definition.&lt;/p&gt;  </description>
        <pubDate>Sun, 06 Dec 2015 16:09:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/12/06/things-to-remember-when-you-work-with/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/12/06/things-to-remember-when-you-work-with/</guid>
      </item>
    
      <item>
        <title>What’s happened to the Visual Studio installer?</title>
        <description>&lt;p&gt;Well, they sorted it out! The Visual Studio 2015 installer is now &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/bb386063.aspx&quot;&gt;componentised&lt;/a&gt;:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-dAPpxt1637Y/VmC2DhNkajI/AAAAAAAACnM/9J8ngzku_PE/s1600-h/inst0%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;inst0&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;inst0&quot; src=&quot;http://lh3.googleusercontent.com/-3Wv_N4BhZOg/VmC2EKXl50I/AAAAAAAACnU/sXDLiwf0Ed0/inst0_thumb.png?imgmax=800&quot; width=&quot;176&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;It is now very straightforward to understand, especially for upgrades. This is true also for the third party components like the Android development stuff.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-M_bn_3_c6Jw/VmC2E5GAmuI/AAAAAAAACng/-l8Ji7BZVns/s1600-h/inst1%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;inst1&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;inst1&quot; src=&quot;http://lh3.googleusercontent.com/-hj-qysTIBk0/VmC2FQgm-dI/AAAAAAAACnw/rT191gutsxk/inst1_thumb.png?imgmax=800&quot; width=&quot;178&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;How was that possible, given the monolithic ISO that Visual Studio was? Let’s have a look at the packages:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-HxGhJErWLaQ/VmC2GBsKD5I/AAAAAAAACn4/Jo9I-61TrIU/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-M4ETX76izg0/VmC2GxUOKKI/AAAAAAAACoI/yzIWzYU0Qwc/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;207&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;And then there is a file for the external, downloadable components. It is the feed.xml file, this is an extract:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-oKywwoPmhVc/VmC2HQotKXI/AAAAAAAACoU/I2OiHUvW3IM/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-P1qWuH7fx4s/VmC2IA2DQYI/AAAAAAAACoc/M33evYisrPA/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;77&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Kudos to the team!&lt;/p&gt;  </description>
        <pubDate>Thu, 03 Dec 2015 21:37:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/12/03/whats-happened-to-visual-studio/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/12/03/whats-happened-to-visual-studio/</guid>
      </item>
    
      <item>
        <title>Endpoints in a Team Project: what shall I do with them?</title>
        <description>&lt;p&gt;If you roam around a TFS/VSTS Team Project Administration page you will surely come across the &lt;strong&gt;Services &lt;/strong&gt;tab:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-JrVPl58OrsQ/Vldxj13sceI/AAAAAAAAClU/NEOMjGME5b4/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-3NTvwp7tobY/VldxkoC9qdI/AAAAAAAAClg/ytT8pDHkxOE/image_thumb.png?imgmax=800&quot; width=&quot;154&quot; height=&quot;67&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;What am I supposed to do with these? Why is there “Endpoints” and “XAML Build Services”?&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-4nyUpg8nz-4/VldxlPSaaMI/AAAAAAAAClo/wQiWiLT-BE4/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-hUXnLyXYQqw/VldxlhRkL9I/AAAAAAAACl4/qQrrnoFJvp4/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;199&quot; height=&quot;82&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Let’s start with the first question – in VSTS or TFS you can connect external services to interact with various features, like Build or Release Management. &lt;/p&gt; &lt;p&gt;Azure is a great example in that regard, because you can link a subscription to a Team Project for deployment purposes, once you do so all the combobox related to Azure Deployment (ARM, Web App, Cloud Services) will be automatically populated.&lt;/p&gt; &lt;p&gt;But there is not only Azure:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-9iJaH2B4h0k/VldxmAf8wlI/AAAAAAAACmA/xfWpBemi9Ak/s1600-h/image%25255B8%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-75yv_7m8iQ4/Vldxm2dqKHI/AAAAAAAACmQ/wYslcvMe1zU/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;168&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The Generic Service Endpoint enables third party services like &lt;a href=&quot;https://community.perfectomobile.com/series/25287-visual-studio-online-guide/posts/1066134-perfecto-service-endpoints-in-vso-projects&quot;&gt;Perfecto&lt;/a&gt; to integrate with the platform – you need to provide a URL and some authentication.&lt;/p&gt; &lt;p&gt;Subversion? Yes, also &lt;strong&gt;SVN is supported&lt;/strong&gt; on VSTS and TFS 2015.1. It is something &lt;a href=&quot;http://blogs.msdn.com/b/visualstudioalm/archive/2015/11/18/subversion-integration-with-visual-studio-team-services.aspx&quot;&gt;new&lt;/a&gt; – the Java ALM team delivered this integration to enable Subversion as a repository for build definition. Kudos to them!&lt;/p&gt;  &lt;p&gt;Jenkins is for the build engine as well, so you can use it in the OOB build tasks.&lt;/p&gt; &lt;p&gt;Now onto the second question – the separation between XAML Build Services and other Endpoints is because the former handles services in a different way. &lt;/p&gt; &lt;p&gt;But as it is more and more becoming something old and deprecated, only Azure is available for these. Moreover, the XAML Build Service Azure integration &lt;strong&gt;doesn’t support Service Principals&lt;/strong&gt; out of the box so you need to customise it should you use them.&lt;/p&gt;  </description>
        <pubDate>Thu, 26 Nov 2015 20:54:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/11/26/endpoints-in-team-project-what-shall-i/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/11/26/endpoints-in-team-project-what-shall-i/</guid>
      </item>
    
      <item>
        <title>Shopping in the Marketplace with Visual Studio Team Services</title>
        <description>&lt;p&gt;With the rename, &lt;strike&gt;Visual Studio Online &lt;/strike&gt;Visual Studio Team Services introduces the &lt;a href=&quot;https://marketplace.visualstudio.com&quot;&gt;Marketplace&lt;/a&gt; for its extensions.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-MzhUpQ4xkOc/Vk77th0qw4I/AAAAAAAAChk/H8bRcu6088Q/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-Z2zKaoE5lzY/Vk77uKHrksI/AAAAAAAAChs/R_FGSGj3pC4/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;115&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;It is a very welcome addition to the platform, as it enables scenarios of customisation in a very easy way.&lt;/p&gt; &lt;p&gt;Once you are logged in your VSTS account, you can browse and choose an extension:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-4mblkJoyr-8/Vk77umINv0I/AAAAAAAACh4/ZuBx1zjHXAA/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-6BObChvrur0/Vk77vDMPdXI/AAAAAAAACiE/Biu5VJzrRwg/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;196&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Each extension has its own page with all the details, and it is the entrypoint for the installation:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-UPd4eS101tc/Vk77v2no46I/AAAAAAAACiQ/C_KcAUB2AZQ/s1600-h/image%25255B8%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-c8kx8kJK_7M/Vk77weXYlOI/AAAAAAAACic/N6XlN9975x4/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;155&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The amazing thing is that it is all on your service – clicking Install brings you to an installation page, where you need to select the VSTS account you want to install the extension in:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-q_hsUGv6IpE/Vk77w0079lI/AAAAAAAACio/k-1U8yJbHMk/s1600-h/image%25255B11%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-oBBwWhKjhM0/Vk77xbSrDHI/AAAAAAAACi0/0iBBNG2sVT8/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;229&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;That’s it! Once installed, you can go back to your account and start using it!&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-1_l3Rx7w2k0/Vk77yITHrlI/AAAAAAAACjA/JKmukOjaDVQ/s1600-h/image%25255B14%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-bw9rxBu9sNM/Vk77yuv8SzI/AAAAAAAACjM/zho2T2uPeCY/image_thumb%25255B4%25255D.png?imgmax=800&quot; width=&quot;229&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;It is transparent for the users, which will just see the extension working as a feature of VSTS. All the extensions are managed at account (hence Collection) level.&lt;/p&gt;     &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-fTEQD6DetsE/Vk77zL3cm8I/AAAAAAAACjc/uaWLgiX08Fw/s1600-h/image%25255B17%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-SSdYBh5joJA/Vk77z2EutQI/AAAAAAAACjk/CubrkwThhMo/image_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;204&quot;&gt;&lt;/a&gt;&lt;/p&gt;  </description>
        <pubDate>Fri, 20 Nov 2015 10:54:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/11/20/shopping-in-marketplace-with-visual/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/11/20/shopping-in-marketplace-with-visual/</guid>
      </item>
    
      <item>
        <title>Upgrading SonarQube to 5.2, my notes</title>
        <description>&lt;p&gt;Today I updated our production instance of SonarQube to the eagerly awaited version 5.2.&lt;/p&gt; &lt;p&gt;It is such an important release because it finally embraces a full client-server paradigm (whereas the runners had to talk straight to the database before of that), it introduces support for Integrated Authentication for its database, and more.&lt;/p&gt; &lt;p&gt;The &lt;a href=&quot;http://docs.sonarqube.org/display/SONAR/Upgrading&quot;&gt;documentation&lt;/a&gt; rightly suggests to not copy across the old sonar.properties file but to carefully cross-check the settings you are modifying – it is a very wise suggestion, as the strings are now different (albeit they look similar at first sight).&lt;/p&gt; &lt;p&gt;The JDBC driver for SQL Server is now different, it doesn’t use jTDS anymore so keep an eye on your connection string. And there is also support for SQL Azure, which is a very nice touch if you host SonarQube on it. If you want to run Integrated Security you have to fiddle a bit, downloading the SQL JDBC driver and manually copying it in the appropriate folder. Everything is &lt;a href=&quot;http://docs.sonarqube.org/display/SONAR/Installing+the+Server&quot;&gt;documented&lt;/a&gt; though.&lt;/p&gt; &lt;p&gt;SonarSource introduced a wizard (a first, I think, in the Java world…) for the upgrade – but beware, the wizard will start only if all the connection and configuration strings are set in the right way.&lt;/p&gt; &lt;p&gt;All the &lt;strike&gt;runners &lt;/strike&gt;scanners must be updated, pointing straight to the SonarQube instance instead of the database, and eventually another very minor issue – if you have a custom image (the top left one) in your SonarQube instance you need to reset it and set a width, as it isn’t preserved.&lt;/p&gt;  </description>
        <pubDate>Tue, 17 Nov 2015 22:12:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/11/17/upgrading-sonarqube-to-52-my-notes/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/11/17/upgrading-sonarqube-to-52-my-notes/</guid>
      </item>
    
      <item>
        <title>Small touches I like in the TFS 2015 Update 1 Upgrade Wizard</title>
        <description>&lt;p&gt;Microsoft is always working towards improving the user experience of its products, and Team Foundation Server is no exception to this rule.&lt;/p&gt; &lt;p&gt;There are two bits I really liked in the Upgrade Wizard of 2015.1: the new Build Agent configuration and the Upgrade Progress monitoring page.&lt;/p&gt; &lt;p&gt;For the first, now it is totally clear what are the paths a Build Agent (referred to the new Team Build, of course) uses:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-uDCgO6EwR7c/VjOgJWnkhiI/AAAAAAAACe0/EYiw9WB0q5E/s1600-h/tfs2015.1-0%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;tfs2015.1-0&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;tfs2015.1-0&quot; src=&quot;http://lh3.googleusercontent.com/-tnyG_5r8Umg/VjOgKA7GcFI/AAAAAAAACfA/3vMhs_cL9w4/tfs2015.1-0_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;193&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;For the second, I can now monitor not only the step of my upgrade but also the elapsed time, and if there is any problem going forward.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-1MKHYAUzT9w/VjOgLFxPUdI/AAAAAAAACfI/J5lPjJVi9BA/s1600-h/tfs%252520upgrade%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;tfs upgrade&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;tfs upgrade&quot; src=&quot;http://lh3.googleusercontent.com/-zsr5GQoBRO0/VjOgLzAK66I/AAAAAAAACfU/jVTjgEzvkb0/tfs%252520upgrade_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;174&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;At the bottom there is a very handy link to the logs, and if something happens during the upgrade, the Issues link brings you straight to the relevant log:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-L7OJUJhtwFs/VjOgMhTR3OI/AAAAAAAACfk/1myMSDWmbME/s1600-h/2015.1.1%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;2015.1.1&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;2015.1.1&quot; src=&quot;http://lh3.googleusercontent.com/-R1sIJmlLgk8/VjOgNmcvyJI/AAAAAAAACfs/Nvu7YEtitb4/2015.1.1_thumb.png?imgmax=800&quot; width=&quot;218&quot; height=&quot;135&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-fVNG0aU8Iyw/VjOgOAfwouI/AAAAAAAACf4/etk9BbGZbG4/s1600-h/2015.1.2%25255B6%25255D.png&quot;&gt;&lt;img title=&quot;2015.1.2&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;2015.1.2&quot; src=&quot;http://lh3.googleusercontent.com/-JvHJ5BXFzBw/VjOgO0WKUpI/AAAAAAAACgI/quYAmB4g1IE/2015.1.2_thumb%25255B4%25255D.png?imgmax=800&quot; width=&quot;484&quot; height=&quot;52&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Again, they are all small touches, but very relevant regardless of how often you use them &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh3.googleusercontent.com/-JyaZNEOivPY/VjOgPgt9yDI/AAAAAAAACgQ/lW7RSDMFeu8/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt;  </description>
        <pubDate>Fri, 30 Oct 2015 16:52:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/10/30/small-touches-i-like-in-tfs-2015-update/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/10/30/small-touches-i-like-in-tfs-2015-update/</guid>
      </item>
    
      <item>
        <title>Dashboards in Team Foundation Server 2015 Update 1</title>
        <description>&lt;p&gt;Another great new feature in TFS 2015.1 is the introduction of a real dashboard instead of a pre-built welcome page.&lt;/p&gt; &lt;p&gt;This is an example:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-vHbZMh_7vok/Vh1fInKfFHI/AAAAAAAACbU/SAUWc2iQUkk/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-poAqkZiJ2EU/Vh1fJWzE8VI/AAAAAAAACbc/ubinZByRRqc/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;256&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This is an upgraded Team Project by the way. There are a few out-of-the box widgets, but is there a &lt;strong&gt;Definition of Done&lt;/strong&gt; widget? Of course not &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh3.googleusercontent.com/-00ldtjWDHm0/Vh1fKS1fgkI/AAAAAAAACbs/C-YAcednnlY/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;You now have the flexibility of creating your own widgets, including a markdown widget:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-QrQJQOZHrhs/Vh1fLsktbKI/AAAAAAAACb4/aQqKohrVrUs/s1600-h/image%25255B8%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-7aKu091e1nw/Vh1fMoOV_qI/AAAAAAAACcA/B67pQ2WG7_A/image_thumb%25255B4%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;170&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Everything is customisable – this is my markdown example:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-UeFarDtZHDA/Vh1fNrQeMqI/AAAAAAAACcQ/_WnNhstBP08/s1600-h/image%25255B11%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-RZ_vXO7wrQs/Vh1fOkNszHI/AAAAAAAACcc/rldZsRg71BA/image_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;232&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;You can also create multiple dashboards – this is extremely handy if you have different teams with different focus across the same Team Project:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-Vz7peIOMh2I/Vh1fPqo9NUI/AAAAAAAACco/iXisDWRwLSU/s1600-h/image%25255B14%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-PwkT74IFeSc/Vh1fQmM5fjI/AAAAAAAACc0/Y0yvQxg8e4c/image_thumb%25255B6%25255D.png?imgmax=800&quot; width=&quot;165&quot; height=&quot;66&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Each dashboard can be totally different, they are independent with each other.&lt;/p&gt; &lt;p&gt;Eventually, there is a new Welcome page experience. This is Markdown as well:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-Kfidj0eBoEk/Vh1fRpFLwII/AAAAAAAACdA/lf2xNKgsBJs/s1600-h/image%25255B17%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-t7ZtyFcwFKU/Vh1fSgENSWI/AAAAAAAACdM/WZ8Jc4wYG8k/image_thumb%25255B7%25255D.png?imgmax=800&quot; width=&quot;193&quot; height=&quot;163&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;and there is one page for each repository by default, as it is based off the readme.md file created into each repo.&lt;/p&gt; &lt;p&gt;This is really a very welcome addition to the platform, as it enables even more collaboration and information’s sharing scenarios as ever.&lt;/p&gt;  </description>
        <pubDate>Tue, 13 Oct 2015 19:45:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/10/13/dashboards-in-team-foundation-server/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/10/13/dashboards-in-team-foundation-server/</guid>
      </item>
    
      <item>
        <title>TFVC and Git in the same Team Project: a revolution</title>
        <description>&lt;p&gt;TFS 2015 Update 1 is literally hot off the press, and I am already on it as the &lt;a href=&quot;https://www.visualstudio.com/news/tfs2015-update1-vs#git&quot;&gt;changelog&lt;/a&gt; is massive!&lt;/p&gt; &lt;p&gt;The #1 priority to me was to have a look at Git and TFVC in the same Team Project. This is a really important milestone for the future.&lt;/p&gt; &lt;p&gt;It means the Version Control storage become agnostic – you can have Git repositories in existing TFVC-based Team Projects (a legacy evolution if you want), but also the other way round, a TFVC storage into a Git-based Team Project.&lt;/p&gt; &lt;p&gt;The experience is as easy as it, you just need to go to the _admin page and under the Version Control tab you can manage that:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-gG7dU_XDMGg/VhjUm0nWc1I/AAAAAAAACYk/wBGcKV5nNwM/s1600-h/image2.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-Q7UDF6kUDjA/VhjUnhmzMuI/AAAAAAAACYs/S5LbMIXX3zo/image_thumb.png?imgmax=800&quot; width=&quot;195&quot; height=&quot;182&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-XcnVGrN_0uA/VhjUodC35RI/AAAAAAAACY8/tzkTr2kvacY/s1600-h/image5.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-1eCsYyG4Pw8/VhjUpfmKhjI/AAAAAAAACZI/gK7zhB17FHE/image_thumb1.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;123&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;If you already have TFVC configured in your Team Projects, you can’t add another repository of the same type of course:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-IeeaKsv3AWY/VhjUqCoVJ0I/AAAAAAAACZU/gERF2plt0LQ/s1600-h/image8.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-4TUXcKWNh6c/VhjUq2XSeWI/AAAAAAAACZc/lKlkB2nlL8c/image_thumb2.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;123&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Why should I add a TFVC repository if I already use Git? Well, migrations, large file storage are two examples.&lt;/p&gt; &lt;p&gt;You need to run Visual Studio 2015 Update 1 (currently in CTP1) to fully access these new repositories - which obviously highlights that you have both the Version Control systems in place.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-D0E7eNESRQY/VhjUrjnsdaI/AAAAAAAACZs/Z6QEaOyCFWM/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-E2wkxLigmeQ/VhjUsayNaJI/AAAAAAAACZ4/dFBl5-smULk/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;153&quot; height=&quot;73&quot;&gt;&lt;/a&gt;&lt;br&gt;The next thing I will look at (across the weekend &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh3.googleusercontent.com/-bDLeh8qIyyk/VhjUtFeDitI/AAAAAAAACaE/P6Qnlc1huJ4/wlEmoticon-smile2.png?imgmax=800&quot;&gt;) are the dashboards!&lt;/p&gt;  </description>
        <pubDate>Sat, 10 Oct 2015 09:04:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/10/10/tfvc-and-git-in-same-team-project/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/10/10/tfvc-and-git-in-same-team-project/</guid>
      </item>
    
      <item>
        <title>Problem solved! Git-LFS and VSO</title>
        <description>&lt;p&gt;One of the problems you might face with Git is the performance hit when you start storing binaries into the Version Control.&lt;/p&gt; &lt;p&gt;It is actually by design – Git takes content snapshots at every commit, and it can’t handle deltas on binary files like on text files.&lt;/p&gt; &lt;p&gt;Fair enough, it has lots of other pros (and cons too), but the inability of storing binaries in an easy and non-disruptive way hampered the need for a shared tool in an heterogeneous development teams. If you have people working on the UI of your applications and you want them to version the .psd files they use, you can’t use Git.&lt;/p&gt; &lt;p&gt;Well, you couldn’t. GitHub developed &lt;a href=&quot;https://git-lfs.github.com/&quot;&gt;Git Large File Storage&lt;/a&gt; for sorting this issue, but it wasn’t by default and eventually you would need to pay for usage (over 1GB quota of free space and bandwidth). It isn’t a out-of-the-box solution.&lt;/p&gt; &lt;p&gt;But yesterday Microsoft &lt;a href=&quot;http://blogs.msdn.com/b/visualstudioalm/archive/2015/10/01/announcing-git-lfs-on-all-vso-git-repos.aspx&quot;&gt;announced&lt;/a&gt; Git-LFS support on VSO, and it is a game changer to me.&lt;/p&gt; &lt;p&gt;Firstly, it is enabled by default on all the Visual Studio Online’s Git repositories. What you need to do is to install the Git-LFS extension, and nothing else.&lt;/p&gt; &lt;p&gt;Then, it is free for unlimited storage, so you don’t have to worry about limits, quotas and usage. It’s there, use it (if it makes sense, obviously).&lt;/p&gt; &lt;p&gt;Eventually, it will be included in Team Foundation Server 2015 Update 1, meaning that you will get exactly the same experience on-premise. &lt;/p&gt; &lt;p&gt;That’s marvellous, really. It solves the aforementioned issue in an effortless and easy way, making Git even more approachable.&lt;/p&gt;  </description>
        <pubDate>Fri, 02 Oct 2015 22:25:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/10/02/problem-solved-git-lfs-and-vso/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/10/02/problem-solved-git-lfs-and-vso/</guid>
      </item>
    
      <item>
        <title>Personal Access Tokens in Visual Studio Online</title>
        <description>&lt;p&gt;When you try to access some services in Visual Studio Online, you might need to enter your Alternate Credentials. Think about Git, for example.&lt;/p&gt; &lt;p&gt;This approach works, no questions about it. But in terms of security it isn’t the best choice. It isn’t granular at all and credentials have no expiry date.&lt;/p&gt; &lt;p&gt;But Visual Studio Online also provides Personal Access Tokens, to fix this &lt;em&gt;inconvenience&lt;/em&gt;. A Personal Access Token offers better granularity and expiration management:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-h3C2U6gPTsk/Vgla6mL_qjI/AAAAAAAACXU/OhPlHryFX-k/s1600-h/image%25255B4%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-bJ_Ma3DyTqQ/Vgla7msJWBI/AAAAAAAACXg/bhIf59XNOLo/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;584&quot; height=&quot;335&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;And how to use it? You need to safely store it (you can’t access them after the creation, by design), and then you can use the string in place of the password when asked.&lt;br&gt;The username in that case can be whatever, it is just not used.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-hXCV3qrlmTE/Vgla9JO9teI/AAAAAAAACXs/3mR3o1ljuDI/s1600-h/image%25255B8%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-trf0n-vzI9c/Vgla-Ix_uXI/AAAAAAAACX4/J5SY1c2jX8M/image_thumb%25255B4%25255D.png?imgmax=800&quot; width=&quot;530&quot; height=&quot;361&quot;&gt;&lt;/a&gt;&lt;/p&gt;  </description>
        <pubDate>Mon, 28 Sep 2015 15:21:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/09/28/personal-access-tokens-in-visual-studio/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/09/28/personal-access-tokens-in-visual-studio/</guid>
      </item>
    
      <item>
        <title>Why shall I split the columns in the Kanban Board?</title>
        <description>&lt;p&gt;A very interesting discussion came out at the SmartDevsUG meeting last night about the Kanban Split Columns in TFS and VSO. What is the real rationale behind it in a real world project? Why should I have a &lt;strong&gt;Resolved &lt;/strong&gt;column split in &lt;strong&gt;Doing &lt;/strong&gt;and &lt;strong&gt;Done&lt;/strong&gt;, for example?&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-7qdp6geBZVQ/VffxfMTbOgI/AAAAAAAACWs/Vxwim1quIm4/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-s0RUdmzWIa8/Vffxf2caxkI/AAAAAAAACW4/5BAlteMMKUI/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;96&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Without taking into consideration the Kanban principles behind this tool, I have an easier explanation. If you step back from the technical stuff for a moment and you think about the &lt;strong&gt;business side&lt;/strong&gt; of it, it is pretty clear.&lt;/p&gt; &lt;p&gt;For example, you are working on a customer hotfix for your product – the code is done, the fix is tested thoroughly and you are &lt;em&gt;technically&lt;/em&gt; done. But you aren’t completely done – did you deliver the hotfix to the customer? Or from a different perspective, is it billed? Until this hurdle isn’t cleared, you are in a &lt;strong&gt;Resolved-Done &lt;/strong&gt;situation.&lt;/p&gt;  </description>
        <pubDate>Tue, 15 Sep 2015 10:22:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/09/15/why-shall-i-split-columns-in-kanban/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/09/15/why-shall-i-split-columns-in-kanban/</guid>
      </item>
    
      <item>
        <title>Reading the TFS update logs</title>
        <description>&lt;p&gt;Did you ever read a TFS update log? If not, you should do it.&lt;/p&gt; &lt;p&gt;Once you do anything on the TFS databases, all the operations are logged, obviously. You can reach these logs from the Administration Console:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-t75onGyMaWU/VfF71YMjEsI/AAAAAAAACTk/oGRtceneYqQ/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-kyOd34wCWFk/VfF72ncT5NI/AAAAAAAACTw/VW89xDtMN-M/image_thumb.png?imgmax=800&quot; width=&quot;243&quot; height=&quot;77&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-5GHFqR515Bc/VfF735BVsUI/AAAAAAAACT8/W9DVZP5RZ-g/s1600-h/image%25255B6%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-FV_DEObPDNQ/VfF75BlwkxI/AAAAAAAACUI/4BYpN883D_k/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;580&quot; height=&quot;193&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;The amount of data in there is really helpful – for example, each Stored Procedure used by the installer is detailed, giving you an idea of what happens to your databases during each update:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/--Dr3k-uJV5I/VfF76dLgI3I/AAAAAAAACUU/LbDTNxnJI8Y/s1600-h/image%25255B10%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-lRkumdm7Rvg/VfF77N9-FcI/AAAAAAAACUg/YenH6nE9rFo/image_thumb%25255B4%25255D.png?imgmax=800&quot; width=&quot;579&quot; height=&quot;205&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;And you also get a recap of how long it took with each individual timing:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/---Zhtr_OZcQ/VfF78GvxZzI/AAAAAAAACUs/bZVIqN5nzj8/s1600-h/image%25255B15%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-KyZeDZZEZms/VfF79FjW04I/AAAAAAAACU4/exvo9fTx8c0/image_thumb%25255B7%25255D.png?imgmax=800&quot; width=&quot;584&quot; height=&quot;398&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;That is interesting enough if everything works, but what about when something fails?&lt;/p&gt; &lt;p&gt;Well, that’s even better, because if you experience an error whatsoever, you will get a detailed exception stacktrace in the logs:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-blPNsByIjG8/VfF7-KFEzJI/AAAAAAAACVE/inDcol_UpUo/s1600-h/image%25255B19%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-OQXICc66JYA/VfF7-6w8TjI/AAAAAAAACVQ/ihs0qWZxdd8/image_thumb%25255B9%25255D.png?imgmax=800&quot; width=&quot;579&quot; height=&quot;124&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;This gives you a real actionable insight before touching anything or raising the phone to call CSS.&lt;/p&gt;  </description>
        <pubDate>Thu, 10 Sep 2015 12:47:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/09/10/reading-tfs-update-logs/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/09/10/reading-tfs-update-logs/</guid>
      </item>
    
      <item>
        <title>Draft Builds in the new Team Build</title>
        <description>&lt;p&gt;With the new Team Build you have the possibility of working on Build Definitions in an asynchronous fashion, without impacting other team members or wasting time cloning the existing build.&lt;/p&gt; &lt;p&gt;For example, you might want to add some tasks to an existing Build Definition – you can then Save as a draft..&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-h-TE0mfvnMg/VeB8Ou023MI/AAAAAAAACQY/-ztkVWK3rXM/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-3kbsz0KWOm4/VeB8PiwhS7I/AAAAAAAACQk/2lxUFzT5djI/image_thumb.png?imgmax=800&quot; width=&quot;187&quot; height=&quot;168&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;You are actually creating a clone of the existing Build Definition with the new steps you added. You can even run it!&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-Rzev0kar8lg/VeB8QtFQyZI/AAAAAAAACQw/N07RvLehNPU/s1600-h/image%25255B8%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-6F7bXEzvPz4/VeB8R-fmF2I/AAAAAAAACQ8/9ZYb1i3LD2A/image_thumb%25255B4%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;74&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;All the builds you run with this definition are marked with a .DRAFT in the name:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-mMRMPQ8VJ1E/VeB8S6a8EWI/AAAAAAAACRE/DBGmTSpCSbQ/s1600-h/image%25255B11%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-Y-BmyXrBcRQ/VeB8T8s-zdI/AAAAAAAACRU/aNJR09uXcqM/image_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;186&quot; height=&quot;33&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;This is not different compared to any other build – it is just not affecting the existing &lt;em&gt;published &lt;/em&gt;builds:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-VjoN69ZIR8k/VeB8U4jXcVI/AAAAAAAACRc/1lrJz1z4yB4/s1600-h/image%25255B14%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-AJ2IRMtgw4Q/VeB8WIIKmUI/AAAAAAAACRs/SwOyaCgcIg8/image_thumb%25255B6%25255D.png?imgmax=800&quot; width=&quot;178&quot; height=&quot;123&quot;&gt;&lt;/a&gt; &lt;a href=&quot;http://lh3.googleusercontent.com/-r0nhIjQMeWE/VeB8XDyhtGI/AAAAAAAACR4/cmylFjcW-Gg/s1600-h/image%25255B17%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-EXQML8vB5Nw/VeB8YXbyyJI/AAAAAAAACSE/KqzdF6zf3Yo/image_thumb%25255B7%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;141&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Then once you save it everything is merged with the original definition, with no further effort.&lt;/p&gt;  </description>
        <pubDate>Fri, 28 Aug 2015 15:21:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/08/28/draft-builds-in-new-team-build/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/08/28/draft-builds-in-new-team-build/</guid>
      </item>
    
      <item>
        <title>Quickly change the TFS Integration Platform settings</title>
        <description>&lt;p&gt;You installed the TFS Integration Platform, and now you want to move your database. Or you want to change the temporary folder used during the migrations.&lt;/p&gt; &lt;p&gt;Shall you waste time reinstalling it?&lt;/p&gt; &lt;p&gt;No, what you need to do is to modify some strings in the &lt;strong&gt;MigrationToolServers.config&lt;/strong&gt; file:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-TXvjoq8KcIQ/Vdxl42c7WZI/AAAAAAAACPw/FoftXE-gsq0/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-GBNeMmEyau4/Vdxl6D-_91I/AAAAAAAACP8/jfScAFh60H8/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;584&quot; height=&quot;219&quot;&gt;&lt;/a&gt;&lt;/p&gt;  </description>
        <pubDate>Tue, 25 Aug 2015 12:56:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/08/25/quickly-change-tfs-integration-platform/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/08/25/quickly-change-tfs-integration-platform/</guid>
      </item>
    
      <item>
        <title>Pre-upgrading a large Team Project Collection to TFS 2015</title>
        <description>&lt;p&gt;TFS 2015 is out and we all rush upgrading our Team Project Collections!&lt;/p&gt; &lt;p&gt;But if you have a collection bigger than 1TB you should stand back and read some documentation before that. &lt;a href=&quot;https://msdn.microsoft.com/Library/vs/alm/TFS/upgrade/pre-upgrade&quot;&gt;This page&lt;/a&gt; in particular explains what you should do if you want to upgrade such a huge collection.&lt;/p&gt; &lt;p&gt;The reason for using TfsPreUpgrade is very simple – you don’t want your users stuck for days while you upgrade Team Foundation Server. So the tool is going to partially upgrade the schema while the server is still available, so the actual upgrade (the one done by the installer) takes no longer than two days, which means a weekend, which also means &lt;strong&gt;no perceivable service interruptions&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;You can run TfsPreUpgrade from whatever machine you like. In my testing environment I am using at the moment I am running it from a plain Virtual Machine which is going to be used by the Application Tier, but it has nothing installed yet. You basically need &lt;strong&gt;access to SQL Server&lt;/strong&gt;, and that’s it.&lt;/p&gt; &lt;p&gt;First thing, run it with the &lt;strong&gt;Estimate&lt;/strong&gt; switch. It will give you an idea of the time and space needed for the upgrade:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-aOak5xbb1Yc/Vcx4I6pmfII/AAAAAAAACN4/lyosDC4stDQ/s1600-h/image4.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-iaJzQKJJo8c/Vcx4J2idGII/AAAAAAAACOE/aePEQ5djU9U/image_thumb2.png?imgmax=800&quot; width=&quot;584&quot; height=&quot;206&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;To give some context, this is data for a 2TB Collection. A few hiccups while running the &lt;strong&gt;Run &lt;/strong&gt;switch might happen, especially with a temporary test environment:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-BiKP5o78_LQ/Vcx4KhIciPI/AAAAAAAACOQ/2qrQOOYtzjc/s1600-h/image5.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-EDrWWXFfJ_4/Vcx4Lll9OuI/AAAAAAAACOc/MFWFLhdRU54/image_thumb2%25255B1%25255D.png?imgmax=800&quot; width=&quot;584&quot; height=&quot;125&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;but you can just relaunch TfsPreUpgrade and it would start again from the same failed point after a quick check. It is smart enough to not further expand your databases if you don’t need it:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-HvFQxObygfw/Vcx4MWb_AbI/AAAAAAAACOo/RhLygMcGKw0/s1600-h/image10.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-L-tBgGH_MKw/Vcx4NZuoKyI/AAAAAAAACO0/SwP9P5jUQ0M/image_thumb5.png?imgmax=800&quot; width=&quot;584&quot; height=&quot;252&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Once it is done your offline upgrade will be much faster, because these operations were carried in advance!&lt;/p&gt;  </description>
        <pubDate>Thu, 13 Aug 2015 10:57:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/08/13/pre-upgrading-large-team-project/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/08/13/pre-upgrading-large-team-project/</guid>
      </item>
    
      <item>
        <title>Change the Release Management URL when the console is stuck</title>
        <description>&lt;p&gt;Quick one, but helpful IMHO. After updating Release Management Server or Client you might experience this:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-R79r8yFGdkI/VcCV_WlgLOI/AAAAAAAACNM/wK8hXibqlJ0/s1600-h/clip_image002%25255B5%25255D.jpg&quot;&gt;&lt;img title=&quot;clip_image002&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;clip_image002&quot; src=&quot;http://lh3.googleusercontent.com/-laDqCLZQlmE/VcCWAdlJ3KI/AAAAAAAACNY/0O7khCb62RQ/clip_image002_thumb%25255B2%25255D.jpg?imgmax=800&quot; width=&quot;584&quot; height=&quot;134&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;and then you would be &lt;strong&gt;stuck&lt;/strong&gt; – &lt;strong&gt;you can’t change&lt;/strong&gt; the Release Management Server URL.&lt;/p&gt; &lt;p&gt;The quick and dirty solution would be changing the URL in the &lt;strong&gt;Microsoft.TeamFoundation.Release.Data.dll.config&lt;/strong&gt; file. &lt;/p&gt; &lt;p&gt;A better solution is to run &lt;a href=&quot;http://blogs.msdn.com/b/visualstudioalm/archive/2014/04/02/did-you-uninstall-release-management-server-and-lose-access-to-the-release-management-client.aspx&quot;&gt;this&lt;/a&gt; command line tool, which basically &lt;strong&gt;automates the former&lt;/strong&gt;. In the worst scenario, &lt;strong&gt;reinstall the Client&lt;/strong&gt; and it would prompt asking for a Release Management Server URL.&lt;/p&gt;  </description>
        <pubDate>Tue, 04 Aug 2015 10:37:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/08/04/change-release-management-url-when/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/08/04/change-release-management-url-when/</guid>
      </item>
    
      <item>
        <title>Team Project rename: is it that easy?</title>
        <description>&lt;p&gt;Renaming a Team Project was the &lt;a href=&quot;https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2037605-rename-project-in-tfs&quot;&gt;most asked&lt;/a&gt; feature for Team Foundation Server since 2005, with over six thousands votes on it. Microsoft finally delivered that feature in April, in Visual Studio Online first and then in Team Foundation Server 2015.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Why did it take so long?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Team Foundation Server relies on a set of SQL Server databases, with a quite…&lt;em&gt;complex&lt;/em&gt; schema. It wasn’t just about detecting a certain name and replacing it, it is all about GUIDs and the likes. A lot of work was done on the architecture, and more of it client-side.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Client-side? Yes.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;When you rename a Team Project in either Visual Studio Online or Team Foundation Server, what happens among the operations is that also you are also creating a &lt;em&gt;redirect &lt;/em&gt;from the old Team Project to the same, renamed one. &lt;/p&gt; &lt;p&gt;Take a look:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-LMbHglym4lg/VbYGkc6jkuI/AAAAAAAACHk/Qogl3ZJykW0/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-QI4XgJr0YG8/VbYGlB-3zrI/AAAAAAAACHw/AXgeL5tVess/image_thumb.png?imgmax=800&quot; width=&quot;232&quot; height=&quot;73&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;this &lt;strong&gt;Foo&lt;/strong&gt; Team Project has some work in it:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-GayGO38gCJs/VbYGl3V-aRI/AAAAAAAACH8/0dyHL5W0_co/s1600-h/image%25255B7%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-Oq3Z2x_6ezQ/VbYGmiVUp9I/AAAAAAAACII/a2t9KJznTag/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;407&quot; height=&quot;101&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;a query with an explicit value in it (&lt;strong&gt;Foo instead of the @Project macro&lt;/strong&gt;):&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/--IL6CDsIRIE/VbYGnJr31iI/AAAAAAAACIU/gQtrWpmXqVs/s1600-h/image%25255B11%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-1o1qQGOeTss/VbYGnxo-kiI/AAAAAAAACIg/nOW3GPOpDZs/image_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;584&quot; height=&quot;151&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;and of course some code.&lt;/p&gt; &lt;p&gt;You can then &lt;strong&gt;rename&lt;/strong&gt; it:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-YeGryOmir1s/VbYGpWj3AkI/AAAAAAAACIs/_8_WDcXYII4/s1600-h/image%25255B15%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-VLYwKGTJkfs/VbYGqIwJwYI/AAAAAAAACI4/3ufroD-XVeo/image_thumb%25255B7%25255D.png?imgmax=800&quot; width=&quot;584&quot; height=&quot;475&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;and what you’ll need to do is to care about code mappings (workspaces or remotes, this would be best handled by a client update – &lt;strong&gt;2015, 2013.5 or 2012.5&lt;/strong&gt;). Code is migrated, Builds are migrated, and all the Work Item Tracking migration is completely effortless.&lt;/p&gt; &lt;p&gt;So you say yes, and the Team Project is renamed. Teams with ‘Foo’ in their name are migrated too:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-eBVMzZW02GM/VbYGq85oXPI/AAAAAAAACJE/qXzpSmCuZX4/s1600-h/image%25255B18%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-oZJttZWY1Ns/VbYGrqomR0I/AAAAAAAACJQ/mfx8YvKk6T0/image_thumb%25255B8%25255D.png?imgmax=800&quot; width=&quot;149&quot; height=&quot;107&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;Areas&lt;/strong&gt; and &lt;strong&gt;iterations&lt;/strong&gt; are migrated too, as expected:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-jKz-Or1Ukfo/VbYGsYnJIuI/AAAAAAAACJc/-q1F-vc6RVk/s1600-h/image%25255B29%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-NZzM02Sfl0k/VbYHG3wPKdI/AAAAAAAACJo/oEzm8E5GehE/image_thumb%25255B13%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;99&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Even the &lt;strong&gt;explicit query&lt;/strong&gt; is migrated!&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-jTH2_S4o_0Y/VbYHHhyv6SI/AAAAAAAACJ0/uDgmHN-kSxM/s1600-h/image%25255B33%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-c4MviXZqoP0/VbYHIlDgGHI/AAAAAAAACKA/185C4yVH5IA/image_thumb%25255B15%25255D.png?imgmax=800&quot; width=&quot;584&quot; height=&quot;147&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;So what happens if you go straight to &lt;strong&gt;Foo&lt;/strong&gt;? &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-SOGUGCE1Vx4/VbYHJQ6UudI/AAAAAAAACKM/r6C2rpE-ugs/s1600-h/image%25255B22%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-NVfFuYikLXI/VbYHKAsYyyI/AAAAAAAACKY/49FISadFeJ8/image_thumb%25255B10%25255D.png?imgmax=800&quot; width=&quot;408&quot; height=&quot;56&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;This:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-3lFiQnU-LV4/VbYHK1lOp9I/AAAAAAAACKk/RrDCBzAzi-c/s1600-h/image%25255B26%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-j1n1RP3B9N8/VbYHL70a6DI/AAAAAAAACKw/QsdP10H93no/image_thumb%25255B12%25255D.png?imgmax=800&quot; width=&quot;355&quot; height=&quot;154&quot;&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;This doesn’t mean you are going to lose the possibility of using the former name – if you will reuse it, you would just lose the URL redirect but all the renamed artefacts would be kept as-is..&lt;/p&gt; &lt;p&gt;There are a couple of things you need to manually address after this. As mentioned above, you need to sort out the Workspaces or the Git Remotes, depending on the Version Control System you are using. &lt;/p&gt; &lt;p&gt;If you are using a &lt;strong&gt;BDT Build Definition with Lab Management&lt;/strong&gt;, you need to &lt;strong&gt;refresh&lt;/strong&gt; the Build Definition by running the wizard again so it can be properly linked again with the right Team Project. This is actually a workaround which will be solved by the new &lt;strong&gt;TFS 2015 Legacy Build Controller&lt;/strong&gt;, but if you need to use older Controllers that’s how to sort it out.&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;On-premises, run a &lt;strong&gt;ProcessWarehouse job&lt;/strong&gt; and a &lt;strong&gt;ProcessAnalysisDatabase job&lt;/strong&gt; as soon as possible, so you will avoid any stale data in SSRS and the Excel Services in SharePoint would be already updated with the current names. The jobs would run anyway in the time interval you set, but this will avoid any temporary inconsistency in the reporting data. &lt;/p&gt; &lt;p&gt;Eventually, &lt;strong&gt;clear the SharePoint cache&lt;/strong&gt; and run a &lt;strong&gt;SharePoint timer job&lt;/strong&gt; so the Excel Services are up and running on the right values.&lt;/p&gt;  </description>
        <pubDate>Mon, 27 Jul 2015 10:25:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/07/27/team-project-rename-is-it-that-easy/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/07/27/team-project-rename-is-it-that-easy/</guid>
      </item>
    
      <item>
        <title>TFS and HTTP status 417</title>
        <description>&lt;p&gt;Panic today – a guy couldn’t connect to Team Foundation Server with a weird “&lt;strong&gt;The request failed with HTTP status 417: Expectation failed.&lt;/strong&gt;”&lt;/p&gt; &lt;p&gt;What did it happen? I never saw such a HTTP status code!&lt;/p&gt; &lt;p&gt;A bit of &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.expect100continue.aspx&quot;&gt;investigation&lt;/a&gt; explained the reason for it – the proxy he is using doesn’t support the expect100Continue behaviour, dropping the connection. &lt;/p&gt; &lt;p&gt;The guy used a proxy server indeed and he did not check the “&lt;strong&gt;Bypass proxy server for local addresses&lt;/strong&gt;” checkbox. After checking that, he was able to connect to Team Foundation Server like everybody else.&lt;/p&gt; &lt;p&gt;It is also worth mentioning that this can impact also components like the Extension Manager, and you can bypass that setting by adding a node in the &lt;strong&gt;devenv.exe.config&lt;/strong&gt; file - &lt;strong&gt;&amp;lt;servicePointManager expect100Continue=&quot;false&quot;/&amp;gt;&lt;/strong&gt;&lt;/p&gt;  </description>
        <pubDate>Fri, 17 Jul 2015 09:44:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/07/17/tfs-and-http-status-417/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/07/17/tfs-and-http-status-417/</guid>
      </item>
    
      <item>
        <title>How to configure SCVMM-based Lab Management for selected Team Projects</title>
        <description>&lt;p&gt;Not all the Team Projects we have in the company might need to get Lab Management, and we pretty much know about the need of &lt;em&gt;locking down&lt;/em&gt; certain resources.&lt;/p&gt; &lt;p&gt;So if you want to enable SCVMM-based Lab Management you need to configure the Library Share and the Host Group on a case-by-case basis instead of dropping them all in, by un-checking the &lt;strong&gt;Auto-Provisioning &lt;/strong&gt;checkbox here:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-CQeMod4FG5o/VGpsFdnGdlI/AAAAAAAABoU/H2SGWX8KoI4/s1600-h/image%25255B32%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-YzXHRs8QIMM/VGpsFwdg4NI/AAAAAAAABoc/snHdeT3g67s/image_thumb%25255B18%25255D.png?imgmax=800&quot; width=&quot;484&quot; height=&quot;361&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://lh4.ggpht.com/-RB2l9RCEE-Q/VGpsGKxp56I/AAAAAAAABok/qmeMYCoogpE/s1600-h/image%25255B31%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-LYR982mFnZI/VGpsGg5GqvI/AAAAAAAABos/s7Iw2WUdq9U/image_thumb%25255B17%25255D.png?imgmax=800&quot; width=&quot;484&quot; height=&quot;350&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Then you need to run &lt;strong&gt;TFSLabConfig&lt;/strong&gt; &lt;strong&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/dn249786.aspx&quot;&gt;TPLibraryShare&lt;/a&gt; /add&lt;/strong&gt; and &lt;strong&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/dn249785.aspx&quot;&gt;TPHostGroup&lt;/a&gt; /add&lt;/strong&gt; to enable the single Team Project.&lt;/p&gt;  </description>
        <pubDate>Mon, 13 Jul 2015 14:59:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/07/13/how-to-configure-scvmm-based-lab/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/07/13/how-to-configure-scvmm-based-lab/</guid>
      </item>
    
      <item>
        <title>How easy is to use a Symbol Server with Team Build vNext?</title>
        <description>&lt;p&gt;Answer: it is extremely easy!&lt;/p&gt; &lt;p&gt;A Symbol Server is a very important piece of infrastructure every development team should have. It enables someone debugging (with the aid of an IntelliTrace file for example) problems happened in production, relating them with the right version of the code deployed.&lt;/p&gt; &lt;p&gt;To use a Symbol Server with the new Team Build, you need to have a local build machine, and a file share. That’s it.&lt;/p&gt; &lt;p&gt;Download the agent, and expand it in a folder – say C:\agent:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-XdXMR_7JFeY/VZZzuStYA0I/AAAAAAAACCk/RyuqMjE4Rdk/s1600-h/0%25255B4%25255D.png&quot;&gt;&lt;img title=&quot;0&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;0&quot; src=&quot;http://lh3.googleusercontent.com/-yb7HzCvqYjU/VZZzuyW6SLI/AAAAAAAACCw/OQZA7zQgn6k/0_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;574&quot; height=&quot;283&quot;&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-o7o1KvSPh3w/VZZzvmAvlPI/AAAAAAAACC4/MjLBODZ_vwI/s1600-h/1%25255B4%25255D.png&quot;&gt;&lt;img title=&quot;1&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;1&quot; src=&quot;http://lh3.googleusercontent.com/-mIEVjq1tO1o/VZZzwQj0zyI/AAAAAAAACDI/8uVqIoyKoiQ/1_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;574&quot; height=&quot;57&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Once done, launch ConfigureAgent.ps1&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href=&quot;http://lh3.googleusercontent.com/-GHAhz9JVo98/VZZzxdq9MAI/AAAAAAAACDU/iciHb0OJ45Y/s1600-h/2%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;2&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;2&quot; src=&quot;http://lh3.googleusercontent.com/-cqajjmDn2jg/VZZzyZxPesI/AAAAAAAACDg/2DAYQREllR8/2_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;142&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;A command line wizard will start. Most of the times you only need to enter the relevant Visual Studio Online account or Team Foundation Server URL. If you want to run it as a service the default would be with LOCAL SERVICE, but you can obviously use whatever account you need.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-BAxwHoISM8Q/VZZzzD_ta_I/AAAAAAAACDs/8d6FpWd2nc8/s1600-h/3%25255B4%25255D.png&quot;&gt;&lt;img title=&quot;3&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;3&quot; src=&quot;http://lh3.googleusercontent.com/-KswLX7HeFUY/VZZzz6zv-yI/AAAAAAAACD4/t-vROvypStA/3_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;574&quot; height=&quot;292&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Now you have a Build Agent on the Default Pool:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href=&quot;http://lh3.googleusercontent.com/-2mbVD7XuSb0/VZZz0nFY6RI/AAAAAAAACEE/IAyJ8P3dvLA/s1600-h/4%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;4&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;4&quot; src=&quot;http://lh3.googleusercontent.com/-MSPxe5J-Rro/VZZz1fi-4TI/AAAAAAAACEQ/2-A1wWyKRco/4_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;82&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Create a build, and you will have the Index Sources &amp;amp; Publish Symbols activity already part of it. Then you only need to enter the file share you want to use for the Symbols Server, and launch a new Build.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href=&quot;http://lh3.googleusercontent.com/-BDQjFeZS1DQ/VZZz2CNy3GI/AAAAAAAACEc/hVx4aPyhJds/s1600-h/5%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;5&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;5&quot; src=&quot;http://lh3.googleusercontent.com/-h2JYa_VvkSw/VZZz21k-9FI/AAAAAAAACEk/aqPCddzO2Fo/5_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;574&quot; height=&quot;346&quot;&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-jxB-T0g48ic/VZZz38C9cFI/AAAAAAAACE0/oqeIxFktRpU/s1600-h/6%25255B4%25255D.png&quot;&gt;&lt;img title=&quot;6&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;6&quot; src=&quot;http://lh3.googleusercontent.com/-e5EcC4yLAEw/VZZz4m8vmqI/AAAAAAAACFA/ifNoLuAihZM/6_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;513&quot; height=&quot;372&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;What is this all about? If you browse the file share you will have all your PDBs indexed.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href=&quot;http://lh3.googleusercontent.com/-RgpA_55eoBM/VZZz5Rfzx5I/AAAAAAAACFM/maMii53d8UM/s1600-h/7%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;7&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;7&quot; src=&quot;http://lh3.googleusercontent.com/-R2vcNpwJgs0/VZZz6Of5kOI/AAAAAAAACFY/CEHftwfk6k8/7_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;176&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Then you can hook it to Visual Studio, so whenever you open an IntelliTrace file, or whatever other dump you can get from a production crash, it will point to the right version referred in the source of the crash itself.&lt;/p&gt;  </description>
        <pubDate>Fri, 03 Jul 2015 11:37:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/07/03/how-easy-is-to-use-symbol-server-with/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/07/03/how-easy-is-to-use-symbol-server-with/</guid>
      </item>
    
      <item>
        <title>Scrum meets the pool – swimlanes in VSO’s backlog board</title>
        <description>&lt;p&gt;With the update of &lt;a href=&quot;https://www.visualstudio.com/en-us/news/2015-jun-3-vso.aspx&quot;&gt;June 3rd&lt;/a&gt; VSO got a new and very useful feature in the Backlog Board: swimlanes.&lt;/p&gt; &lt;p&gt;What does that mean? It means you can have this situation:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-RPtgGCQDU-4/VYltQv8A0tI/AAAAAAAACBU/kk4FYofytrE/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-xpnaA00gPew/VYltRwHlVfI/AAAAAAAACBg/uIf9iJVQwDk/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;584&quot; height=&quot;405&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;This allows for an even finer time and resources management, for example. It mostly impacts prioritisation, something that happens with critical bugs stopping a production system. Keep in mind that a swimlane configured as above should be used very sparingly.&lt;/p&gt; &lt;p&gt;It could be even more creative:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-RDAOfkjz-bQ/VYltTBQ_IZI/AAAAAAAACBs/-PUyVDF8xZ4/s1600-h/image%25255B9%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-j-2eMHHhON4/VYltUjQXYUI/AAAAAAAACB4/FR2cmz3iE74/image_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;584&quot; height=&quot;434&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;You might be selling a product which, from time to time, has customer’s personalisations, which you need to schedule with the product itself. This is another way of using the swimlanes.&lt;/p&gt; &lt;p&gt;It is a tool which increases the flexibility a lot – but remember that it is just an aid, it doesn’t work &lt;em&gt;as a given&lt;/em&gt;. Your process must be already resilient to this, and the tools is only there to help.&lt;/p&gt;  </description>
        <pubDate>Tue, 23 Jun 2015 14:29:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/06/23/scrum-meets-pool-swimlanes-in-vsos/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/06/23/scrum-meets-pool-swimlanes-in-vsos/</guid>
      </item>
    
      <item>
        <title>Beware of the Package Location in VSRM!</title>
        <description>&lt;p&gt; I am working on a few scenarios using VSRM and DSC, and something funny happened. Picking a build up for release, I noticed this:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-jdCOIqfJjR4/VYAgbQsodDI/AAAAAAAACAo/FcthblFqoJU/s1600-h/Capture%25255B4%25255D.png&quot;&gt;&lt;img title=&quot;Capture&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;Capture&quot; src=&quot;http://lh3.googleusercontent.com/-jE_PKq2-UZc/VYAgcELmzvI/AAAAAAAACA0/ADmd86Jf70c/Capture_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;584&quot; height=&quot;114&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;Localhost? I am pretty sure I didn’t enter localhost anywhere in VSRM!&lt;/em&gt;&lt;/p&gt; &lt;p&gt;And I was right – there was no localhost to be found in my pipeline configuration. But this just caused problems deploying to a different workgroup target server, due to the lack of a proper DNS infrastructure.&lt;/p&gt; &lt;p&gt;The culprit here is the XAML Build I was using, its Drop Location was configured with &lt;a href=&quot;file://\\localhost&quot;&gt;\\localhost&lt;/a&gt; because it is an AIO demo box, and as there is no such name resolution facility VSRM cannot access my source server from the target.&lt;/p&gt; &lt;p&gt;To fix this you’d just need to change the Drop Location of the build.&lt;/p&gt;  </description>
        <pubDate>Tue, 16 Jun 2015 13:11:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/06/16/beware-of-package-location-in-vsrm/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/06/16/beware-of-package-location-in-vsrm/</guid>
      </item>
    
      <item>
        <title>A note on reusing your custom fields</title>
        <description>&lt;p&gt;When you customise your Work Item Types you often start with a &lt;em&gt;lone &lt;/em&gt;custom Field, and then you forget about it for a while.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-kCPEGuccTgE/VW7UI9KCYbI/AAAAAAAAB_E/a5vfsuHQJV0/s1600-h/image%25255B11%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-tGzt2BptRK8/VW7UJ8ZgWoI/AAAAAAAAB_Q/ynVQjwkpuUs/image_thumb%25255B7%25255D.png?imgmax=800&quot; width=&quot;584&quot; height=&quot;367&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;But what happens when you need to add the same field to another WIT? The first thing you are naturally inclined to do is to add a new one, with the same name and reporting design but with a &lt;strong&gt;different Reference Name &lt;/strong&gt;(because maybe you attended one of my sessions on TFS Administration and you then discover you should mark your custom Reference Names in a significant matter :-) ). &lt;/p&gt; &lt;p&gt;The result?&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-_ABdOjImrps/VW7ULDPuVdI/AAAAAAAAB_c/ncf7cIu_Fmc/s1600-h/image%25255B9%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-Pb7Y13uBVrw/VW7UMcc1XnI/AAAAAAAAB_o/Qf1jmtaYokA/image_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;497&quot; height=&quot;267&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;How can I reuse my existing field then? The easiest way is to create the custom Field in the second Work Item Type with exactly the same properties, including the Reference Name. So TFS will correctly use the same Field and your experience is going to be consistent.&lt;/p&gt;  </description>
        <pubDate>Wed, 03 Jun 2015 10:17:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/06/03/a-note-on-reusing-your-custom-fields/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/06/03/a-note-on-reusing-your-custom-fields/</guid>
      </item>
    
      <item>
        <title>A design consideration: SQL Server AlwaysOn Availability Mode for TFS</title>
        <description>&lt;p&gt;There are a few bits of any Team Foundation Server deployment which are either taken for granted, or completely ignored. One of them is:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;&lt;em&gt;Why shall I choose a Synchronous-Commit Availability Mode for the TFS Data Tier using SQL Server AlwaysOn?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;If you are running an AlwaysOn Availability Group, you should know that you have a &lt;a href=&quot;https://msdn.microsoft.com/en-us/ff877931.aspx&quot;&gt;choice&lt;/a&gt; on how to write your Transaction Log – hence your database integrity. My suggestion is to run Team Foundation Server’s data tier in a &lt;strong&gt;Synchronous-Commit Availability Mode.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;The reason is very simple: TFS relies heavily on the Transaction Log, and it is the only way to guarantee a point-in-time recovery. Moreover, if you run AlwaysOn you cannot have any database in the Availability Group set without the &lt;strong&gt;Full &lt;/strong&gt;recovery mode.&lt;/p&gt; &lt;p&gt;So you &lt;a href=&quot;http://mattvsts.blogspot.co.uk/2014/08/tfs-transaction-marking-on-sql-server.html&quot;&gt;must use&lt;/a&gt; the Transaction Log, and it is critical for the Team Foundation Server recovery – using the Synchronous-Commit mode ensures that each Secondary Replica in your Availability Group has &lt;strong&gt;an updated copy&lt;/strong&gt; of the Transaction Log, synchronised at the same time as the Primary Replica, for immediate failover and service continuity.&lt;/p&gt; &lt;p&gt;You will face a really minor increase in the RTO (a few seconds, generally) and a performance loss, but we are talking about something you won’t be able to realise in general usage, and you are ensuring your service has an excellent reliability.&lt;/p&gt;  </description>
        <pubDate>Sun, 17 May 2015 21:05:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/05/17/a-design-consideration-sql-server/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/05/17/a-design-consideration-sql-server/</guid>
      </item>
    
      <item>
        <title>A design consideration: Reporting Services on the Application Tier</title>
        <description>&lt;p&gt;There are a few bits of any Team Foundation Server deployment which are either taken for granted, or completely ignored. One of them is:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;Why shall I install SQL Server Reporting Services on the Application Tier?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Fair question, if you are not considering installing it on a separate box – a different approach, usually not as common as the former.&lt;/p&gt; &lt;p&gt;The idea is to centralise all the client-originated HTTP traffic on &lt;strong&gt;a single endpoint&lt;/strong&gt;. The endpoint of course can be a cluster address where you have multiple SSRS servers and Application Tiers, but the concept is the same. Centralise your traffic, possibly using &lt;strong&gt;&lt;a href=&quot;http://www.edsquared.com/2011/01/03/Using+Friendly+DNS+Names+In+Your+TFS+Environment.aspx&quot;&gt;DNS names&lt;/a&gt;&lt;/strong&gt;. The &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/bb552243.aspx&quot;&gt;documentation&lt;/a&gt; suggest that too:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-wRK-PeOKGlE/VUybPlADqFI/AAAAAAAAB-k/fj57xlmw6Zo/s1600-h/image%25255B4%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-sTzM66OpzyU/VUybQWFzXDI/AAAAAAAAB-o/K5Gn5bJBexo/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;584&quot; height=&quot;77&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;so that the data tier is exactly that: &lt;strong&gt;the storage&lt;/strong&gt; for Team Foundation Server’s (and related, if you want) databases.&lt;/p&gt; &lt;p&gt;Beware: it is not &lt;strong&gt;wrong&lt;/strong&gt; to install it on the data tier (it is actually supported since Team Foundation Server 2008), but it is a matter of best practices.&lt;/p&gt;  </description>
        <pubDate>Fri, 08 May 2015 11:17:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/05/08/a-design-consideration-reporting/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/05/08/a-design-consideration-reporting/</guid>
      </item>
    
      <item>
        <title>TF30170 errors and the TFS Cache</title>
        <description>&lt;p&gt;Weird things happen, like this:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-RhY43PGdqZ0/VUtAJ-KRXJI/AAAAAAAAB-M/4pLrVtfDMTE/s1600-h/0%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;0&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;0&quot; src=&quot;http://lh3.googleusercontent.com/-gaO9lvrbBvE/VUtAKoDwY-I/AAAAAAAAB-Q/n-IUNIY3vZI/0_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;597&quot; height=&quot;484&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;“&lt;em&gt;An item with the same key has already been added.&lt;/em&gt;” &lt;strong&gt;How?!&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Nothing catastrophic actually – it is just a matter of clearing the cache. This happened because this instance of Team Foundation Server was restored as part of a Disaster Recovery exercise, and its ID was &lt;a href=&quot;http://mattvsts.blogspot.co.uk/2013/11/how-to-change-tfs-guid-and-why-is-it.html&quot;&gt;not changed&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;So, in order to solve this (and other similar &lt;strong&gt;TF30170&lt;/strong&gt; errors) just look at the logs – if you find that explanation message in one of the exceptions, or similar (like “&lt;em&gt;cannot add LinkTypes relationship”&lt;/em&gt;) then I would suggest to clear the Team Foundation Cache:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&amp;lt;OSDrive&amp;gt;:\Users\&amp;lt;youruser&amp;gt;\AppData\Local\Microsoft\Team Foundation\&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;There are some folders in there, each containing a &lt;strong&gt;Cache&lt;/strong&gt; folder. Empty those Cache folders, and try again. If there is nothing actually wrong underneath the Team Project would be created without problems.&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;A couple of remarks: it happens that the Team Project would be actually allocated on your target server even if the creation fails (it won’t be accessible and it is shown as &lt;strong&gt;&lt;em&gt;Deleting&lt;/em&gt;&lt;/strong&gt;). In this scenario it is pretty common that Visual Studio launches part of the temporary Team Project deletion but it would fail because it is not pointing at the right server GUID – open the TFS Admin Console and relaunch a &lt;strong&gt;manual&lt;/strong&gt; deletion on the temporary Team Project.&lt;/p&gt; &lt;p&gt;Eventually, this might happen because you are not &lt;a href=&quot;http://mattvsts.blogspot.co.uk/2014/08/tfs-transaction-marking-on-sql-server.html&quot;&gt;marking&lt;/a&gt; your Transaction Logs backups, so you restored some of the database out of the right order. Please use the TFS Backup Tool, or if you can’t, mark the transactions so you won’t hit that again.&lt;/p&gt;  </description>
        <pubDate>Thu, 07 May 2015 10:36:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/05/07/tf30170-errors-and-tfs-cache/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/05/07/tf30170-errors-and-tfs-cache/</guid>
      </item>
    
      <item>
        <title>Visual Studio ALM at //BUILD – recap</title>
        <description>&lt;p&gt;Tons of stuff at this year’s //BUILD! It was really exciting and there were a lot of news about Windows 10, Edge and the ecosystem.&lt;/p&gt; &lt;p&gt;But this post is going to be about all that’s been announced for Visual Studio ALM. Brace yourselves, it is quite long :)&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Visual Studio Code&lt;br&gt;&lt;/strong&gt;An evolution of Codename Monaco, this Electron-based &lt;em&gt;app&lt;/em&gt; enables a great editing experience on not only Windows, but also &lt;strong&gt;MacOS&lt;/strong&gt; and &lt;strong&gt;Linux&lt;/strong&gt;. It is free and downloadable from &lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;here&lt;/a&gt;.  &lt;li&gt;&lt;strong&gt;SonarQube and Team Foundation Server integration&lt;br&gt;&lt;/strong&gt;I already started &lt;a href=&quot;http://mattvsts.blogspot.co.uk/2015/04/sq-tfsscripts-automation-scripts-for.html&quot;&gt;working on it&lt;/a&gt;, this is a &lt;a href=&quot;https://github.com/SonarSource/sonar-msbuild-runner&quot;&gt;joint&lt;/a&gt; &lt;a href=&quot;https://github.com/SonarSource/sonar-dotnet-codeanalysis&quot;&gt;release&lt;/a&gt; from SonarSource and Microsoft to enable a deep integration between SonarQube and Team Foundation Server so we can have the &lt;strong&gt;same parity&lt;/strong&gt; as Java for &lt;strong&gt;Technical Debt Analysis&lt;/strong&gt; with SonarQube. It is a very well welcomed effort, I can’t wait to bring it into several projects I have in mind.  &lt;li&gt;&lt;strong&gt;Visual Studio Release Management 2015&lt;br&gt;&lt;/strong&gt;Some light was shed on VSRM at //BUILD, we now know that much of the &lt;a href=&quot;http://blogs.msdn.com/b/visualstudioalm/archive/2015/04/29/release-management-announcements-at-build-2015.aspx&quot;&gt;goodness&lt;/a&gt; of the &lt;strong&gt;new Release Management &lt;/strong&gt;(with full support to Chef, Puppet and Team Build vNext) is going to be released with &lt;strong&gt;Team Foundation Server 2015 Update 1 &lt;/strong&gt;or during the Summer on Visual Studio Online.  &lt;li&gt;&lt;strong&gt;CodeLens&lt;br&gt;&lt;/strong&gt;This is quite big – CodeLens is &lt;strong&gt;integrated&lt;/strong&gt; in &lt;a href=&quot;http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/4150271-make-codelens-available-outside-of-ultimate&quot;&gt;Visual Studio Professional 2015&lt;/a&gt;! Plus, there are new indicators like Combined Authors, When Last Changed and support for every file type.  &lt;li&gt;&lt;strong&gt;Cloud Load Test&lt;br&gt;&lt;/strong&gt;I can &lt;a href=&quot;http://blogs.msdn.com/b/visualstudioalm/archive/2015/04/29/load-test-enhancements-in-release-candidate-of-visual-studio-2015-enterprise-edition.aspx&quot;&gt;now&lt;/a&gt; define from &lt;strong&gt;where&lt;/strong&gt; my traffic is going to be generated, so I can generate a &lt;strong&gt;better profile&lt;/strong&gt; of my simulated usage.  &lt;li&gt;&lt;strong&gt;REST API and Service Hooks for Team Foundation Server 2015&lt;br&gt;&lt;/strong&gt;As Visual Studio Online and Team Foundation Server share &lt;strong&gt;the same codebase&lt;/strong&gt;, we are going to get both &lt;a href=&quot;http://blogs.msdn.com/b/visualstudioalm/archive/2015/05/01/extensions-for-visual-studio-online-rest-apis-for-tfs-2015-rc-and-more-from-build-2015.aspx&quot;&gt;REST APIs&lt;/a&gt; and &lt;a href=&quot;http://mattvsts.blogspot.co.uk/2014/07/visual-studio-online-and-service-hooks.html&quot;&gt;Service Hooks&lt;/a&gt;!  &lt;li&gt;&lt;strong&gt;Extensions for Visual Studio Online&lt;/strong&gt;&lt;br&gt;Based on the existing REST APIs, Visual Studio Online is going to boast a brand new &lt;a href=&quot;http://blogs.msdn.com/b/visualstudioalm/archive/2015/05/01/extensions-for-visual-studio-online-rest-apis-for-tfs-2015-rc-and-more-from-build-2015.aspx&quot;&gt;&lt;strong&gt;extension&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; capability&lt;/strong&gt;.  &lt;li&gt;&lt;strong&gt;Application Insights in Public Preview&lt;/strong&gt;&lt;br&gt;&lt;a href=&quot;http://blogs.msdn.com/b/somasegar/archive/2015/04/29/introducing-visual-studio-code-visual-studio-2015-rc-application-insights-public-preview-and-net-core-for-linux-and-mac.aspx&quot;&gt;Oh yes&lt;/a&gt;, Application Insights is in Public Preview now! And with additional capabilities – a better &lt;strong&gt;Java&lt;/strong&gt; support, &lt;strong&gt;iOS and Android&lt;/strong&gt; devices as first-class citizens, a new shiny integration in &lt;strong&gt;Eclipse and XCode&lt;/strong&gt;!  &lt;li&gt;&lt;strong&gt;IntelliTest&lt;br&gt;&lt;/strong&gt;Do you remember &lt;a href=&quot;http://mattvsts.blogspot.co.uk/2014/12/reducing-technical-debt-with-smart-unit.html&quot;&gt;Smart Unit Tests&lt;/a&gt;? Well, the name wasn’t as good as it seemed to be, so it is now &lt;a href=&quot;https://www.visualstudio.com/news/vs2015-vs?CR_CC=200626819#Testing&quot;&gt;IntelliTest&lt;/a&gt; (like IntelliSense and IntelliTrace). There are two additional features now – &lt;strong&gt;Parametrized Unit Tests&lt;/strong&gt; (you can define your data properties for the generated tests) and a &lt;strong&gt;Create Unit Tests menu&lt;/strong&gt;.  &lt;li&gt;&lt;strong&gt;Developer Assistant&lt;br&gt;&lt;/strong&gt;The Developer Assistant &lt;a href=&quot;http://blogs.msdn.com/b/visualstudio/archive/2015/04/30/github-integration-in-developer-assistant.aspx&quot;&gt;gets&lt;/a&gt; full access to the enormous amount of code hosted on &lt;strong&gt;GitHub&lt;/strong&gt;! 21 millions of examples to browse.  &lt;li&gt;&lt;strong&gt;GitHub extension as a Managed Hosting Provider&lt;/strong&gt;&lt;br&gt;GitHub enters Visual Studio as a new &lt;a href=&quot;http://blogs.msdn.com/b/visualstudio/archive/2015/04/30/announcing-the-github-extension-for-visual-studio.aspx&quot;&gt;Managed Hosting Provider&lt;/a&gt;, so you can have a &lt;strong&gt;seamless integration&lt;/strong&gt; inside the IDE like if it is Visual Studio Online or Team Foundation Server.  &lt;li&gt;&lt;strong&gt;Improved Git branches and history views&lt;br&gt;&lt;/strong&gt;The integration of Git into Visual Studio proceeds, the &lt;strong&gt;branching view&lt;/strong&gt; and the &lt;strong&gt;history view&lt;/strong&gt; get &lt;a href=&quot;https://www.visualstudio.com/news/vs2015-vs?CR_CC=200626819#VersionControl&quot;&gt;lots of love&lt;/a&gt;, making it way easier to use on a daily basis. &lt;li&gt;&lt;strong&gt;Team Projects Rename&lt;br&gt;&lt;/strong&gt;Ten years later, we finally get &lt;a title=&quot;Team project rename&quot; href=&quot;https://www.visualstudio.com/news/tfs2015-vs#tpr&quot;&gt;Team Project rename&lt;/a&gt; in Team Foundation Server! This is a fantastic milestone (as it required lots of rework under the covers)! &lt;li&gt;&lt;strong&gt;Improved Build vNext preview&lt;/strong&gt;&lt;br&gt;&lt;a title=&quot;Team Build preview&quot; href=&quot;https://www.visualstudio.com/news/tfs2015-vs#vNextBuild&quot;&gt;Team Build preview&lt;/a&gt; is more aligned to the &lt;strong&gt;latest bits&lt;/strong&gt; running on Visual Studio Online, it is a lot more stable and there are several new features in the web UI.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;There is actually more, this is just a quick feature recap. For instance I purposely left out the Agile Boards improvements in Team Foundation Server, as I believe it is pretty clear it is being ported from Visual Studio Online to the on-premise product. In case you still have doubts, have a look at the &lt;a href=&quot;https://www.visualstudio.com/en-us/news/release-archive-vso.aspx&quot;&gt;Visual Studio Online and Team Foundation Server Feature Timeline&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;Eventually, it is worth having a look at the Release Notes &lt;a href=&quot;https://www.visualstudio.com/news/tfs2015-vs &quot;&gt;for TFS&lt;/a&gt; and &lt;a href=&quot;https://www.visualstudio.com/news/vs2015-vs&quot;&gt;Visual Studio&lt;/a&gt;.&lt;/p&gt;  </description>
        <pubDate>Mon, 04 May 2015 19:22:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/05/04/visual-studio-alm-at-build-recap/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/05/04/visual-studio-alm-at-build-recap/</guid>
      </item>
    
      <item>
        <title>SQ-TFS.Scripts, automation scripts for SonarQube and TFS</title>
        <description>&lt;p&gt;This is my second take at open-sourcing something!&lt;/p&gt; &lt;p&gt;Yesterday I read about the fantastic &lt;a href=&quot;http://blogs.msdn.com/b/visualstudioalm/archive/2015/04/28/technical-debt-management-announcing-sonarqube-integration-with-msbuild-and-team-build.aspx&quot;&gt;joint release&lt;/a&gt; from Microsoft and SonarSource for an integration between &lt;strong&gt;SonarQube&lt;/strong&gt; and &lt;strong&gt;Team Foundation Server&lt;/strong&gt;. As a quality-first advocate, I was immediately on it and yesterday I set up the environment based on the 45 pages long &lt;a href=&quot;https://vsarguidance.codeplex.com/downloads/get/1452516&quot;&gt;document&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;It is very well done - like all the Visual Studio ALM Rangers’ content! – but I thought about automating it, so it could be easily replicated in a lab. &lt;/p&gt; &lt;p&gt;You’ll still need to manually setup SQL Server (for now) and install Java. They are pretty basic – they follow the walkthrough, without any diversion, except for the InstallSonarRunner script, where I introduced a &lt;strong&gt;v12&lt;/strong&gt; and &lt;strong&gt;v14&lt;/strong&gt; script for respectively &lt;strong&gt;TFS 2013&lt;/strong&gt; and &lt;strong&gt;TFS 2015&lt;/strong&gt;, both using the legacy XAML Team Build.&lt;/p&gt; &lt;p&gt;You can find them &lt;a href=&quot;https://github.com/MattVSTS/SQ-TFS.Scripts&quot;&gt;here&lt;/a&gt;. Please let me know if you run into issues, I would look into further automation so it can even more seamless than now.&lt;/p&gt;  </description>
        <pubDate>Wed, 29 Apr 2015 19:26:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/04/29/sq-tfsscripts-automation-scripts-for/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/04/29/sq-tfsscripts-automation-scripts-for/</guid>
      </item>
    
      <item>
        <title>Remember, remember, remember…to close the TFS Administration Console!</title>
        <description>&lt;p&gt;That was fun :) While working with &lt;strong&gt;TFSConfig&lt;/strong&gt; I hit this error on a TFS Farm’s Application Tier…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.googleusercontent.com/-77Omz_tOfYY/VTUcx8nPPlI/AAAAAAAAB90/CHn7943X7Q8/s1600-h/image%25255B4%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.googleusercontent.com/-h1kqCj3oe7I/VTUcym9sEzI/AAAAAAAAB98/dzZ3kA8YY6U/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;584&quot; height=&quot;57&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Oh, right, I have it open. I run the command again &lt;strong&gt;after closing the console&lt;/strong&gt; and I get the same error.&lt;/p&gt; &lt;p&gt;The lesson? Close the TFS Admin Console &lt;strong&gt;on all the Application Tiers&lt;/strong&gt; of your TFS Farm, otherwise TFSConfig will detect it as open and return an error.&lt;/p&gt;  </description>
        <pubDate>Mon, 20 Apr 2015 15:35:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/04/20/remember-remember-rememberto-close-tfs/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/04/20/remember-remember-rememberto-close-tfs/</guid>
      </item>
    
      <item>
        <title>How to schedule a TFS Integration Platform session</title>
        <description>&lt;p&gt;You might need to schedule your TFS Integration Platform session at a certain time, and the TFS Integration UI doesn’t expose such an information.&lt;/p&gt; &lt;p&gt;Not all is lost though, the UI relies on a &lt;strong&gt;Console Application&lt;/strong&gt;:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-Xx-P4J5XTcM/VSUIZGTxG_I/AAAAAAAAB9Y/RJYD7O0aizo/s1600-h/image%25255B4%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-8cZmAtrQrkI/VSUIZwa3MDI/AAAAAAAAB9c/Mw4TtEczyYM/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;584&quot; height=&quot;301&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;As you can see, you can feed it with a &lt;strong&gt;Configuration File&lt;/strong&gt;. It would be a breeze then scheduling a task with the &lt;strong&gt;Windows Task Scheduler&lt;/strong&gt;, to run whenever it is convenient for you.&lt;/p&gt;  </description>
        <pubDate>Wed, 08 Apr 2015 10:52:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/04/08/how-to-schedule-tfs-integration/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/04/08/how-to-schedule-tfs-integration/</guid>
      </item>
    
      <item>
        <title>Why ‘Doing’ and ‘Done’ in the Kanban board?</title>
        <description>&lt;p&gt;Visual Studio Online &lt;a href=&quot;https://www.visualstudio.com/en-us/news/2015-feb-18-vso.aspx&quot;&gt;introduced&lt;/a&gt; this feature a few weeks ago, and then I’ve been asked…&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;Why is the split column inside another column?&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;That is absolutely a fair question.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-qmeVrL-zuDg/VRWJntj1EbI/AAAAAAAAB8g/EmR7HBxUsP0/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-M1CkHJMkAG4/VRWJoBeX3ZI/AAAAAAAAB8k/37oJcKW1U5w/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;584&quot; height=&quot;79&quot;&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Kanban &lt;/strong&gt;rotates around the concept of Capacity Flow, minimizing turnover and cycle time.&lt;/p&gt; &lt;p&gt;The so called ‘Kanban Boards’ – the Backlog Boards in reality - in Visual Studio Online take this principles as foundational when it is time to present an aggregated view of the development situation. Capacity is immutable by definition, unless there is an external intervention.&lt;/p&gt; &lt;p&gt;Also note that the we are not looking at the same stuff. The Sprint Backlog Board will boast the true &lt;strong&gt;States&lt;/strong&gt; of my involved Work Items, which are then mapped to the Kanban Boards’ &lt;strong&gt;Metastates&lt;/strong&gt;. Here is an example:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-gGFtMiyM3P4/VRWJo-wqO7I/AAAAAAAAB8w/_j7g91ij3W8/s1600-h/image%25255B10%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-ft_rdo7SAHY/VRWJphPVitI/AAAAAAAAB80/XIlk5NtK0kI/image_thumb%25255B6%25255D.png?imgmax=800&quot; width=&quot;584&quot; height=&quot;202&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;This is my Process Template. But my board looks like this:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-DlxGDehkri0/VRWJqE8ZWKI/AAAAAAAAB88/483DkB1SJik/s1600-h/image%25255B15%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-FJzvrkhsbCs/VRWJqr6O5zI/AAAAAAAAB9E/JIrtOGodHh8/image_thumb%25255B9%25255D.png?imgmax=800&quot; width=&quot;584&quot; height=&quot;70&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;What happens is that regardless of the &lt;strong&gt;Metastate&lt;/strong&gt; (between New and Approved) the actual Work Item State is still Proposed. A &lt;strong&gt;Metastate&lt;/strong&gt; is basically a way of determining how it is visualised, given that all the constraints are valid of course.&lt;/p&gt; &lt;p&gt;But back to the original question – does it make sense?&lt;br&gt;It does, indeed. These feature might seem just cosmetic stuff, but they actually contribute &lt;strong&gt;a lot&lt;/strong&gt; in keeping the teams’ meeting lean and the procedures simple and effective.&lt;/p&gt; &lt;p&gt;Even if a PBI is &lt;strong&gt;Approved&lt;/strong&gt;, it still might have work on it. Hence separating the Doing/Done phases makes it way easier for the Product Owner to understand the actual pace of the team. This works very well with the Definition of Done on the board, which I covered on &lt;a href=&quot;http://mattvsts.blogspot.co.uk/2015/03/definition-of-done-on-boards-how-and-my.html&quot;&gt;this&lt;/a&gt; post.&lt;/p&gt;  </description>
        <pubDate>Fri, 27 Mar 2015 16:47:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/03/27/why-doing-and-done-in-kanban-board/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/03/27/why-doing-and-done-in-kanban-board/</guid>
      </item>
    
      <item>
        <title>Definition of Done on the Boards – how, and my thoughts on why</title>
        <description>&lt;p&gt;Last week Microsoft rolled on the latest Visual Studio Online sprint deployment, and among all the new features there is the possibility of adding a visualisation of the Definition of Done in the Kanban Board.&lt;/p&gt; &lt;p&gt;How? It’s very easy, you click on &lt;strong&gt;Customize columns&lt;/strong&gt; in the board, and you add the DoD for each column you want to add it to:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-gTRfDIMohjo/VQhYedyWcBI/AAAAAAAAB7Y/fp1DbURDYnU/s1600-h/image%25255B20%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-WRDzppMbhl8/VQhYe-bYfdI/AAAAAAAAB7c/8HFiPzb1a-Q/image_thumb%25255B12%25255D.png?imgmax=800&quot; width=&quot;251&quot; height=&quot;162&quot;&gt;&lt;/a&gt; &lt;a href=&quot;http://lh6.ggpht.com/-TgQ3TCn5ywE/VQhYfYxEohI/AAAAAAAAB7k/Unqptq8HGqE/s1600-h/image%25255B10%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-gJt_YGtTxrk/VQhYf15fqRI/AAAAAAAAB7s/jvLKDaEvIvQ/image_thumb%25255B4%25255D.png?imgmax=800&quot; width=&quot;207&quot; height=&quot;406&quot;&gt;&lt;/a&gt; &lt;a href=&quot;http://lh3.ggpht.com/-bphfHoVNltA/VQhYgGrym3I/AAAAAAAAB70/tcK2JDPGbCI/s1600-h/image%25255B19%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-n8m3sC5oQ1M/VQhYgqiOhOI/AAAAAAAAB78/1eiGWmjJe2Q/image_thumb%25255B11%25255D.png?imgmax=800&quot; width=&quot;513&quot; height=&quot;428&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-dstLvqzz49g/VQhYg49nBDI/AAAAAAAAB8E/PrNx3pffAwk/s1600-h/image%25255B18%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-d1OXX1K9Bzo/VQhYhVjXBbI/AAAAAAAAB8M/1GgL3RI8aVg/image_thumb%25255B10%25255D.png?imgmax=800&quot; width=&quot;302&quot; height=&quot;137&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Easy as chips. But where is the real value of this (very welcomed) feature? Why is it that good for me?&lt;/p&gt; &lt;p&gt;Step back from your role a minute, and think. What is the Definition of Done?&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;a href=&quot;https://www.scrum.org/Resources/Scrum-Glossary/Definition-of-Done&quot;&gt;The DoD is usually a clear and concise list of requirements that a software Increment must adhere to for the team to call it complete.&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;That said, the Boards are meant for team’s consumption, hence reporting the DoD in a &lt;strong&gt;shared, neutral tool&lt;/strong&gt; is an amazing way of pushing the concept of the Definition of Done itself. It is under everybody’s eyes and &lt;strong&gt;it doesn’t leave space for interpretation&lt;/strong&gt;, so it enforces how to properly relate to it.&lt;/p&gt;  </description>
        <pubDate>Tue, 17 Mar 2015 16:38:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/03/17/definition-of-done-on-boards-how-and-my/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/03/17/definition-of-done-on-boards-how-and-my/</guid>
      </item>
    
      <item>
        <title>A lap around the new Application Insights</title>
        <description>&lt;p&gt;I really like Application Insights – it is no mystery, just look at how many posts I wrote on it – and the last time I purposely &lt;a href=&quot;http://mattvsts.blogspot.co.uk/2014/09/application-insights-whats-going-on.html&quot;&gt;played with it&lt;/a&gt; was around 2013.3 last September, with the 2.0 version approaching the release and a complete under the hood rewrite to fit into Microsoft Azure.&lt;/p&gt; &lt;p&gt;Well, &lt;strong&gt;a lot &lt;/strong&gt;changed in the last six months…let’s start from scratch: we have a Web Site running, we want to add Application Insights as the production monitoring solution. &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-KKD2GUOXtpg/VP3IK8v5H5I/AAAAAAAAB0w/NxnSMzW65VI/s1600-h/0%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;0&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;0&quot; src=&quot;http://lh4.ggpht.com/-2O6fBZI5mqo/VP3ILW2B6jI/AAAAAAAAB04/JfXhFGL8c-o/0_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;480&quot; height=&quot;484&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;You are running on Azure, so the &lt;strong&gt;request monitoring&lt;/strong&gt; is implemented out-of-the-box. No configuration, no code changes – it is offered &lt;strong&gt;as part of the Azure&lt;/strong&gt; &lt;strong&gt;infrastructure&lt;/strong&gt;. If we want to monitor the actual end-user usage, we need to add a bit of &lt;strong&gt;JavaScript&lt;/strong&gt; to your pages:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href=&quot;http://lh3.ggpht.com/-WMLAqv6fIH4/VP3IL7e6lSI/AAAAAAAAB1A/KkPm4maeKYE/s1600-h/1%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;1&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;1&quot; src=&quot;http://lh3.ggpht.com/-B7IaBGsnxlQ/VP3IMb8US1I/AAAAAAAAB1E/MkToSWrwQY0/1_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;548&quot; height=&quot;484&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Doing this will enable the&lt;strong&gt; usage monitoring&lt;/strong&gt;. You are going to notice how fast and sleek Application Insights is now compared to the old Visual Studio Online implementation, it is a matter of a &lt;strong&gt;couple of minutes&lt;/strong&gt; at worst and you are going to look at your freshly fetched data:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-R1E2w8W9l6U/VP3IM6aOnvI/AAAAAAAAB1M/zampU4AgPJY/s1600-h/2%25255B7%25255D.png&quot;&gt;&lt;img title=&quot;2&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;2&quot; src=&quot;http://lh4.ggpht.com/-tKTzVgxb7k0/VP3INeoZTwI/AAAAAAAAB1U/0-Z4CvWUxcU/2_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;190&quot; height=&quot;366&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Obviously you can &lt;strong&gt;dig into&lt;/strong&gt; this data – it is a monitoring platform after all!&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href=&quot;http://lh6.ggpht.com/-MvhS2Of5k0w/VP3INpa-4EI/AAAAAAAAB1g/XMCQjDH_EeA/s1600-h/3%25255B7%25255D.png&quot;&gt;&lt;img title=&quot;3&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;3&quot; src=&quot;http://lh5.ggpht.com/-v4oZeCGaSvA/VP3IOV8e6gI/AAAAAAAAB1o/feu4J_aB8pI/3_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;313&quot; height=&quot;484&quot;&gt;&lt;/a&gt; &lt;a href=&quot;http://lh3.ggpht.com/-qOYvNbV4NIo/VP3IOlzPQcI/AAAAAAAAB1s/A6sYGk5JPIk/s1600-h/4%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;4&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;4&quot; src=&quot;http://lh4.ggpht.com/-LGOWwvqfwBo/VP3IPBR2RAI/AAAAAAAAB10/NXgXc6TGKxw/4_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;541&quot; height=&quot;484&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;The &lt;strong&gt;Diagnostic search&lt;/strong&gt; is very cool because it is a &lt;strong&gt;pre-filtered, context-based&lt;/strong&gt; series of charting which enables troubleshooting and diagnostic scenarios with a couple of clicks. For instance here I can access the details of a page’s status in a certain session:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-WYKmdW50GAQ/VP3IPgS_ynI/AAAAAAAAB18/ASfMAspcCvE/s1600-h/5%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;5&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;5&quot; src=&quot;http://lh4.ggpht.com/-7W9hwJaHY-U/VP3IQC_yxoI/AAAAAAAAB2E/9SZ1M-Hb8R8/5_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;387&quot; height=&quot;484&quot;&gt;&lt;/a&gt; &lt;a href=&quot;http://lh3.ggpht.com/-xulnFk4Kfp0/VP3IQn_ThuI/AAAAAAAAB2M/2ENlOqKVMdE/s1600-h/6%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;6&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;6&quot; src=&quot;http://lh4.ggpht.com/-N5U9wJqMq3g/VP3IQzD7YPI/AAAAAAAAB2U/j0EpYJQaYJQ/6_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;320&quot; height=&quot;484&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;subsequently, I might want to see the &lt;strong&gt;telemetry&lt;/strong&gt; for the whole session:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-hQVqX-r0VYM/VP3IRVD3JEI/AAAAAAAAB2c/S9iXZV38qTs/s1600-h/7%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;7&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;7&quot; src=&quot;http://lh6.ggpht.com/-fdXchlPm6eQ/VP3IRq_C3lI/AAAAAAAAB2k/Xgn346WGb2w/7_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;644&quot; height=&quot;255&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;so looking at what this user did, in case I am inspecting a suspect behaviour on a bug report:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-OALtItltJoQ/VP3ISJhK91I/AAAAAAAAB2s/CSr7O-LAVCU/s1600-h/8%25255B8%25255D.png&quot;&gt;&lt;img title=&quot;8&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;8&quot; src=&quot;http://lh4.ggpht.com/-c79MEYBzF_Q/VP3IS_n7ysI/AAAAAAAAB24/Yy2z0IPlOa0/8_thumb%25255B6%25255D.png?imgmax=800&quot; width=&quot;471&quot; height=&quot;772&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;The other option is on a timeframe, so looking at the &lt;strong&gt;ten minutes interval around the event&lt;/strong&gt; I scoped my search on:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-dxu4djX-j2k/VP3ITeuoM1I/AAAAAAAAB28/H7inPBmhEBE/s1600-h/9%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;9&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;9&quot; src=&quot;http://lh4.ggpht.com/-ex4QHRIcUCs/VP3ITm9sWVI/AAAAAAAAB3E/NwIBtY-5zUE/9_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;644&quot; height=&quot;266&quot;&gt;&lt;/a&gt;&amp;nbsp; &lt;/p&gt; &lt;p&gt;Moving on to the health and performance monitoring, you need the &lt;strong&gt;Application Insights Telemetry&lt;/strong&gt;, a two-click operation in Visual Studio which is going to lead to a new &lt;strong&gt;NuGet package&lt;/strong&gt; installed in my solution:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href=&quot;http://lh3.ggpht.com/-2m3bx8QnbSw/VP3IUbQUvXI/AAAAAAAAB3Q/iGKkrDbF6t4/s1600-h/14%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;14&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;14&quot; src=&quot;http://lh6.ggpht.com/-_F6qoHYwfAM/VP3IVK4kSgI/AAAAAAAAB3U/RbvFYc2YPVY/14_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;539&quot; height=&quot;484&quot;&gt;&lt;/a&gt;&amp;nbsp; &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-twhE-8cupUs/VP3IVjRJurI/AAAAAAAAB3c/SIHVpp8PiuM/s1600-h/15%25255B7%25255D.png&quot;&gt;&lt;img title=&quot;15&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;15&quot; src=&quot;http://lh5.ggpht.com/-SpWWbxCllMs/VP3IWBn7QoI/AAAAAAAAB3k/8QxCR-cS4Nk/15_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;535&quot; height=&quot;565&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;So I can enabled scenarios like this - I have a troublesome page here:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-lPagOo2XvEM/VP3IWVsBHUI/AAAAAAAAB3s/KedYFPg8PTY/s1600-h/11%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;11&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;11&quot; src=&quot;http://lh3.ggpht.com/-1e2NEPMmcGw/VP3IW8oCpDI/AAAAAAAAB30/Wgq5ubivFOI/11_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;644&quot; height=&quot;186&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;I can dig into the Metrics Explorer, and look at the stats – each event is reportable and will boast a number of properties you can use to investigate.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href=&quot;http://lh6.ggpht.com/-hZo9amFUSJY/VP3IXTDPbrI/AAAAAAAAB38/BgeXfLEiUac/s1600-h/12%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;12&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;12&quot; src=&quot;http://lh3.ggpht.com/-8iMUEHXGx6A/VP3IXjrXcSI/AAAAAAAAB4I/p4C65RA_gZQ/12_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;644&quot; height=&quot;467&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;If you want to log custom events, it is a matter of using the same &lt;strong&gt;appInsights&lt;/strong&gt; object created by the existing snippet and model what you need to log. For example, I might want to log an event with two properties, a string and an integer:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href=&quot;http://lh6.ggpht.com/-4rzDAQl4Fvk/VP3IYLFIPUI/AAAAAAAAB4M/U5gKTj5d8Kc/s1600-h/17%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;17&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;17&quot; src=&quot;http://lh3.ggpht.com/-PkDp_8Fh9pE/VP3IYmmnS5I/AAAAAAAAB4U/osDpiQbusBg/17_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;602&quot; height=&quot;26&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;and out-of-the-box I would get support for &lt;strong&gt;sorting and aggregating&lt;/strong&gt; my custom properties in the charts:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-sQY7H3ScFtg/VP3IY65153I/AAAAAAAAB4c/NUef2pYmvUU/s1600-h/18%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;18&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;18&quot; src=&quot;http://lh3.ggpht.com/-b9vZQUYlJeQ/VP3IZauksvI/AAAAAAAAB4k/xjTpSapEjQU/18_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;290&quot; height=&quot;72&quot;&gt;&lt;/a&gt; &lt;a href=&quot;http://lh5.ggpht.com/-ddeHBjszA1Q/VP3IaNUDB6I/AAAAAAAAB4w/6PSIeX6eqUg/s1600-h/20%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;20&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;20&quot; src=&quot;http://lh3.ggpht.com/-SL0LT4SdXtQ/VP3IabWQzeI/AAAAAAAAB40/YEfpmu-9NQs/20_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;306&quot; height=&quot;101&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://lh4.ggpht.com/-XJsl9Vu4lfU/VP3Ia17n_0I/AAAAAAAAB48/YRYimIwGWtY/s1600-h/19%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;19&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;19&quot; src=&quot;http://lh3.ggpht.com/-q4hJVu6Yceo/VP3IbLl1CWI/AAAAAAAAB5E/sfggC2DQfsY/19_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;551&quot; height=&quot;179&quot;&gt;&lt;/a&gt;&amp;nbsp; &lt;/p&gt; &lt;p&gt;To be fair, I really like the workflow provided by the Azure Portal’s &lt;strong&gt;blades&lt;/strong&gt;. Let’s say I have an exception:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-SkR_d08tn3A/VP3IblsambI/AAAAAAAAB5Q/AY8ACNygLGE/s1600-h/21%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;21&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;21&quot; src=&quot;http://lh5.ggpht.com/-58phcXmYXSA/VP3IcDen2GI/AAAAAAAAB5Y/qfhMqyUoZ78/21_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;371&quot; height=&quot;186&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;For each level I dig into, a blade opens, so I can easily keep track of the workflow I am following. Very good use for all these 16:9 screens around :) &lt;a href=&quot;http://lh4.ggpht.com/-3TRiY_YJua8/VP3Icl9wikI/AAAAAAAAB5g/f_a6QRhQ414/s1600-h/22%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;22&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;22&quot; src=&quot;http://lh4.ggpht.com/-GgpUIbRYSKo/VP3IdYyRlRI/AAAAAAAAB5k/v_Xu5FDLT-8/22_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;581&quot; height=&quot;506&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/--9aysp6IwM4/VP3IdnBoEjI/AAAAAAAAB5s/wQ4qeKT7aUY/s1600-h/23%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;23&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;23&quot; src=&quot;http://lh6.ggpht.com/-oRMjJSbBBMg/VP3IeeR3J1I/AAAAAAAAB54/Aeovk_3d6hI/23_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;582&quot; height=&quot;737&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;The Properties blade is the same for each event, so I can retrieve the &lt;strong&gt;relevant telemetry&lt;/strong&gt; in any case. My users for example behaved like this:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-LkcdNAxUnCQ/VP3Ie5k4TVI/AAAAAAAAB58/xpQ7rZIfWZk/s1600-h/24%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;24&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;24&quot; src=&quot;http://lh6.ggpht.com/-9pZeQX2TE2Y/VP3IfIsgkGI/AAAAAAAAB6E/m2wHfKU2kr4/24_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;553&quot; height=&quot;323&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;It’s a matter of seconds understanding where this issue is.&lt;/p&gt; &lt;p&gt;But what if you want more logs? Mostly important, more logs at &lt;strong&gt;lower levels&lt;/strong&gt;? Here they are:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-jXjpx3H32A0/VP3IfqbYGMI/AAAAAAAAB6M/Dyob0-oSkws/s1600-h/25%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;25&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;25&quot; src=&quot;http://lh5.ggpht.com/-psELqM8MGzY/VP3IgNbneYI/AAAAAAAAB6U/EEeHCyh2sKY/25_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;294&quot; height=&quot;250&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Eventually, you get live streaming of the &lt;strong&gt;Application&lt;/strong&gt; and &lt;strong&gt;Web Server&lt;/strong&gt; Logs:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-ojYfzhsD2y0/VP3IgiuggSI/AAAAAAAAB6c/pZIWo9z0hkE/s1600-h/26%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;26&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;26&quot; src=&quot;http://lh6.ggpht.com/-Bcf1gHptmRw/VP3IhIpYk6I/AAAAAAAAB6k/gDhVrzgaKVA/26_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;556&quot; height=&quot;222&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-l7A4z-RTrVE/VP3IhSYP93I/AAAAAAAAB6s/_32LZ_zi-oY/s1600-h/27%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;27&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;27&quot; src=&quot;http://lh6.ggpht.com/-Ld-q3BMpqQA/VP3IiFD8tfI/AAAAAAAAB64/NIAWGltgFho/27_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;553&quot; height=&quot;231&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-roe-DvlECSE/VP3IinpW6kI/AAAAAAAAB7A/OdaSRpkkgNs/s1600-h/28%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;28&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;28&quot; src=&quot;http://lh5.ggpht.com/-IRQmfB7Wrsk/VP3IjBoDZrI/AAAAAAAAB7E/LDgEDRZcS-k/28_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;644&quot; height=&quot;151&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This is actually quite verbose because I set it so, but you have four options to choose from…&lt;/p&gt; &lt;p&gt;The new Application Insights is more promising than ever – I am seriously impressed by the effort the team spent on it, Application Insights now feels very solid and it sports even more data than before, without mentioning how integrated it is with Azure.&lt;/p&gt;  </description>
        <pubDate>Mon, 09 Mar 2015 16:21:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/03/09/a-lap-around-new-application-insights/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/03/09/a-lap-around-new-application-insights/</guid>
      </item>
    
      <item>
        <title>Why can’t I output the result of git log from a PowerShell script?</title>
        <description>&lt;p&gt;Git log is a &lt;em&gt;special&lt;/em&gt; command, it uses a pager and it seems the PowerShell ISE &lt;strong&gt;hangs&lt;/strong&gt; when you run into that kind of commands. If you try creating a script relying on running git log in whatever form, you won’t get anything.&lt;/p&gt; &lt;p&gt;The workaround is not the very best, but it does the trick:&lt;/p&gt; &lt;p&gt;$logcommand = &quot;git --no-pager log ... [&amp;gt; file.ext if needed]&quot; &lt;br&gt;Invoke-Expression $log&lt;/p&gt; &lt;p&gt;Other commands like git diff are &lt;strong&gt;not affected&lt;/strong&gt; by this. This made me lose quite a bit of time this morning…but I am happy to be unblocked now.&lt;/p&gt;  </description>
        <pubDate>Thu, 05 Mar 2015 12:54:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/03/05/why-cant-i-output-result-of-git-log/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/03/05/why-cant-i-output-result-of-git-log/</guid>
      </item>
    
      <item>
        <title>A first look at Team Foundation Server 2015</title>
        <description>A few days ago Microsoft &lt;a href=&quot;http://blogs.msdn.com/b/bharry/archive/2015/02/23/vs-2015-ctp6-and-tfs-2015-ctp1-shipped-today.aspx&quot;&gt;released&lt;/a&gt; a first CTP of Team Foundation Server 2015, together with another one for Visual Studio 2015. Whoo!&lt;br /&gt;I was particularly curious about Team Foundation Server, as the preferred way of evaluating new features is Visual Studio Online. Keep in mind what Brian said: “&lt;em&gt;More than anything it was a forcing function for us to practice getting ready to ship TFS 2015&lt;/em&gt;”, meaning I’d expect other TFS 2015 CTPs soon. Moreover, don’t forget many of the Visual Studio Online features had been brought into TFS 2013 Updates, so it isn’t like 2008 any longer.&lt;br /&gt;It is the beginning of a new &lt;em&gt;wave&lt;/em&gt;. The &lt;strong&gt;TFS 2015 wave&lt;/strong&gt;! It is quite of a change, I reckon, but based on my experience it works pretty well. I manage a gigantic TFS deployment with all the trimmings, and being on the &lt;em&gt;Update Train&lt;/em&gt; is perceived as extremely valuable by both my colleagues in Operations and my users. So expect sizeable features to show up after RTM.&lt;br /&gt;Before looking at the actual features, a word on the installation process itself. It didn’t change a lot, but there are a couple of tidbits worth mentioning.&lt;br /&gt;&lt;a href=&quot;http://lh6.ggpht.com/-B-TVPVhaXXM/VO49Cv0tYhI/AAAAAAAABzE/ddSkhKDvABs/s1600-h/AT44.png&quot;&gt;&lt;img alt=&quot;AT4&quot; border=&quot;0&quot; src=&quot;http://lh4.ggpht.com/-B9oNivqW_rk/VO49DKH9zXI/AAAAAAAABzI/FyTnRsbCMCo/AT4_thumb2.png?imgmax=800&quot; height=&quot;441&quot; style=&quot;border-width: 0px; display: inline;&quot; title=&quot;AT4&quot; width=&quot;584&quot; /&gt;&lt;/a&gt; &lt;br /&gt;You can now configure a Basic Server (TFS Basic as we knew it) or a Full Server. The Full Server makes it clear that &lt;strong&gt;the new Build is a new core service&lt;/strong&gt;:&lt;a href=&quot;http://lh3.ggpht.com/-426zTxD8ifY/VO49DrvOJ7I/AAAAAAAABzQ/T5QPxl0ygwg/s1600-h/AT84.png&quot;&gt;&lt;img alt=&quot;AT8&quot; border=&quot;0&quot; src=&quot;http://lh3.ggpht.com/-bUWZQjH3g38/VO49EGN4goI/AAAAAAAABzY/MarIt37ccew/AT8_thumb2.png?imgmax=800&quot; height=&quot;438&quot; style=&quot;border-width: 0px; display: inline;&quot; title=&quot;AT8&quot; width=&quot;584&quot; /&gt;&lt;/a&gt; &lt;br /&gt;SharePoint Foundation &lt;strong&gt;doesn’t ship&lt;/strong&gt; in the box anymore, hence the 370MB ISO size. You can still integrate with an existing SharePoint deployment of course:&lt;a href=&quot;http://lh4.ggpht.com/-CQeBI8USkU0/VO49EqCj4ZI/AAAAAAAABzg/ruXH6elXecw/s1600-h/AT94.png&quot;&gt;&lt;img alt=&quot;AT9&quot; border=&quot;0&quot; src=&quot;http://lh5.ggpht.com/-4huFxMIzx3Y/VO49FGvCUyI/AAAAAAAABzo/dkMwYGE9r-c/AT9_thumb2.png?imgmax=800&quot; height=&quot;439&quot; style=&quot;border-width: 0px; display: inline;&quot; title=&quot;AT9&quot; width=&quot;584&quot; /&gt;&lt;/a&gt; &lt;br /&gt;So let’s start with what’s in the &lt;strong&gt;CTP1&lt;/strong&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Extensibility and integration&lt;/strong&gt;&lt;li&gt;&lt;strong&gt;Agile tooling improvements &lt;/strong&gt;&lt;li&gt;&lt;strong&gt;Licensing changes &lt;/strong&gt;&lt;li&gt;&lt;strong&gt;Build.vNext&lt;/strong&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;Extensibility means you now have the whole set of &lt;strong&gt;REST APIs&lt;/strong&gt; which were available in Visual Studio Online only, together with the &lt;strong&gt;&lt;a href=&quot;http://mattvsts.blogspot.co.uk/2014/07/visual-studio-online-and-service-hooks.html&quot;&gt;Service Hooks&lt;/a&gt;&lt;/strong&gt;. This is very interesting for the whole lot of in-house applications you might have, plus a out-of-the-box integration facility with the supported 3rd party services. &lt;br /&gt;Oh, &lt;strong&gt;integration&lt;/strong&gt;…I think this screenshot says it all:&lt;br /&gt;&lt;a href=&quot;http://lh4.ggpht.com/-Y8EvegWwU8o/VO49FucDYXI/AAAAAAAABzw/GQ1bpqsBIyc/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://lh6.ggpht.com/-6koGnjM6hvk/VO49Fxb44bI/AAAAAAAABz4/uFW0HXLtsNk/image_thumb%25255B1%25255D.png?imgmax=800&quot; height=&quot;484&quot; style=&quot;border-width: 0px; display: inline;&quot; title=&quot;image&quot; width=&quot;486&quot; /&gt;&lt;/a&gt; &lt;br /&gt;Do you want to integrate with a &lt;strong&gt;Jenkins&lt;/strong&gt; build server? A couple of clicks, and you are in!&lt;br /&gt;On the Agile tooling improvements it is basically lots of what we already saw on Visual Studio Online with all the reliability improvements we cannot see because they are behind the scenes. &lt;br /&gt;To be honest, I read quite a few comments busting the Product Team’s work because there aren’t hundreds of new eye-popping features in this CTP, and I cannot agree with them. It is a &lt;strong&gt;CTP1&lt;/strong&gt;, to be used as a &lt;strong&gt;shipping test&lt;/strong&gt; for the team, &lt;strong&gt;it isn’t feature-complete&lt;/strong&gt; or &lt;strong&gt;go-live supported&lt;/strong&gt;. Why all this &lt;em&gt;mess&lt;/em&gt;? They used to be called &lt;strong&gt;alphas&lt;/strong&gt;, and I still remember the excitement when the first virtual machine containing an alpha of Visual Studio 2010 (codename Rosario at the time) came out, with really few features inside a Visual Studio Team System 2008 IDE, and everybody was excited about it. On my side, I’d rather appreciate what we can have to learn and share feedback, instead of complaining…&lt;br /&gt;Anyway – back to the features :)&lt;br /&gt;The licensing changes are all about the &lt;strong&gt;&lt;a href=&quot;http://mattvsts.blogspot.co.uk/2014/07/why-is-new-vso-stakeholder-plan-game.html&quot;&gt;Stakeholder Access Level&lt;/a&gt;&lt;/strong&gt;, extending lots of the Standard features to the basic, CAL-less tier. It is amazing because it enables a true involvement by the stakeholders themselves, without being too limited by the lack of a CAL.&lt;br /&gt;Eventually, &lt;strong&gt;Build.vNext&lt;/strong&gt; – it is a new Team Build concept, based on &lt;strong&gt;scalable agents&lt;/strong&gt; instead of rigid matching between controllers and agents. But what matters most is that the workflow is now &lt;strong&gt;easier&lt;/strong&gt;, &lt;strong&gt;clearer&lt;/strong&gt;, and &lt;strong&gt;cross-platform&lt;/strong&gt;.&lt;br /&gt;&lt;a href=&quot;http://lh4.ggpht.com/-3jk-2y9F46k/VO49GcFkzBI/AAAAAAAAB0A/-bd27G9bJJg/s1600-h/image%25255B7%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; src=&quot;http://lh3.ggpht.com/--PZlyB2mVCI/VO49GyGZxCI/AAAAAAAAB0I/23MEuIFBhFY/image_thumb%25255B3%25255D.png?imgmax=800&quot; height=&quot;484&quot; style=&quot;border-width: 0px; display: inline;&quot; title=&quot;image&quot; width=&quot;404&quot; /&gt;&lt;/a&gt; &lt;br /&gt;Does this mean the old XAML-based build is going away? Absolutely not, everything works as it does today, but this is now the way forward for the future. With Build.vNext, you won’t have a dedicated Build Controller setup any longer. You &lt;em&gt;can&lt;/em&gt; have it, but it would be the Legacy Build Service we saw in the installation as a separated, optional step to do – aka XAML-based Team Build.</description>
        <pubDate>Wed, 25 Feb 2015 21:22:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/02/25/a-first-look-at-team-foundation-server/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/02/25/a-first-look-at-team-foundation-server/</guid>
      </item>
    
      <item>
        <title>PowerShell DSC in legacy pipelines, or with no pipeline at all</title>
        <description>&lt;p&gt;It is true that PowerShell DSC is the newest kid on the block, but it is also true that we can &lt;strong&gt;integrate it in legacy pipelines&lt;/strong&gt;, or where we have no clear pipeline whatsoever.&lt;/p&gt; &lt;p&gt;How? Pretty easy – even if there is DSC in the name, we are still talking about &lt;strong&gt;PowerShell&lt;/strong&gt;, hence who can stop us from invoking a legacy script or even a command?&lt;/p&gt; &lt;p&gt;For example, think about where you have a script which stops IIS, copies the new content and then the scripts restarts IIS, using iisreset and xcopy. Not best practice at all, but it is broadly used. You can replace it with this:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-dD4UT9sXkds/VN0kpquUMwI/AAAAAAAABys/m2G8uFxK1Tc/s1600-h/image%25255B4%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-e3vBGPyfkEA/VN0kqFtWcUI/AAAAAAAAByw/FUhLlnVL5QM/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;584&quot; height=&quot;272&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;The &lt;strong&gt;Invoke-Command&lt;/strong&gt; cmdlet is a &lt;strong&gt;standard&lt;/strong&gt; PowerShell one, it has nothing to do with DSC. But embedded into a DSC script it can make &lt;strong&gt;a functional step&lt;/strong&gt; into the DSC script itself.&lt;/p&gt; &lt;p&gt;Even better, do you have a preparation script which prepares the environment? You can use &lt;strong&gt;Invoke-Command&lt;/strong&gt; with the &lt;strong&gt;–FilePath &lt;/strong&gt;switch, pointing at your script, as part of the DSC script.&lt;/p&gt;  </description>
        <pubDate>Thu, 12 Feb 2015 22:09:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/02/12/powershell-dsc-in-legacy-pipelines-or/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/02/12/powershell-dsc-in-legacy-pipelines-or/</guid>
      </item>
    
      <item>
        <title>What are .tfignore files?</title>
        <description>&lt;p&gt;I was talking with &lt;a href=&quot;http://twitter.com/alkampfer&quot;&gt;Gian Maria&lt;/a&gt; this morning about the need of excluding some files from the Version Control, with both TFVC and Git. With Git (and the .gitignore file) you can specify rules for it, but what about the TFVC?&lt;/p&gt; &lt;p&gt;Typically you have two options, a check-in policy or a &lt;strong&gt;.tfignore&lt;/strong&gt; file. What is the latter?&lt;/p&gt; &lt;p&gt;It is a file which specifies some rules about the allowed and disallowed files in the Team Foundation Version Control. You need to create it in your Workspace folder, and you can specify rules like &lt;a href=&quot;https://msdn.microsoft.com/library/vstudio/ms245454(v=vs.110).aspx#tfignore&quot;&gt;these&lt;/a&gt;. Yep, pretty much like the Git counterpart.&lt;/p&gt; &lt;p&gt;Of course it isn’t like a check-in policy, but it provides a good way of enabling basic rules on the allowed files in your TFVC. It is very helpful anyway when you have large teams, it enables a quick distribution of a standard set of policies without too much mess around the startup.&lt;/p&gt;  </description>
        <pubDate>Wed, 11 Feb 2015 14:06:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/02/11/what-are-tfignore-files/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/02/11/what-are-tfignore-files/</guid>
      </item>
    
      <item>
        <title>The hidden gem of Microsoft Test Manager: tcm.exe</title>
        <description>&lt;p&gt;Can you clone a specific Test Suite into an existing Test Plan? &lt;strong&gt;Not really&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Shall you resort to Excel, getting – in this scenario – an half-baked result? &lt;strong&gt;No, either&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;And what if you want to work with test artifacts in a script?&lt;/p&gt; &lt;p&gt;You should use &lt;strong&gt;tcm.exe &lt;/strong&gt;instead! By design, MTM doesn’t expose all the possible capabilities, for a matter of User Experience. As it is a tool aimed mainly at testers, too many options might be confusing for the user. But that does not mean that a scenario like cloning Test Suites (not the whole Test Plan or the single Test Case) is impossible or barely possible by using tools not really fit for it - tcm.exe &lt;strong&gt;fills this gap&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;What you’ll need to do is just calling &lt;strong&gt;tcm suites&lt;/strong&gt;:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-qr8uQiUHNnU/VNDQCHGWzKI/AAAAAAAABx0/j31cn3TpP9I/s1600-h/image%25255B15%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-TIHxfnG-pww/VNDQClsa0YI/AAAAAAAABx8/7A2izmE26NE/image_thumb%25255B9%25255D.png?imgmax=800&quot; width=&quot;584&quot; height=&quot;48&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;You can get the &lt;strong&gt;Suite ID&lt;/strong&gt; from MTM. Even if you are cloning from/to the root of the Test Plan, it is still a Test Suite hence you have a Suite ID:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-J1F-97PUdiA/VNDQDMQO9JI/AAAAAAAAByA/rKvgnygqrEI/s1600-h/image%25255B16%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/--41VunveMK0/VNDQDcvzlfI/AAAAAAAAByI/dk22P1SC_NI/image_thumb%25255B10%25255D.png?imgmax=800&quot; width=&quot;584&quot; height=&quot;182&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;You can also override fields, and clone stuff across Team Projects. It is pretty handy.&lt;/p&gt; &lt;p&gt;But it isn’t over, as it has other capabilities:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-w2vGGf6YT-Q/VNDQDofaEjI/AAAAAAAAByQ/TBHlNvUZ2Wg/s1600-h/image%25255B20%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-BpaIyTiUDWU/VNDQEM_6kAI/AAAAAAAAByY/3T5oIlGoNlM/image_thumb%25255B12%25255D.png?imgmax=800&quot; width=&quot;584&quot; height=&quot;282&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;I find very, very useful the possibility of running specific tests from the command-line (&lt;strong&gt;tcm run&lt;/strong&gt;) and, very helpful in case of migrations and integrations, downloading the XML mapping of Bugs, resolutiontype and failuretype with &lt;strong&gt;tcm fieldmapping&lt;/strong&gt;.&lt;/p&gt;  </description>
        <pubDate>Tue, 03 Feb 2015 13:41:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/02/03/the-hidden-gem-of-microsoft-test/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/02/03/the-hidden-gem-of-microsoft-test/</guid>
      </item>
    
      <item>
        <title>My first approach with open-source: TFSThemeUploader</title>
        <description>&lt;p&gt;To be fair, I’ve never been involved in open-source very much. I mean, personally. Moreover, I have always been quite shy of my &lt;em&gt;stuff&lt;/em&gt;, as nowadays I mostly write scripts and no longer full-fledged production applications.&lt;/p&gt; &lt;p&gt;But anyway I decided to give it a go. So please, &lt;strong&gt;do not shoot the pianist&lt;/strong&gt;, alright? :)&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/MattVSTS/TFSThemeUploader&quot;&gt;&lt;strong&gt;TFSThemeUploader&lt;/strong&gt;&lt;/a&gt; is a simple PowerShell script aimed at automating the scenario described in &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/dn306083.aspx&quot;&gt;this&lt;/a&gt; MSDN article. I’ve always thought it is quite tedious to manually complete, as it requires a bit of fiddling around XML and command-line tools. There is absolutely nothing wrong with it, but when you need to perform the same actions for more than one or two projects it isn’t very…compelling – hence the script.&lt;/p&gt; &lt;p&gt;I might expand it actually, to make it a bit more user-friendly and to expand the possible scenarios, I have a couple of ideas. But for the meantime, it is a good start I think.&lt;/p&gt;  </description>
        <pubDate>Thu, 29 Jan 2015 10:37:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/01/29/my-first-approach-with-open-source/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/01/29/my-first-approach-with-open-source/</guid>
      </item>
    
      <item>
        <title>Continuous-Integration-as-Infrastructure and Git Flow</title>
        <description>&lt;p&gt;This came out at Friday’s meeting of the London ALM User Group – can I set up an infrastructure CI build for my whole Git project, configured with &lt;strong&gt;Git Flow&lt;/strong&gt;?&lt;/p&gt; &lt;p&gt;I think Git Flow is a great piece of tool for non-enthusiasts or anyway people with limited interest in understanding Git. It creates a &lt;strong&gt;naming convention skeleton&lt;/strong&gt; for your branching strategy, and using SourceTree you can let this kind of users work on their stuff with limited supervision.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-BxusQ6Fx0ag/VLpnqGKHkrI/AAAAAAAABwY/gOsydaQTIZs/s1600-h/gitflow0%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;gitflow0&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;gitflow0&quot; src=&quot;http://lh3.ggpht.com/-DxVLe27353Q/VLpnqsr6G3I/AAAAAAAABwc/VpQndyhVm0I/gitflow0_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;162&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://lh3.ggpht.com/-YCJ6sQ7qv2Y/VLpnq_s1G6I/AAAAAAAABwo/qde23PsgNEE/s1600-h/gitflow1%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;gitflow1&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;gitflow1&quot; src=&quot;http://lh5.ggpht.com/-V7MmFVq5XnA/VLpnrva8MTI/AAAAAAAABww/WSEHRRPFwSI/gitflow1_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;118&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;So, thinking on it – &lt;strong&gt;can Team Build help? &lt;/strong&gt;Of course it can!&lt;/p&gt; &lt;p&gt;If you select the appropriate &lt;strong&gt;Include&lt;/strong&gt; statement for the branches you’d like in the Build Definition, it is literally one click away:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-W52Dstj7MCQ/VLpntDsjtHI/AAAAAAAABw0/exOzAkdNXqA/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-oJR63kH1oB8/VLpntsd1MwI/AAAAAAAABw8/unM_HNvKezI/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;135&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Doing so you are telling the Team Build to run a build (CI in this case) on the &lt;strong&gt;feature/*&lt;/strong&gt; branch, where of course the star is a &lt;strong&gt;wildcard&lt;/strong&gt;. Every branch you are going to create will benefit from it without any effort.&lt;/p&gt; &lt;p&gt;So you commit whatever you need, and the CI is already working for all you wish - given the mapping.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-aalP0lMoByk/VLpnuMbHr4I/AAAAAAAABxE/yj0s554ZI3g/s1600-h/gitflow2%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;gitflow2&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;gitflow2&quot; src=&quot;http://lh6.ggpht.com/-R929f2uN1ys/VLpnutsd4RI/AAAAAAAABxM/YSeJVKThJwM/gitflow2_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;95&quot;&gt;&lt;/a&gt; &lt;a href=&quot;http://lh6.ggpht.com/-Cc0EJXpHxgM/VLpnvIfvVbI/AAAAAAAABxU/i1w2JpLIPxw/s1600-h/gitflow3%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;gitflow3&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;gitflow3&quot; src=&quot;http://lh6.ggpht.com/-EzYyEempoPg/VLpnv6h4sJI/AAAAAAAABxc/0g9PCL9Z6uw/gitflow3_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;46&quot;&gt;&lt;/a&gt;&lt;/p&gt;  </description>
        <pubDate>Sat, 17 Jan 2015 13:46:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/01/17/continuous-integration-as/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/01/17/continuous-integration-as/</guid>
      </item>
    
      <item>
        <title>Visual Studio Release Management as a Service – a quickstart</title>
        <description>&lt;p&gt;Let’s face it – cloud computing is utterly cool (pay-as-you-use service, near 100% availability, no infrastructure costs) but it is not for everyone. Even myself, I keep maintaining my own lab even if I use cloud services, both for learning and production purposes. But there are tools where the infrastructure and setup costs are not for everyone – think about Exchange.&lt;/p&gt; &lt;p&gt;IMHO Visual Studio Release Management is &lt;strong&gt;amazing&lt;/strong&gt;, but its infrastructure and setup/maintenance cost might not be for every taste. That’s why having it &lt;em&gt;as a Service &lt;/em&gt;in Visual Studio makes it even better!&lt;/p&gt; &lt;p&gt;If you install the Release Management Client on your machine, you just need to connect to Visual Studio Online instead of an on-premise server:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-DgqisARaEco/VLbMa8Uhn_I/AAAAAAAABvA/DMLzsd1OyAo/s1600-h/image%25255B4%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-LLKWHR-7iK4/VLbMbT98YpI/AAAAAAAABvE/HfMeqf6AQ7w/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;567&quot; height=&quot;370&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;After you log on with your MSA, you will notice the URL automatically changing – that is &lt;strong&gt;VSRMaaS&lt;/strong&gt;!&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-sY9uKig4KFM/VLbMbwniIwI/AAAAAAAABvM/f3YlJi9vXIc/s1600-h/image6.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-t1XRaqCX-0k/VLbMcGFj0FI/AAAAAAAABvU/VlLJHdwFQLg/image_thumb2.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;25&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;This is the &lt;strong&gt;only setting&lt;/strong&gt; you have to care about. All the rest is managed by Visual Studio Online.&lt;/p&gt; &lt;p&gt;So, how can you use it? There are a couple of limits, &lt;em&gt;for now&lt;/em&gt;. It is a beta, and it supports only &lt;strong&gt;vNext environments&lt;/strong&gt;. A vNext environment is an agent-less deployment environment, which leverages &lt;strong&gt;PowerShell DSC&lt;/strong&gt;. Eventually, it can be both in the cloud or on-premise. After that, it’s all the usual VSRM stuff…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-DSzNrhBEs0w/VLbMcqDF4OI/AAAAAAAABvc/w_dQuVsEI20/s1600-h/image7%25255B1%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-LK6hsP1hGX8/VLbMc8hR34I/AAAAAAAABvk/Mc3oczDC7pM/image7_thumb.png?imgmax=800&quot; width=&quot;555&quot; height=&quot;425&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;The caveat is that you need to use DSC – hence no pre-existing activities but just your own scripts:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-RPHrJ4dh_tg/VLbMdUvUf6I/AAAAAAAABvs/JJjXZDbxl2Y/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-HOSdKdYg_Ok/VLbMd8sitbI/AAAAAAAABv0/YD1iMWLPvsw/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;216&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;These scripts are going to feed the Release Pipeline, exactly like the agent-based VSRM deploys.&lt;/p&gt; &lt;p&gt;If you need a jumpstart though, use the integrated menu in Visual Studio: it is going to create stages, components and templates on your’s behalf!&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-cY1dyDS1Ay0/VLbMeLLsCUI/AAAAAAAABv8/wjDJsBVpa1E/s1600-h/image13.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-g4KYv2YdAUo/VLbMejtS4qI/AAAAAAAABwE/6YL8_1m5WdM/image_thumb5.png?imgmax=800&quot; width=&quot;235&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt;  </description>
        <pubDate>Wed, 14 Jan 2015 20:07:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/01/14/visual-studio-release-management-as/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/01/14/visual-studio-release-management-as/</guid>
      </item>
    
      <item>
        <title>Useful SQL queries for the TFS Administrator</title>
        <description>&lt;p&gt;Right, right – &lt;strong&gt;I know&lt;/strong&gt;:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/--TIoAXqege8/VK5r-PYe_YI/AAAAAAAABuI/X9LEiegvmjU/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-O48KSZSv7wU/VK5r-hoD_0I/AAAAAAAABuQ/1XZISypxYhE/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;644&quot; height=&quot;81&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-7ihFM6I0LLM/VK5r_J5bfgI/AAAAAAAABuU/T1RG-IKPgRE/s1600-h/image%25255B7%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-kMcVuHdqLPM/VK5r_hwvDNI/AAAAAAAABuc/YLOcDXLxfJw/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;644&quot; height=&quot;157&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;I would actually replace &lt;em&gt;can&lt;/em&gt; with &lt;em&gt;will&lt;/em&gt;, but people might think I am too harsh. Remember – the TFS databases cannot be modified by nobody but Microsoft, otherwise you won’t get support, you might experience unknown (and untested!) issues and mostly important – you would lose any upgrade path as the schemas are checked by the TFS installer.&lt;/p&gt; &lt;p&gt;Anyway I won’t be talking about modifying the databases, while instead I wanted to share some useful queries I found during my almost ten years experience with Team Foundation Server.&lt;/p&gt; &lt;p&gt;SQL Server is a &lt;a href=&quot;http://en.wikipedia.org/wiki/Deterministic_system&quot;&gt;deterministic system&lt;/a&gt;, but sometimes &lt;em&gt;it doesn’t seem to be&lt;/em&gt;. For instance, AlwaysOn is synchronising some data after you messed up with a Team Project Collection used for testing purposes, and despite it might look stuck it is actually doing &lt;em&gt;something&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;The AlwaysOn Dashboard doesn’t show anything but a &lt;strong&gt;Synchronizing&lt;/strong&gt; status, so how can I say so?&lt;/p&gt; &lt;p&gt;Run this query:&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;SELECT dmv_2.login_name AS Invoker, &lt;br&gt;dmv_1.session_id AS SPID, &lt;br&gt;command as &apos;Instruction Type&apos;,&lt;br&gt;a.text AS Query, &lt;br&gt;start_time AS &apos;Initiated at&apos;, &lt;br&gt;percent_complete AS Percentage, &lt;br&gt;dateadd(second,estimated_completion_time/1000, getdate()) AS ETA &lt;br&gt;FROM sys.dm_exec_requests dmv_1 &lt;br&gt;CROSS APPLY sys.dm_exec_sql_text(dmv_1.sql_handle) a &lt;br&gt;INNER JOIN sys.dm_exec_sessions dmv_2 &lt;br&gt;ON dmv_1.session_id = dmv_2.session_id &lt;p&gt;This is what you’ll get: &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-yTLTFLn2GK8/VK5sAMU2XBI/AAAAAAAABuk/MxgYaUtSTNs/s1600-h/image%25255B13%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-WKfRXuCaOC4/VK5sAZeIjuI/AAAAAAAABus/qxgwag-Njjg/image_thumb%25255B7%25255D.png?imgmax=800&quot; width=&quot;644&quot; height=&quot;86&quot;&gt;&lt;/a&gt;  &lt;p&gt;Excluding the line where I am the Invoker – of course – I can see all the activity at 11:08am: &lt;ul&gt; &lt;li&gt;NT AUTHORITY\SYSTEM running &lt;strong&gt;sp_server_diagnostics&lt;/strong&gt;&lt;/li&gt; &lt;li&gt;The TFS and SQL service account in this testing environment running an &lt;strong&gt;INSERT query&lt;/strong&gt; – that is AlwaysOn!&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;That query leverages &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms188754.aspx&quot;&gt;SQL Server’s DMVs&lt;/a&gt;, and it is very handy for checking all the things happening in the Database Engine.&lt;/p&gt; &lt;p&gt;Another one is about Transaction Log files – what about their physical status?&lt;/p&gt; &lt;p&gt;SELECT Name, &lt;br&gt;database_id, &lt;br&gt;log_reuse_wait,&lt;br&gt;log_reuse_wait_desc &lt;br&gt;FROM sys.databases &lt;p&gt;Querying sys.databases can give you the status of your Transaction Log files. I needed that because I was running some &lt;em&gt;extreme&lt;/em&gt; tests in borderline conditions, hence I had to monitor their status. &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms178534.aspx&quot;&gt;Sys.databases&lt;/a&gt; is very handy for other information as well.&lt;/p&gt; &lt;p&gt;Eventually, as Grant &lt;a href=&quot;http://blogs.msdn.com/b/granth/archive/2013/10/08/what-does-a-well-maintained-team-foundation-server-look-like.aspx&quot;&gt;suggests&lt;/a&gt; (and he is always right!), &lt;strong&gt;DBCC CHECKDB &lt;/strong&gt;regularly is a must. And please, have a test server around so you can compare all the behaviours, if any.&lt;/p&gt;  </description>
        <pubDate>Thu, 08 Jan 2015 11:37:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2015/01/08/useful-sql-queries-for-tfs-administrator/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2015/01/08/useful-sql-queries-for-tfs-administrator/</guid>
      </item>
    
      <item>
        <title>Troubleshoot a Team Project deletion</title>
        <description>&lt;p&gt;A colleague of mines once said “it’s never a stupid question if you don’t know the answer.” So that post might sound stupid, but I had people asking for it hence…there it goes!&lt;/p&gt; &lt;p&gt;You might need to delete a Team Project, and it is a &lt;strong&gt;matter of seconds&lt;/strong&gt;, isn’t it?&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-M0U5K7N-M_E/VJgBKM8bIII/AAAAAAAABtA/yCOtXR1VxkU/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-OE49NMkz14k/VJgBKssPkNI/AAAAAAAABtE/ihAjCMV_l2s/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;52&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;It is not always the case, unfortunately. But you can do a lot to understand what goes south. Just using the TFS Admin Console.&lt;/p&gt; &lt;p&gt;Firstly, when you have a &lt;strong&gt;DeleteProject&lt;/strong&gt; job running, you can actually check what it is doing. It is not very intuitive, but if you double-click it, you can access this:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-OXrmdlQbWG0/VJgBK7xk3oI/AAAAAAAABtM/4EHLfdGBUjY/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-MkUCgTsv9ck/VJgBLW-eDgI/AAAAAAAABtU/r6AUhA-Vjyg/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;173&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Ok, the job fails. You know what? If you double-click the failed job you can get a very detailed log:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-RSI20T9SOyw/VJgBLyfD5gI/AAAAAAAABtc/K--EWMb_08U/s1600-h/image%25255B8%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-TK-cAR9r43s/VJgBMDevyAI/AAAAAAAABtk/P3jzufv5pP0/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;169&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;and digging down there you will surely find the reason why the job fails:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-sUESDICfQc4/VJgBMjR8N5I/AAAAAAAABto/2Qdowh5VQ-A/s1600-h/image%25255B14%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-2KsrBHDlEmw/VJgBMzNsozI/AAAAAAAABtw/WY0tGnxGTb0/image_thumb%25255B6%25255D.png?imgmax=800&quot; width=&quot;644&quot; height=&quot;78&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;That specific case, well…just size your testing environment accordingly, ok? :)&lt;/p&gt;  </description>
        <pubDate>Mon, 22 Dec 2014 11:32:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/12/22/troubleshoot-team-project-deletion/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/12/22/troubleshoot-team-project-deletion/</guid>
      </item>
    
      <item>
        <title>Reducing Technical Debt with Smart Unit Tests</title>
        <description>&lt;p&gt;One of the reasons behind &lt;a href=&quot;http://en.wikipedia.org/wiki/Technical_debt&quot;&gt;Technical Debt&lt;/a&gt; is the &lt;strong&gt;lack of appropriate test suites&lt;/strong&gt; around a certain feature. Especially when implementing something new, tests are critical in shaping a robust and quality solution. Often, if you have something &lt;em&gt;in the works&lt;/em&gt; and you are not strictly operating TDD, &lt;strong&gt;tests are behind&lt;/strong&gt; where they should be.&lt;/p&gt; &lt;p&gt;Visual Studio 2015 introduced Smart Unit Tests, which are nothing but the former MSR Pex project, rebranded and productised. What Pex/a Smart Unit Test does is to analyse your code and create a basic suite of unit tests to test the &lt;strong&gt;basic, border scenarios&lt;/strong&gt;. Here is an example:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-ZZeY9RW6UzU/VIbimXUa1YI/AAAAAAAABrY/ZAJmcE1cjUg/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-1NxWhys2Ajk/VIbim6ijJXI/AAAAAAAABrg/iXKPgVkLAcI/image_thumb.png?imgmax=800&quot; width=&quot;221&quot; height=&quot;97&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Right click on the method, &lt;strong&gt;Smart Unit Tests&lt;/strong&gt;…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-CAn2Sbwn8K0/VIbinUCHIeI/AAAAAAAABrk/YfK9Niy8ao4/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-6u9KA4dmrMg/VIbinwyiq9I/AAAAAAAABrw/mPZr0LPO0Ko/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;94&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;and here is the result:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-UhT14Y1cGTY/VIbioVie6xI/AAAAAAAABr0/mIS80wb8y8E/s1600-h/image%25255B20%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-y0v6h61GBLA/VIbioyUUylI/AAAAAAAABr8/uD-niaO84c4/image_thumb%25255B8%25255D.png?imgmax=800&quot; width=&quot;507&quot; height=&quot;163&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Of course – this is a really, really basic scenario. What is interesting IMHO is how it is doing it &lt;em&gt;behind the scenes&lt;/em&gt;:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-06f5Z7VlhhE/VIbipDC7akI/AAAAAAAABsE/BY8Cl87MpnQ/s1600-h/image%25255B11%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-967e3WHXTcY/VIbip1L60MI/AAAAAAAABsM/16Rkg1_oc8I/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;236&quot; height=&quot;183&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;as mentioned, it is a &lt;strong&gt;full-fledged Unit Test&lt;/strong&gt;. Very basic, but still a good starting point, &lt;strong&gt;saving time &lt;/strong&gt;while in the works. And if you save it, the Smart Unit Test engine is automatically going to create a new Test Project with the aforementioned tests contained in there. Again, it is not meant to remain as-is (“Sum748” is not a great test name for instance…) but it is still better IMHO than doing everything on my own.&lt;/p&gt; &lt;p&gt;Let’s make things a bit &lt;em&gt;harder&lt;/em&gt; now:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-faShiYzL3ZQ/VIbiqGxah8I/AAAAAAAABsU/6IuRADRJob4/s1600-h/image%25255B14%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-GR6keaS7FiU/VIbiq15XRTI/AAAAAAAABsc/CqEhtXlzmtc/image_thumb%25255B4%25255D.png?imgmax=800&quot; width=&quot;239&quot; height=&quot;94&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;That is &lt;strong&gt;very crappy code&lt;/strong&gt; in small scale. No exception management at all, just the plain and down-to-the-bone feature, potentially &lt;em&gt;in development&lt;/em&gt;. I can ear people screaming, but it happens extremely often in every organisation. This is the output of Smart Unit Test in this scenario:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-qubAwLfWXP0/VIbirUIqbUI/AAAAAAAABso/feEBldLUrps/s1600-h/image%25255B21%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-eQbENuaknoU/VIbir2A8DWI/AAAAAAAABss/Qs0AQ4dvMW0/image_thumb%25255B9%25255D.png?imgmax=800&quot; width=&quot;474&quot; height=&quot;104&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;It seems I need to spend some time on handling &lt;strong&gt;DivideByZeroExceptions&lt;/strong&gt; and &lt;strong&gt;OverflowExceptions&lt;/strong&gt;, to begin with…&lt;/p&gt;  </description>
        <pubDate>Tue, 09 Dec 2014 11:53:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/12/09/reducing-technical-debt-with-smart-unit/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/12/09/reducing-technical-debt-with-smart-unit/</guid>
      </item>
    
      <item>
        <title>Lab Management and Environments – what to remember</title>
        <description>&lt;p&gt;Lab Management’s SCVMM environments are nothing more than a bunch of Virtual Machines running somewhere in a datacentre. Really. I do not understand the reluctancy (almost fear!) when I mention it.&lt;/p&gt; &lt;p&gt;Let’s start with &lt;strong&gt;Network Isolation&lt;/strong&gt;. Network Isolation is an extremely handy feature, allowing a side-by-side deployment of multiple instances of an environment with the same properties (machine name, IP addresses, basically everything which should not be duplicated in a network). It is very cool.&lt;/p&gt; &lt;p&gt;And guess what, there is a clear, &lt;strong&gt;step-by-step &lt;/strong&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/dd380770.aspx&quot;&gt;&lt;strong&gt;guide&lt;/strong&gt;&lt;/a&gt; on how to create a Domain Controller VM to be used as a template for a Network Isolated Environment. Basically once you installed the ADDS you need to clean the DNS.&lt;/p&gt; &lt;p&gt;Once you have the VMs ready, I would suggest to compose some environments to be reused without searching for the VM every time. To then enable the Network Isolation, you need to check this checkbox in the Advanced tab of the Wizard:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-9uvL-XGd4n4/VHybG0kOvWI/AAAAAAAABpw/awbwz-CrOSQ/s1600-h/image%25255B6%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-XxWIiovq_Wg/VHybJypHHLI/AAAAAAAABp4/YYzAzVGiFTs/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;644&quot; height=&quot;151&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;That is all you need to do. SCVMM will then add a &lt;strong&gt;secondary Network Card&lt;/strong&gt; to the VM to enable this feature, but it is nothing you should worry about.&lt;/p&gt; &lt;p&gt;Also remember that unless you set auto-provisioning, &lt;strong&gt;your VMs won’t be automatically shared&lt;/strong&gt; among the Team Projects in a Collection. You can import them from the library you used to store the template anyway.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-pqSuPHbw-1w/VHybKKHIjlI/AAAAAAAABp8/v7Kzr2v1Yrg/s1600-h/image%25255B10%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-lh4wm1FQomw/VHybKgHaVCI/AAAAAAAABqE/X0VF7I4aHPY/image_thumb%25255B4%25255D.png?imgmax=800&quot; width=&quot;644&quot; height=&quot;466&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;One last thing to remember on the VM Templates – always remember to &lt;strong&gt;enable the&lt;/strong&gt; &lt;strong&gt;File and Printers Sharing&lt;/strong&gt; firewall exception, otherwise the deployment would fail, and you won’t be able to connect to the VMs via the MTM Environment Viewer for instance.&lt;/p&gt; &lt;p&gt;If you want an all-in-one reference, have a look at this appendix from &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/jj159343.aspx#&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/jj159345.aspx&quot;&gt;Testing for Continuous Delivery with Visual Studio 2012&lt;/a&gt; – even if it is on the older version everything is still relevant. The whole book is actually on the matter, so I suggest to have a look at it.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Another misunderstood topic seems to be &lt;strong&gt;Test Settings.&lt;/strong&gt; We all have seen the fantastic demos with screen and audio recording, but then &lt;em&gt;all of a sudden&lt;/em&gt; you cannot set it up in your lab.&lt;/p&gt; &lt;p&gt;To enable that feature, you need to install the &lt;strong&gt;Desktop Experience&lt;/strong&gt; Feature on your Windows Server VMs:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-sNVMK-Q7go4/VHybLCKr36I/AAAAAAAABqM/KuP6S3Aud3Q/s1600-h/image%25255B13%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-r6NVah0JJCU/VHybLmvdz_I/AAAAAAAABqU/Lg9_9yRB17k/image_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;71&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;and then select the &lt;strong&gt;Screen and Voice Recorder&lt;/strong&gt; diagnostic data adapter from the Test Setting you want to use:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-0vsxxnax1s8/VHybMUAu2wI/AAAAAAAABqc/YS8QhbcTSOs/s1600-h/image%25255B23%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-YsWhGlMSD64/VHybMgICUkI/AAAAAAAABqk/yEz5cMYOc4k/image_thumb%25255B13%25255D.png?imgmax=800&quot; width=&quot;644&quot; height=&quot;334&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Each DDA can be configured to better suit the usage you want, in this case just bear in mind that you are storing &lt;strong&gt;big binary files&lt;/strong&gt; inside the Team Project Collection database, so its size might increase very quickly if you use it a lot. Moreover, there is a number of useful settings you might use:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-cVABQ-xak8o/VHybNJaLhdI/AAAAAAAABqs/MWevFpM2688/s1600-h/image%25255B26%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-vGuH0X-kfIM/VHybNhHw6VI/AAAAAAAABq0/5LN7HC1TLA0/image_thumb%25255B14%25255D.png?imgmax=800&quot; width=&quot;162&quot; height=&quot;166&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;You can &lt;strong&gt;copy specific files&lt;/strong&gt; (not tied to the Version Control or the build output) to the VMs, run pre and post-test execution &lt;strong&gt;scripts&lt;/strong&gt;, or even &lt;strong&gt;force 32 or 64-bit execution&lt;/strong&gt; in case you need it:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-ZgXlkCMi5uI/VHybOLa_0sI/AAAAAAAABq8/Tg751dVIqO8/s1600-h/image%25255B32%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-EhFyD9kZ5Ko/VHybOrcWO7I/AAAAAAAABrE/VSYYQQxF-F4/image_thumb%25255B16%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;141&quot;&gt;&lt;/a&gt;&amp;nbsp; &lt;/p&gt; &lt;p&gt;Unfortunately the number of resources here is not immense – &lt;a href=&quot;http://msdn.microsoft.com/en-gb/library/dd936084.aspx&quot;&gt;MSDN&lt;/a&gt; is extremely useful as usual, together with the aforementioned eBook, the &lt;a href=&quot;http://vsarlabman.codeplex.com/&quot;&gt;Visual Studio ALM Rangers Lab Management Guide&lt;/a&gt; and the &lt;a href=&quot;http://mattvsts.blogspot.co.uk/2014/07/review-professional-team-foundation.html&quot;&gt;Pro Team Foundation Server 2013&lt;/a&gt; book. &lt;/p&gt; &lt;p&gt;But again, this is not rocket science so you should be good with them.&lt;/p&gt;  </description>
        <pubDate>Mon, 01 Dec 2014 16:45:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/12/01/lab-management-and-environments-what-to/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/12/01/lab-management-and-environments-what-to/</guid>
      </item>
    
      <item>
        <title>How to configure Visual Studio Team Lab Management 2013, once and for all</title>
        <description>&lt;p&gt;Every time I go at a conference/user group and Lab Management is mentioned I hear someone saying “Lab Management? I never understood how it sticks together…” “Wow, it must be an adventure to set it up!” and so on…&lt;/p&gt; &lt;p&gt;Well, after all Visual Studio Team Lab Management (yes, fancy name) is not rocket science &lt;strong&gt;at all!&lt;/strong&gt; It is just a clever mix of many different components, each doing a different thing, to enable the “Virtual Test Fabric” scenario. Nothing more, nothing less.&lt;/p&gt; &lt;p&gt;To begin with, you would need System Center Virtual Machine Manager (2012 R2), at least one Hyper-V host, Team Foundation Server (2013.4 in this case), a Build Controller and a Test Controller.&lt;/p&gt; &lt;p&gt;Assuming SCVMM installed&amp;nbsp; and configured (how: install SQL Server Database Engine, install SCVMM pointing at it, add an Hyper-V host), you need to install the SCVMM Console on the Team Foundation Server Application Tier. Now you can configure Lab Management!&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-WHyduQEx7yU/VGpsA6BpS8I/AAAAAAAABnY/qK4JNqSyB44/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-sZFaXwEja8U/VGpsBq9mk1I/AAAAAAAABnc/js24riJA1oM/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;644&quot; height=&quot;199&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;You just need to enter your &lt;strong&gt;SCVMM FQDN&lt;/strong&gt;:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-ppvjDq2MdiM/VGpsCPbD3mI/AAAAAAAABnk/wbLLlpUt2hg/s1600-h/image%25255B16%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-O_bCVl1_09I/VGpsCmrvjZI/AAAAAAAABns/9Bi5GZDNGo0/image_thumb%25255B8%25255D.png?imgmax=800&quot; width=&quot;644&quot; height=&quot;249&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;and – if you wish to use it – an &lt;strong&gt;IP Block&lt;/strong&gt; and a &lt;strong&gt;DNS Suffix&lt;/strong&gt; for your Network Isolated machines:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-pZR5Uq17udI/VGpsDNGpuwI/AAAAAAAABn0/AQYXJaQMRuc/s1600-h/image%25255B15%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-nivY708eesI/VGpsDllNRGI/AAAAAAAABn8/JHo4PeMtnuQ/image_thumb%25255B7%25255D.png?imgmax=800&quot; width=&quot;490&quot; height=&quot;484&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;This is the core, infrastructure configuration. You are going to see that something is missing though…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-w_dXDjZOyvc/VGpsEGMFHhI/AAAAAAAABoE/syY-vBqRbs4/s1600-h/image%25255B13%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/--1J-5Dsav4I/VGpsFABBxwI/AAAAAAAABoQ/7lcFH9j26jY/image_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;644&quot; height=&quot;160&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;You just configured the infrastructure for the whole Lab Management deployment, what’s missing is the configuration for each Team Project Collection you want to enable.&lt;/p&gt; &lt;p&gt;The two settings you need are:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;A &lt;strong&gt;Library Share&lt;/strong&gt; (a normal SMB share) containing the SCVMM templates used by VSTLM to create your VMs&lt;a href=&quot;http://lh6.ggpht.com/-CQeMod4FG5o/VGpsFdnGdlI/AAAAAAAABoU/H2SGWX8KoI4/s1600-h/image%25255B32%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-YzXHRs8QIMM/VGpsFwdg4NI/AAAAAAAABoc/snHdeT3g67s/image_thumb%25255B18%25255D.png?imgmax=800&quot; width=&quot;484&quot; height=&quot;361&quot;&gt;&lt;/a&gt; &lt;/li&gt; &lt;li&gt;A &lt;strong&gt;Host Group&lt;/strong&gt; (it’s actually optional, as SCVMM creates a default “&lt;strong&gt;All Hosts&lt;/strong&gt;” Host Group, which in your case is enough as we are assuming you are starting with one Hyper-V host server)&lt;br&gt;&lt;a href=&quot;http://lh4.ggpht.com/-RB2l9RCEE-Q/VGpsGKxp56I/AAAAAAAABok/qmeMYCoogpE/s1600-h/image%25255B31%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-LYR982mFnZI/VGpsGg5GqvI/AAAAAAAABos/s7Iw2WUdq9U/image_thumb%25255B17%25255D.png?imgmax=800&quot; width=&quot;484&quot; height=&quot;350&quot;&gt;&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;As &lt;a href=&quot;http://mattvsts.blogspot.co.uk/2014/11/visual-studio-lab-management-and-auto.html&quot;&gt;mentioned&lt;/a&gt;, the Auto Provision flag enables all the Team Projects contained into your Collection.&lt;/p&gt; &lt;p&gt;Now the only missing piece is a Test Controller to bind to Lab Management. In fact, if you launch Test Manager and try to create a new Environment, it would complain:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-WwbsuZIic2E/VGpsHDfvQuI/AAAAAAAABo0/Rf6tfx-VAUs/s1600-h/image%25255B33%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-yYRUaAI0MwA/VGpsHjrz2WI/AAAAAAAABo8/5pEu9fhdd8M/image_thumb%25255B19%25255D.png?imgmax=800&quot; width=&quot;424&quot; height=&quot;193&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;So, let’s install the &lt;a href=&quot;http://www.microsoft.com/en-us/download/confirmation.aspx?id=44923&quot;&gt;Test Controller&lt;/a&gt; and configure it:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-4kR_NpTYCdA/VGpsIAjjAzI/AAAAAAAABpE/JJfc3WpzXq4/s1600-h/image%25255B46%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-9QCMP53Ci8c/VGpsIU7FpSI/AAAAAAAABpM/Qs6fhZ_08WQ/image_thumb%25255B26%25255D.png?imgmax=800&quot; width=&quot;404&quot; height=&quot;455&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;If you need it, configure a Lab Service Account as well. This is helpful in cases where you need to &lt;a href=&quot;http://mattvsts.blogspot.co.uk/2012/05/standard-environment-in-visual-studio.html&quot;&gt;resort&lt;/a&gt; to Shadow Accounts (or you can’t add the Service Account to the Local Administrators group), but let’s keep it simple and skip it for now. Just keep that in mind:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-rwiyy594KvE/VGpsIzmsodI/AAAAAAAABpU/gbOG60PxCqI/s1600-h/image%25255B42%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-hvVd4ICONFU/VGpsJUOaHAI/AAAAAAAABpc/2pmXDW_nlgo/image_thumb%25255B24%25255D.png?imgmax=800&quot; width=&quot;404&quot; height=&quot;107&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;That’s all! This is the whole Lab Management configuration! Is it still rocket science? In another post we are going to look at the environments’ configurations and at some useful tips from the real world.&lt;/p&gt;  </description>
        <pubDate>Mon, 17 Nov 2014 21:44:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/11/17/how-to-configure-visual-studio-team-lab/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/11/17/how-to-configure-visual-studio-team-lab/</guid>
      </item>
    
      <item>
        <title>Why can’t I delete a Test Plan with MTM and TFS 2013 Update 3?</title>
        <description>&lt;p&gt;Do you want to delete a Test Plan from MTM? Fair enough.&lt;/p&gt; &lt;p&gt;Unfortunately the documentation is a bit outdated here – a quick Google to find &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/dd286734(v=vs.100).aspx&quot;&gt;this&lt;/a&gt;, and it is about Visual Studio 2010. It would work – but only if you are connected to a Team Foundation Server without Update 3.&lt;/p&gt; &lt;p&gt;If instead you are running 2013.3+, you would be greeted with a message saying … “Deleting a test plan is not supported for current version of Team Foundation Server. Use witadmin tool &apos;destroywi&apos; command to destroy test plan work item.”&lt;/p&gt; &lt;p&gt;It is not a bug, but it is by design instead - it is the only downside of the conversion to Work Item Types of the Test Suites and Test Plans. &lt;/p&gt; &lt;p&gt;Basically prior to Team Foundation Server 2013.3 they were ‘special artifacts’, meaning you wouldn’t be able to treat them like Work Items – including advanced querying, charting, etc.&lt;/p&gt; &lt;p&gt;The Update 3 converted the whole thing to plain Work Item Types, but this means you no longer get the &lt;em&gt;special&lt;/em&gt; feature of deleting it via MTM, instead you should run witadmin destroywi from the Developer Command Line – which is the only way of doing so. That is because deleting a Work Item is not really something that happens every day, and if done in the wrong way (for example, truncating relationships in linked Work Items) it could lead to issues with the Work Item Store. &lt;/p&gt;  </description>
        <pubDate>Sun, 16 Nov 2014 21:55:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/11/16/why-cant-i-delete-test-plan-with-mtm/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/11/16/why-cant-i-delete-test-plan-with-mtm/</guid>
      </item>
    
      <item>
        <title>Visual Studio Lab Management and Auto Provisioning</title>
        <description>&lt;p&gt;Despite it is very handy, the Auto Provisioning feature of Lab Management can become a trouble pretty quickly. If enabled, every Team Project will be authorised to deploy VMs in the VSTLM hosts, a situation which – 99% of the times – becomes unmanageable.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-3pORAzuXhvM/VFohdhAgxJI/AAAAAAAABnA/cqt0pxHkB7E/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-TeI0YRoNuvY/VFoheBbbA-I/AAAAAAAABnE/BgnxQxer-Xg/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;538&quot; height=&quot;484&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;It’s not a TFS problem, and it depends on how the users are used to work. But if your deployment is used (as it should be, to be fair) and considered ‘as a service’, then IMHO you need to limit the scope a little bit, otherwise your Hyper-V servers are going be clogged like Beijing at the rush hour…or the M25.&lt;/p&gt; &lt;p&gt;There is a pretty quick fix for this though – &lt;strong&gt;after&lt;/strong&gt; you grant the permissions to the specific Team Project to use Lab Management, you need to use two TFSLabConfig (&lt;a href=&quot;https://twitter.com/MattVSTS/status/468424068807811072&quot;&gt;and not TFSConfig Lab&lt;/a&gt;) commands: &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/dn249785.aspx&quot;&gt;tfslabconfig TPHostGroup&lt;/a&gt; and &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/dn249786.aspx&quot;&gt;tfslabconfig TPLibraryShare&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;After that, you are ready to go!&lt;/p&gt;  </description>
        <pubDate>Wed, 05 Nov 2014 13:09:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/11/05/visual-studio-lab-management-and-auto/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/11/05/visual-studio-lab-management-and-auto/</guid>
      </item>
    
      <item>
        <title>Impact of the new Visual Studio Online European Region</title>
        <description>&lt;p&gt;With the &lt;a href=&quot;http://www.visualstudio.com/en-us/news/2014-oct-28-vso&quot;&gt;latest update&lt;/a&gt; Microsoft addressed one of the most repeated requests about Visual Studio Online. It isn’t a specific feature or capability, but it is &lt;strong&gt;a EU-hosted region&lt;/strong&gt; for it!&lt;/p&gt; &lt;p&gt;Up to yesterday, you did not have any choice on where your VSO data is hosted - the VSO tenants were only in &lt;strong&gt;Chicago&lt;/strong&gt;, &lt;strong&gt;San Antonio&lt;/strong&gt; and &lt;strong&gt;West Virginia&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;It wasn’t a matter of performance or latency – I personally never had heavy problems unless a service-wide problem arised – but it was all about governance. If you are a EU-based company or anyway you have operations in the EU, you know data protection it is a pretty important matter.&lt;/p&gt; &lt;p&gt;We are not talking about Microsoft &lt;em&gt;snooping into your source code and looking at your intellectual property&lt;/em&gt;, not at all, but depending on what you work on you might have strict regulatory policies to apply. In detail, if you have EU operations (which means even a single server running in the EU), the &lt;strong&gt;&lt;a href=&quot;http://ec.europa.eu/justice/data-protection/&quot;&gt;EU Data Protection Directive&lt;/a&gt;&lt;/strong&gt; applies, and it is stricter than the US counterside, especially on when data &lt;strong&gt;&lt;a href=&quot;http://ec.europa.eu/justice/data-protection/data-collection/data-transfer/index_en.htm&quot;&gt;leaves the EU&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Visual Studio Online is covered by the &lt;a href=&quot;http://www.visualstudio.com/en-us/support/privacy-policy-vs.aspx&quot;&gt;Safe Harbor&lt;/a&gt; since I recall its existence, a bilateral agreement between the US Federal Trade Commission and the European Commission providing reciprocal protection to personal and sensible data, but for certain businesses or countries it was just not enough. Germany is a good example, where its privacy laws are way stricter than the general EU umbrella.&lt;/p&gt; &lt;p&gt;Eventually, if you store your data – whatever it is – on a US hosted service, your data could be inspected by the US Law Enforcement agencies under the PATRIOT Act.&lt;/p&gt; &lt;p&gt;So, introducing a EU-hosted region (in Amsterdam, for completeness) means &lt;strong&gt;a lot&lt;/strong&gt; in terms of governance, as all of your intellectual property hosted there is subject to the EU DPD as such, and that’s all.&lt;/p&gt; &lt;p&gt;What you will be lacking &lt;strong&gt;today&lt;/strong&gt; is Application Insights – but it would reach the EU VSO in time for its General Availability.&lt;/p&gt;  </description>
        <pubDate>Tue, 28 Oct 2014 15:07:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/10/28/impact-of-new-visual-studio-online/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/10/28/impact-of-new-visual-studio-online/</guid>
      </item>
    
      <item>
        <title>Can I host multiple Git repositories in Team Foundation Server?</title>
        <description>&lt;p&gt;Of course you can!&lt;/p&gt; &lt;p&gt;I am in the middle of a migration project, and the team I am helping with has several Git repositories (converted from other version control systems) to upload to their Team Project.&lt;/p&gt; &lt;p&gt;It isn’t extremely intuitive – you need to open the &lt;strong&gt;Control Panel&lt;/strong&gt; for your Team Project (&lt;a title=&quot;https://mattvsts.visualstudio.com/DefaultCollection/DDDNorth-Git/_admin/_versioncontrol&quot; href=&quot;https://yourserver.domain.tld/yourcollection/yourteamproject/_admin/_versioncontrol&quot;&gt;https://yourserver.domain.tld/yourcollection/yourteamproject/_admin/_versioncontrol&lt;/a&gt;) &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-IHuZ8egkfq4/VEi_JcozQvI/AAAAAAAABmE/aWwzUhtoiPA/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-_XgQ2LOWc4w/VEi_Jzh4kbI/AAAAAAAABmI/-wlDyRtdOkc/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;158&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;and from there you can create a &lt;strong&gt;new repository.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-xiS_6gx-Qnk/VEi_KUomuMI/AAAAAAAABmQ/ow3l6TzmV_I/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-uzNyP54i6Mg/VEi_K44qmtI/AAAAAAAABmY/eCXYwccWu5A/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;118&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;That’s all! &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-5PBaztxiQ60/VEi_LUbdQfI/AAAAAAAABmg/SDJvczIhxxA/s1600-h/image%25255B11%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-nKv6s_oC3ak/VEi_LsAvt5I/AAAAAAAABmo/_MXISLpgFik/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;169&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;When you’ll navigate to the newly created Git repository you will get the &lt;strong&gt;Getting Started&lt;/strong&gt; page as well, which is very helpful for first-time users.&lt;/p&gt;  </description>
        <pubDate>Thu, 23 Oct 2014 08:41:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/10/23/can-i-host-multiple-git-repositories-in/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/10/23/can-i-host-multiple-git-repositories-in/</guid>
      </item>
    
      <item>
        <title>Again on the logs: are errors in the logs going to stop an upgrade?</title>
        <description>&lt;p&gt;A quick but interesting question came out this week: “&lt;em&gt;if I see an error in the Event Viewer of the Application Tier, is it going to break a TFS upgrade?”&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Generally speaking – no. The errors you see in the Event Viewer are client-side logs reported to the server. You might see an error on a client not able to connect, another one because of a non-existent user or value in the Work Item query, or more critically an error because you cannot contact your &lt;strong&gt;data tier&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;It is the &lt;strong&gt;data tier&lt;/strong&gt; which contains &lt;em&gt;all the meat&lt;/em&gt;. All the data is stored over there and, if you look at the Configuration logs after an upgrade, the big show is there. &lt;/p&gt; &lt;p&gt;Of course there is a correlation between the data tier’s schema and the application tier version – everything is handled by the same binaries.&lt;/p&gt;  </description>
        <pubDate>Thu, 16 Oct 2014 15:37:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/10/16/again-on-logs-are-errors-in-logs-going/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/10/16/again-on-logs-are-errors-in-logs-going/</guid>
      </item>
    
      <item>
        <title>Logs, logs, logs…</title>
        <description>&lt;p&gt;Team Foundation Server is by no means an easy product – especially with large deployments. One of the most important aids in the daily maintenance is taking care of the logs, which are very descriptive.&lt;br&gt;&lt;br&gt;Apart from &lt;em&gt;the usual suspects&lt;/em&gt; (IIS, SharePoint, SQL Server, SCVMM) inside the Event Viewer you are going to find all the logs related to the &lt;strong&gt;TFS Services&lt;/strong&gt; – these logs are especially invaluable when it’s time to troubleshoot a client issue, because they will contain exactly the error the user experienced plus many information about his environment (in particular which client triggered the error).&lt;br&gt;&lt;br&gt;One example is an error like this:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-dfHNQzpiutk/VDZO7DWqCaI/AAAAAAAABlI/AkBpuxFAnAw/s1600-h/logs2%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;logs2&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;logs2&quot; src=&quot;http://lh4.ggpht.com/-4DfadsV6qmM/VDZO7-8mgnI/AAAAAAAABlM/xCW2fCGEcPw/logs2_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;204&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;“TF10158: The user or group name &amp;lt;group&amp;gt; contains unsupported characters, is empty, or too long&quot; Once it is logged inside the Event Viewer I am going to get the error itself, plus who (the user account) and from which client (Visual Studio, a browser, MSTest, MTM, etc…) experienced that – guess what happens if you receive a question on such a group &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;http://lh6.ggpht.com/-vI984qgfY2g/VDWS2JXUoOI/AAAAAAAABkc/RNKzYI1tydA/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt; &lt;br&gt;&lt;br&gt;But what about setup or update logs? They are elsewhere – you are going to find the link into the TFS Administration Console. &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-H8q35WDX3Uc/VDZO8X3obtI/AAAAAAAABlU/wWE7XY1ACzY/s1600-h/logs1%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;logs1&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;logs1&quot; src=&quot;http://lh6.ggpht.com/-9ZAl_KenXKY/VDZO9APLrUI/AAAAAAAABlc/XfGXRNH6aUI/logs1_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;229&quot; height=&quot;191&quot;&gt;&lt;/a&gt; &lt;br&gt;What is amazing is their verbosity – did you ever try opening one of them?&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://lh6.ggpht.com/-hH9G00WtE3w/VDZO97NkIbI/AAAAAAAABlk/FIM6Q-m03fk/s1600-h/logs0%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;logs0&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;logs0&quot; src=&quot;http://lh6.ggpht.com/-F744xfCdA-g/VDZO-W7KpZI/AAAAAAAABls/OecDnBI3Spo/logs0_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;126&quot;&gt;&lt;/a&gt;&amp;nbsp;&lt;br&gt;They are pretty self-explanative, and when it comes to a version update you will find detailed information about every step the setup does. This explains many things…for instance, did you know that the 2013.3 update which enabled Test Suites and Test Plans customisation has much of its foundations in the Update 2 bits?&lt;/p&gt;  </description>
        <pubDate>Thu, 09 Oct 2014 08:57:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/10/09/logs-logs-logs/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/10/09/logs-logs-logs/</guid>
      </item>
    
      <item>
        <title>Hitting the limit on a Local Workspace</title>
        <description>&lt;p&gt;Everybody remember the introduction of the local workspaces in 2012, enabling offline scenarios with Team Foundation Server. But did you know they have a limit on the number of files prior to performance degradation?&lt;/p&gt; &lt;p&gt;This limit is 100000 elements.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;code&gt;TF401190: The local workspace temp_WS;User has 248536 items in it, &lt;br&gt;which exceeds the recommended limit of 100000 items. To improve &lt;br&gt;performance, either reduce the number of items in the workspace, &lt;br&gt;or convert the workspace to a server workspace.&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;There it is. It’s not a bug, but it is a design choice by the Team Foundation Server team.&lt;/p&gt; &lt;p&gt;Local workspaces work leveraging the content of the hidden $tf folder, which tracks all the changes for a file (deltas) from check-out to check-in. That’s how you get features like &lt;a href=&quot;http://mattvsts.blogspot.co.uk/2012/11/candidate-changes-with-local-workspaces.html&quot;&gt;Candidate Changes&lt;/a&gt;. The side effect is that despite the source copy is compressed, it is still a copy, hence you have a physically bigger workspace. &lt;/p&gt; &lt;p&gt;The workarounds in this case is to use a server workspace (easy) or to split the huge, monolithic workspace into several smaller workspace so you won’t hit the issue. This could be harder than just using a server workspace, but with a bit of planning it is absolutely feasible.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://blogs.msdn.com/b/phkelley/archive/2013/05/29/server-workspaces-vs-local-workspaces.aspx&quot;&gt;This post&lt;/a&gt; by Philip Kelley is extremely enlightening, as it is a deep comparison between local and server workspaces. Right there he explains the differences, and how they are implemented (the PendChange permission, the +R bit, etc.).&lt;/p&gt;  </description>
        <pubDate>Tue, 23 Sep 2014 09:21:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/09/23/hitting-limit-on-local-workspace/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/09/23/hitting-limit-on-local-workspace/</guid>
      </item>
    
      <item>
        <title>Application Insights: what’s going on?</title>
        <description>I guess it has been a little overlooked, but there is&lt;strong&gt; a lot&lt;/strong&gt; of moving around Application Insights…&lt;br /&gt;The biggest thing is that with Visual Studio 2013 Update 3, Application Insights is moving towards version 2.0. It’s not a mere version change…&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-ISqWakedubo/VBcEdwodFOI/AAAAAAAABkM/OggreFOBDtw/s1600/ai0.PNG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-ISqWakedubo/VBcEdwodFOI/AAAAAAAABkM/OggreFOBDtw/s1600/ai0.PNG&quot; height=&quot;323&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Application Insights &lt;strong&gt;is being moved to Microsoft Azure&lt;/strong&gt;, and 2.0 is the first version of it. The move is not complete yet, so the 1.3.2 version – running on Visual Studio Online – works, and it contains all the current feature set, but bear in mind that they are “&lt;a href=&quot;http://azure.microsoft.com/en-us/documentation/articles/app-insights-get-started/&quot;&gt;&lt;em&gt;rebuilding it from the ground up as part of Microsoft Azure&lt;/em&gt;&lt;/a&gt;”.&lt;br /&gt;If you want to understand which version you are running, just check the &lt;strong&gt;ApplicationInsights.config&lt;/strong&gt; file: if it contains a &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/dn793604.aspx&quot;&gt;schemaVersion&lt;/a&gt;, then you are using the 2.0 release.&lt;br /&gt;The Azure version lacks several features at the moment (Windows Store and Windows Phone apps monitoring, different APIs) and there are a couple of architectural changes, most notably the agent-free performance monitoring.&lt;br /&gt;But &lt;strong&gt;it does not mean you are losing anything&lt;/strong&gt;: it was in preview on VSO, it is in preview on Azure, and you can use both. If your application or service is configured to send data to the 1.3.2 version, this is not changing as there is no automatic upgrade.&lt;br /&gt;There is only one thing to consider: if you remove the 2.0 package and you restore the 1.3.2 one, you cannot return to the 2.0 without &lt;strong&gt;repairing&lt;/strong&gt; the Visual Studio installation.</description>
        <pubDate>Sat, 20 Sep 2014 06:39:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/09/20/application-insights-whats-going-on/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/09/20/application-insights-whats-going-on/</guid>
      </item>
    
      <item>
        <title>Again, again and again on the backups</title>
        <description>&lt;p&gt;This is a topic which I find coming back every now and then: backups of the Team Foundation Server.&lt;/p&gt; &lt;p&gt;Team Foundation Server is a &lt;strong&gt;SQL Server-based product&lt;/strong&gt; – hence most of the backups’ work happens there. Full, Copy Only, Differential, Transaction Log: choose your flavour, as long as you are confident it’s good.&lt;/p&gt; &lt;p&gt;IMHO it is a good practice to keep things simple: a daily Full Backup with hourly Transaction Logs Backups provide a good level of protection without involving the (IMHO) complicated Differential Backups.&lt;/p&gt; &lt;p&gt;If you can, &lt;strong&gt;use the OOB &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/bb552295.aspx&quot;&gt;tool&lt;/a&gt;&lt;/strong&gt;: it is mature enough to do its job without too many worries. But if you happen to need a manual backup, there are a couple of information to keep in mind…&lt;/p&gt; &lt;p&gt;In order to be supported by the Microsoft CSS your backups &lt;strong&gt;must&lt;/strong&gt; be synchronized – no exceptions. The safest way of doing that, as it required manual interaction with the TFS databases, is to follow &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms253070.aspx&quot;&gt;this&lt;/a&gt; MSDN walkthrough. I introduced a slight &lt;a href=&quot;http://mattvsts.blogspot.co.uk/2014/08/tfs-transaction-marking-on-sql-server.html&quot;&gt;modification&lt;/a&gt; as I manage a big deployment which uses SQL Server AlwaysOn, which is just the verification of the preferred backup instance, but the core steps are the same.&lt;/p&gt; &lt;p&gt;The reason behind that is pretty simple: the Team Project Collection databases refer to objects (like IDs, or &lt;strong&gt;identities&lt;/strong&gt;) stored in the &lt;strong&gt;TFS_Configuration&lt;/strong&gt; database. If you restore a Team Project Collection database which contains something not aligned with the Configuration DB, it is going to end badly…&lt;/p&gt; &lt;p&gt;And remember to test the restore – otherwise you &lt;strong&gt;do not &lt;/strong&gt;have a backup &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh6.ggpht.com/-PaQjOWolgvU/VBIM2vEdS1I/AAAAAAAABj8/XPLI1lZJ-WI/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt;  </description>
        <pubDate>Thu, 11 Sep 2014 20:58:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/09/11/again-again-and-again-on-backups/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/09/11/again-again-and-again-on-backups/</guid>
      </item>
    
      <item>
        <title>TFS Transaction Marking on SQL Server AlwaysOn Data Tier</title>
        <description>&lt;p&gt;If you need to manually backup the Team Foundation Server – you might have several reasons for not using the OOB tool – you need to follow &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms253070.aspx&quot;&gt;this&lt;/a&gt; walkthrough on MSDN.&lt;/p&gt; &lt;p&gt;What I’d like to share is a small script you might use while you have to backup your Team Foundation Server running on an &lt;strong&gt;AlwaysOn&lt;/strong&gt;-backed Data Tier.&lt;/p&gt; &lt;p&gt;I created a hourly job in both nodes, running &lt;strong&gt;one minute prior&lt;/strong&gt; to the Transaction Log Backup job, as it follows:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-ZT4oHjXy1Bg/U_721lA3e8I/AAAAAAAABjk/-gPIF0CT028/s1600-h/image%25255B6%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-AG_2o2GL79Q/U_722Ejd0FI/AAAAAAAABjo/wCEFqGPA2bo/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;218&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;In our case, we backup the Primary Replica, so before initiating the transaction I check for the preferred Replica. If it is 1, it’s the primary, otherwise it is the secondary (2) or it is resolving (0), both cases where my job cannot run.&lt;/p&gt; &lt;p&gt;It might be a little bit overzealous, because if you run the very same job on a non-preferred Replica (the secondary in our case) you are going to get an execution error stating the databases are read-only, but better safe than sorry!&lt;/p&gt;  </description>
        <pubDate>Thu, 28 Aug 2014 09:31:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/08/28/tfs-transaction-marking-on-sql-server/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/08/28/tfs-transaction-marking-on-sql-server/</guid>
      </item>
    
      <item>
        <title>Why is my Incremental Analysis Database Sync going on forever?</title>
        <description>&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;a href=&quot;file:///C:/Users/memili/AppData/Local/Temp/WindowsLiveWriter1286139640/supfilesD99F3834/image[3].png&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;/a&gt;Sometimes it happens...&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; margin-left: 1em; margin-right: 1em; text-align: left;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-Qrq2Nj5dl2Q/U_Sw8MV9tGI/AAAAAAAABjU/XSLv5no1FB0/s1600/process.PNG&quot; height=&quot;217&quot; width=&quot;400&quot; /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;And that’s just because I stopped it. Why does it happen?&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;The &lt;a href=&quot;file:///C:/Users/granth/Desktop/AdminReportPack/#Four&quot;&gt;&lt;span style=&quot;color: #3778cd;&quot;&gt;reason&lt;/span&gt;&lt;/a&gt; is  pretty easy: if the job is running, but you have a network problem&amp;nbsp;– an outage,  like it happened to me&amp;nbsp;– the TFS Job Agent might&amp;nbsp;not report the state and it may  goes on for hours, even if it has released all the resource locks.&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;You can safely stop the job by invoking the Web Service on the TFS  Application Tier&amp;nbsp;– you’ll need to set the  &lt;strong&gt;SetAnalysisJobEnabledState&lt;/strong&gt;&amp;nbsp;to &lt;strong&gt;FullyDisabled&lt;/strong&gt;  first and then to &lt;strong&gt;Enabled &lt;/strong&gt;in order to restart with the next  scheduled job.&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;And remember&amp;nbsp;– do &lt;strong&gt;NOT &lt;/strong&gt;process the TFS_Analysis OLAP cube  with SSMS, as it is &lt;strong&gt;not supported&lt;/strong&gt; by the Microsoft CSS.&lt;/div&gt;</description>
        <pubDate>Wed, 20 Aug 2014 14:32:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/08/20/why-is-my-incremental-analysis-database/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/08/20/why-is-my-incremental-analysis-database/</guid>
      </item>
    
      <item>
        <title>How did I learn to get on well with Git</title>
        <description>&lt;p&gt;Who knows me certainly know I am not the biggest…err…fan of Git &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh3.ggpht.com/-H3Bcr103GC4/U-vRGc-2V_I/AAAAAAAABjE/302HdmPVays/wlEmoticon-smile2.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;Thanks to &lt;a href=&quot;http://twitter.com/Alkampfer&quot;&gt;Gian Maria&lt;/a&gt; and its &lt;em&gt;continuous support&lt;/em&gt; on it I managed to understand how Git works and why it is so powerful. I am not saying it is “better than” something else – it is different and it has some pros and some cons.&lt;/p&gt; &lt;p&gt;So, it’s distributed. Distributed does not mean anarchist – it means &lt;strong&gt;distributed&lt;/strong&gt;. If you want to have some sort of centralisation, go for a &lt;strong&gt;Remote&lt;/strong&gt;. You can use it as a shared repository to be used like a central depot without losing any advantage of the DVCS concept.&lt;/p&gt; &lt;p&gt;When you &lt;strong&gt;commit&lt;/strong&gt; something is different than when you &lt;strong&gt;push&lt;/strong&gt; something. A commit is local, a push is toward a Remote.&lt;/p&gt; &lt;p&gt;A &lt;strong&gt;Git Fetch &lt;/strong&gt;gets all the objects from the Remote which are not in your local repository. A &lt;strong&gt;Git Pull&lt;/strong&gt; does more: it merges those files on your local repository, like a &lt;strong&gt;Get Latest Version.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Eventually – install &lt;a href=&quot;www.sourcetreeapp.com&quot;&gt;SourceTree&lt;/a&gt;. It’s an amazing GUI tool with a fantastic branch visualisation tool.&lt;/p&gt;  </description>
        <pubDate>Wed, 13 Aug 2014 20:56:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/08/13/how-did-i-learn-to-get-on-well-with-git/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/08/13/how-did-i-learn-to-get-on-well-with-git/</guid>
      </item>
    
      <item>
        <title>Can’t refresh the TfsOlapReport connection? Have a look at the Trusted Data Providers…</title>
        <description>&lt;p&gt;You open the SharePoint Dashboard and you suddenly see this error:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-FH8XCLhIch0/U99QNAYV8fI/AAAAAAAABio/F2-hvxH5QMw/s1600-h/image2.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-LGkaoqRyLkw/U99QNzer9VI/AAAAAAAABiw/W_5pHJ67I0o/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;176&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;An error occurred during an attempt to establish a connection to the external data source. The following connections failed to refresh. TfsOlapReport&lt;/strong&gt;  &lt;p&gt;Fair enough, something happened to the Excel Services. Does it? Actually not – and if you try opening that specific report you will see your local Excel refreshing the data and working as usual.&lt;/p&gt; &lt;p&gt;What happened?&lt;/p&gt; &lt;p&gt;That specific error is a generic refresh error in our case. I tried back and forth on all the usual suspects – SSAS permissions, &lt;a href=&quot;http://mattvsts.blogspot.co.uk/2014/05/the-tfs-excel-reports-wont-load-after.html&quot;&gt;SSS token in the file&lt;/a&gt;, SharePoint settings, even firewall ports – but nothing changed.&lt;/p&gt; &lt;p&gt;Suddenly I noticed some reports were working (the Burndown one for example) while this (Active Bugs by Priority) didn’t. So what?&lt;/p&gt; &lt;p&gt;Looking at the Connection String I saw the Burndown report had &lt;strong&gt;MSOLAP.3&lt;/strong&gt; as a provider, while the broken report was using &lt;strong&gt;MSOLAP.5&lt;/strong&gt;…&lt;/p&gt; &lt;p&gt;A quick double check on the SharePoint server (Manage Excel Services Application –&amp;gt; Trusted Data Providers) brought to the solution: &lt;strong&gt;MSOLAP.5 was not listed as a Trusted Data Provider&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Once I added MSOLAP.5 to the list everything worked as expected again and the reports were correctly showing.&lt;/p&gt;  </description>
        <pubDate>Mon, 04 Aug 2014 09:19:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/08/04/cant-refresh-tfsolapreport-connection/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/08/04/cant-refresh-tfsolapreport-connection/</guid>
      </item>
    
      <item>
        <title>Demystifying the Scrum of Scrums</title>
        <description>&lt;p&gt;The Scrum of Scrums is often saw as something ‘which grew out of control’, ‘just for Scrum Masters’ or something suited just to very large organizations.&lt;/p&gt; &lt;p&gt;It isn’t, actually…and it’s not &lt;em&gt;rocket science&lt;/em&gt;, either.&lt;/p&gt; &lt;p&gt;A Scrum of Scrums is the best possible way of clearing doubts and questions raised &lt;strong&gt;among teams&lt;/strong&gt;. It must not be merged or confused with a &lt;em&gt;bigger standup meeting&lt;/em&gt; (as I’ve heard it…) because it is something brought on by the teams’ representatives – the Scrum Masters.&lt;/p&gt; &lt;p&gt;Its scope is to get a clear understanding of the problem’s domain and provide a solution – as the Scrum Master is there &lt;strong&gt;to remove impediments&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;And yes: a Scrum of Scrums can have its own backlog, Jeff Sutherland defines the Scrum of Scrums as “&lt;em&gt;…an operational delivery mechanism&lt;/em&gt;”, so having a backlog is perfectly reasonable.&lt;/p&gt;  </description>
        <pubDate>Tue, 15 Jul 2014 20:47:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/07/15/demystifying-scrum-of-scrums/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/07/15/demystifying-scrum-of-scrums/</guid>
      </item>
    
      <item>
        <title>Why is the new VSO Stakeholder Plan a game changer?</title>
        <description>&lt;p&gt;Yesterday Brian Harry &lt;a href=&quot;http://blogs.msdn.com/b/bharry/archive/2014/07/09/upcoming-vs-online-licensing-changes.aspx&quot;&gt;announced&lt;/a&gt; the new Visual Studio Online Stakeholder Plan – basically, full access to Work Items only in Visual Studio Online (and on-premise Team Foundation Server) for everybody, free of charge.&lt;/p&gt; &lt;p&gt;I believe this is a true game changer: it’s at least four years that we talk about ‘&lt;strong&gt;involving stakeholders in the process&lt;/strong&gt;’, ‘&lt;strong&gt;synergy among the parts in the organization&lt;/strong&gt;’, &lt;strong&gt;Product Owners&lt;/strong&gt;, etc. We could do that, for a fee (the Visual Studio Online plan or the on-premise TFS CAL) but it was perceived as a bit &lt;em&gt;unfair &lt;/em&gt;against who could use that CAL/plan at full power (a developer would use all the features provided by the platform, a stakeholder certainly wouldn’t, 99% of the time).&lt;/p&gt; &lt;p&gt;Right now there are no &lt;em&gt;excuses&lt;/em&gt; anymore &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh4.ggpht.com/-c0g3SSSUr2Y/U75TgmlfQPI/AAAAAAAABiY/Y3LX-Akhurg/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt; as you can involve as many stakeholders as you wish &lt;strong&gt;without paying a penny&lt;/strong&gt;. &lt;/p&gt; &lt;p&gt;As there are &lt;a href=&quot;http://www.computer.org/csdl/mags/so/2001/04/s4058.pdf&quot;&gt;evidences&lt;/a&gt; of how involving stakeholders in the development process is a staggering improvement compared to other methodologies, it is a great opportunity to push hard on the quality pedal and starting to achieve great results!&lt;/p&gt;  </description>
        <pubDate>Thu, 10 Jul 2014 08:49:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/07/10/why-is-new-vso-stakeholder-plan-game/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/07/10/why-is-new-vso-stakeholder-plan-game/</guid>
      </item>
    
      <item>
        <title>Test Suite and Test Plan customizations in TFS 2013 Update 3 – synergic work between development and testing</title>
        <description>&lt;p&gt;IMHO the most exciting feature of &lt;a href=&quot;http://go.microsoft.com/fwlink/?LinkId=402294&quot;&gt;Team Foundation Server 2013 Update 3&lt;/a&gt;, among all its goodness, is the migration of Test Suites and Test Plans to plain Work Item Types – and the reason is pretty simple.&lt;/p&gt; &lt;p&gt;Despite all the effort spent, developers and testers still had a &lt;em&gt;tiny line&lt;/em&gt; which kept splitting them and their &lt;em&gt;worlds&lt;/em&gt;:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-O32fQdLtj0c/U7vFJPVr7iI/AAAAAAAABhQ/a22tbx4tKMw/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-9vCsMEoIw6w/U7vFJqEV7kI/AAAAAAAABhY/ROS01paKB7U/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;68&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Which eventually led to limited shared information (pinned items on the Web Access) between them. Which was a cause of pain and frustration, especially among the testers. Using Tags was a way of sorting it, but to be fair not properly the best…&lt;/p&gt; &lt;p&gt;But right now all the testing artefacts are Work Item Types – Test Plans, Suites and Cases – so you can &lt;strong&gt;query them&lt;/strong&gt; and, mostly important, you can easily &lt;strong&gt;add custom fields, rules and workflows&lt;/strong&gt; like with the existing WITs.&lt;/p&gt; &lt;p&gt;For example, I might have Test Suites with a specific &lt;strong&gt;Feature Area &lt;/strong&gt;(potentially reused across other Work Item Types) as well as a &lt;strong&gt;Planned Release &lt;/strong&gt;field. I can easily add them to the Test Suite Work Item Type:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-nD6pcsP9i6I/U7vFKNy5jCI/AAAAAAAABhg/YAP3MpyogGc/s1600-h/image%25255B9%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-9ek0ZZSgbo4/U7vFK-5_KWI/AAAAAAAABho/Bv8o2n3TsYE/image_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;644&quot; height=&quot;482&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;The cool stuff is that all of these are now queryable!&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-UK-9FAEEMUo/U7vFLZJy6CI/AAAAAAAABhs/0pCn5PFzrI0/s1600-h/image%25255B17%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-m5D2r-wu9ws/U7vFLwnVMUI/AAAAAAAABh4/dnoclfmu1Xo/image_thumb%25255B11%25255D.png?imgmax=800&quot; width=&quot;644&quot; height=&quot;215&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;…and obviously, pinnable to the team’s home page:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-pY7c_iri2W4/U7vFMfaDplI/AAAAAAAABiA/XNKeLlPK5ww/s1600-h/image%25255B20%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-71LFyR8Y8uA/U7vFMzJtjWI/AAAAAAAABiI/JJJ5UTz9bxs/image_thumb%25255B12%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;130&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;That’s why it is way easier for testers now to access and share relevant information.&lt;/p&gt;  </description>
        <pubDate>Tue, 08 Jul 2014 10:17:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/07/08/test-suite-and-test-plan-customizations/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/07/08/test-suite-and-test-plan-customizations/</guid>
      </item>
    
      <item>
        <title>TFS Audits – how to create reports on your TFS usage in five minutes or so…</title>
        <description>&lt;p&gt;Some months ago I wrote about the &lt;a href=&quot;http://mattvsts.blogspot.co.uk/2014/03/how-to-perform-tfs-security-audit.html&quot;&gt;TFS Audit Log&lt;/a&gt;, because a big part of my daily job is about governance, regulation and access management.&lt;/p&gt; &lt;p&gt;This log is very, very, &lt;strong&gt;very verbose&lt;/strong&gt; as it is a flat list of every single user and group into the Team Foundation Server’s ACLs. How to get some more meaningful information from it?&lt;/p&gt; &lt;p&gt;The basic &lt;strong&gt;Sort functions&lt;/strong&gt;, together with the &lt;strong&gt;Text to Columns&lt;/strong&gt; of Excel are a must in order to format it in the best possible way. You can then create a PivotTable and mix/match your data and the criteria you want to show:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-aQoUNuq4xYg/U7q4qODHJII/AAAAAAAABfY/V_I-DnguNu4/s1600-h/image%25255B1%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-gBW99-o1NY8/U7q4qxsEv9I/AAAAAAAABfc/CpXBBVh4xxE/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;351&quot; height=&quot;484&quot;&gt;&lt;/a&gt;&amp;nbsp; This fairly basic PivotTable is going to give you this result: &lt;a href=&quot;http://lh5.ggpht.com/-MzXtFsTOH-E/U7q4rO5K_RI/AAAAAAAABfk/Q7XHfL_Obo8/s1600-h/image5.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-tYEYpdXMPBk/U7q4rwMpjSI/AAAAAAAABfw/xfosU15Oyac/image_thumb1.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;107&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;It is basic, but it is something you can do in zero time. Add a chart to the mix and you have a nice (reusable, as you just need to replace the datasource, which is the whole original Audit Log. So in case you need to do it monthly you just need to replace the appropriate sheet and you’re done) report for understanding the ratio between users and group, without the need of complex SSRS reports or even PowerPivot.&lt;/p&gt; &lt;p&gt;Then for instance…if I want to get a text document with all the users contained in each TFS group, the only command I need to launch is &lt;strong&gt;tfssecurity /imx&lt;/strong&gt;. As I have hundreds of groups it is quite…long for a manual interaction. So, I’d create a text file with all the groups - copy, paste from the original audit log, one for each line – and then launch the following command from the Visual Studio Command Prompt:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;for /f &quot;tokens=* delims=,&quot; %l in (&amp;lt;path to groups.txt&amp;gt;) do tfssecurity /imx &quot;%l&quot; /server:&lt;/strong&gt;&lt;a href=&quot;http://&amp;lt;tfs&quot;&gt;&lt;strong&gt;http://&amp;lt;tfs&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&amp;gt;:8080 &amp;gt;&amp;gt; &amp;lt;path to mygroupaudit.txt&amp;gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;this simple command is going to execute tfssecurity /imx for each group and, thanks to the &amp;gt;&amp;gt; sign it is going to append the tfssecurity’s output to the mygroupaudit.txt file. I usually launch it on an unattended machine and keep it running on the background until it finishes.&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Then in order to get a basic but polished report, open the resulting file in Word, and change the font setting to &lt;strong&gt;Bold&lt;/strong&gt; for these four lines, except for the very first on top which are IMHO useful for a nice presentation:&lt;/p&gt; &lt;p&gt;&lt;b&gt;Done.&lt;br&gt;&lt;/b&gt;&lt;b&gt;Microsoft (R) TFSSecurity - Team Foundation Server Security Tool&lt;br&gt;&lt;/b&gt;&lt;b&gt;Copyright (c) Microsoft Corporation. All rights reserved.&lt;br&gt;&lt;/b&gt;&lt;b&gt;The target Team Foundation Server is &lt;a href=&quot;http://&amp;lt;tfs&amp;gt;:8080/&quot;&gt;http://&amp;lt;tfs&amp;gt;:8080/&lt;/a&gt;.&lt;/b&gt;&lt;/p&gt; &lt;p&gt;Word has a very useful feature for this needs: &lt;strong&gt;select text with similar formatting&lt;/strong&gt;. Do that and wipe those lines away! You’ll get something neat and polished – change fonts, and add whatever else you need and you’ll get an Audit Report in five minutes :)&lt;/p&gt; &lt;p&gt;Of course it’s possible to use that file in a better way, but these basic tips will give you &lt;em&gt;something&lt;/em&gt; in a near-to-none time!&lt;/p&gt; &lt;p&gt;Going slightly deeper in the reporting technologies – PowerPivot is perfect for that. You just need to load the .csv file and you have a dynamic model perfect for drill-down queries. With this:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-oVneKHIMOwk/U7q4sRYwvJI/AAAAAAAABf0/IV7roQ_F2nI/s1600-h/image%25255B4%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-oxvRHpBPoV0/U7q4tDiSPHI/AAAAAAAABgA/h13x2_g_GBw/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;137&quot;&gt;&lt;/a&gt; you’re going to get this chart: &lt;a href=&quot;http://lh3.ggpht.com/-TlyzGKcaAwY/U7q4tuCWQHI/AAAAAAAABgI/7QB7mwEubW8/s1600-h/image%25255B18%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-1i9bmglt7sw/U7q4uA5mWOI/AAAAAAAABgQ/gUH9YqkYaUk/image_thumb%25255B14%25255D.png?imgmax=800&quot; width=&quot;550&quot; height=&quot;345&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;which is pretty basic. But what if you want to know how many users with &lt;strong&gt;Full Access &lt;/strong&gt;(which require a CAL as we know) accessed the server on a specific date…well, you can create a chart having &lt;strong&gt;Last Accessed UTC&lt;/strong&gt; on the Axis as well as on a &lt;strong&gt;Slicer&lt;/strong&gt;, so you can filter your timeframe – and &lt;strong&gt;Sum of Full&lt;/strong&gt; on the Values:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-ua3gTuCxJBE/U7q4u9iaoMI/AAAAAAAABgY/CYQwsu0oj0o/s1600-h/image%25255B23%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-JRf1ROAZ8i0/U7q4vuKYSVI/AAAAAAAABgg/ZUvhm3MyIwM/image_thumb%25255B17%25255D.png?imgmax=800&quot; width=&quot;644&quot; height=&quot;272&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;But as it is PowerPivot, you can drill down as you wish…so if from my dates selection I select just today at 13:09 (where this is the only access for today on this test instance, by me) and I drill down by Display Name what I get is …&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-5UtBmBAN4Lg/U7q4wOW4j1I/AAAAAAAABgo/-tXT4JFH0_c/s1600-h/image%25255B39%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-DXLAESZiJI0/U7q4w7RbN6I/AAAAAAAABgs/TxRkbqGjNdc/image_thumb%25255B27%25255D.png?imgmax=800&quot; width=&quot;644&quot; height=&quot;234&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;…a big pie with just me as a value:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-kwmh3zvN0jk/U7q4xRl0GeI/AAAAAAAABg0/QhKDqeZlYA0/s1600-h/image%25255B44%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-mKHVZ5ivJy4/U7q4yKGf7HI/AAAAAAAABhA/vro28MHtEng/image_thumb%25255B30%25255D.png?imgmax=800&quot; width=&quot;644&quot; height=&quot;203&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;These are just easy samples, but as soon as you get that this csv data is a data source…the whole reporting world will welcome you!&lt;/p&gt;  </description>
        <pubDate>Mon, 07 Jul 2014 15:12:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/07/07/tfs-audits-how-to-create-reports-on/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/07/07/tfs-audits-how-to-create-reports-on/</guid>
      </item>
    
      <item>
        <title>Visual Studio Online and Service Hooks!</title>
        <description>&lt;p&gt;Despite Visual Studio Online is a Cloud Service – so something you do not have on-premise and where you have limited room for customization – it has been recently updated with a critical feature: Service Hooks.&lt;/p&gt; &lt;p&gt;A Service Hook is, like the name describes, a way to integrate 3rd party services with Visual Studio Online. They are based on the REST APIs &lt;a href=&quot;http://www.visualstudio.com/integrate/reference/reference-vso-overview-vsi&quot;&gt;provided by VSO&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Let’s say we want to leverage on customers’ feedback like Microsoft does, using UserVoice. It is a great way of interacting with our users – so why not? We are using Visual Studio Online as our ALM platform: how can we accomplish this mission?&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-Y-LCKNFVX8Y/U7KUwL86r3I/AAAAAAAABbg/JVsi5BnVzyQ/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-8htv1wJvS4o/U7KUwtJ-xZI/AAAAAAAABbo/oclVLFoyAFA/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;77&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;It is easy actually, but you’d be stopped up front by Visual Studio Online when you try to create a new Service Hook to UserVoice:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-f5s7ABiOpJo/U7KUxToxuMI/AAAAAAAABbw/adqEWvDawV0/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-pMjjysrgxXQ/U7KUx4zTCMI/AAAAAAAABb4/XgtaGyKVs1g/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;244&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;em&gt;“The &lt;strong&gt;Next&lt;/strong&gt; button is blocked? Why? I thought it was easy!”&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Again: it is! But if you read, it says “&lt;strong&gt;Subscriptions for this service must be created and managed at uservoice.com&lt;/strong&gt;.” which means “Service Hooks can be bidirectional, and this service isn’t.” No big deal anyway, because once we logon to UserVoice we are going to find this under &lt;strong&gt;Settings –&amp;gt; Integrations&lt;/strong&gt;…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-egryHzwzi8w/U7KUyZyod_I/AAAAAAAABcA/AK0kE8sb40E/s1600-h/image%25255B8%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-pl4IWdd3ymc/U7KUy6rihmI/AAAAAAAABcI/cfbescL9Q8I/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;205&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Easy peasy. Just link your Visual Studio Online account…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-2MBWMxEiTFg/U7KUzuf13CI/AAAAAAAABcQ/R9xjABy55gs/s1600-h/image%25255B11%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-e0Um2ubATVo/U7KU0Qr4KrI/AAAAAAAABcY/TB8sYe1ZgdE/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;241&quot;&gt;&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://lh5.ggpht.com/-A3Iln5YZw_E/U7KU1HfOKRI/AAAAAAAABcg/wYBQvlPwBOI/s1600-h/image%25255B14%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-pzZ7PZJFdB4/U7KU1pOCHpI/AAAAAAAABck/QPG0ZMVo00s/image_thumb%25255B4%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;164&quot;&gt;&lt;/a&gt; &lt;a href=&quot;http://lh3.ggpht.com/-4jUfN5BqD-o/U7KU1xlJQbI/AAAAAAAABcs/7SPhEoGzGmA/s1600-h/image%25255B20%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-HJbv2LBIVm8/U7KU2hWbD1I/AAAAAAAABc4/jPSMYYgZlP8/image_thumb%25255B6%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;139&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Once you are authenticated you can define which Work Item Types are going to be mapped to UserVoice ideas, and in which Team Project of course:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-EYGdJlS9Q-k/U7KU3PmLe_I/AAAAAAAABdA/JYFdJ2kS8HI/s1600-h/image%25255B23%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-insd0Lfff5Q/U7KU3q_9nFI/AAAAAAAABdI/bZ0s01DOlfw/image_thumb%25255B7%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;65&quot;&gt;&lt;/a&gt; &lt;a href=&quot;http://lh3.ggpht.com/-qpZ3ByBMRiI/U7KU4dX_l-I/AAAAAAAABdQ/JruHGMInOoU/s1600-h/image%25255B26%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-1Pyq0mkxlew/U7KU428XU1I/AAAAAAAABdY/l-fbGMSCjK4/image_thumb%25255B8%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;47&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;…and that’s all!&lt;/p&gt; &lt;p&gt;Refreshing the Visual Studio Online Project Administration page will show the new subscription – it is managed on UserVoice so VSO is &lt;em&gt;just a client, &lt;/em&gt;but of course you can check it from VSO as well!&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-0EnNK4R-FeA/U7KU5nozh4I/AAAAAAAABdg/x3FUEHrxt4g/s1600-h/image%25255B29%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-MU9PbxN5tUM/U7KU6GP2t8I/AAAAAAAABdo/4lCgPRtgaCI/image_thumb%25255B9%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;52&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;It just means that in case you’d try to edit the Subscription, you’re going to get this error:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-EYaK0N3XNYs/U7KU6xJvaQI/AAAAAAAABds/zXluV4_sHK0/s1600-h/image%25255B44%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-hw_tDcu2FAI/U7KU7oLiUkI/AAAAAAAABd4/qPxLUsxgc7o/image_thumb%25255B14%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;96&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;because you need to manage it from UserVoice. Nothing serious though.&lt;/p&gt; &lt;p&gt;As soon as we start receiving feedbacks, we can promote them to Work Items:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-WHVJzMprDWQ/U7KU8LLfNPI/AAAAAAAABeA/qkum10O-oh8/s1600-h/image%25255B17%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-KINNZmKckn4/U7KU8spX7NI/AAAAAAAABeI/mgl1kiHUsGc/image_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;71&quot;&gt;&lt;/a&gt; &lt;a href=&quot;http://lh4.ggpht.com/-uZRdkD0gg2Y/U7KU9TAMkBI/AAAAAAAABeQ/VCWWxUTwtVY/s1600-h/image%25255B32%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-Bi1hE-ionXg/U7KU-CPhMnI/AAAAAAAABeY/4whWMx0KujQ/image_thumb%25255B10%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;63&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-QoUMYPu0Cfg/U7KU-uWUAxI/AAAAAAAABeg/HVgOX-UKos0/s1600-h/image%25255B35%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-4fkKKc70iR4/U7KU_LNNz2I/AAAAAAAABeo/ovP7YguIbw4/image_thumb%25255B11%25255D.png?imgmax=800&quot; width=&quot;239&quot; height=&quot;244&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;And eventually we are going to get them in our selected Team Project. I can open it straight from UserVoice as well!&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-cR0gjxjQPcA/U7KU_rTlSVI/AAAAAAAABew/9BkOb_ptBpM/s1600-h/image%25255B38%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-VP-92OSKQEk/U7KVAf-syiI/AAAAAAAABe4/c81clC7w890/image_thumb%25255B12%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;109&quot;&gt;&lt;/a&gt; &lt;a href=&quot;http://lh6.ggpht.com/-5gXWQj1lQ_E/U7KVA9_4e1I/AAAAAAAABfA/ASgbvU6K3EU/s1600-h/image%25255B41%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-ajTFdcYZEPQ/U7KVBsr4t5I/AAAAAAAABfI/iyoNnjRonYI/image_thumb%25255B13%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;130&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;And keep in mind – you can extend it even more as Visual Studio Online is already set for &lt;strong&gt;Web Hooks&lt;/strong&gt;, which means &lt;strong&gt;&lt;a href=&quot;http://www.visualstudio.com/get-started/webhooks-and-vso-vs&quot;&gt;your own service&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;  </description>
        <pubDate>Tue, 01 Jul 2014 11:01:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/07/01/visual-studio-online-and-service-hooks/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/07/01/visual-studio-online-and-service-hooks/</guid>
      </item>
    
      <item>
        <title>Review – Professional Team Foundation Server 2013</title>
        <description>&lt;a href=&quot;http://lh4.ggpht.com/-Lzx7In0s1jY/U7HfnMCW13I/AAAAAAAABbI/bfY0HZRcG00/s1600-h/WP_20140630_22_53_11_Pro%25255B7%25255D.jpg&quot;&gt;&lt;img alt=&quot;WP_20140630_22_53_11_Pro&quot; border=&quot;0&quot; src=&quot;http://lh5.ggpht.com/-IXadbYCHF98/U7Hfnm_FEZI/AAAAAAAABbQ/Z15hCM2aUck/WP_20140630_22_53_11_Pro_thumb%25255B4%25255D.jpg?imgmax=800&quot; height=&quot;484&quot; style=&quot;background-image: none; border: 0px currentColor; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;WP_20140630_22_53_11_Pro&quot; width=&quot;274&quot; /&gt;&lt;/a&gt;&lt;br /&gt;It is The Book. It’s the book you should have on your desk, library, shelve, whatever if you are working with Team Foundation Server.&lt;br /&gt;I can describe it as a the most comprehensive book on the matter, the go-to reference when you need to plan/understand/troubleshoot something on TFS.&lt;br /&gt;The 2013 edition is even better than the last year’s one, covering Git and the Distributed Version Control System, Visual Studio Release Management and all the new stuff of the latest version – Visual Studio Online included.&lt;br /&gt;Everything is very smooth and in deep as you’d expect – you won’t find generic stuff or something about Visual Studio or MTM. If you are searching for them, you should see other books. It is not a pure &lt;em&gt;beginners’&lt;/em&gt; book: the planning section for example is very specific. &lt;br /&gt;But even if you are a regular user, you are going to get a lot of value from the book. I strongly suggest it to everybody, from who uses TFS every day who wants to understand what goes on behind the scenes to the hard-core Team Foundation Server Administrator.</description>
        <pubDate>Mon, 30 Jun 2014 21:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/06/30/review-professional-team-foundation/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/06/30/review-professional-team-foundation/</guid>
      </item>
    
      <item>
        <title>How to use PowerShell DSC with Visual Studio Release Management</title>
        <description>&lt;p&gt;After the brief introduction earlier this month it is now time to push forward – let’s see how the Update 3 CTP of Visual Studio Release Management enables you to push your DSC scripts to the target machines.&lt;/p&gt; &lt;p&gt;Firstly, the script. To keep things simple, I decided to deploy my script in an independent build and then leverage on VSRM for the deployment – no build template integration.&lt;/p&gt; &lt;div id=&quot;scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:1f4863b1-6932-4a10-8943-fd3c1894731b&quot; class=&quot;wlWriterEditableSmartContent&quot; style=&quot;float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot;&gt;&lt;pre style=white-space:normal&gt;&lt;br /&gt;[sourcecode language=&apos;powershell&apos; ]&lt;br /&gt;Configuration DemoAppConfig&lt;br /&gt;{&lt;br /&gt;    param($servers=&amp;quot;localhost&amp;quot;,&lt;br /&gt;    [String]$SourcePath = &apos;\\dtfsat\Build&apos;,&lt;br /&gt;    [String]$AppPath = &apos;C:\AppPath&apos;&lt;br /&gt;    )&lt;br /&gt;    Node $servers&lt;br /&gt;    {&lt;br /&gt;        File CopyApp&lt;br /&gt;        {&lt;br /&gt;        Ensure = &apos;Present&apos;&lt;br /&gt;        Type = &amp;quot;Directory&amp;quot;&lt;br /&gt;        Recurse = $true&lt;br /&gt;        SourcePath = $SourcePath&lt;br /&gt;        DestinationPath = $AppPath&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;DemoAppConfig&lt;br /&gt;&lt;br /&gt;[/sourcecode]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Then we can create a new &lt;strong&gt;Standard Environment:&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-0GoYTFRcjEc/U6Ft-UILH_I/AAAAAAAABZw/NI55GdICkZo/s1600-h/image%25255B6%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-qCmKDtBYGjY/U6Ft-8t6UKI/AAAAAAAABZ0/CouYxqev-Jk/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;15&quot;&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;which is going to contain our &lt;strong&gt;agentless target server&lt;/strong&gt;. To configure a target server, you’d need to run &lt;strong&gt;Enable-PSRemoting –force &lt;/strong&gt;and &lt;strong&gt;winrm qc –transport:HTTP&lt;/strong&gt; from PowerShell.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;This server must be added using the FQDN and the listener port – the 5985 is the default port used by the HTTP listener.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-jroYi0oEx-U/U6Ft_aqUdsI/AAAAAAAABaA/3O3wBGAHFfE/s1600-h/image%25255B12%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-vqdXDQ9vYzQ/U6Ft_1rgP3I/AAAAAAAABaI/HYMGmQPxNX8/image_thumb%25255B4%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;182&quot;&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;This server is always going to be in a &lt;strong&gt;Ready&lt;/strong&gt; status as long as there are the required permissions in place. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;The only missing bits are the Component and the Release Template. As mentioned, the Component is going to be picked from an external network share (the build drop location) and used as-is. This is just for this sample anyway, the standard Build Definition used by VSRM would work as usual. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;The big difference stands in the Deployment Tool used for the component – it is going to be &lt;strong&gt;Run PowerShell on Standard Environment&lt;/strong&gt;, which provides all the facilities for running the DSC script:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-vv90O8mgIyY/U6FuAcH2N2I/AAAAAAAABaQ/x6a-iAu0PPs/s1600-h/image%25255B15%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-ZbHWoW4MLJo/U6FuA-3zSOI/AAAAAAAABaU/TQSp_KEssKE/image_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;89&quot;&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;This is going to be our single entrypoint for running DSC script. Moreover – if you look at the Release Template toolbox it is quite…empty:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-Nx_shb-0RZs/U6FuBD7GvQI/AAAAAAAABag/H41tUPuy6h0/s1600-h/image%25255B18%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-W5EDDiLbi5k/U6FuBwMuUuI/AAAAAAAABak/rcm5z854XeI/image_thumb%25255B6%25255D.png?imgmax=800&quot; width=&quot;178&quot; height=&quot;244&quot;&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;But it would work like a charm :) The Deployment Sequence is going to be pretty lean as well: invoking the Component’s deployment for the target server – and that’s all:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-W80THvtI124/U6FuCFI4AuI/AAAAAAAABaw/0k-TO3tw7_c/s1600-h/image%25255B21%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-VV6T5xoNy40/U6FuCyoMdCI/AAAAAAAABa4/vmGuE02kWek/image_thumb%25255B7%25255D.png?imgmax=800&quot; width=&quot;235&quot; height=&quot;244&quot;&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;This is what you are going to need to create a basic DSC-based deployment using Visual Studio Release Management. No rocket science required!&lt;/p&gt;  </description>
        <pubDate>Wed, 18 Jun 2014 10:46:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/06/18/how-to-use-powershell-dsc-with-visual/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/06/18/how-to-use-powershell-dsc-with-visual/</guid>
      </item>
    
      <item>
        <title>A quick look at the Team Foundation Server’s permissions inheritance</title>
        <description>&lt;p&gt;Straight with the sample – why does it happen…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-vWgjMx7xizk/U48rWrpuSXI/AAAAAAAABZI/NvEqT_v6pE8/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-TjpqJD5XywE/U48rXMKFeaI/AAAAAAAABZQ/j505A1PWj9o/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;221&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;…even if my user is a &lt;strong&gt;Project Administrator&lt;/strong&gt;?&lt;/p&gt; &lt;p&gt;Because the single user’s permission are less important than the Team’s one – and as in this team there is a explicit deny on that permission (Edit project-level information) even if he is an Administrator he is going to get a deny.&lt;/p&gt; &lt;p&gt;Indeed…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-InX7dDMiPK8/U48rX_ybjOI/AAAAAAAABZY/XztxgwGpABw/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-pC9EnLtUy9c/U48rYXnav5I/AAAAAAAABZg/x1iMGzOzlQc/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;210&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;That’s because you can be the CEO, but you won’t be allowed to change the delete the Team Project on your own if you’d be fired, for example :)&lt;/p&gt;  </description>
        <pubDate>Wed, 04 Jun 2014 14:21:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/06/04/a-quick-look-at-team-foundation-servers/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/06/04/a-quick-look-at-team-foundation-servers/</guid>
      </item>
    
      <item>
        <title>PowerShell DSC – extreme automation in a DevOps world</title>
        <description>&lt;p&gt;Release Management &lt;strong&gt;Update 3 CTP1&lt;/strong&gt; introduces support to &lt;strong&gt;PowerShell Desired State Configuration&lt;/strong&gt; to deploy applications in your environments – this is utterly cool, but…&lt;strong&gt;why&lt;/strong&gt;?&lt;/p&gt; &lt;p&gt;Before looking at VSRM itself, I think a bit of introduction to DSC is needed.&lt;/p&gt; &lt;p&gt;PowerShell Desired State Configuration is a &lt;strong&gt;new management platform&lt;/strong&gt; built-in in Windows and based on, guess what, &lt;strong&gt;PowerShell&lt;/strong&gt;. It can do a bunch of useful tasks, which I leave to the &lt;a href=&quot;http://technet.microsoft.com/en-us/library/dn249912.aspx&quot;&gt;documentation&lt;/a&gt; because I just want to dig into the core concepts.&lt;/p&gt; &lt;p&gt;As it is built-in in Windows, &lt;strong&gt;it is &lt;em&gt;agentless&lt;/em&gt;&lt;/strong&gt;. Well actually the agent is inside PowerShell and Windows Management Framework, but for our purpose (deployments) we can consider whatever system running &lt;strong&gt;PowerShell 4.0+&lt;/strong&gt; (so Windows Server 2008 R2 and above, just by installing PS 4.0 and WMF 4.0) a &lt;strong&gt;DSC-capable system.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;All of that goodness relies on a keyword – &lt;strong&gt;Configuration&lt;/strong&gt;. If you set a Configuration block at the beginning of the script, you are invoking DSC. &lt;/p&gt; &lt;p&gt;DSC uses a .mof file which is created by the script itself, so after creating and running the script you just need to call Start-DscConfiguration with the appropriate parameters.&lt;/p&gt; &lt;p&gt;Let’s see a code snippet, it is very easy to use &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh4.ggpht.com/-HQcb_i92FEQ/U4rJEenYfII/AAAAAAAABY4/_n3w8ICbnfU/wlEmoticon-smile2.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;div id=&quot;scid:9D7513F9-C04C-4721-824A-2B34F0212519:4cd40a9b-558f-4e97-b750-1424166ba5d7&quot; class=&quot;wlWriterEditableSmartContent&quot; style=&quot;float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot;&gt;&lt;pre style=&quot; width: 450px; height: 329px;background-color:White;overflow: auto;&quot;&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Configuration InstallFX35_45&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #0000FF;&quot;&gt;param&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #800080;&quot;&gt;$servers&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;localhost&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;)&lt;br /&gt;    Node &lt;/span&gt;&lt;span style=&quot;color: #800080;&quot;&gt;$servers&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;    {&lt;br /&gt;        WindowsFeature Net&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Framework&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Core&lt;br /&gt;        {&lt;br /&gt;            Ensure &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;Present&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;            Name &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;Net-Framework-Core&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        WindowsFeature Net&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Framework&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;45&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Core&lt;br /&gt;        {&lt;br /&gt;            Ensure &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;Present&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;            Name &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;Net-Framework-45-Core&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn&apos;s Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Here it is. The Configuration block is called &lt;strong&gt;InstallFX35_45&lt;/strong&gt; – it will check for the .NET Frameworks 3.5 and 4.5 on the target servers (or on just localhost if not specified) and, if any of them are not present at runtime, it would automatically trigger the installation of what’s missing via &lt;strong&gt;Install-WindowsFeature&lt;/strong&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;We just have to launch it, to get the .mof file, and invoking &lt;strong&gt;Start-DscConfiguration&lt;/strong&gt;:&lt;/p&gt;&lt;br /&gt;&lt;div id=&quot;scid:9D7513F9-C04C-4721-824A-2B34F0212519:5f32474b-5c36-4c7e-90de-8c66008ad32d&quot; class=&quot;wlWriterEditableSmartContent&quot; style=&quot;float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot;&gt;&lt;pre style=&quot; width: 542px; height: 32px;background-color:White;overflow: auto;&quot;&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style=&quot;color: #000000;&quot;&gt;InstallFX35_45 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;servers &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;PTFSDT&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;PTFSAT&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;Start&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DscConfiguration &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Wait &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Verbose &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Path .\InstallFX35_45&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn&apos;s Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Everything is &lt;strong&gt;handled by the OS&lt;/strong&gt; – so what we should care about is the whole configuration, nothing else. This specific solution addresses almost all the needs we might face in a DevOps environment – and in a very robust way! &lt;/p&gt;&lt;br /&gt;&lt;p&gt;DSC scripts are &lt;strong&gt;idempotent&lt;/strong&gt; – so you can reapply a change and get to your desired state (hence the name…) regardless of the current status. No complex logic for catching exceptions or incremental changes – all is handled by the underlying infrastructure.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;You can use DSC for installing roles, services, interacting with IIS, copying files…all from PowerShell, and in a &lt;strong&gt;completely reproducible environment&lt;/strong&gt;. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;The PowerShell team released a very handy &lt;strong&gt;Resource Kit&lt;/strong&gt;, to get started with DSC and, eventually, DevOps – you can download it &lt;a href=&quot;http://gallery.technet.microsoft.com/scriptcenter/DSC-Resource-Kit-All-c449312d&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;.&lt;/p&gt;  </description>
        <pubDate>Sun, 01 Jun 2014 06:32:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/06/01/powershell-dsc-extreme-automation-in/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/06/01/powershell-dsc-extreme-automation-in/</guid>
      </item>
    
      <item>
        <title>Shared Parameters in Web Test Case Management</title>
        <description>&lt;p&gt;With the latest Team Foundation Server update (2013.2) we get a very useful feature in Web Test Case Management – Shared Parameters.&lt;/p&gt; &lt;p&gt;We had it in MTM, but not in the web. Right now instead I can write a generic Test Case and populate its values from the Web Access as well:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-TiI8f7KNcww/U39UWz8jMpI/AAAAAAAABX0/we7QGcwZplM/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-AC8E5LoLAfA/U39UXUHXEkI/AAAAAAAABX8/1t2zZ8SljIs/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;92&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-hZJVvOU9Z1E/U39UX9iLMgI/AAAAAAAABYE/krakltZOGbQ/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-6musTOanKN0/U39UYoQAXDI/AAAAAAAABYM/um00NLv3MO4/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;224&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;At execution time I am going to face multiple iteration of test cases, one for each line of parameters:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-f1_crvHV5Bg/U39UZHmT7uI/AAAAAAAABYU/rqEziZMmKVw/s1600-h/image%25255B8%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-l7hE9QXKznI/U39UZv0zlpI/AAAAAAAABYc/pOk40HLrrEA/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;171&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;WTCM becomes cooler and cooler at each release!&lt;/p&gt;  </description>
        <pubDate>Fri, 23 May 2014 14:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/05/23/shared-parameters-in-web-test-case/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/05/23/shared-parameters-in-web-test-case/</guid>
      </item>
    
      <item>
        <title>The TFS’ Excel Reports won’t load after a SharePoint change – why?</title>
        <description>&lt;p&gt;I experienced a situation where the SharePoint instance used by a Team Foundation Server suddenly started raising errors while loading the Excel Reports inside a page.&lt;/p&gt; &lt;p&gt;The error was “&lt;strong&gt;An error occurred during an attempt to estabilish a connection to the external data source. The following connections failed to refresh: TfsOlapReport&lt;/strong&gt;”&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-Mfz41OK5EF4/U3zLvAy8qcI/AAAAAAAABXM/B20quJ76d4c/s1600-h/clip_image002%25255B3%25255D.jpg&quot;&gt;&lt;img title=&quot;clip_image002&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;clip_image002&quot; src=&quot;http://lh6.ggpht.com/-uBxpdD5xglo/U3zLvg7HAfI/AAAAAAAABXQ/pnRUWTiHVYE/clip_image002_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;135&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;But – if I tried to open them they were fine, after a refresh. What the heck?&lt;/p&gt; &lt;p&gt;The answer seems easy for a SharePoint expert but not for someone who tries to steer clear from it…:) basically the &lt;strong&gt;Secure Store Service&lt;/strong&gt; is used to authenticate the requests TFS does using the SharePoint’s services.&lt;/p&gt; &lt;p&gt;Here is the issue – do not ask me &lt;strong&gt;why&lt;/strong&gt;, but after a change on the SharePoint side (possibly due to a reconfiguration), the Authentication Setting for my report’s connection changed. In order to work, the report must use the “&lt;strong&gt;TFS&lt;/strong&gt;”&amp;nbsp; SSS token – and not the user itself.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-O-LNQSK4GLw/U3zLwEsSNWI/AAAAAAAABXc/F_Ezc6GTwKI/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-5Dx7QFPZy_o/U3zLwqT5mDI/AAAAAAAABXk/vOo7qSnlm04/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;175&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;After resetting this, and double checking the SharePoint settings together with a specialist, everything worked as expected.&lt;/p&gt;  </description>
        <pubDate>Wed, 21 May 2014 15:52:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/05/21/the-tfs-excel-reports-wont-load-after/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/05/21/the-tfs-excel-reports-wont-load-after/</guid>
      </item>
    
      <item>
        <title>Why bringing evidences to the Sprint Retrospective meeting?</title>
        <description>&lt;p&gt;The most common question in all the situations of an average software development project is not “&lt;em&gt;How?&lt;/em&gt;” but instead “&lt;em&gt;Why?&lt;/em&gt;” – and in particular:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;“Why did we do/act/decide that way?”&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;With the wealth of technologies available today it is not a matter of &lt;strong&gt;how &lt;/strong&gt;anymore, because a new framework, a new tool comes up every week so we do not face the same technology challenges as twenty years ago – today is all about the &lt;strong&gt;why&lt;/strong&gt;, because we can tackle the same problem in many different ways but each solution is going to have something special.&lt;/p&gt; &lt;p&gt;This is why I bringing evidences – when needed and possible, of course – to a Sprint Retrospective meeting becomes real value for the team.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;“&lt;em&gt;During this sprint we did this &lt;strong&gt;because&lt;/strong&gt; we found out that: …&lt;/em&gt;”&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Making this an habit improves the quality on the long term: if you enter this information throughout the development, ideally at each Sprint Retrospective, into a wiki it creates an informal and backed &lt;strong&gt;knowledge base&lt;/strong&gt; which will surely be reusable in the future.&lt;/p&gt; &lt;p&gt;There is a high value behind this task: you are &lt;strong&gt;tracking all the decisions &lt;/strong&gt;made during the project. It is also a basic form of Evidence-based Management if you wish, with all its pros.&lt;/p&gt;  </description>
        <pubDate>Sun, 18 May 2014 15:35:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/05/18/why-bringing-evidences-to-sprint/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/05/18/why-bringing-evidences-to-sprint/</guid>
      </item>
    
      <item>
        <title>Troubleshooting users’ issues with the Team Foundation Server Operational Intelligence</title>
        <description>&lt;blockquote&gt; &lt;p&gt;&lt;em&gt;I tried to do something on the TFS but I got this error … Why?&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Fairly common situation for every TFS Admin on this planet and beyond. How to quickly get grip with the problem?&lt;/p&gt; &lt;p&gt;As usual in this cases, the answer is one: with the &lt;strong&gt;TFS Operational Intelligence&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;It is enough to go in the Activity Log page (&lt;a title=&quot;http://tfs.prod.quest.corp:8080/_oi/_diagnostics/activityLog&quot; href=&quot;http://mytfs:8080/_oi/_diagnostics/activityLog&quot;&gt;http://mytfs:8080/_oi/_diagnostics/activityLog&lt;/a&gt;), selecting the Project Collection (or the server itself if needed, but this would be useful just in case of errors not related to the Project Collection itself) and filtering by user account.&lt;/p&gt; &lt;p&gt;From the results, whatever line has a status of –&lt;strong&gt;1&lt;/strong&gt; is the one which failed:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-h55lWWtFrVc/U2juaCippMI/AAAAAAAABWQ/Tj-N8QcC6s8/s1600-h/image%25255B11%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; margin-left: 0px; border-left: 0px; display: inline; margin-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-q584wzdrwWQ/U2jubA_NWfI/AAAAAAAABWY/soSnIyuwFcE/image_thumb%25255B7%25255D.png?imgmax=800&quot; width=&quot;644&quot; height=&quot;20&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;For instance, for my obscured user (you can see the PRO as part of the domain name, I had to remove it :) ) it is an error coming from the Team Foundation Build – he fails to list the builds.&lt;/p&gt; &lt;p&gt;If you open the Details for the error itself, you can get all the details about the issue:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-d8qM5urT24o/U2jubqPjxUI/AAAAAAAABWg/dORMdPqIDcc/s1600-h/image%25255B14%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-bpQY-1LFiWs/U2juce8KDKI/AAAAAAAABWo/LBYz3lPKvJc/image_thumb%25255B8%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;242&quot;&gt;&lt;/a&gt; &lt;a href=&quot;http://lh4.ggpht.com/-Ulb-KiI2VAo/U2juc72wKgI/AAAAAAAABWw/9SD1uFIOlx8/s1600-h/image%25255B17%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-3EniwhojED4/U2judvXYQtI/AAAAAAAABW0/iEGo7NIdgJM/image_thumb%25255B9%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;242&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;His PowerShell script is failing because it is probably trying to get a Build Template which doesn’t exist. A couple of questions (and ten minutes later) he was up and running again.&lt;/p&gt;  </description>
        <pubDate>Tue, 06 May 2014 14:15:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/05/06/troubleshooting-users-issues-with-team/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/05/06/troubleshooting-users-issues-with-team/</guid>
      </item>
    
      <item>
        <title>Review – Professional Application Lifecycle Management with Visual Studio 2013</title>
        <description>&lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-GAWG2Xu0ZZc/U2gD8HoN7QI/AAAAAAAABVw/GYv2N0khS2Y/s1600-h/WP_20140429_23_12_41_Pro%25255B4%25255D.jpg&quot;&gt;&lt;img title=&quot;WP_20140429_23_12_41_Pro&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;WP_20140429_23_12_41_Pro&quot; src=&quot;http://lh3.ggpht.com/-JwxbT3Zypho/U2gD8m8g_aI/AAAAAAAABV0/VVhM-wmJaB8/WP_20140429_23_12_41_Pro_thumb%25255B1%25255D.jpg?imgmax=800&quot; width=&quot;212&quot; height=&quot;346&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;After &lt;a href=&quot;http://mattvsts.blogspot.co.uk/2014/04/review-professional-visual-studio-2013.html&quot;&gt;Professional Visual Studio 2013&lt;/a&gt; it is now time to go a little deeper on Visual Studio ALM – Professional Application Lifecycle Management with Visual Studio 2013 is out!&lt;/p&gt; &lt;p&gt;The book itself confirms its aim – being the one stop guide to the Visual Studio ALM platform.&lt;/p&gt; &lt;p&gt;It has been fully updated, including &lt;strong&gt;Git, Visual Studio Release Management and Visual Studio Online&lt;/strong&gt;. All the previous’ version chapters have been reviewed and revamped with the latest bits and everything is new.&lt;/p&gt; &lt;p&gt;Personally, I really liked the &lt;strong&gt;Chapter 4&lt;/strong&gt; – a quick introduction on Git, to let Visual Studio users being updated with the latest tool around. It is not easy, I am still digging into that as well, but &lt;strong&gt;Ch4&lt;/strong&gt; serves its role in a perfect way.&lt;/p&gt; &lt;p&gt;So, it is time to update the libraries folks! &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh5.ggpht.com/-Th6FJJGjT-0/U2gD9Ggw9NI/AAAAAAAABV8/I0xFpIXCvk0/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt;  </description>
        <pubDate>Mon, 05 May 2014 21:34:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/05/05/review-professional-application/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/05/05/review-professional-application/</guid>
      </item>
    
      <item>
        <title>Can Scrum and CMMI live together?</title>
        <description>&lt;p&gt;&lt;strong&gt;TL;DR version – yes.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Many think that Scrum (and Agile in general) and CMMI cannot live together. After some years researching about that, my opinion is that this assumption is &lt;strong&gt;false&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Let’s keep things simple – CMMI is based on a binary process: planning plus execution. We have a (sometimes very) high level planning, each hierarchy level with its requirements and so on.&lt;/p&gt; &lt;p&gt;Can the execution phase keep on with that? &lt;strong&gt;It can&lt;/strong&gt; – breaking down large features into smaller PBIs and then tasks is &lt;strong&gt;not something exclusive&lt;/strong&gt; to Scrum but it can be applied to CMMI as well, &lt;strong&gt;with great results&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;The Definition of Done as well &lt;strong&gt;can be integrated&lt;/strong&gt; as a part of the CMMI Requirements and criteria, this is another simple yet effective example.&lt;/p&gt; &lt;p&gt;The CMMI Institute has a very interesting article &lt;a href=&quot;http://cmmiinstitute.com/cmmi-getting-started/cmmi-compatibility/cmmi-and-agile/cmmi-and-scrum/&quot;&gt;digest&lt;/a&gt; on the topic – I really like this quote from the above:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;As an Agile method, Scrum promotes frequent inspection and adaptation, teamwork, self-organization, and accountability. CMMI focuses on improving processes to improve performance.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;And what about TFS? Well…all the tools are standard regardless of the Process Template, so the answer is obvious again.&lt;/p&gt;  </description>
        <pubDate>Tue, 29 Apr 2014 21:39:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/04/29/can-scrum-and-cmmi-live-together/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/04/29/can-scrum-and-cmmi-live-together/</guid>
      </item>
    
      <item>
        <title>How did I manage to get on well with Git</title>
        <description>&lt;p&gt;Having to deal with Git when you come from years of another Version Control System can be hard – I was very comfortable with the Team Foundation Version Control and in the rare cases I needed a distributed VCS my choice went to Mercurial.  &lt;p&gt;I was very biased against Git, for several reasons. But then, after using it and dealing with it at work, I managed to find a position for it in my toolbox. Let’s see the reasons which made me &lt;i&gt;accepting &lt;/i&gt;Git &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh6.ggpht.com/-HzeN-jPSRSU/U1utPec9eNI/AAAAAAAABVg/blu61IipGNs/wlEmoticon-smile2.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;h2&gt;Git is different&lt;/h2&gt; &lt;p&gt;Yes, indeed. It was born with a specific purpose (VCS for the Linux kernel) and with a specific target in mind – kernel developers. Git is sometimes counterintuitive and not consistent, you have to learn it from the ground up &lt;strong&gt;without comparing it &lt;/strong&gt;with other VCSs. &lt;br&gt;Despite it is a VCS, you can &lt;strong&gt;change the history&lt;/strong&gt; of your source tree for example. You just have to understand that it is different, that’s all.&lt;/p&gt; &lt;h2&gt;It is a great tool to be used with Team Foundation Server&lt;/h2&gt; &lt;p&gt;Team Foundation Server is maybe one of the most interoperable product at Microsoft, and including Git inside it has been a marvellous choice. &lt;br&gt;You can have &lt;strong&gt;heterogeneous projects&lt;/strong&gt; thanks to it, and even use it together with the TFVC if you want – with &lt;strong&gt;git-tf&lt;/strong&gt;. And do not forget the migration capability – there are countless tools for migrating from other VCSs to Git.&lt;/p&gt; &lt;h2&gt;It is lightweight and fast&lt;/h2&gt; &lt;p&gt;Despite its steep learning curve, once you are familiar with the basic commands Git is blazingly fast and lightweight – thanks to its distributed nature.&lt;/p&gt; &lt;p&gt;These are the main reasons which led me to live with Git without fighting with it. I am still a learner on the subject though, maybe in the future there might be a revised version of the list. Let’s see &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh6.ggpht.com/-HzeN-jPSRSU/U1utPec9eNI/AAAAAAAABVg/blu61IipGNs/wlEmoticon-smile2.png?imgmax=800&quot;&gt;&lt;/p&gt;  </description>
        <pubDate>Sat, 26 Apr 2014 12:57:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/04/26/how-did-i-manage-to-get-on-well-with-git/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/04/26/how-did-i-manage-to-get-on-well-with-git/</guid>
      </item>
    
      <item>
        <title>How to check for Team Foundation Server’s job running time</title>
        <description>&lt;p&gt;This is very quick but helpful IMHO.&lt;/p&gt; &lt;p&gt;Scenario: you are an external consultant and you need to run a job from the Team Foundation Server web services (&lt;strong&gt;ProcessWarehouse&lt;/strong&gt;, just to mention one of them), but you cannot access the server itself because of some security policy.&lt;/p&gt; &lt;p&gt;You ask someone in the IT department to run it on behalf of you, but of course you want to check how long does it take. &lt;strong&gt;How?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;By using the &lt;strong&gt;TFS Operational Intelligence&lt;/strong&gt;. If you check the &lt;strong&gt;Job Queue&lt;/strong&gt; list, you will get all the running and scheduled jobs for the server.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-o6-PWErODr4/U00Xal8Xn-I/AAAAAAAABVI/7W0pWlzAVec/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-b95HQyXtjrg/U00Xb6MvYNI/AAAAAAAABVQ/QDpZ2_UujBE/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;400&quot; height=&quot;166&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;If a job is running you will get the actual running time, otherwise the last execution’s time.&lt;/p&gt;  </description>
        <pubDate>Tue, 15 Apr 2014 11:26:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/04/15/how-to-check-for-team-foundation/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/04/15/how-to-check-for-team-foundation/</guid>
      </item>
    
      <item>
        <title>Review – Professional Visual Studio 2013</title>
        <description>&lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-RSGMYDWLrMM/U0G5cBHzRMI/AAAAAAAABUw/zxPCJf90gic/s1600-h/WP_20140402_09_08_59_Pro%25255B4%25255D.jpg&quot;&gt;&lt;img title=&quot;WP_20140402_09_08_59_Pro&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;WP_20140402_09_08_59_Pro&quot; src=&quot;http://lh3.ggpht.com/-gkWd9CYDbAw/U0G5cw76h8I/AAAAAAAABU0/1P0QE2Si2z0/WP_20140402_09_08_59_Pro_thumb%25255B1%25255D.jpg?imgmax=800&quot; width=&quot;174&quot; height=&quot;316&quot;&gt;&lt;/a&gt; Another year, a new IDE, a new book about it.&lt;/p&gt; &lt;p&gt;Do you want to compare it to the last year’s one? Fair enough – it is an updated overview of the Microsoft development stack. This is enough to justify it in full.&lt;/p&gt; &lt;p&gt;Bruce Johnson (Visual C# MVP) refreshed the 2012 one, covering a huge (1050 pages) amount of topics. Of course it is not a deep dive style book, it is not its target, but it gives the right amount of information on everything surrounds the core topic – Visual Studio itself.&lt;/p&gt; &lt;p&gt;To summarize in one idea: &lt;strong&gt;if you see something in the IDE, it is covered here.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Again at the end, Visual Studio Ultimate and Team Foundation Server are separately reviewed in order to avoid &lt;em&gt;polluting&lt;/em&gt; the core stuff. A great choice I fully back, by the way.&lt;/p&gt; &lt;p&gt;It is a book every developer should have on the shelf, because sometimes picking up a specific chapter is better than just searching on the MSDN or a search engine.&lt;/p&gt;  </description>
        <pubDate>Sun, 06 Apr 2014 20:30:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/04/06/review-professional-visual-studio-2013/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/04/06/review-professional-visual-studio-2013/</guid>
      </item>
    
      <item>
        <title>IISReset and TFSServiceControl quiesce</title>
        <description>&lt;p&gt;“&lt;em&gt;Isn’t it the same if I just run IISReset /stop to take the Team Foundation Server down?&lt;/em&gt;”&lt;/p&gt; &lt;p&gt;No, it isn’t.&lt;/p&gt; &lt;p&gt;If you just run &lt;strong&gt;IISReset /stop&lt;/strong&gt;, you are just locking the IIS access – but the Team Foundation Server is still up and running, it is just not reachable.&lt;/p&gt; &lt;p&gt;This is why &lt;strong&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ff470382.aspx&quot;&gt;TFSServiceControl quiesce&lt;/a&gt;&lt;/strong&gt; is needed: by running it, you are effectively taking down the server, stopping the Application Pools, all the jobs and the agents running on it. Moreover, MSDN states “&lt;em&gt;You cannot manually perform all of the tasks carried out by the &lt;strong&gt;TFSServiceControl&lt;/strong&gt; command.&lt;/em&gt;”, so little choice here &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh6.ggpht.com/-KleUxw6yZ6I/Uy2MDo2-yeI/AAAAAAAABUg/bvKGWXRr-NY/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;Other than being sure of the TFS’ status and consistency, by running it together with IISReset you are ensuring that the IIS won’t be overstressed and it won’t forward any query to the TFS itself.&lt;/p&gt; &lt;p&gt;Basically, you are locking the &lt;strong&gt;safe&lt;/strong&gt; (TFS) and the &lt;strong&gt;room’s door&lt;/strong&gt; (IIS).&lt;/p&gt;  </description>
        <pubDate>Sat, 22 Mar 2014 13:11:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/03/22/iisreset-and-tfsservicecontrol-quiesce/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/03/22/iisreset-and-tfsservicecontrol-quiesce/</guid>
      </item>
    
      <item>
        <title>Suggestions for preparing a TFS deployment with SQL AlwaysOn</title>
        <description>&lt;p&gt;SQL Server AlwaysOn is a utterly cool technology, but it is not a technology itself which solves all the problems you may have.&lt;/p&gt; &lt;p&gt;In particular, it is not just about tweaking a couple of settings and adding servers as needed. A careful planning and thorough tests are mandatory in order to succeed without affecting the existing service or going overtime. So I wanted to sum up some tips I found during a project I am following with a huge deployment of Team Foundation Server 2013 which uses SQL Server AlwaysOn as an underlying High Availability solution.&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Size your storage&lt;/strong&gt;&lt;br&gt;I am dealing with TBs of data, so I am experiencing that TBs of storage flies away in a snap. Do not underestimate your storage size and do not rely just on SANs. Importing your data takes time and space, especially if you restore your databases to the secondary replica using the &lt;strong&gt;Full&lt;/strong&gt; mechanism of backup-and-restore provided by SQL Server AlwaysOn.&lt;br&gt;&lt;a href=&quot;http://lh6.ggpht.com/-oTmXs_M0x-I/Ux7lItkd0lI/AAAAAAAABT4/62zqsmJLoI8/s1600-h/SQLConfig15b2.png&quot;&gt;&lt;img title=&quot;SQLConfig15b&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;SQLConfig15b&quot; src=&quot;http://lh5.ggpht.com/-5yR76FSJyag/Ux7lJHxyZ9I/AAAAAAAABT8/4sRMs4zdC1c/SQLConfig15b_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;229&quot;&gt;&lt;/a&gt;  &lt;li&gt;&lt;strong&gt;You can’t mix and match all the HA technologies&lt;br&gt;&lt;/strong&gt;Not all the SQL HA technologies are supported by TFS in the first place. &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/dd631889.aspx&quot;&gt;MSDN&lt;/a&gt; is pretty clear on this, &lt;strong&gt;no replication and no log shipping&lt;/strong&gt;. Log shipping could &lt;em&gt;technically&lt;/em&gt; work, but you won’t be supported by the Microsoft CSS, so it is a no no. You can mix a clustered SQL Server with another one in another location within the same AlwaysOn Availability Group though, and it is pretty robust. Keep in mind anyway that TFS is pretty agnostic about the underlying SQL deployment though, in fact the only feature which requires a specific configuration is AlwaysOn Availability Groups.  &lt;li&gt;&lt;strong&gt;The MultiSubnetFailover setting&lt;br&gt;&lt;/strong&gt;When configuring Team Foundation Server for using AlwaysOn Availability Groups, remember to tick the specific checkbox about this setting. &lt;strong&gt;Beware &lt;/strong&gt;of the setting: if you are not directly using an AG but you select it at TFS configuration time, you are going to be in trouble. If you are restoring it to a new server, launch TFSConfig RegisterDB to enable it:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;TFSConfig RegisterDB /SQLInstance:MyDB\namedinstanceifneeded /databaseName:Tfs_Configuration &lt;strong&gt;/usesqlalwayson&lt;/strong&gt; &lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://lh5.ggpht.com/-lG-9nv9XdYc/Ux7lJoFYV5I/AAAAAAAABUE/zMebaAIaT_k/s1600-h/image2.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-roul0bBYrHE/Ux7lKDhzH2I/AAAAAAAABUM/z9AEDVxcGgs/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;79&quot;&gt;&lt;/a&gt;&amp;nbsp; &lt;li&gt;&lt;strong&gt;All the Team Foundation Server databases must be in the AlwaysOn Availability Group&lt;br&gt;&lt;/strong&gt;No exceptions to this – if you use it, all the DBs must be contained in the AG.&lt;/li&gt;&lt;/ol&gt;  </description>
        <pubDate>Tue, 11 Mar 2014 10:27:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/03/11/suggestions-for-preparing-tfs/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/03/11/suggestions-for-preparing-tfs/</guid>
      </item>
    
      <item>
        <title>How to perform a TFS Security Audit</title>
        <description>&lt;p&gt;It is common to be asked for performing a security audit on Team Foundation Server, and it is not a nightmare as it would seem…&lt;/p&gt; &lt;p&gt;The easiest way is to download the &lt;strong&gt;Audit Log&lt;/strong&gt;. You can find it in the Access Levels administration page:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-6H97DXIBRAg/UxNETXlirpI/AAAAAAAABTY/6gTvq2ndQwo/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-yWx7vKNSWF8/UxNEThTGKHI/AAAAAAAABTg/dwoISoHGqK8/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;177&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;What you are going to get is a .csv file, containing all the groups and accounts allowed into Team Foundation Server, each with its unique internal URI (vstfs://…), the last access date and its access level.&lt;/p&gt; &lt;p&gt;But this is just the beginning – you get a list of flat users and groups, without their relationships. In order to get these, you can use the &lt;strong&gt;TFSSecurity&lt;/strong&gt; command with the &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms400794.aspx&quot;&gt;&lt;strong&gt;/i&lt;/strong&gt;&lt;/a&gt;, &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms400782.aspx&quot;&gt;&lt;strong&gt;/im&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;and &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms400806.aspx&quot;&gt;&lt;strong&gt;/imx &lt;/strong&gt;switches&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;These will give you all the informations about each user/group and its relationships and privileges, so wrapping their outputs and creating a very simple report is just a matter of time &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh5.ggpht.com/-Y4fvVBc5Yw8/UxNEUfDwD2I/AAAAAAAABTk/t4PR0I9ELJ4/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt;  </description>
        <pubDate>Sun, 02 Mar 2014 14:46:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/03/02/how-to-perform-tfs-security-audit/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/03/02/how-to-perform-tfs-security-audit/</guid>
      </item>
    
      <item>
        <title>Why shall I use Application Insights?</title>
        <description>&lt;p&gt;There has been a lot of noise around the latest kid – Application Insights on Visual Studio Online.&lt;/p&gt; &lt;p&gt;It is a fantastic solution, but I did not clearly stated anywhere is:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;Why shall I use it?&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;I think the answer is pretty easy – everybody needs &lt;strong&gt;diagnostics and logging &lt;/strong&gt;while in production. It can be expensive to setup a custom solution, which spreads among different devices, different infrastructures (cloud anyone?), different networks.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-1EM66qJ-pgI/UwO6ZREhvlI/AAAAAAAABSM/O4rLcVjmkq8/s1600-h/image8.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-R_b8PUJ3Whs/UwO6aCPrQDI/AAAAAAAABSU/X2i5gwQ5yxM/image_thumb2.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;147&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Application Insights is a great solution for that, as it provides a broad range of features aimed at addressing almost every scenario in that field.&lt;/p&gt; &lt;p&gt;For example, the possibility of downloading an &lt;strong&gt;IntelliTrace file&lt;/strong&gt; from an exception which has been logged on a specific error is just invaluable, providing all the information I might need for fixing that specific issue.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-6TwrJ1MGvW0/UwO6ayv-SuI/AAAAAAAABSc/VSKpNdxIzb0/s1600-h/image12.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-XVvmRLiuKL4/UwO6bzSKTiI/AAAAAAAABSg/oKQFDhoGMxY/image_thumb4.png?imgmax=800&quot; width=&quot;340&quot; height=&quot;334&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Or talking about &lt;strong&gt;usage &lt;/strong&gt;– how handy can it be a service which collects and aggregates all the information related to my usage data from my real users. &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-PI-dITd_SSA/UwO6cRnZkFI/AAAAAAAABSo/wMVao0TNSOE/s1600-h/image19.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-nI2LeYRNFKE/UwO6c5lzN-I/AAAAAAAABS0/3k9jJLkms5k/image_thumb7.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;200&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;I mean, from the page pattern they follow to the device they use, it is a range of data who can be used in many ways, from diagnostics to marketing. Why losing it?&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-qYtSsjSiVnY/UwO6d6ls_SI/AAAAAAAABS8/0ZlfpVfYgxw/s1600-h/image16.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-YeNHB5_7sgE/UwO6em8YvRI/AAAAAAAABTA/2CuvL2usygA/image_thumb6.png?imgmax=800&quot; width=&quot;426&quot; height=&quot;211&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;As we know, integrating it is a matter of adding some JavaScript lines, a couple of files or a bunch of lines of code depending on the platform we are targeting – this is why it is really worth integrating it in our projects: with a minimal effort we can get a &lt;strong&gt;giant stream of information&lt;/strong&gt; to use as a source for a broad range of tasks, not just developer-focused ones.&lt;/p&gt;  </description>
        <pubDate>Tue, 18 Feb 2014 19:54:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/02/18/why-shall-i-use-application-insights/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/02/18/why-shall-i-use-application-insights/</guid>
      </item>
    
      <item>
        <title>Application Insights Visual Studio Add-in preview – what is that?</title>
        <description>&lt;p&gt;Brian Harry recently blogged about &lt;a href=&quot;http://visualstudiogallery.msdn.microsoft.com/82367b81-3f97-4de1-bbf1-eaf52ddc635a&quot;&gt;that&lt;/a&gt;, this is an add-in for adding Application Insights’ telemetry straight from Visual Studio itself.&lt;/p&gt; &lt;p&gt;It is helpful, because once you install it you can add AI to all your new projects OOB:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-BD9j7JGIMdY/UwCAQeEFdZI/AAAAAAAABR0/IXZr00ze2sY/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-ND01eRnaLBs/UwCAQzGFntI/AAAAAAAABR4/ZzPOVotyoeA/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;114&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;It is already tied to your Visual Studio Online account (after a login, of course). Then it is going to automatically detect what project type you created and it is going to set it up for AI in a snap.&lt;/p&gt;  </description>
        <pubDate>Sun, 16 Feb 2014 09:09:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/02/16/application-insights-visual-studio-add/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/02/16/application-insights-visual-studio-add/</guid>
      </item>
    
      <item>
        <title>SQL Server AlwaysOn with Team Foundation Server – a great team!</title>
        <description>&lt;p&gt;High Availability and Disaster Recovery are the first two items on the list for a TFS Administrator, as Team Foundation Server hosts a critical service for almost every company with a linked development team.&lt;/p&gt; &lt;p&gt;Frankly in the past delegating the HA story to someone else in the organization was a very common practice, as it is not something related to TFS – which is pretty agonostic about the SQL Server deployment topology or about the number of Application Tiers.&lt;/p&gt; &lt;p&gt;If you want to use SQL Server AlwaysOn in your deployment – apart from all the other technologies which can be involved (Windows Failover Clustering, SQL Server Clustering, VMs redundancy, etc.) – the only configuration needed is to create a &lt;strong&gt;SQL Server AlwaysOn Availability Group&lt;/strong&gt;. You are going to get a replication between up to four different SQL Server instances so you can failover at anytime.&lt;/p&gt; &lt;p&gt;Given a Windows Failover Cluster and two different SQL Server instances, one on each node, you just need to do as it follows:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-xFUHrPWyTsI/UvEYtOg-7GI/AAAAAAAABRc/f3XdW7KQI3M/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-t1OeKtTo6W0/UvEYtzD3y0I/AAAAAAAABRg/ZHuIPvUPcng/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;105&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;You launch the wizard, and you specify a name and, for now, no databases are going to be contained inside the Availability Group. &lt;/p&gt; &lt;p&gt;Then you can select the replica mode (synchronous or asynchronous) and you must specify a Listener, which is going to become the &lt;em&gt;instance name&lt;/em&gt; you are going to use to configure Team Foundation Server.&lt;/p&gt; &lt;p&gt;Then – while configuring Team Foundation Server using the &lt;strong&gt;Advanced&lt;/strong&gt; mode - you are going to need to specify the Listener and tick the box saying that it is a &lt;strong&gt;SQL AlwaysOn Availability Group&lt;/strong&gt;. TFS will then configure some specific settings for it in the process.&lt;/p&gt; &lt;p&gt;&lt;img title=&quot;Select AlwaysOn checkbox&quot; alt=&quot;Select AlwaysOn checkbox&quot; src=&quot;http://i.msdn.microsoft.com/dynimg/IC630622.png&quot;&gt;&lt;/p&gt; &lt;p&gt;It is extremely important to add all the databases, and each database must be backed up, otherwise you won’t be able to add them to the AG. &lt;/p&gt; &lt;p&gt;Eventually, do not forget it is not the only HA solution, and a good HA solution is composed by several technologies working together on a minded plan :)&lt;/p&gt; &lt;p&gt;Here you can find the &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/jj662725.aspx&quot;&gt;MSDN&lt;/a&gt; page for the topic.&lt;/p&gt;  </description>
        <pubDate>Tue, 04 Feb 2014 16:43:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/02/04/sql-server-alwayson-with-team/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/02/04/sql-server-alwayson-with-team/</guid>
      </item>
    
      <item>
        <title>New sprint, new release for Visual Studio Online</title>
        <description>&lt;p&gt;Microsoft just &lt;a href=&quot;http://www.visualstudio.com/news/2014-jan-22-vso&quot;&gt;released&lt;/a&gt; a new sprint of Visual Studio Online, the first one of the new year.&lt;/p&gt; &lt;p&gt;Three small but valuable items contained inside: &lt;strong&gt;Tags Querying&lt;/strong&gt;, the possibility of &lt;strong&gt;removing weekends from the Burndown Chart&lt;/strong&gt; and finally, &lt;strong&gt;Configurable CFD Dates&lt;/strong&gt;!&lt;/p&gt; &lt;p&gt;I wanted to highlight the first one: it makes the usage of Work Item Tags extremely powerful now - adding this feature means we can now have&lt;strong&gt; another level of sorting&lt;/strong&gt;, completely independent from the hierarchy.&lt;/p&gt; &lt;p&gt;One example? You can have a quantitative analysis of your Work Items, grouping them by a specific tag. Or, if you use a single Team Project approach in a consultancy scenario, using tags to create an independent sorting label for customers.&lt;/p&gt; &lt;p&gt;The latter two instead are very helpful for reporting purposes – removing weekends is essential to have a clear view of your sprint, instead of applying some kind of correction because you have weekends in the middle, and the Configurable CFD Date makes possible to drill down on your CFD in a snap.&lt;/p&gt;  </description>
        <pubDate>Thu, 23 Jan 2014 13:37:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/01/23/new-sprint-new-release-for-visual/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/01/23/new-sprint-new-release-for-visual/</guid>
      </item>
    
      <item>
        <title>Groups Synchronization in Visual Studio Release Management</title>
        <description>&lt;blockquote&gt; &lt;p&gt;Why can’t I see my updated Active Directory groups in Visual Studio Release Management?&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;It is a fairly common question. And the answer is pretty easy: by default, there is no automated synchronization.&lt;/p&gt; &lt;p&gt;In order to manually sync them up, you should press the &lt;strong&gt;Refresh&lt;/strong&gt; button in the &lt;strong&gt;Manage Groups&lt;/strong&gt; section of the VSRM client.&lt;/p&gt; &lt;p&gt;But what if I want to have an automated synchronization?&lt;/p&gt; &lt;p&gt;The setting to change is the &lt;strong&gt;AD/TFS-Based Group Refresh Interval&lt;/strong&gt;. &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-HMnr2Qi806w/Ut_oAqg-1CI/AAAAAAAABQ8/BHM2RvRBVSs/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-KHUM2btUPdA/Ut_oBOMIqFI/AAAAAAAABRA/cYBjGEALIvY/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;39&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Set it to something different than 0 (minutes), and VSRM will start synchronizing your accounts every interval you defined.&lt;/p&gt; &lt;p&gt;Easy peasy &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh6.ggpht.com/-5oGHLhiOUW8/Ut_oBjIcKkI/AAAAAAAABRI/Ki0uMOlZ1eM/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt;  </description>
        <pubDate>Wed, 22 Jan 2014 15:47:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/01/22/groups-synchronization-in-visual-studio/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/01/22/groups-synchronization-in-visual-studio/</guid>
      </item>
    
      <item>
        <title>Find hidden information in the Visual Studio Online Application Insights portal</title>
        <description>&lt;p&gt;No, I am not talking about something secret or left around. I am talking about when you skip the &lt;em&gt;adventure&lt;/em&gt; to, for instance, set up Usage Monitoring of an application and you cannot find the code snippet anymore. Or the Instrumentation Keys. Or…:) You may struggle to find them, and do not use the same snippet of another application – you will monitor the right one in the wrong place. So, here they are:&lt;/p&gt; &lt;p&gt;Just by clicking the Control Panel button:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-aFc4u2fjRIo/UtZkxy2FrJI/AAAAAAAABQU/qbgGwqN0ft0/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-XDcI-hbTkNc/UtZkySOcMjI/AAAAAAAABQc/nnH9hAjVt-s/image_thumb.png?imgmax=800&quot; width=&quot;163&quot; height=&quot;46&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;You will find all you need for each application you want to instrument:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-P1yQqXr9ou0/UtZky6EtODI/AAAAAAAABQk/HfCib24CAwY/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-Bleqn27cMnQ/UtZkzgx1aBI/AAAAAAAABQo/MC9ZbjhczPc/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;124&quot;&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;In the &lt;strong&gt;Keys and Downloads&lt;/strong&gt; tab you will be able to regenerate each key as well, in case you might need it.&lt;/p&gt;  </description>
        <pubDate>Wed, 15 Jan 2014 10:37:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/01/15/find-hidden-information-in-visual/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/01/15/find-hidden-information-in-visual/</guid>
      </item>
    
      <item>
        <title>Custom Synthetic Monitors in Application Insights</title>
        <description>&lt;p&gt;We know it is extremely cool being able to monitor a website’s availability using the Windows Azure data centres all around the world, &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-CDKKsoE1SGc/UswvPGlCASI/AAAAAAAABO8/--EpFD0waFM/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-nvAXxODKTj4/UswvPjWOGaI/AAAAAAAABPE/w9OWEi5i03U/image_thumb.png?imgmax=800&quot; width=&quot;200&quot; height=&quot;244&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;but what if I would want to monitor a specific usage pattern? It is extremely easy – I would create a multistep web test.&lt;/p&gt; &lt;p&gt;Just create a new Web Performance Test:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-6n64Z0PXmqA/UswvQkjJCzI/AAAAAAAABPM/Chie4VXSULI/s1600-h/image%25255B8%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-I29QhVOFs8w/UswvRZ77NUI/AAAAAAAABPQ/zUaLzmHXCUc/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;64&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Once I am ready, I can start recording my usage pattern:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-rOukEtctqyk/UswvR46aBUI/AAAAAAAABPc/zvHrFNdFawY/s1600-h/image%25255B11%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-s3m5HDm9EYI/UswvSvFptBI/AAAAAAAABPk/jaoWw1YCThY/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;220&quot; height=&quot;127&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;That’s all! Once saved, from the Application Insight Availability Hub I can then add it, as a &lt;strong&gt;Multistep Web Test&lt;/strong&gt;:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-iYnsySB5zRo/UswvTWra8WI/AAAAAAAABPs/GK0FUI9Vx08/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-ifUvggjB48c/UswvULwJliI/AAAAAAAABPw/Y4UqrASMInE/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;191&quot; height=&quot;157&quot;&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Now I have to upload it, and the only missing step would be selecting the required locations I want to use as a test site, the test frequency and an alert email if needed. &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-gdy9lpUtryg/UswvUrmSfxI/AAAAAAAABP8/md_MrCrzLMc/s1600-h/image%25255B14%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-FDIRpp-1vqE/UswvVRVbdDI/AAAAAAAABQE/ksDmtfhp2hE/image_thumb%25255B4%25255D.png?imgmax=800&quot; width=&quot;210&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt;  </description>
        <pubDate>Tue, 07 Jan 2014 16:46:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/01/07/custom-synthetic-monitors-in/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/01/07/custom-synthetic-monitors-in/</guid>
      </item>
    
      <item>
        <title>Visual Studio ALM MVP, again</title>
        <description>&lt;p&gt;Every year since 2010, the first day of the year is marked by the email from the MVP Award, and this year is no exception: I have been reawarded this year as well, for the 5th year in a row on Visual Studio ALM again :) &lt;/p&gt; &lt;p&gt;It is a huge pleasure and I am really honoured by this, and moreover this year with the relocation and all the other changes it has been &lt;em&gt;harder&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;I definitely need to thank &lt;a href=&quot;https://twitter.com/ClaireS_MS&quot;&gt;Claire&lt;/a&gt;, my CPM, and the whole Visual Studio ALM team for this.&lt;/p&gt; &lt;p&gt;I will always do my best for the technical community all around the world, as it is something I really enjoy doing, so let’s see what happens during this 2014!&lt;/p&gt;  </description>
        <pubDate>Thu, 02 Jan 2014 16:12:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2014/01/02/visual-studio-alm-mvp-again/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2014/01/02/visual-studio-alm-mvp-again/</guid>
      </item>
    
      <item>
        <title>Keys for a painless TFS upgrade experience</title>
        <description>&lt;p&gt;This weekend I had to work on the upgrade of the main Team Foundation Server we have in production. Everything went fine – despite not everything according to the planned slick idea we had. The whole thing has been longer than just yesterday, though, and it comes with several takeaways. &lt;/p&gt; &lt;p&gt;Here’s what, of course involving our shiny Team Foundation Server 2013. Keep in mind the scenario: thousand of users all around the world, terabytes of databases. Here we go:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Plan, but do not overplan.&lt;br&gt;&lt;/strong&gt;We had a plan but you cannot cover anything. You cannot plan every single step and do not have a B, C, D plan. I am not talking about not having a plan, but I suggest of being confident and flexible. &lt;br&gt;Start planning with enough time, so the right guys are involved, and keep in mind the basics of TFS and its known issues, the history of the server (in our case it was essential) and use the TFS Upgrade Guide to have a guideline to follow.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Test the core, test the basic.&lt;br&gt;&lt;/strong&gt;This TFS survived through upgrades from 2005 on, we discovered what we thought impossible. Your team’s skills will let you fix the problems you might find. &lt;br&gt;So test the core, verifying that all the essential pillars are working. If you find out issues, try to fix them or plan a deferral (maybe with the CSS?) if they are not critical. &lt;br&gt;Do not start trying the latest, better tech combo. As a sample, do not start upgrading the test server to 2013 and upgrade the build servers as well. Test the existing servers (or clones of them) against the 2013 server, and only when you are sure of the result test the upgrade of them.&lt;br&gt;File as much documentation as you can but – again – you cannot cover the 100% of cases.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Problems are problems if they come out just in production. Otherwise they are issues to fix.&lt;br&gt;&lt;/strong&gt;You might find something to fix at a later time, which does not impact all the users but maybe a small percentage. You can work it out later. &lt;br&gt;Instead, for instance, we hit a very nasty problem during our live production update. We had no plan for it, as it did not happen in the test. What did we do? We tried several solution (one worked, luckily &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh4.ggpht.com/-ZIGiU0Lv_gg/Uq4YXPAFtiI/AAAAAAAABOs/gb7GLlr8uws/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;) while someone else worked on a mitigation plan to use in case no solution was fine.&lt;br&gt;We did not have to use it, but if you are running a service, you have to make tradeoffs and stop the whole service for just a part of it is unacceptable. &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Remember that Team Foundation Server is modular, so you can exclude a part of it in case of problems, and that usually the upgrade compatibility for who comes from the last version (2012 in our case) is almost effortless.&lt;/p&gt;  </description>
        <pubDate>Sun, 15 Dec 2013 21:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/12/15/keys-for-painless-tfs-upgrade-experience/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/12/15/keys-for-painless-tfs-upgrade-experience/</guid>
      </item>
    
      <item>
        <title>A pragmatic approach to a better manual testing</title>
        <description>&lt;p&gt;I recently had to deal with a small Functional Testing Team (two people in total) which was used to have a non-structured approach to manual testing, with several Word and Excel files used to track down the required information, absolutely no automation in place and a very personal way of dealing with issues reproduction and environments.&lt;/p&gt; &lt;p&gt;I thought that giving them all the Visual Studio ALM features was surely going to be overkill. Quite a greenfield situation, but combined with the requirement of retaining their habits and their knowhow as much as possible.&lt;/p&gt; &lt;p&gt;The first step is converting the sparse information they have as test cases into Test Cases in Team Foundation Server. It seems obvious, but it is not. You have to set up a descriptive standard, detailing steps and expected results, so that everything is coherent with the actual target but they feel comfortable with the new tool (MTM) and process.&lt;/p&gt; &lt;p&gt;It is also &lt;strong&gt;extremely important&lt;/strong&gt; to standardize a bit the environments they work with. If they use their own local machines, set up a standard about not just toolings, but even how to reach them. If you do this, a newbie tester can be thrown in the mix and be able to start working in a near-zero time. Once they are aware that they can replicate their recordings and they can get even the videos, they will go nuts. But it is not enough…&lt;/p&gt; &lt;p&gt;The next logical step is either converting their action recordings into Coded UI tests or using Lab Management. There are valid reasons behind both:&lt;/p&gt; &lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;350&quot; border=&quot;0&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;177&quot;&gt; &lt;p align=&quot;center&quot;&gt;&lt;strong&gt;Coded UI Tests&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;171&quot;&gt; &lt;p align=&quot;center&quot;&gt;&lt;strong&gt;Lab Management&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;177&quot;&gt;Validation&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;171&quot;&gt;Standardized environments&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;177&quot;&gt;Extended behaviours&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;171&quot;&gt;Complex configurations&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;177&quot;&gt;Integration with Visual Studio&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;171&quot;&gt;Commodity for the members&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;You could take both of course, but it depends on the resources you have. I went for the Lab Management route – as they are pure functional testers, so with very little code confidence - and they are happier and more productive than ever.&lt;/p&gt;  </description>
        <pubDate>Tue, 10 Dec 2013 15:05:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/12/10/a-pragmatic-approach-to-better-manual/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/12/10/a-pragmatic-approach-to-better-manual/</guid>
      </item>
    
      <item>
        <title>New TFS Upgrade Guide out!</title>
        <description>&lt;p&gt;The ALM Rangers just &lt;a href=&quot;http://vsarupgradeguide.codeplex.com/&quot;&gt;released&lt;/a&gt; the v3 of the TFS Upgrade Guide. Apart from the official announcement, etc., I wanted to give you a valid reason to download and use it if you are still sceptic.&lt;/p&gt; &lt;p&gt;Scenarios. This guide covers a handful lot of &lt;strong&gt;real world &lt;/strong&gt;scenarios, like the upgrade from 2008 or different configurations. So it is not just a basic walkthrough, but it provides you a robust sample from people who already experienced the aforementioned scenarios.&lt;/p&gt; &lt;p&gt;Give it a try, you won’t regret it ;)&lt;/p&gt;  </description>
        <pubDate>Wed, 04 Dec 2013 11:20:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/12/04/new-tfs-upgrade-guide-out/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/12/04/new-tfs-upgrade-guide-out/</guid>
      </item>
    
      <item>
        <title>Recap of the Visual Studio launch!</title>
        <description>So, very packed day!&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.visualstudio.com/en-gb/products/visual-studio-online-overview-vs&quot;&gt;Visual Studio Online&lt;/a&gt; is among us. Nothing more than Team Foundation Service up to yesterday, but now with a lot more.&lt;br /&gt;&lt;br /&gt;First of all: the plans. We now have three plans, Basic, Professional and Advanced. The Basic and the Professional one expose the same set of features, apart from the fact that the Professional one includes a monthly subscription for Visual Studio Professional. Yes, &lt;strong&gt;the IDE&lt;/strong&gt;! And of course you get five users for free with the Visual Studio Online Basic plan, as of today.&lt;br /&gt;The Advanced one is another story – it is the biggest one, but without the IDE subscription.&lt;br /&gt;&lt;br /&gt;Codename Monaco is something incredible - finally they managed to deliver Visual Studio (well, part of it I would say) through the browser. Yes. Visual Studio &lt;strong&gt;in&lt;/strong&gt; the browser. Just for Azure Web Sites at the moment, but still awesome!&lt;br /&gt;&lt;br /&gt;InRelease changed its name, becoming &lt;a href=&quot;http://www.visualstudio.com/en-gb/explore/release-management-vs&quot;&gt;Release Management for Visual Studio 2013&lt;/a&gt;. It’s a very powerful solution for delivering artifacts, as we know, and it is perfectly integrated with Team Foundation Server and the other tools.&lt;br /&gt;&lt;br /&gt;Visual Studio 2012 got some love as well - the Update 4 is &lt;a href=&quot;http://support.microsoft.com/kb/2872520/en-gb&quot;&gt;out&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;And eventually, Application Insights is the shiny new feature of Visual Studio Online – it fills the gap for a monitoring solution which is not SCOM. But keep in mind – you can use both! &lt;a href=&quot;http://mattvsts.blogspot.co.uk/2013/11/application-insights-in-visual-studio.html?utm_source=feedburner&amp;amp;utm_medium=twitter&amp;amp;utm_campaign=Feed:+MattsAlmSpace+(Matt&apos;s+ALM+space)&quot;&gt;Here&lt;/a&gt; is my introductive post about that.</description>
        <pubDate>Wed, 13 Nov 2013 20:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/11/13/recap-of-visual-studio-launch/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/11/13/recap-of-visual-studio-launch/</guid>
      </item>
    
      <item>
        <title>Application Insights in Visual Studio Online</title>
        <description>One of the coolest things about Visual Studio ALM is that it is a continuously evolving platform. Application Insights is the latest addiction to the family, empowering the monitoring story on the Visual Studio Online side.&lt;br /&gt;&lt;a href=&quot;http://lh4.ggpht.com/-_sWOYjOwZ8g/UoNohVUTkxI/AAAAAAAABMQ/8ARPGJEc_l8/s1600-h/MMA%25255B5%25255D.png&quot;&gt;&lt;img alt=&quot;MMA&quot; border=&quot;0&quot; height=&quot;160&quot; src=&quot;http://lh4.ggpht.com/-Fnz_O4wV93c/UoNoh0S91FI/AAAAAAAABMU/M8vvIC8Inrs/MMA_thumb%25255B1%25255D.png?imgmax=800&quot; style=&quot;border: 0px currentColor; display: inline;&quot; title=&quot;MMA&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;br /&gt;First of all, you have to download the latest Microsoft Monitoring Agent. This version allows you to configure &lt;strong&gt;both&lt;/strong&gt; the Visual Studio Online Application Insights and the SCOM integration, it is a huge leap on. You can monitor .NET and Java applications, running on-premise or on Windows Azure, and Windows Phone 8 apps.&lt;br /&gt;&amp;nbsp;&lt;a href=&quot;http://lh6.ggpht.com/-3qy46dQGtXs/UoNoiINe86I/AAAAAAAABMc/yAICsv5yO_o/s1600-h/MMA3%25255B2%25255D.png&quot;&gt;&lt;img alt=&quot;MMA3&quot; border=&quot;0&quot; height=&quot;189&quot; src=&quot;http://lh4.ggpht.com/-tJEXcLakQOM/UoNoipk2L1I/AAAAAAAABMk/VdMEIQwK07Q/MMA3_thumb.png?imgmax=800&quot; style=&quot;border: 0px currentColor; display: inline;&quot; title=&quot;MMA3&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Then you must enter the &lt;strong&gt;Account ID&lt;/strong&gt; and the &lt;strong&gt;Instrumentation Key&lt;/strong&gt;. Both are unique to the Visual Studio Online account.&lt;br /&gt;&amp;nbsp;&lt;a href=&quot;http://lh6.ggpht.com/-9oiiSR0qTKI/UoNoi6pDzpI/AAAAAAAABMs/Lpaij92MBfs/s1600-h/MMA4%25255B2%25255D.png&quot;&gt;&lt;img alt=&quot;MMA4&quot; border=&quot;0&quot; height=&quot;188&quot; src=&quot;http://lh5.ggpht.com/-zCkVXgyhmhY/UoNojTwwAQI/AAAAAAAABM0/7n_FsWynsBM/MMA4_thumb.png?imgmax=800&quot; style=&quot;border: 0px currentColor; display: inline;&quot; title=&quot;MMA4&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;br /&gt;&lt;img alt=&quot;MMA5&quot; border=&quot;0&quot; height=&quot;68&quot; src=&quot;http://lh4.ggpht.com/-j7ZfK-LH4BU/UoNojmumunI/AAAAAAAABM8/KXSlyIM4rJY/MMA5_thumb.png?imgmax=800&quot; style=&quot;border: 0px currentColor; display: inline;&quot; title=&quot;MMA5&quot; width=&quot;244&quot; /&gt;&lt;br /&gt;It is possible to choose Microsoft Update as a update source. It is the recommended option, and unless you already have another update source (WSUS, SCCM) you don’t have a lot of choice :)&lt;br /&gt;&amp;nbsp;&lt;img alt=&quot;MMA6&quot; border=&quot;0&quot; height=&quot;187&quot; src=&quot;http://lh6.ggpht.com/-2q_C8mGaCw4/UoNokPDOBVI/AAAAAAAABNE/a0Lkkwhhf9c/MMA6_thumb.png?imgmax=800&quot; style=&quot;border: 0px currentColor; display: inline;&quot; title=&quot;MMA6&quot; width=&quot;244&quot; /&gt;&lt;br /&gt;That’s all. After we finish the installation, the configuration command prompt will automatically pop up, scanning your IIS. I am running it on a Microsoft demo VM, so never mind about the TFS applications and the others. The one we care about is the &lt;strong&gt;FabrikamFiber.Web&lt;/strong&gt;.&lt;br /&gt;&amp;nbsp;&lt;a href=&quot;http://lh4.ggpht.com/-0oEqynTLdGg/UoNokeYPvaI/AAAAAAAABNM/w6tsNNc8TZ4/s1600-h/MMA8%25255B2%25255D.png&quot;&gt;&lt;img alt=&quot;MMA8&quot; border=&quot;0&quot; height=&quot;130&quot; src=&quot;http://lh3.ggpht.com/-guZsI1yZC8M/UoNokt3xWVI/AAAAAAAABNU/h8j5U1cGcxo/MMA8_thumb.png?imgmax=800&quot; style=&quot;border: 0px currentColor; display: inline;&quot; title=&quot;MMA8&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://lh3.ggpht.com/-n7xI3uW4Jko/UoNolPbjl1I/AAAAAAAABNc/SbbftPRou_I/s1600-h/MMA9%25255B2%25255D.png&quot;&gt;&lt;img alt=&quot;MMA9&quot; border=&quot;0&quot; height=&quot;130&quot; src=&quot;http://lh5.ggpht.com/-yls2EyHKoq8/UoNoljZznRI/AAAAAAAABNo/BwrppkAQrEI/MMA9_thumb.png?imgmax=800&quot; style=&quot;border: 0px currentColor; display: inline;&quot; title=&quot;MMA9&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://lh3.ggpht.com/-D6FHhOkuov8/UoNomB0n4yI/AAAAAAAABNw/k7aT1kB3VQg/s1600-h/MMA10%25255B2%25255D.png&quot;&gt;&lt;img alt=&quot;MMA10&quot; border=&quot;0&quot; height=&quot;126&quot; src=&quot;http://lh3.ggpht.com/-cE4cF8PGYac/UoNomlWlKGI/AAAAAAAABN0/LQ_oQ2oEMVQ/MMA10_thumb.png?imgmax=800&quot; style=&quot;border: 0px currentColor; display: inline;&quot; title=&quot;MMA10&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;br /&gt;Now you only need to give the service some minutes of data gathering in order to start composing your data. Meanwhile, one among the big amount of possible choices is to create a summary dashboard – here’s how:&lt;br /&gt;&lt;a href=&quot;http://lh5.ggpht.com/-_VavUAguSaA/UoNom3sitiI/AAAAAAAABN8/6Xv-X4msZcg/s1600-h/MMA11%25255B2%25255D.png&quot;&gt;&lt;img alt=&quot;MMA11&quot; border=&quot;0&quot; height=&quot;128&quot; src=&quot;http://lh5.ggpht.com/-fXCWyJ_Zwwc/UoNond6Y1UI/AAAAAAAABOE/0gfq8_VnETo/MMA11_thumb.png?imgmax=800&quot; style=&quot;border: 0px currentColor; display: inline;&quot; title=&quot;MMA11&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;br /&gt;Correct, you only need to set a name and select the Application you want to aggregate data for. It is pretty cool by the way :)&lt;br /&gt;&lt;a href=&quot;http://lh5.ggpht.com/-RqYa8byGbHk/UoNonyU6qhI/AAAAAAAABOM/LK2V6Vv-XQQ/s1600-h/MMA12%25255B2%25255D.png&quot;&gt;&lt;img alt=&quot;MMA12&quot; border=&quot;0&quot; height=&quot;119&quot; src=&quot;http://lh4.ggpht.com/-9BXEwcOLDYc/UoNooIv45YI/AAAAAAAABOU/U80c-rTQt-U/MMA12_thumb.png?imgmax=800&quot; style=&quot;border: 0px currentColor; display: inline;&quot; title=&quot;MMA12&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;br /&gt;Opportunities are broad – you can monitor the Application or deep dive on a specific performance or reliability value. Keep in mind that it is possible to define a metric in a very quick and easy way, so you can even use your own metrics as a baseline for evaluating the Application’s lifecycle and its values. </description>
        <pubDate>Wed, 13 Nov 2013 16:14:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/11/13/application-insights-in-visual-studio/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/11/13/application-insights-in-visual-studio/</guid>
      </item>
    
      <item>
        <title>Feature Flags, the cornerstone of Continuous Delivery – a jumpstart</title>
        <description>I had to talk about that so it is worth to share it there as well!&lt;br /&gt;One of the pillars of Continuous Delivery is the broad usage of Feature Flags in the code.&lt;br /&gt;What’s that? It is a concept introduced by Flickr in their pioneering usage of DevOps and Continuous Delivery, and supported by &lt;a href=&quot;http://martinfowler.com/bliki/FeatureToggle.html&quot;&gt;Martin Fowler&lt;/a&gt; as well. To keep it simple, let&apos;s make an example: everybody has a control panel at home for electricity. The control panel complexity may vary – it could be simply on-off, or be shaped to split every single room of the house with one switch each. These switches are the Feature Flags.&lt;br /&gt;I guess it is pretty obvious to understand why they should be used. With them, you are improving testability, troubleshooting, and facilitating the incremental shipping.&lt;br /&gt;Of course technology is not everything. You should be backed by a very solid process, otherwise the tentative of being &lt;a href=&quot;http://code.flickr.net/2009/12/02/flipping-out/&quot;&gt;Flickr&lt;/a&gt;-like (no branches and just feature toggles) would be a bloodbath..&lt;br /&gt;An easy way of starting could be as it follows:&lt;br /&gt;&lt;a href=&quot;http://lh6.ggpht.com/-QIpF7oJn1bs/Ub7fCZW2LsI/AAAAAAAAA98/7iJWY724-fc/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;90&quot; src=&quot;http://lh4.ggpht.com/-TibsvF2sGhU/Ub7fDPjtnhI/AAAAAAAAA-E/OgXyOHN4z5w/image_thumb.png?imgmax=800&quot; style=&quot;border: 0px currentColor; display: inline;&quot; title=&quot;image&quot; width=&quot;172&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://lh3.ggpht.com/-0jQmHpIIYDc/Ub7fDmOalAI/AAAAAAAAA-M/BCREKSpxNqo/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;129&quot; src=&quot;http://lh6.ggpht.com/-0ow1UTte8C0/Ub7fESFmRxI/AAAAAAAAA-U/lwPCBMKF5Pg/image_thumb%25255B1%25255D.png?imgmax=800&quot; style=&quot;border: 0px currentColor; display: inline;&quot; title=&quot;image&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;br /&gt;It is a beginning, we can use Feature Branches to develop features (separation of concerns, modularization design patterns apply here) and merge them to the &lt;em&gt;main&lt;/em&gt; development branch. Fairly easy and fairly classic I’d say.&lt;br /&gt;Now let’s go a bit more into the code. As a sample I am using a WinRT App, leveraging on FeatureToggle as a helper. &lt;a href=&quot;https://github.com/jason-roberts/FeatureToggle&quot;&gt;FeatureToggle&lt;/a&gt; is a nice OSS library which enables Feature Flags in a very easy way, it was the easiest to set up (NuGet package) and use. And moreover, it works on Windows Desktop, WinRT and Windows Phone. Definitely worth a try IMHO. But keep in mind it is just a sample, with no willing of be production-ready :)&lt;br /&gt;I created two classes with my &lt;em&gt;features &lt;/em&gt;inside – I wanted to do the easiest possible example, so don’t mind about the code’s silliness – which implement one of the OOB toggles, simply an Interface. &lt;br /&gt;After this, in the MainPage() I would set (for the example, because in WinRT there are no .config files. In a webapp I would &lt;strong&gt;read&lt;/strong&gt; the web.config file instead) the available features - and of course in the FF.Dev I would get the &lt;strong&gt;Yes&lt;/strong&gt; and &lt;strong&gt;No&lt;/strong&gt; features because of the merge from the feature branches – and then the bounded controls would be instantiated.&lt;br /&gt;&lt;a href=&quot;http://lh3.ggpht.com/-ycER0hJaEIU/Ub7fE2elaVI/AAAAAAAAA-c/DcXVPT16ypU/s1600-h/image%25255B9%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;124&quot; src=&quot;http://lh3.ggpht.com/-thlJWXDwAzk/Ub7fFfXP8JI/AAAAAAAAA-k/MnDCSsd3bQo/image_thumb%25255B3%25255D.png?imgmax=800&quot; style=&quot;border: 0px currentColor; display: inline;&quot; title=&quot;image&quot; width=&quot;545&quot; /&gt;&lt;/a&gt; &lt;br /&gt;If I do not want to enable the &lt;strong&gt;Yes&lt;/strong&gt; feature, I just have to set its configuration value to &lt;strong&gt;false&lt;/strong&gt;, and despite the code is there, it won’t be available to the user. Which is exactly the target of Feature Flags.&lt;br /&gt;&lt;br /&gt;Just run the application with the settings you want, and you would get the result. In case of a &lt;em&gt;old-fashioned&lt;/em&gt; web application or whatever else, you can rely on XML files (and their transformations, if needed) for configurations.</description>
        <pubDate>Fri, 08 Nov 2013 14:43:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/11/08/feature-flags-cornerstone-of-continuous/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/11/08/feature-flags-cornerstone-of-continuous/</guid>
      </item>
    
      <item>
        <title>How to change a TFS GUID and why is it extremely important?</title>
        <description>&lt;p&gt;If you are working on a test upgrade of an existing Team Foundation Server by restoring it on another machine, keep in mind it is not enough to discern it from the existing instance.&lt;/p&gt; &lt;p&gt;Yes – you are changing machine names and IPs – but it would be needed to change the GUIDs as well, otherwise the Visual Studio cache is going to go crazy. You have one GUID per Team Project Collection, and they are stored inside the &lt;strong&gt;TFS_Configuration database&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;You need to quiesce the server first, then use the &lt;strong&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/vstudio/ee349259.aspx&quot;&gt;TFSConfig ChangeServerID&lt;/a&gt; &lt;/strong&gt;tool:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;tfsconfig changeserverid&amp;nbsp; /sqlinstance:&amp;lt;your-sql instance&amp;gt; /DatabaseName:Tfs_Configuration /projectcollectionsonly &lt;/strong&gt;&lt;/p&gt; &lt;p&gt;You can specify if you are running on SQL AlwaysOn as well.&lt;/p&gt;  </description>
        <pubDate>Fri, 01 Nov 2013 16:18:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/11/01/how-to-change-tfs-guid-and-why-is-it/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/11/01/how-to-change-tfs-guid-and-why-is-it/</guid>
      </item>
    
      <item>
        <title>Converting TFS 2008 servers to 2012 and 2013</title>
        <description>As you know, Team Foundation Server 2008 had several limitations which prevents a direct migration to 2012 or 2013. It is a &lt;strong&gt;legacy&lt;/strong&gt; release, good at its times but definitely not adequate anymore.&lt;br /&gt;Migrating it through an in-place upgrade to 2010 and then a move to 2012/2013 version (from now on &lt;strong&gt;modern&lt;/strong&gt;) is feasible, but often the server where the legacy version runs is old as well – 32 bit only CPU overall – making the migration path harder because of the move.&lt;br /&gt;There is a very handy tool for dealing with this scenario: &lt;strong&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/vstudio/ff407080(v=vs.120).aspx&quot;&gt;TFSConfig Import&lt;/a&gt;&lt;/strong&gt;.&lt;br /&gt;It is meant to convert the legacy server into a new Team Project Collection in the modern instance. It won’t migrate reports or SharePoint, but it is worth using it as it saves a ton of time in the process.&lt;br /&gt;It is needed to move the databases onto the current Team Foundation Server – or upgrade the legacy one to a supported version by the modern release you are using – and then launching the command as an administrator:&lt;br /&gt;TFSConfig Import /SQLInstance:&amp;lt;servername&amp;gt; /CollectionName:&amp;lt;MigratedCollectionName&amp;gt; /confirmed&lt;br /&gt;The &lt;strong&gt;/confirmed&lt;/strong&gt; switch is meant to confirm you have backups of the databases you are converting, as after the process they won’t be compatible with the old TFS.</description>
        <pubDate>Mon, 21 Oct 2013 20:29:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/10/21/converting-tfs-2008-servers-to-2012-and/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/10/21/converting-tfs-2008-servers-to-2012-and/</guid>
      </item>
    
      <item>
        <title>Visual Studio ALM 2013 is RTM: is it just Visual Studio and TFS?</title>
        <description>&lt;p&gt;As we know, Visual Studio ALM 2013 has been RTM’d and released. But is it just a new Visual Studio and a new Team Foundation Server?&lt;/p&gt; &lt;p&gt;Obviously not. Apart from these, we are talking about:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;the new Monitoring Agent 2013, which contains a newer and enhanced version of the Standalone IntelliTrace Collector  &lt;li&gt;the new &lt;a href=&quot;http://go.microsoft.com/fwlink/?LinkId=248624&quot;&gt;MSSCCI 2013 provider&lt;/a&gt;, which enables legacy clients to connect to Team Foundation Server 2013  &lt;li&gt;the latest &lt;a href=&quot;http://visualstudiogallery.msdn.microsoft.com/f017b10c-02b4-4d6d-9845-58a06545627f&quot;&gt;Team Foundation Server Power Tools 2013&lt;/a&gt;  &lt;li&gt;the latest &lt;a href=&quot;http://visualstudiogallery.msdn.microsoft.com/2011f516-15a7-4f9a-8b86-1e0894a75739&quot;&gt;Team Foundation Server Build Extensions&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;And – as usual - there is more on the Team Foundation Service side every three weeks, with their agile release cadence.&lt;/p&gt;  </description>
        <pubDate>Thu, 17 Oct 2013 12:33:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/10/17/visual-studio-alm-2013-is-rtm-is-it/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/10/17/visual-studio-alm-2013-is-rtm-is-it/</guid>
      </item>
    
      <item>
        <title>Fix the “Cannot perform &apos;SetProperty of Text with value “” on the hidden control.” error</title>
        <description>&lt;p&gt;If you are trying to use Test Manager to record a manual test with a web application and then play it back, you might find a nasty issue while inputting stuff: the error &lt;strong&gt;“Cannot perform &apos;SetProperty of Text with value &quot;value&quot;&apos; on the hidden control.”.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;It is caused by the Microsoft Security Update MS13-069 (KB2870699), which introduces several security fixes as well as this strange behaviour.&lt;/p&gt; &lt;p&gt;To fix it and correctly playback the test, you would need to install the &lt;a href=&quot;http://www.microsoft.com/en-us/download/details.aspx?id=40338&quot;&gt;latest&lt;/a&gt; Update of Visual Studio 2012 or use Visual Studio 2013 which is not affected. &lt;/p&gt;  </description>
        <pubDate>Thu, 10 Oct 2013 15:51:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/10/10/fix-cannot-perform-of-text-with-value/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/10/10/fix-cannot-perform-of-text-with-value/</guid>
      </item>
    
      <item>
        <title>Microsoft Monitoring Agent 2013 overview</title>
        <description>&lt;p&gt;A couple of weeks ago Microsoft released the &lt;a href=&quot;http://www.microsoft.com/en-us/download/details.aspx?id=40316&quot;&gt;Microsoft Monitoring Agent 2013&lt;/a&gt;, the next generation of the very useful Standalone IntelliTrace Collector.&lt;/p&gt; &lt;p&gt;It is a very interesting tool – as I mentioned at DevReach – because it can be used as a standalone collector or integrated with System Center Operations Manager, being then the foundation of the bridge connecting IT Operations teams and Development teams.&lt;/p&gt; &lt;p&gt;If you want to run it, it is absolutely easy:&lt;/p&gt; &lt;p&gt;&lt;img src=&quot;http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-92/3107.two.png&quot; width=&quot;500&quot; height=&quot;98&quot;&gt;&lt;/p&gt; &lt;p&gt;What’s next? &lt;/p&gt; &lt;p&gt;&lt;img src=&quot;http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-45-92/7268.Three.png&quot; width=&quot;500&quot; height=&quot;117&quot;&gt;&lt;/p&gt;  &lt;p&gt;A wonderful IntelliTrace file &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh4.ggpht.com/-6f4trL-beAY/Uk7E2sSr8NI/AAAAAAAABL8/N9iDmxq0Imo/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt;  </description>
        <pubDate>Fri, 04 Oct 2013 13:38:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/10/04/microsoft-monitoring-agent-2013-overview/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/10/04/microsoft-monitoring-agent-2013-overview/</guid>
      </item>
    
      <item>
        <title>Review – Professional Scrum with Team Foundation Server 2010</title>
        <description>I can already hear the voices…”why are you reviewing a three years old book?” “It is on 2010, it is outdated!” and so on.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://5piexa.bay.livefilestore.com/y2pmAJ_3Jx1SUMJEv1QMFEZrfXYHL9POCzuSJEC-rGtoDfdRNTuySTM4tzvmktXXwdbNnXYEum_9zTYb8n7lacw-e4Aj_upnXK6tGtYxzbJpWI/WP_20130912_001.jpg?psid=1&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://5piexa.bay.livefilestore.com/y2pmAJ_3Jx1SUMJEv1QMFEZrfXYHL9POCzuSJEC-rGtoDfdRNTuySTM4tzvmktXXwdbNnXYEum_9zTYb8n7lacw-e4Aj_upnXK6tGtYxzbJpWI/WP_20130912_001.jpg?psid=1&quot; width=&quot;225&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Instead – trust me – I would strongly suggest you to buy it, for a simple reason. All the features used and explained in this book are the same or very similar from 2010 on, as we are talking about essential, cornerstone features.&lt;br /&gt;Moreover, the book covers the very needed concepts needed for Scrum, so it is very helpful when you have to introduce a team to it.&lt;br /&gt;The authors (&lt;strong&gt;Steve Resnick &lt;/strong&gt;– Architect at Courion Corporation, &lt;strong&gt;Michael de la Maza&lt;/strong&gt; – Agile Coach and Investor, &lt;strong&gt;Aaron Bjork&lt;/strong&gt; – Senior Program Manager at Microsoft) explain everything with a very good pace and the required level of detail: they go step-by-step in every required part of the Scrum methodology, and at the end you will find a dedicated chapter on &lt;strong&gt;Spikes &lt;/strong&gt;and an appendix dedicated to the Scrum Assessment.&lt;br /&gt;It is very handy to use as a quick reference, just grab the required chapter and you would get your answer. &lt;br /&gt;I am going to use it with a new team to be inducted to Scrum, by keeping it on the table during the daily Scrum and every Meeting. I bet it is going to be helpful &lt;img alt=&quot;Smile&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; src=&quot;http://lh3.ggpht.com/-9Ehqy3NfevA/UjthDsmh0wI/AAAAAAAABLs/EZVMizqiuXU/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot; /&gt;</description>
        <pubDate>Mon, 23 Sep 2013 08:02:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/09/23/review-professional-scrum-with-team/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/09/23/review-professional-scrum-with-team/</guid>
      </item>
    
      <item>
        <title>How an automated release looks like – the InRelease side</title>
        <description>Once you have an automatic build leveraging &lt;strong&gt;InRelease&lt;/strong&gt; for its automatic deploy, the workflow is pretty easy and straightforward.&lt;br /&gt;Let’s say we make a whatever edit to a file in our project:&lt;br /&gt;&lt;a href=&quot;http://lh5.ggpht.com/-SSTeTMrozLY/UhuuogwbvRI/AAAAAAAABI0/OAKmwWTcCYM/s1600-h/cir1%25255B2%25255D.png&quot;&gt;&lt;img alt=&quot;cir1&quot; border=&quot;0&quot; height=&quot;34&quot; src=&quot;http://lh6.ggpht.com/-iarJnFsfkBE/UhuupKzqwyI/AAAAAAAABI4/2y7RYJPBF5Y/cir1_thumb.png?imgmax=800&quot; style=&quot;background-image: none; border: 0px currentColor; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;cir1&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;br /&gt;We check it in, and we trigger a &lt;strong&gt;Continuous Integration build&lt;/strong&gt;.&lt;br /&gt;&lt;a href=&quot;http://lh3.ggpht.com/-54khGoSfXtY/UhuupkyhGPI/AAAAAAAABJA/_2EeA-lNGFA/s1600-h/cir2%25255B2%25255D.png&quot;&gt;&lt;img alt=&quot;cir2&quot; border=&quot;0&quot; height=&quot;244&quot; src=&quot;http://lh6.ggpht.com/-6-oMxKVVwVY/Uhuup5CLcLI/AAAAAAAABJI/Nu4NWXV-8po/cir2_thumb.png?imgmax=800&quot; style=&quot;background-image: none; border: 0px currentColor; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;cir2&quot; width=&quot;168&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://lh5.ggpht.com/-wFrOqkBKEvI/Uhuuqes8GzI/AAAAAAAABJQ/jlmg-b3KvUg/s1600-h/cir3%25255B2%25255D.png&quot;&gt;&lt;img alt=&quot;cir3&quot; border=&quot;0&quot; height=&quot;244&quot; src=&quot;http://lh6.ggpht.com/-X35k6b4Nr8I/Uhuuq4aXgsI/AAAAAAAABJc/0Fd7x_TKlFs/cir3_thumb.png?imgmax=800&quot; style=&quot;background-image: none; border: 0px currentColor; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;cir3&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Nothing too fancy at the moment. But of course we have to use the &lt;strong&gt;InRelease Build Definition Template&lt;/strong&gt; for using those features, so we are going to see some specific activities in the build log, targeted at this.&lt;br /&gt;&lt;a href=&quot;http://lh6.ggpht.com/-vhqQUpf8OXo/UhuuvIpaRwI/AAAAAAAABJk/4eeXoI5qI5I/s1600-h/cir4%25255B2%25255D.png&quot;&gt;&lt;img alt=&quot;cir4&quot; border=&quot;0&quot; height=&quot;96&quot; src=&quot;http://lh6.ggpht.com/-3QqDTgtUeR4/UhuuvkzMBXI/AAAAAAAABJo/0kXKpoHAiiY/cir4_thumb.png?imgmax=800&quot; style=&quot;background-image: none; border: 0px currentColor; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;cir4&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;br /&gt;The next steps are extremely easy and straightforward: depending on the Release Settings someone designed as &lt;strong&gt;Approver&lt;/strong&gt; should approve the deployment:&lt;br /&gt;&lt;a href=&quot;http://lh6.ggpht.com/-jww2-V90aYY/Uhuuv_zriRI/AAAAAAAABJw/G-H07S57R7k/s1600-h/cir5%25255B2%25255D.png&quot;&gt;&lt;img alt=&quot;cir5&quot; border=&quot;0&quot; height=&quot;11&quot; src=&quot;http://lh5.ggpht.com/-q97ySOO_rz4/UhuuwY4Er-I/AAAAAAAABJ4/gfz0yvsp_oc/cir5_thumb.png?imgmax=800&quot; style=&quot;background-image: none; border: 0px currentColor; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;cir5&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Once this person/team accomplished this task, that’s basically all &lt;img alt=&quot;Smile&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; src=&quot;http://lh4.ggpht.com/-CCC24nYJm9U/Uhuuw0zJL6I/AAAAAAAABKA/psvKIaCBji0/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot; /&gt;The only missing piece would be &lt;strong&gt;approving the Release&lt;/strong&gt; (again, based on its settings. So it could be avoided, if needed)&lt;br /&gt;&lt;a href=&quot;http://lh6.ggpht.com/--K5oXohvGso/UhuuxPGeeEI/AAAAAAAABKM/V1KwxaRKbac/s1600-h/cir6%25255B2%25255D.png&quot;&gt;&lt;img alt=&quot;cir6&quot; border=&quot;0&quot; height=&quot;24&quot; src=&quot;http://lh4.ggpht.com/-bulJYFmn738/Uhuuxq9GV4I/AAAAAAAABKU/M7AMtqU7R_M/cir6_thumb.png?imgmax=800&quot; style=&quot;background-image: none; border: 0px currentColor; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;cir6&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://lh3.ggpht.com/-_WfUdo8z7K4/UhuuyRE-l6I/AAAAAAAABKc/biEG7KexVVQ/s1600-h/cir7%25255B2%25255D.png&quot;&gt;&lt;img alt=&quot;cir7&quot; border=&quot;0&quot; height=&quot;62&quot; src=&quot;http://lh4.ggpht.com/-2T6-XKAWvKM/UhuuygAG3HI/AAAAAAAABKk/rdg1Zl1DQTA/cir7_thumb.png?imgmax=800&quot; style=&quot;background-image: none; border: 0px currentColor; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;cir7&quot; width=&quot;168&quot; /&gt;&lt;/a&gt;&lt;br /&gt;A very useful aid is the possibility of scheduling the transition (i.e.: QA to Prod) to a future time, in order to be compliant with whatever company policy you might have.&lt;br /&gt;&lt;a href=&quot;http://lh5.ggpht.com/-YXEF55t38Ys/UhuuzMrpUtI/AAAAAAAABKs/xq4r96KdAZQ/s1600-h/cir8%25255B2%25255D.png&quot;&gt;&lt;img alt=&quot;cir8&quot; border=&quot;0&quot; height=&quot;114&quot; src=&quot;http://lh6.ggpht.com/-cHhn27mfmbk/Uhuuz5bDWxI/AAAAAAAABKw/yYcW9CyDtTM/cir8_thumb.png?imgmax=800&quot; style=&quot;background-image: none; border: 0px currentColor; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;cir8&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;br /&gt;And this is &lt;em&gt;really&lt;/em&gt; all &lt;img alt=&quot;Smile&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; src=&quot;http://lh4.ggpht.com/-CCC24nYJm9U/Uhuuw0zJL6I/AAAAAAAABKA/psvKIaCBji0/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot; /&gt;</description>
        <pubDate>Tue, 17 Sep 2013 09:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/09/17/how-automated-release-looks-like/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/09/17/how-automated-release-looks-like/</guid>
      </item>
    
      <item>
        <title>Work Item Queries Charts</title>
        <description>In the latest sprint, Microsoft released a very nice feature for reporting purposes: Charts for Work Item Queries.&lt;br /&gt;It is incredibly easy to use. You do not need anything but Team Foundation Service. You can click on the link while opening a WIQL query:&lt;br /&gt;&lt;a href=&quot;http://lh5.ggpht.com/-cQtXE-4yPIM/UfpUUxZT3mI/AAAAAAAABF4/hJD3bYGByEU/s1600-h/ch00%25255B2%25255D.png&quot;&gt;&lt;img alt=&quot;ch00&quot; border=&quot;0&quot; height=&quot;121&quot; src=&quot;http://lh5.ggpht.com/-PPPC-I6PehY/UfpUVcIdSNI/AAAAAAAABGA/zSfiKKjs9pM/ch00_thumb.png?imgmax=800&quot; style=&quot;border: 0px currentColor; display: inline;&quot; title=&quot;ch00&quot; width=&quot;194&quot; /&gt;&lt;/a&gt; &lt;br /&gt;and creating a new Chart&lt;br /&gt;&lt;a href=&quot;http://lh6.ggpht.com/--t4Gm0hIC48/UfpUVxDADcI/AAAAAAAABGI/sWiyee4lC5M/s1600-h/ch01%25255B2%25255D.png&quot;&gt;&lt;img alt=&quot;ch01&quot; border=&quot;0&quot; height=&quot;109&quot; src=&quot;http://lh5.ggpht.com/-ZI2gNpHRjA0/UfpUWdI9D0I/AAAAAAAABGQ/efTc4fz108I/ch01_thumb.png?imgmax=800&quot; style=&quot;border: 0px currentColor; display: inline;&quot; title=&quot;ch01&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;br /&gt;Finished. &lt;br /&gt;&lt;a href=&quot;http://lh6.ggpht.com/-PrfHofrNBCY/UfpVhtk5hJI/AAAAAAAABGg/GxXZzQrUbF4/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;225&quot; src=&quot;http://lh3.ggpht.com/-pMbgcIsl0XE/UfpViFAECOI/AAAAAAAABGo/raYRKo_239M/image_thumb.png?imgmax=800&quot; style=&quot;border: 0px currentColor; display: inline;&quot; title=&quot;image&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;br /&gt;Unfortunately at the moment is just supports flat lists, but in the future it is going to support the two other WIQL resultsets. It is very handy, you can embed it into an email or whatever, and it comes working with no configuration. Well done team!</description>
        <pubDate>Mon, 09 Sep 2013 18:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/09/09/work-item-queries-charts/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/09/09/work-item-queries-charts/</guid>
      </item>
    
      <item>
        <title>How an automated release looks like – the Team Foundation Build side</title>
        <description>Well, when it comes to the &lt;strong&gt;Automated Release&lt;/strong&gt; our &lt;em&gt;beloved&lt;/em&gt; Team Foundation Build has not so much to do…apart from hers usual stuff, with a slightly different Build Process Template.&lt;br /&gt;For enabling an Automated Release, you have to add a custom Template and create a Build Definition using it. You are going to find it into the &lt;strong&gt;InRelease installation folder &lt;/strong&gt;(…\InCycle Software\InRelease\Bin).&lt;br /&gt;&lt;a href=&quot;http://lh3.ggpht.com/-YRgX9lPOBsc/Uhu8UzBA58I/AAAAAAAABLE/nD6t291_anI/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;96&quot; src=&quot;http://lh3.ggpht.com/-K9LV7fO5U20/Uhu8VRI6OlI/AAAAAAAABLI/cup3T-54Y6w/image_thumb%25255B1%25255D.png?imgmax=800&quot; style=&quot;background-image: none; border: 0px currentColor; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;br /&gt;You are going to notice that there is a dedicated InRelease section for its parameters. If &lt;strong&gt;Release Build&lt;/strong&gt; is set to &lt;strong&gt;True&lt;/strong&gt; you are going to deploy the build. &lt;br /&gt;You can set a &lt;strong&gt;Release Target Stage&lt;/strong&gt; – if needed. Leaving it blank will make it go through all the possible stages unless stopped - and a specific &lt;strong&gt;Configuration to Release – &lt;/strong&gt;leveraging the same configurations you might use in the Configuration Manager.&lt;br /&gt;Every component must be configured to &lt;strong&gt;Build with Application &lt;/strong&gt;or &lt;strong&gt;Build Externally&lt;/strong&gt;. A &lt;strong&gt;Build Independently&lt;/strong&gt; component won’t work. This is a known limitation of InRelease.&lt;br /&gt;And obviously, both &lt;strong&gt;Acceptance Step &lt;/strong&gt;and &lt;strong&gt;Deployment Step &lt;/strong&gt;of the very first stage of the associated release path must be &lt;strong&gt;Automated&lt;/strong&gt;.&lt;br /&gt;The main task it does is the &lt;strong&gt;Configuration File Tokenization&lt;/strong&gt;. This feature, together with a specific syntax into the configuration files themselves (usually &lt;strong&gt;__VALUE__&lt;/strong&gt;), makes a build-time transformation based on the target stage.&lt;br /&gt;&lt;a href=&quot;http://lh6.ggpht.com/-I1-kYSsXNkU/Uhu8VuZASjI/AAAAAAAABLQ/PGNZ7hunaBA/s1600-h/image%25255B8%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;244&quot; src=&quot;http://lh4.ggpht.com/-sOUXoyHheFk/Uhu8WG1A3lI/AAAAAAAABLY/jn7wxQ6HpNI/image_thumb%25255B2%25255D.png?imgmax=800&quot; style=&quot;background-image: none; border: 0px currentColor; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;233&quot; /&gt;&lt;/a&gt;&lt;br /&gt;For achieving this, it is needed to install the &lt;strong&gt;Client Component&lt;/strong&gt; of InRelease on the Build Server.&lt;br /&gt;It is not something that hard or trivial – you can integrate these specific tasks into a pre-existing customized Build Template so you are going to get a single template if you need.&lt;br /&gt;After that, the InRelease &lt;strong&gt;Release Service&lt;/strong&gt; is invoked, and everything passes through that, with the related configurations and settings.</description>
        <pubDate>Mon, 09 Sep 2013 12:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/09/09/how-automated-release-looks-like-team/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/09/09/how-automated-release-looks-like-team/</guid>
      </item>
    
      <item>
        <title>Your first InRelease Release</title>
        <description>In&amp;nbsp; the previous posts we saw the main pieces of InRelease, so let’s see how they fit together!&lt;br /&gt;You are going to create a new Release: it is based on a Template, and it has two essential information to fill: the &lt;strong&gt;Target Stage&lt;/strong&gt;, which is basically “&lt;em&gt;where to stop&lt;/em&gt;” and the &lt;strong&gt;build&lt;/strong&gt; to use, which could be the latest or a selected one (or even a build &lt;em&gt;on-the-run&lt;/em&gt;).&lt;br /&gt;&lt;a href=&quot;http://lh5.ggpht.com/-qt2capcfiQ8/Ug9or9l6ydI/AAAAAAAABH8/OnrMO-v_O2c/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;325&quot; src=&quot;http://lh6.ggpht.com/-iQZJ0zx-EYQ/Ug9osI7KSfI/AAAAAAAABIA/BKXTLC7GH6I/image_thumb%25255B1%25255D.png?imgmax=800&quot; style=&quot;background-image: none; border: 0px currentColor; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;403&quot; /&gt;&lt;/a&gt;&lt;br /&gt;You should define the stages, if you didn’t. It is extremely easy, as it just explains who approves the stages and who is the owner. You can add automation (starting a build), if you need.&lt;br /&gt;&lt;a href=&quot;http://lh5.ggpht.com/-YMvkeRyL3SE/Ug9osuuz6yI/AAAAAAAABIM/UglNWvM5_bQ/s1600-h/image%25255B7%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;351&quot; src=&quot;http://lh3.ggpht.com/-utwmdcAiFak/Ug9otGxjFZI/AAAAAAAABIQ/m2DX5QenZj8/image_thumb%25255B3%25255D.png?imgmax=800&quot; style=&quot;background-image: none; border: 0px currentColor; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;438&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Releases are fully trackable, and you get a step-by-step progress sequence to check, with its logs.&lt;br /&gt;&lt;a href=&quot;http://lh3.ggpht.com/-whb5K_Cz32Y/Ug9otfZe1sI/AAAAAAAABIc/HPYQHZ0wxnA/s1600-h/image%25255B11%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;161&quot; src=&quot;http://lh5.ggpht.com/-ZPXyvDmxZyo/Ug9ot-T2jlI/AAAAAAAABIg/vbK6-q5U3Ug/image_thumb%25255B5%25255D.png?imgmax=800&quot; style=&quot;background-image: none; border: 0px currentColor; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;457&quot; /&gt;&lt;/a&gt;</description>
        <pubDate>Sun, 01 Sep 2013 14:40:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/09/01/your-first-inrelease-release/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/09/01/your-first-inrelease-release/</guid>
      </item>
    
      <item>
        <title>Team Foundation Server 2013 in production? With some help! TFS Upgrade Weekend</title>
        <description>&lt;p&gt;Microsoft scheduled a very interesting initiative for the 13-15 September: the Team Foundation Server 2013 Upgrade Weekend.&lt;/p&gt; &lt;p&gt;What is that? It is a weekend where organizations can upgrade their Team Foundation Servers to the 2013 release with the latest go-live prerelease, and get free support in case of issues by the Microsoft CSS.&lt;/p&gt; &lt;p&gt;I strongly suggest to join us (I am going to upgrade several instances as well, both personal and corporate), to do this you are simply required to register &lt;a href=&quot;http://aka.ms/TFSUpgradeWeekend&quot;&gt;here&lt;/a&gt; so they can staff the appropriate people. &lt;/p&gt; &lt;p&gt;If you need to download the previews, &lt;a href=&quot;http://aka.ms/GetVS2013&quot;&gt;here&lt;/a&gt; you can find what you might need!&lt;/p&gt;  </description>
        <pubDate>Fri, 30 Aug 2013 22:10:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/08/30/team-foundation-server-2013-in/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/08/30/team-foundation-server-2013-in/</guid>
      </item>
    
      <item>
        <title>InRelease Components and Release Templates, what are they?</title>
        <description>The most important parts of InRelease are &lt;strong&gt;Components&lt;/strong&gt; and &lt;strong&gt;Release Templates&lt;/strong&gt;, which enable deployments to be smooth and automatic.&lt;br /&gt;You can package as a &lt;strong&gt;Component&lt;/strong&gt; almost everything, but everything starts from a build:&lt;br /&gt;&lt;a href=&quot;http://lh3.ggpht.com/-h0Rk86MD1f8/Uf_1mTaK2II/AAAAAAAABG4/-jptZavCyG0/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;377&quot; src=&quot;http://lh5.ggpht.com/-gCTMS8NPWKE/Uf_1m9Tm5OI/AAAAAAAABG8/tNk62GuJtug/image_thumb%25255B1%25255D.png?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;499&quot; /&gt;&lt;/a&gt;&lt;br /&gt;You can define to get the Component in several ways: it can be built with the application, independently, or just by picking it up from a file share.&lt;br /&gt;The next step is on defining how to deploy this Component. You must use an InRelease &lt;strong&gt;Tool&lt;/strong&gt;, which could be just your own basic script as you can see.&lt;br /&gt;&lt;a href=&quot;http://lh5.ggpht.com/-MQ_pmE6YOwg/Uf_1nAwJpWI/AAAAAAAABHE/Eb7lEBDjm6k/s1600-h/image%25255B7%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;133&quot; src=&quot;http://lh4.ggpht.com/-w9HdktD91kU/Uf_1npiaPwI/AAAAAAAABHM/h8JsWkxArO0/image_thumb%25255B3%25255D.png?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;503&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Beside of that, you can define some variables to be replaced and, most important, the associated Release Templates.&lt;br /&gt;The &lt;strong&gt;Release Template&lt;/strong&gt; is the &lt;strong&gt;Release Pipeline’s core&lt;/strong&gt;. It is built on Windows Workflow Foundation, and it defines the step-by-step deployment activities to be carried on.&lt;br /&gt;&lt;a href=&quot;http://lh5.ggpht.com/-HHkzQmsoxkg/Ug9joNpFycI/AAAAAAAABHk/jOhILm59NPc/s1600-h/image4%25255B1%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;372&quot; src=&quot;http://lh5.ggpht.com/-CvnmXDjywr0/Ug9joijvK3I/AAAAAAAABHo/AAf5XqwP0tY/image_thumb1%25255B1%25255D.png?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;286&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Right there you are going to shape every single step with the related configuration variable (like for the &lt;strong&gt;Create Web Site &lt;/strong&gt;activity, for example). You can add as much Components (like &lt;strong&gt;Call Center Site&lt;/strong&gt;) or Activities (which are like &lt;strong&gt;Create Web Site&lt;/strong&gt;) as you want.</description>
        <pubDate>Thu, 22 Aug 2013 09:30:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/08/22/inrelease-components-and-release/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/08/22/inrelease-components-and-release/</guid>
      </item>
    
      <item>
        <title>Some basic concepts of InRelease</title>
        <description>Despite it is tightly integrated with Team Foundation Server, InRelease is – as far as today –&amp;nbsp; a standalone product.&lt;br /&gt;It is formed of three components: a Server, a Client and as many Deployers you might need, installed on the servers where you are going to deploy you application.&lt;br /&gt;Everything is so granular, it reminds of a &lt;a href=&quot;http://en.wikipedia.org/wiki/Matryoshka_doll&quot;&gt;Russian nested doll&lt;/a&gt;.&lt;br /&gt;You are going to create a &lt;strong&gt;Release&lt;/strong&gt;. The Release is based on a &lt;strong&gt;Template&lt;/strong&gt; which defines the stages and the actions of a deployment. &lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://lh5.ggpht.com/-QalZK7IRL2o/UevHy1_q_WI/AAAAAAAABD4/unA5qLQy2Ns/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;227&quot; src=&quot;http://lh6.ggpht.com/-QT8pzm4VcWg/UevHzWM9mFI/AAAAAAAABD8/95HUG56iiJw/image_thumb%25255B1%25255D.png?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;384&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It is based on Windows Workflow Foundation, and it is very intuitive. You can find a huge amount of out-of-the-box actions and the InRelease &lt;strong&gt;Components&lt;/strong&gt;, we are going to see in a separate post what are they and how to customize them.&lt;br /&gt;&lt;br /&gt;In order to be able to deploy, the Template must feature &lt;strong&gt;Environments&lt;/strong&gt;, containers for the target &lt;strong&gt;Servers&lt;/strong&gt; running the Deployer component.&lt;br /&gt;In my case, I created two Environments (Development and Production), each containing one server (dev.domain.tld and prod.domain.tld).&lt;br /&gt;As you can see in the picture, for this sample the deployment pipeline is extremely easy: create a folder in the target server and copy some files into it.&lt;br /&gt;Then the simplest release workflow is based on approvals: you must approve the deployment and the successful completion. It is possible to make approvals and rejection from both the Console or the handy web interface.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://lh4.ggpht.com/-85t7zVtG7Hs/UevHzl4y3KI/AAAAAAAABEI/53MRICPjUbw/s1600-h/image%25255B7%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;111&quot; src=&quot;http://lh6.ggpht.com/-zntLtUlw_5I/UevH0LmmzKI/AAAAAAAABEM/0hYD7YSFslI/image_thumb%25255B3%25255D.png?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;440&quot; /&gt;&lt;/a&gt;&lt;br /&gt;These are the basic concepts you might need to know about InRelease &lt;img alt=&quot;Smile&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; src=&quot;http://lh3.ggpht.com/-VjtTMjWf9GU/UevH0ZJ6JwI/AAAAAAAABEU/YbzdcyWWcGc/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot; /&gt;</description>
        <pubDate>Mon, 12 Aug 2013 07:30:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/08/12/some-basic-concepts-of-inrelease/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/08/12/some-basic-concepts-of-inrelease/</guid>
      </item>
    
      <item>
        <title>Letting System Center Operations Manager 2013 and Team Foundation Server 2013 Preview talk together</title>
        <description>Despite TFS 2013 is still a Preview, it is fully compatible with the other Microsoft products.&lt;br /&gt;For enabling the DevOps story, you need to follow the TechNet &lt;a href=&quot;http://technet.microsoft.com/en-us/library/jj883936.aspx&quot;&gt;procedure&lt;/a&gt; as usual, &lt;strong&gt;but&lt;/strong&gt; you need:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;to install the &lt;a href=&quot;http://visualstudiogallery.msdn.microsoft.com/f30e5cc7-036e-449c-a541-d522299445aa&quot;&gt;TFS 2012 Object Model&lt;/a&gt;&lt;/li&gt;&lt;li&gt;restart the SCOM HealthService via PowerShell (&lt;strong&gt;restart-service HealthService&lt;/strong&gt;)&lt;/li&gt;&lt;li&gt;after you successfully connect to the server with the wizard, you should get a &lt;strong&gt;TF223006&lt;/strong&gt; error regarding the command-line tools. Don’t worry. Save the configuration, and manually &lt;a href=&quot;http://technet.microsoft.com/en-us/library/jj899890.aspx&quot;&gt;add&lt;/a&gt; the OperationalIssue_11 Work Item Type from the Operations Manager installation media.&lt;/li&gt;&lt;/ul&gt;&lt;a href=&quot;http://lh3.ggpht.com/-O7IyYc80cis/UfA96b5F7II/AAAAAAAABFQ/a26s4k9HPLw/s1600-h/clip_image002%25255B3%25255D.jpg&quot;&gt;&lt;img alt=&quot;clip_image002&quot; border=&quot;0&quot; height=&quot;129&quot; src=&quot;http://lh6.ggpht.com/-1E7Si2yqrD8/UfA96jVPDsI/AAAAAAAABFU/eYSwzuWQmlo/clip_image002_thumb.jpg?imgmax=800&quot; style=&quot;background-image: none; border: 0px currentColor; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;clip_image002&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://lh6.ggpht.com/-K6sd2-qewS0/UfA97E9Js6I/AAAAAAAABFg/rFqB9tTWObM/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;217&quot; src=&quot;http://lh4.ggpht.com/-q_aUcmSr8Yg/UfA97Qg2AaI/AAAAAAAABFk/L2Xn9KmsVt4/image_thumb%25255B1%25255D.png?imgmax=800&quot; style=&quot;background-image: none; border: 0px currentColor; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;366&quot; /&gt;&lt;/a&gt;&lt;br /&gt;and it works!</description>
        <pubDate>Mon, 05 Aug 2013 20:49:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/08/05/letting-system-center-operations/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/08/05/letting-system-center-operations/</guid>
      </item>
    
      <item>
        <title>A little, unnoticed feature in Visual Studio – Notifications Center</title>
        <description>It is not something you go around shouting “This is a life changer!”, but IMHO it has its own dignity and it is going to gain more and more importance in the future releases. &lt;br /&gt;I am talking about the Visual Studio Notifications Center. It is something which is based on the &lt;a href=&quot;http://blogs.msdn.com/b/bharry/archive/2013/06/26/a-few-more-visual-studio-2013-preview-features.aspx&quot;&gt;Connected IDE&lt;/a&gt;, maybe the first example of its integration into Visual Studio, together with the Roaming Settings.&lt;br /&gt;It is a small icon on top of the IDE…&lt;br /&gt;&lt;a href=&quot;http://lh3.ggpht.com/-C2XHiEFcmb4/Ue-v8kstUOI/AAAAAAAABEo/dN7ASX1yEAI/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;45&quot; src=&quot;http://lh3.ggpht.com/-jbj5uzNZsRA/Ue-v9JubaKI/AAAAAAAABEw/KtkVjC8HRnc/image_thumb.png?imgmax=800&quot; style=&quot;border-width: 0px; display: inline;&quot; title=&quot;image&quot; width=&quot;68&quot; /&gt;&lt;/a&gt; &lt;br /&gt;…which opens a Notification pane:&lt;br /&gt;&lt;a href=&quot;http://lh6.ggpht.com/-K2fUMJXS9Uo/Ue-v9qMoxUI/AAAAAAAABE4/MjUJWjgugwI/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;230&quot; src=&quot;http://lh5.ggpht.com/-sSZGhz27bVI/Ue-v9wtiMLI/AAAAAAAABFA/60fdWm697bg/image_thumb%25255B1%25255D.png?imgmax=800&quot; style=&quot;border-width: 0px; display: inline;&quot; title=&quot;image&quot; width=&quot;244&quot; /&gt;&lt;/a&gt; &lt;br /&gt;IMHO it is important because it could be the notifications’ hub for informative content (help installation, license expiration) but updates as well.</description>
        <pubDate>Thu, 01 Aug 2013 10:44:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/08/01/a-little-unnoticed-feature-in-visual/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/08/01/a-little-unnoticed-feature-in-visual/</guid>
      </item>
    
      <item>
        <title>InRelease and Team Foundation Server, tips for the setup</title>
        <description>&lt;p&gt;Recently Microsoft released a preview (non go-live, unfortunately) of InRelease for Team Foundation Server 2013. I am starting to have a look at it, so expect some content in the near future &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh6.ggpht.com/-Tx6W2kajS1g/UerpFUGumiI/AAAAAAAABDY/xAJRiMdq9a8/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;First of all, the setup. You can even be the most important user in your network, but you would need to use the following command for the installation:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;msiexec –I InCycle_InReleasePreview.msi&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://lh4.ggpht.com/-xF4jLww5Z0s/UerpFtiLBYI/AAAAAAAABDg/847PsVpBvKs/s1600-h/ir0%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;ir0&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;ir0&quot; src=&quot;http://lh6.ggpht.com/-dkkaPygRfMc/UerpGADTXSI/AAAAAAAABDo/7KC2qPZ-Zew/ir0_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;127&quot;&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Otherwise you would get an error.&lt;/p&gt; &lt;p&gt;After successfully completing the installation you could go through some errors. Not too much to worry about anyway, I suggest you to keep an eye on the Windows Event Viewer (for IIS, InRelease uses a 32 bit Application Pool and it can be a trouble in certain environments) and on the logs into &lt;strong&gt;C:\ProgramData\&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;They are pretty useful as they are separed by component, so you would get an error log for the console, one for the server and one for the deployer.&lt;/p&gt; &lt;p&gt;Eventually &lt;a href=&quot;http://support.inreleasesoftware.com/entries/24794668-After-installation-InRelease-client-cannot-be-opened&quot;&gt;here&lt;/a&gt; you can find a support page with the most common errors and solutions.&lt;/p&gt;  </description>
        <pubDate>Sat, 20 Jul 2013 19:46:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/07/20/inrelease-and-team-foundation-server/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/07/20/inrelease-and-team-foundation-server/</guid>
      </item>
    
      <item>
        <title>Enhancing Agile Portfolio Management experience with Backlog Mapping</title>
        <description>&lt;p&gt;Yesterday the Team Foundation Service team &lt;a href=&quot;http://tfs.visualstudio.com/en-us/news/2013-jul-10&quot;&gt;released&lt;/a&gt; the Sprint 50 build, and one of the features shipped is the Backlog Mapping.&lt;/p&gt; &lt;p&gt;Nothing too big or hard to explain: if you are creating a Portfolio within Team Foundation Service, you would surely get a flat list of Features and a flat list of PBI/User Stories.&lt;/p&gt; &lt;p&gt;With the Backlog Mapping (which is just a pane on the right side), you can drag&amp;amp;drop the PBI you want to be child of a certain Feature, and it is going to be automatically linked. &lt;/p&gt; &lt;p&gt;It is a very nice and effective feature, which combines a strong User Experience with a tangible result.&lt;/p&gt;  </description>
        <pubDate>Thu, 11 Jul 2013 13:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/07/11/enhancing-agile-portfolio-management/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/07/11/enhancing-agile-portfolio-management/</guid>
      </item>
    
      <item>
        <title>How the best practice made it into the product: Workspace Mapping in Visual Studio 2013</title>
        <description>&lt;p&gt;It is well known that the best practice says “One workspace per project”. Unfortunately it is not always possible to make it as the default solution, for various reasons (typical audience, etc.).&lt;/p&gt; &lt;p&gt;In Visual Studio 2013 the best practice made it into the product: the default Workspace Mapping is exactly one-per-project! In fact if you configure the Workspace for a new Team Project, you are going to get prompted to configure it:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-ou4EmYAnZ3k/UdPu7yCRVyI/AAAAAAAABCc/1zQIydx5j9M/s1600-h/bp1%25255B9%25255D.png&quot;&gt;&lt;img title=&quot;bp1&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;bp1&quot; src=&quot;http://lh3.ggpht.com/-TQm3FHI8L-8/UdPu8jCV3RI/AAAAAAAABCk/ZvyZVjShxx8/bp1_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;412&quot; height=&quot;151&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;After clicking &lt;strong&gt;Configure&lt;/strong&gt;, you are going to map the Team Project root into a specific folder into your User’s folder:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-RjKTacw-Ou4/UdPu9Gm3Y4I/AAAAAAAABCo/Bxlc43J4bw4/s1600-h/bp2%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;bp2&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;bp2&quot; src=&quot;http://lh5.ggpht.com/-QmzUyxIc6GY/UdPu9jYXFmI/AAAAAAAABC0/UI76xRB-CDU/bp2_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;424&quot; height=&quot;168&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-gA2a5anZHQY/UdPu-AXbQjI/AAAAAAAABC8/y3XbYNYHl0Q/s1600-h/bp3%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;bp3&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;bp3&quot; src=&quot;http://lh4.ggpht.com/-1WA4Wghc32s/UdPu-sJeSMI/AAAAAAAABDE/9Z6qPE4nvyU/bp3_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;435&quot; height=&quot;124&quot;&gt;&lt;/a&gt;  &lt;/p&gt; &lt;p&gt;It is definitely a good improvement, as it prevents the creation of a one, big, monolithic workspace which can take ages to download when needed, with all the related performance problems.&lt;/p&gt;  </description>
        <pubDate>Wed, 03 Jul 2013 09:29:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/07/03/how-best-practice-made-it-into-product/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/07/03/how-best-practice-made-it-into-product/</guid>
      </item>
    
      <item>
        <title>Some tips on adding other levels above the Feature</title>
        <description>&lt;p&gt;I know, I know – we have it on the &lt;a href=&quot;http://msdn.microsoft.com/library/dn217880(v=vs.120).aspx&quot;&gt;MSDN&lt;/a&gt;. But I wanted to take the other route, which is not using witadmin and using the old Visual Studio 2012 with its Power Tools and limiting the raw XML editing to the pure essential part. It went pretty well I have to say. Let’s see…&lt;/p&gt; &lt;p&gt;First of all, download the Process Template you want to add levels above the Feature one (Themes anyone? :)).&lt;/p&gt; &lt;p&gt;When you’re going to open it with Visual Studio, you are going to see that both the Agile and Common Process Settings are empty.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-5m-Hw8D3CAQ/UdKyaw9ZTKI/AAAAAAAABAE/RSs4GpM8J4c/s1600-h/image%25255B4%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-rboSup_GMq0/UdKybZsltLI/AAAAAAAABAM/zKq_Q2mPSf0/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;761&quot; height=&quot;188&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;This is because Microsoft changed the structure of the Process Settings, merging everything into a &lt;strong&gt;ProcessConfiguration.xml&lt;/strong&gt; file. No worries anyway, we can fix it.&lt;/p&gt; &lt;p&gt;So, copy and paste the Feature.xml work item, renaming it to Themes.xml, and fixing the WORKITEMTYPE name:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-KbuGOv5MulA/UdKyb--C2yI/AAAAAAAABAU/Sr2dVCNAM50/s1600-h/image%25255B8%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-BxbQETWgQ5k/UdKycZAWwYI/AAAAAAAABAc/AuQysjj-f24/image_thumb%25255B4%25255D.png?imgmax=800&quot; width=&quot;656&quot; height=&quot;215&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Import it into the Process Template:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-I1xbZyoQPvo/UdKycmqEy6I/AAAAAAAABAk/JqxrzdgdWjo/s1600-h/image%25255B18%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-ydwTEwdQW3c/UdKydeJerII/AAAAAAAABAs/mIHNSl1D2kY/image_thumb%25255B8%25255D.png?imgmax=800&quot; width=&quot;510&quot; height=&quot;312&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Now you can create a new Category using the IDE, and adding the aforementioned &lt;strong&gt;Theme.&lt;/strong&gt; Use &lt;strong&gt;Custom.ThemeCategory&lt;/strong&gt; as a reference name or whatever you may feel right for your custom category:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-1Y-M8-7Ebyk/UdKyd9HPOKI/AAAAAAAABA0/6ZbFaXdiFA4/s1600-h/image%25255B11%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-tx4p9g5VVdw/UdKyeeaOp_I/AAAAAAAABA8/VOxoPSH1Uwg/image_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;200&quot; height=&quot;72&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Now open the Theme.xml file. You have to fix the Implementation Hierarchy. This is very important in order to let you select &lt;strong&gt;Features&lt;/strong&gt; as children.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-kS5UuS7g1m8/UdKyevY0_JI/AAAAAAAABBE/y-ll3zagAsc/s1600-h/image%25255B23%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-srjUbbKoFrc/UdKyfLkrdwI/AAAAAAAABBI/xfKJxvkcVCw/image_thumb%25255B11%25255D.png?imgmax=800&quot; width=&quot;595&quot; height=&quot;413&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Now, delete whatever it is not &lt;strong&gt;ProcessConfiguration.xml&lt;/strong&gt; into the \WorkItem Tracking\Process folder, and fix the &lt;strong&gt;WorkItems.xml &lt;/strong&gt;into \WorkItem Tracking:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-OwkCHwWB4XY/UdKyfg6J2bI/AAAAAAAABBU/xTECzlVjGpU/s1600-h/image%25255B30%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-21vedmAM7gE/UdKygIF_WcI/AAAAAAAABBc/CHrUuv_UP98/image_thumb%25255B14%25255D.png?imgmax=800&quot; width=&quot;652&quot; height=&quot;272&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Now, let’s add a node to the &lt;strong&gt;PortfolioBacklogs&lt;/strong&gt; section of the ProcessConfiguration.xml. &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-afdwmVPxLmk/UdKygth3SaI/AAAAAAAABBk/7y0O7LVCDfw/s1600-h/image%25255B34%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-WJMS3xzVwUA/UdKyhJapX-I/AAAAAAAABBs/AE30PWukuMA/image_thumb%25255B16%25255D.png?imgmax=800&quot; width=&quot;504&quot; height=&quot;404&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;It is enough to copy and paste the Feature’s one, but here it is very important to add &lt;strong&gt;parent=”Custom.ThemeCategory” &lt;/strong&gt;to the existing Feature, in order to keep the linear hierarchy and avoid a “The following element contains an error: PortfolioBacklogs. &lt;strong&gt;TF401096&lt;/strong&gt;: This element defines the hierarchy relationship between portfolio backlogs and must define a linear hierarchy from bottom to top. The specified hierarchy is invalid.” error.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-gjreftd7LKA/UdKyhjxI1TI/AAAAAAAABB0/bVlbZkLtfXE/s1600-h/image%25255B43%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-1mKH5QFBry8/UdKyiBY5VBI/AAAAAAAABB8/ZS38vMB0AYE/image_thumb%25255B21%25255D.png?imgmax=800&quot; width=&quot;502&quot; height=&quot;64&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Moreover, add a node to the WorkItemColor section, but remember to follow the existing colour pattern, otherwise the Process Template won’t upload. I used the same colour, but of course you can use others. Just keep in mind the pattern.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-stV597E2xrE/UdKyiifJhDI/AAAAAAAABCE/OVmCvR9kre4/s1600-h/image%25255B53%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-GnwgnZj7y-s/UdKyiwMRIDI/AAAAAAAABCM/7ZhFItlMSxI/image_thumb%25255B27%25255D.png?imgmax=800&quot; width=&quot;706&quot; height=&quot;112&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;That’s all! Now you can upload your Process Template and you’re going to get another level above Feature with all the associated tools (board, etc.)&lt;/p&gt;  </description>
        <pubDate>Tue, 02 Jul 2013 10:59:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/07/02/some-tips-on-adding-other-levels-above/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/07/02/some-tips-on-adding-other-levels-above/</guid>
      </item>
    
      <item>
        <title>Hosted Build Servers up to date with Windows 8.1</title>
        <description>&lt;p&gt;One of the reasons for using Team Foundation Service and others hosted services is not worrying about technology updates as they are carried on by the provider.&lt;/p&gt; &lt;p&gt;Team Foundation Service is no exception and today, together with the Preview’s release of Visual Studio 2013 and Windows 8.1, the Hosted Build Server got upgraded to Windows 8.1 as well!&lt;/p&gt; &lt;p&gt;But, but. You won’t be able to select them in Visual Studio as a beginning. You have to browse to your Team Foundation Service instance, and enable them for the required project:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-KitSeJ6GQhs/Uctu95QqYZI/AAAAAAAAA_M/1UIYmoC3RwY/s1600-h/image%25255B4%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-j64ZBJHz_WY/Uctu-U9cbWI/AAAAAAAAA_Q/wY3YbV7KzdU/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;731&quot; height=&quot;150&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Just after doing that you’d be able to select the required Build Controller:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-OQ59vSvVEvQ/Uctu-n5eyJI/AAAAAAAAA_Y/cWYPWMa34b8/s1600-h/image%25255B7%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-NCl3hj2hJpE/Uctu-2m4CUI/AAAAAAAAA_k/ewUA3meSKD8/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;102&quot;&gt;&lt;/a&gt; and in the Build Definition itself:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-euaUP0Gz428/Uctu_fqHNlI/AAAAAAAAA_s/PGRdYz_nAXI/s1600-h/image%25255B10%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-PKD0nPwa1IE/Uctu_9IrQ5I/AAAAAAAAA_0/wwB3PMRBNto/image_thumb%25255B4%25255D.png?imgmax=800&quot; width=&quot;225&quot; height=&quot;116&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Man forewarned is forearmed :)&lt;/p&gt;  </description>
        <pubDate>Wed, 26 Jun 2013 22:45:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/06/26/hosted-build-servers-up-to-date-with/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/06/26/hosted-build-servers-up-to-date-with/</guid>
      </item>
    
      <item>
        <title>Example on what Agile Portfolio Management is covering</title>
        <description>&lt;p&gt;I have been asked about a quick example, so let’s take this screenshot:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-Ivo83eUcQNs/Ucg3pOp-YqI/AAAAAAAAA-0/qu9_POvR7X8/s1600-h/image%25255B9%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-FaaThNkFBkw/Ucg3qO6T97I/AAAAAAAAA-8/rS88lT-YGoY/image_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;681&quot; height=&quot;154&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;This is something you can achieve today via Project. But it is not feasible in Team Foundation Server 2012 stating that the “As a customer…” are User Stories. You must use the Project Server integration, setting Project Server and the integration up, it is an expensive process and it is not suitable for everybody.&lt;/p&gt; &lt;p&gt;Here’s why I feel the Agile Portfolio Management is &lt;strong&gt;very useful&lt;/strong&gt;. I understand Project Server is not for everybody, and this new features enable scenarios which were an exclusive of Project Server in the past.&lt;/p&gt; &lt;p&gt;Of course Project Server is not going away, but at least now if you have a well defined scenario you can choose which tool to use.&lt;/p&gt;  </description>
        <pubDate>Mon, 24 Jun 2013 12:12:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/06/24/example-on-what-agile-portfolio/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/06/24/example-on-what-agile-portfolio/</guid>
      </item>
    
      <item>
        <title>Basics of Agile Portfolio Management: Themes and Epics</title>
        <description>&lt;p&gt;Apart from the technology itself, the introduction of the Agile Portfolio Management in Team Foundation Server and Service has a huge impact on the surface you can cover on your project.&lt;/p&gt; &lt;p&gt;Beware: in most of the cases, I am talking about mid-sized to big projects. Introducing a concept like this in small projects could be counterproductive.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-2IW9rJgdhuE/Ubl9lsUn3SI/AAAAAAAAA9g/T66gOR7Md3E/s1600-h/image6.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-8JeU1in26bE/Ubl9mc4fFWI/AAAAAAAAA9o/iZ_7G8nziws/image_thumb2.png?imgmax=800&quot; width=&quot;532&quot; height=&quot;359&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;As far as now, the most common way of tackling agile product management is to create some User Stories and then split them into tasks. This is perfectly fine and it is not changing, but sometimes you can face the following problem: the User Story is &lt;strong&gt;too big&lt;/strong&gt; for being delivered in a sprint.&lt;/p&gt; &lt;p&gt;Unfortunately it happens. So to solve this, you have to use the &lt;strong&gt;Epic&lt;/strong&gt; concept.&lt;/p&gt; &lt;p&gt;An &lt;strong&gt;Epic&lt;/strong&gt; is basically a very big User Story, which is split into several sub-Stories whose effort is compatible with the Sprint duration. Think about it as a goal. An Epic contains one or more User Stories, kept together by a common topic. You won’t deliver an Epic in one sprint, usually an Epic is a big part of the product, a (marketable) feature. You manage this on top of the product, as it can impact other products in your organization.&lt;/p&gt; &lt;p&gt;The &lt;strong&gt;Theme&lt;/strong&gt; is on top of everything. Talking in terms of a project, it can be a major release. It is an initiative, one of the cornerstones of the project itself. Themes drive the strategy, and they express a &lt;strong&gt;direction &lt;/strong&gt;– they are generally not too specific because of it.&lt;/p&gt; &lt;p&gt;At the moment in Team Foundation Service (and soon in Team Foundation Server 2013) you’d get the Epic concept out-of-the-box. But as Brian Harry told us in his &lt;a href=&quot;http://blogs.msdn.com/b/bharry/archive/2013/06/03/visual-studio-2013.aspx&quot;&gt;post&lt;/a&gt;, it is possible to customize the experience with a low effort.&lt;/p&gt;  </description>
        <pubDate>Thu, 13 Jun 2013 08:06:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/06/13/basics-of-agile-portfolio-management/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/06/13/basics-of-agile-portfolio-management/</guid>
      </item>
    
      <item>
        <title>A huge leap toward the Agile Portfolio Management</title>
        <description>&lt;p&gt;Up to yesterday, managing something more than User Stories and Tasks, Bugs, etc. required a certain degree of abstraction and usage of specific tools like Project Server.&lt;/p&gt; &lt;p&gt;With the newly revealed Agile Portfolio Management feature now we can avoid to use Project Server for doing something which is not designed for, thus we can still integrated it (with TFS 2013) as needed.&lt;/p&gt; &lt;p&gt;Let’s take this example: we want to create a certain system, and one of its features is the &lt;strong&gt;Trash Bin&lt;/strong&gt;. So we create a feature, and I can see it by filtering the Backlog by Features:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href=&quot;http://lh6.ggpht.com/-tnMfXkSOxSs/Uayow-OC-RI/AAAAAAAAA74/2Zf7Gwg1muk/s1600-h/image%25255B9%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-KcaB4i-3Wc4/UayoxVjWJEI/AAAAAAAAA8A/IM9njjEbSoM/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;127&quot; height=&quot;70&quot;&gt;&lt;/a&gt; &lt;a href=&quot;http://lh3.ggpht.com/-OXR1OIxH1s8/Uayox99v9XI/AAAAAAAAA8I/671J67BmlhA/s1600-h/image%25255B15%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-o1UfUH7IoKg/UayoyUvq3PI/AAAAAAAAA8Q/oFRjIrvSyAI/image_thumb%25255B9%25255D.png?imgmax=800&quot; width=&quot;648&quot; height=&quot;94&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This feature has some user stories into it. Let’s say we want &lt;strong&gt;to put stuff into the bin&lt;/strong&gt; and that we want &lt;strong&gt;to empty the bin&lt;/strong&gt; as needed.&lt;/p&gt; &lt;p&gt;These are Product Backlog Items, or Requirements depending on the Process Template you are using. I am using CMMI, so they are requirements – and I change the filter again:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-MtAvmGjbNQk/UayozHpEL-I/AAAAAAAAA8Y/-Ay4sT5dhkA/s1600-h/image%25255B18%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-70i2PWcYrhM/Uayo0gQV4MI/AAAAAAAAA8g/XxbXNwHI9LU/image_thumb%25255B10%25255D.png?imgmax=800&quot; width=&quot;148&quot; height=&quot;63&quot;&gt;&lt;/a&gt; &lt;a href=&quot;http://lh5.ggpht.com/-g0fXjtWSA8o/Uayo1IPExGI/AAAAAAAAA8o/ktlMQ6dBP9Q/s1600-h/image%25255B23%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-aGTg6VwtWf0/Uayo1sgkinI/AAAAAAAAA8w/xkCY4_7WcDg/image_thumb%25255B13%25255D.png?imgmax=800&quot; width=&quot;625&quot; height=&quot;142&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Of course these Requirements are split onto several different tasks, and this is not different since the past. Changing the filter again this is what I see:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-Z0_pvX0VQ5s/Uayo2WqHbPI/AAAAAAAAA84/o4b_f4ciuHg/s1600-h/image%25255B26%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-2T_TviOrYY8/Uayo3FlYtFI/AAAAAAAAA9A/e8DnW4HFOMk/image_thumb%25255B14%25255D.png?imgmax=800&quot; width=&quot;110&quot; height=&quot;62&quot;&gt;&lt;/a&gt; &lt;a href=&quot;http://lh3.ggpht.com/-LfSrcZHu9kQ/Uayo3rdQAUI/AAAAAAAAA9I/3DdIXWTOjsc/s1600-h/image%25255B30%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-HGKW9SOs3bQ/Uayo4Enf0aI/AAAAAAAAA9Q/eg3kCi5cjBI/image_thumb%25255B16%25255D.png?imgmax=800&quot; width=&quot;421&quot; height=&quot;138&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;This view is exactly what we wanted to achieve. And of course it is way easier to understand and visualize, than using other tools – often not designed for fitting that specific need.&lt;/p&gt; &lt;p&gt;Let’s spread this concept quite a little: can it be handy if you have multiple Scrum teams working on the same backlog? If you have different backlogs (you shouldn’t…) for different teams, why not merging everything on the same backlog in this way? It was hard to explain to some manager how the project was going in term of features and market comparison. Now it isn’t, because you can use the &lt;strong&gt;Feature&lt;/strong&gt; work item type as an &lt;strong&gt;abstraction&lt;/strong&gt; on the work the teams are doing. And it is out-of-the-box, which is never bad.&lt;/p&gt; &lt;p&gt;As &lt;a href=&quot;http://blogs.msdn.com/b/bharry/archive/2013/06/03/visual-studio-2013.aspx&quot;&gt;Brian&lt;/a&gt; said, it is just the beginning…there is surely more to add here.&lt;/p&gt;  </description>
        <pubDate>Mon, 03 Jun 2013 14:32:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/06/03/a-huge-leap-toward-agile-portfolio/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/06/03/a-huge-leap-toward-agile-portfolio/</guid>
      </item>
    
      <item>
        <title>Team Rooms in Team Foundation Service</title>
        <description>&lt;p&gt;So now after the Tech.Ed announcement the Team Rooms are available :)&lt;/p&gt; &lt;p&gt;They are not &lt;em&gt;just&lt;/em&gt; a chit-chat tool for conversations into the team. They are an invaluable tool for collaboration.&lt;/p&gt; &lt;p&gt;First of all, we can configure it as a broadcast messenger for certain events&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-MXAFiIj4HjY/Uayf3z8c_fI/AAAAAAAAA6Q/Cc1Lru3a9Cw/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-HvEJoW8YDxU/Uayf4pRETvI/AAAAAAAAA6Y/mML-q5e26DI/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;452&quot; height=&quot;375&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-Dcz9pPF77ZQ/Uayf5RAJxvI/AAAAAAAAA6g/uogBTybMHuY/s1600-h/image%25255B19%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-n_ZfmdYspLQ/Uayf51otmsI/AAAAAAAAA6o/EWXr9yxhS_s/image_thumb%25255B7%25255D.png?imgmax=800&quot; width=&quot;471&quot; height=&quot;393&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-xPXpIQV7Yoo/Uayf63HARBI/AAAAAAAAA6w/m3vQgk-__xE/s1600-h/image%25255B20%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-noKUJz3xT8M/Uayf7pIY5BI/AAAAAAAAA64/GEPsUbPyeP8/image_thumb%25255B8%25255D.png?imgmax=800&quot; width=&quot;490&quot; height=&quot;401&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/--IvRV6e-QRo/Uayf8GiP-oI/AAAAAAAAA7A/F6TcNqtPKhU/s1600-h/image%25255B21%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-loXul6eYMPQ/Uayf88gkXuI/AAAAAAAAA7I/uzLEDSM-Fg0/image_thumb%25255B9%25255D.png?imgmax=800&quot; width=&quot;505&quot; height=&quot;417&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;It is possible to tag a certain User Story, or a specific build to talk about.&lt;/p&gt; &lt;p&gt;But the best comes to the specific collaboration tags: &lt;strong&gt;@&lt;/strong&gt; and &lt;strong&gt;#&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;The &lt;strong&gt;@&lt;/strong&gt; tag is for tagging a user:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-PZul5isx9Ok/Uayf9RdK5JI/AAAAAAAAA7M/R41G00ZGkdE/s1600-h/image%25255B6%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-kb1Hiun1SBs/Uayf9_gYcKI/AAAAAAAAA7Y/ZCGkAXpa9SI/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;34&quot;&gt;&lt;/a&gt; which is going to get notified about it.&lt;/p&gt; &lt;p&gt;The &lt;strong&gt;#&lt;/strong&gt; tag is for mentioning a specific work item:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-NGVvztLPJE4/Uayf-Sg-rKI/AAAAAAAAA7g/YFmsKAjAnrs/s1600-h/image%25255B9%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-AWXJDAjcivc/Uayf-4XUkpI/AAAAAAAAA7o/5RVl0beE3ZM/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;66&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;After clicking on the hyperlink a new tab is going to be opened with the required work item.&lt;/p&gt; &lt;p&gt;All of this could seem pretty silly, but I can ensure they add some value to the team work, less overwhelmed by emails and better communicating among the members.&lt;/p&gt;  </description>
        <pubDate>Mon, 03 Jun 2013 13:54:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/06/03/team-rooms-in-team-foundation-service/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/06/03/team-rooms-in-team-foundation-service/</guid>
      </item>
    
      <item>
        <title>Troubleshooting for dummies with Team Foundation Server</title>
        <description>&lt;p&gt;I have been asked how did I manage to understand the issue with the Work Item Synchronization Service I posted before, so maybe a broad answer could be better than a one-to-one.&lt;/p&gt; &lt;p&gt;At the very beginning, I have been notified by a user which didn’t manage to see his Iterations in the proper way after some amendments. &lt;/p&gt; &lt;p&gt;After asking to clean the client cache – an unsuccessful try - I tried &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ff400237(v=vs.110).aspx&quot;&gt;refreshing&lt;/a&gt; the Data Warehouse, and eventually &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/cc668753(v=vs.110).aspx&quot;&gt;rebuilding&lt;/a&gt; it. No luck again.&lt;/p&gt; &lt;p&gt;When this sort of issues happen, it can be nasty. My suggestion is to avoid running some scripts you may find on the web, as touching the TFS databases without the consent of a Microsoft CSS man would be &lt;strong&gt;very dangerous&lt;/strong&gt; and can put your installation in &lt;strong&gt;an unsupported &lt;/strong&gt;situation or even worse, it can be damaged.&lt;/p&gt; &lt;p&gt;You can have a look in the Event Viewer for issues, it is time consuming but often useful.&lt;/p&gt; &lt;p&gt;Or you can do as I did, logging into the &lt;a href=&quot;http://blogs.msdn.com/b/granth/archive/2013/02/13/tfs2012-new-tools-for-tfs-administrators.aspx&quot;&gt;Administrative Page&lt;/a&gt; (the informally called &lt;em&gt;&lt;strong&gt;_oi&lt;/strong&gt;) &lt;/em&gt;which contains a lot of informations about everything running on the Team Foundation Server, in a almost real time state.&lt;/p&gt; &lt;p&gt;In this case, I noticed the user raised some service calls with –1 as a result, which means error. Opening the log I looked at the error detail, so I managed to get in touch with Microsoft. Luckily the RC of the Update 3 went live shortly after the issue, so applying it was a matter of a very short time.&lt;/p&gt; &lt;p&gt;I &lt;strong&gt;strongly&lt;/strong&gt; suggest looking at _oi very often, as it is not just a troubleshooting tool, but it is a real live look at the servers’ health, with detailed reports etc.&lt;/p&gt;  </description>
        <pubDate>Mon, 27 May 2013 20:23:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/05/27/troubleshooting-for-dummies-with-team/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/05/27/troubleshooting-for-dummies-with-team/</guid>
      </item>
    
      <item>
        <title>How Developer Operations fit into the Agile picture?</title>
        <description>&lt;p&gt;It looks like one of the buzzwords this year is &lt;b&gt;DevOps&lt;/b&gt;. &lt;p&gt;But what is it? It is the merge of &lt;b&gt;Developer &lt;/b&gt;and &lt;b&gt;Operations&lt;/b&gt;, which basically means everything that happens while running an application inside the boundaries of the production systems. &lt;p&gt;It represents a great leap from the standard, reactive way of managing production applications and services on a alert basis, to the new agile, proactive way – which means the Operations teams actively collaborate with the Development teams in order to get better and higher quality products. &lt;p&gt;The heart of Developer Operations is its principles. They are the incorporation of the Agile development practices in the IT environment, plus a huge enhancement in collaboration which involves Development teams, QA teams (where separated by the Development teams) and Operations teams. &lt;p&gt;The main tools for achieving this are: &lt;p&gt;· An automated systems infrastructure, which allows the removal of many of the human interactions and thus points of failure. &lt;p&gt;· A broad ALM platform, enabling developers to have a shared Version Control System, an automated build server, etc. &lt;p&gt;· Designing software leveraging on &lt;b&gt;Feature Flags&lt;/b&gt;, so that if something is faulty it can be easily disabled while investigating on the issue – without impacting the non-faulty areas of the application itself. &lt;p&gt;· &lt;b&gt;Continuous Delivery&lt;/b&gt;. &lt;p&gt;· Shared metrics aimed at measuring and improving both the overall and the detailed quality of the application/service. &lt;p&gt;Of course it is not just about &lt;i&gt;tools&lt;/i&gt;. For reaching a good DevOps proficiency every role in the team should collaborate in the proper way from the first inception of the project, in order to have a seamless experience among everybody. DevOps don’t start at the delivery, but at the very first sprint. &lt;p&gt;Feature flags are a very bright example of this approach. It is a development pattern which directly affects an operations’ topic: configuration. If a team commits to use feature flags in an application involving the DevOps people, the latter must be aware about feature flags themselves and they will know how to proactively manage potential issues. &lt;p&gt;Everything rely on communication. To get properly working Developer Operations the Ops team must be open to a huge mind shift – from &lt;b&gt;stability&lt;/b&gt; to &lt;b&gt;agility&lt;/b&gt;, as the &lt;i&gt;change &lt;/i&gt;referred here is not a breaking change but an evolutionary change, often required by the business itself. The existing boundaries between Development teams and Operations teams should be removed, with their disruptive behaviors. &lt;p&gt;The natural evolution of Developer Operations would be the &lt;b&gt;Agile Operations&lt;/b&gt; – the Operations team would then use some of the core Agile principles (Kanban or &lt;a href=&quot;http://www.scrum.org/Resources/What-is-Scrum/&quot;&gt;Scrum&lt;/a&gt; derived, like backlogs) together with some specific developer tools like a Version Control and a Build Server for their own deployment efforts. &lt;p&gt;This second step of course needs a lot of prerequisites – as opposite as the Developer Operations one which is pretty easy to start – but benefits would be huge. Concepts like the Daily Scrum applied to an Operations environment empower productivity because of the direct communication flow happening beneath. &lt;p&gt;So, answering the title: How Developer Operations fit into the Agile picture? By incorporating the Agile development lifecycle, applying concepts and principles from the methodologies (usually Scrum) to a completely different topic – Production Operations.&lt;/p&gt;  </description>
        <pubDate>Wed, 22 May 2013 13:34:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/05/22/how-developer-operations-fit-into-agile/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/05/22/how-developer-operations-fit-into-agile/</guid>
      </item>
    
      <item>
        <title>Migrating distributed branches from Git to Team Foundation Server</title>
        <description>&lt;p&gt;If you have to migrate (like me, today) a &lt;strong&gt;huge &lt;/strong&gt;Git repository to Team Foundation Server, it’s very likely that you are going to hit one of the most common walls while migrating a distributed VCS to a centralized one: understanding the branches’ lifecycle.&lt;/p&gt; &lt;p&gt;Briefly, in a DVCS you won’t have the common branches you might find in a VCS like Team Foundation Server, because of the nature of the DVCS itself which tends to have a number of branches for making offline working easier and smoother. Of course you won’t be able to clone this structure inside the Team Foundation Version Control, but there is a way to mitigate it.&lt;/p&gt; &lt;p&gt;I am using Git-Tf, the Microsoft’s tool for migrating Git to Team Foundation Server. After you configured your repository, you should perform a &lt;strong&gt;git-tf checkin –deep &lt;/strong&gt;in order to replicate every single changeset instead of a big bulk one. But you’d get an error:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-p5Ui4SXnGIA/UZJUqpy4pDI/AAAAAAAAA54/r9SEod6CwqY/s1600-h/image%25255B6%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-4w7p3eDWCo8/UZJUr6CHo1I/AAAAAAAAA6A/dzzPDdbmNDg/image_thumb%25255B4%25255D.png?imgmax=800&quot; width=&quot;724&quot; height=&quot;112&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Here is what I meant: if you have multiple parents for a commit, you cannot replicate it inside Team Foundation Server. If you rebase, you are going to edit the history, which is wrong from a preservation point of view.&lt;/p&gt; &lt;p&gt;So you should use the –autosquash switch, which is going to create a linear history without editing it. How? By finding out the HEAD revisions.&lt;/p&gt;  </description>
        <pubDate>Tue, 14 May 2013 15:13:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/05/14/migrating-distributed-branches-from-git/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/05/14/migrating-distributed-branches-from-git/</guid>
      </item>
    
      <item>
        <title>Work Item Synchronization issue with Update 2</title>
        <description>&lt;p&gt;After installing the Team Foundation Server 2012 Update 2 it can happen that the Work Item Tracking Synchronization Service suddenly stops working, so that you can’t see updated areas and iterations neither in Visual Studio, Web Access, Excel, etc.&lt;/p&gt; &lt;p&gt;These are the &lt;em&gt;symptoms&lt;/em&gt;…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-c3UmlbaAm_Y/UYoT0KN754I/AAAAAAAAA4o/83vJBcbKUJ0/s1600-h/error%25255B11%25255D.png&quot;&gt;&lt;img title=&quot;error&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;error&quot; src=&quot;http://lh5.ggpht.com/-M8w43DKs2wQ/UYoT3T5JdoI/AAAAAAAAA4w/cyeUKJyIfu4/error_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;12&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-usbUJre3ZbY/UYoT62kZU0I/AAAAAAAAA44/O41iO6NkSpM/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-dzHwYCST-VA/UYoT-PSQviI/AAAAAAAAA5A/xvibjHTcUfI/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;135&quot;&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;To help us troubleshooting this nasty – but known – bug, the _oi Activity Logs are very helpful…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-VEen97Fb-mM/UYoUAWsM3yI/AAAAAAAAA5I/_Bv3VOHVeIk/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-0Mqr9SvjiK4/UYoUC7hVMQI/AAAAAAAAA5Q/Xx4A2chb31E/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;27&quot;&gt;&lt;/a&gt;&amp;nbsp; We see that from a certain point, a number of &lt;strong&gt;Work Item Tracking Integration Synchronization &lt;/strong&gt;jobs are failing…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-msw3C1kKBdE/UYoUFv-PnaI/AAAAAAAAA5Y/LJNoHOgrYXY/s1600-h/image%25255B8%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-m_cVLIV9TzY/UYoUIZ3MBCI/AAAAAAAAA5g/vp0KqobtsNE/image_thumb%25255B2%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;171&quot;&gt;&lt;/a&gt; …and the &lt;strong&gt;Job History Details&lt;/strong&gt; show a &lt;strong&gt;System.NullReferenceException&lt;/strong&gt;. Here is the problem!&lt;/p&gt; &lt;p&gt;The &lt;a href=&quot;http://www.microsoft.com/en-gb/download/details.aspx?id=38832&quot;&gt;Team Foundation Server 2012 Update 3&lt;/a&gt; contains a fix for this, as detailed into the &lt;a href=&quot;http://support.microsoft.com/kb/2835600&quot;&gt;changelog&lt;/a&gt; (see the &lt;strong&gt;Work Item Tracking &lt;/strong&gt;paragraph into the &lt;strong&gt;Team Foundation Server&lt;/strong&gt; fixes).&lt;/p&gt;  </description>
        <pubDate>Wed, 08 May 2013 09:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/05/08/work-item-synchronization-issue-with/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/05/08/work-item-synchronization-issue-with/</guid>
      </item>
    
      <item>
        <title>Behind the scenes of the Work Items’ states: Team Foundation Server Metastates</title>
        <description>&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 8pt;&quot;&gt;&lt;a href=&quot;http://www.blogger.com/&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://www.blogger.com/&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;Despite present since the RTM version, the metastates became notorious to the mainstream after the introduction of the Kanban Board. Why? Let’s see…&lt;/span&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-dNzyQ0xzvXI/UXf27KYA3QI/AAAAAAAAA38/Rne1eFQALXw/s1600/pic1.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;64&quot; src=&quot;http://2.bp.blogspot.com/-dNzyQ0xzvXI/UXf27KYA3QI/AAAAAAAAA38/Rne1eFQALXw/s320/pic1.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 8pt;&quot;&gt;&lt;span style=&quot;mso-fareast-language: EN-GB; mso-no-proof: yes;&quot;&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shapetype  id=&quot;_x0000_t75&quot; coordsize=&quot;21600,21600&quot; o:spt=&quot;75&quot; o:preferrelative=&quot;t&quot;  path=&quot;m@4@5l@4@11@9@11@9@5xe&quot; filled=&quot;f&quot; stroked=&quot;f&quot;&gt; &lt;v:stroke joinstyle=&quot;miter&quot;/&gt; &lt;v:formulas&gt;  &lt;v:f eqn=&quot;if lineDrawn pixelLineWidth 0&quot;/&gt;  &lt;v:f eqn=&quot;sum @0 1 0&quot;/&gt;  &lt;v:f eqn=&quot;sum 0 0 @1&quot;/&gt;  &lt;v:f eqn=&quot;prod @2 1 2&quot;/&gt;  &lt;v:f eqn=&quot;prod @3 21600 pixelWidth&quot;/&gt;  &lt;v:f eqn=&quot;prod @3 21600 pixelHeight&quot;/&gt;  &lt;v:f eqn=&quot;sum @0 0 1&quot;/&gt;  &lt;v:f eqn=&quot;prod @6 1 2&quot;/&gt;  &lt;v:f eqn=&quot;prod @7 21600 pixelWidth&quot;/&gt;  &lt;v:f eqn=&quot;sum @8 21600 0&quot;/&gt;  &lt;v:f eqn=&quot;prod @7 21600 pixelHeight&quot;/&gt;  &lt;v:f eqn=&quot;sum @10 21600 0&quot;/&gt; &lt;/v:formulas&gt; &lt;v:path o:extrusionok=&quot;f&quot; gradientshapeok=&quot;t&quot; o:connecttype=&quot;rect&quot;/&gt; &lt;o:lock v:ext=&quot;edit&quot; aspectratio=&quot;t&quot;/&gt;&lt;/v:shapetype&gt;&lt;v:shape id=&quot;Picture_x0020_1&quot; o:spid=&quot;_x0000_i1026&quot; type=&quot;#_x0000_t75&quot;  style=&apos;width:450.75pt;height:91.5pt;visibility:visible;mso-wrap-style:square&apos;&gt; &lt;v:imagedata src=&quot;file:///C:\Users\memili\AppData\Local\Temp\msohtmlclip1\01\clip_image001.png&quot;   o:title=&quot;&quot;/&gt;&lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 8pt;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;New, Approved, Committed and Done are metastates. Have you ever heard about them before? I don’t think so &lt;/span&gt;&lt;span style=&quot;font-family: Wingdings; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-char-type: symbol; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-symbol-font-family: Wingdings;&quot;&gt;&lt;span style=&quot;mso-char-type: symbol; mso-symbol-font-family: Wingdings;&quot;&gt;J&lt;/span&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 8pt;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;They are not something particular, but just an aggregator of various states for Work Item Types. Metastates are defined into the Process Template of course, in our case just for the Product Backlog Item Work Items:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-zyRpcYpEv2w/UXf281gY6oI/AAAAAAAAA4E/s_gmu6dgb1Y/s1600/pic2.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-zyRpcYpEv2w/UXf281gY6oI/AAAAAAAAA4E/s_gmu6dgb1Y/s1600/pic2.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;72&quot; src=&quot;http://4.bp.blogspot.com/-zyRpcYpEv2w/UXf281gY6oI/AAAAAAAAA4E/s_gmu6dgb1Y/s320/pic2.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 8pt;&quot;&gt;&lt;span style=&quot;mso-fareast-language: EN-GB; mso-no-proof: yes;&quot;&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shape  id=&quot;Picture_x0020_3&quot; o:spid=&quot;_x0000_i1025&quot; type=&quot;#_x0000_t75&quot; style=&apos;width:451.5pt;  height:102pt;visibility:visible;mso-wrap-style:square&apos;&gt; &lt;v:imagedata src=&quot;file:///C:\Users\memili\AppData\Local\Temp\msohtmlclip1\01\clip_image003.png&quot;   o:title=&quot;&quot;/&gt;&lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://www.blogger.com/&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://www.blogger.com/&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 8pt;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;As we see, we can have a &lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt;Proposed&lt;/b&gt; (state) Work Item which can be either &lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt;New&lt;/b&gt; or &lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt;Approved&lt;/b&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 8pt;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;This is the easiest sample, you can customize the board to show more metastates, you can report against them, and much more.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;</description>
        <pubDate>Wed, 24 Apr 2013 15:15:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/04/24/behind-scenes-of-work-items-states-team/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/04/24/behind-scenes-of-work-items-states-team/</guid>
      </item>
    
      <item>
        <title>Web Access Licensing for dummies</title>
        <description>&lt;p&gt;With Team Foundation Server 2012 the licensing became way easier, in order to have a clearer path of adoption for the involved features. One big example of that is the new Web Access. &lt;p&gt;The new Team Web Access now features three levels of information access, dependent on the CAL you have: &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-5bDXrQqpUds/UXf1EVBo1xI/AAAAAAAAA24/auONCpAh6pU/s1600-h/clip_image001%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;clip_image001&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;clip_image001&quot; src=&quot;http://lh5.ggpht.com/-RZBAwmIw7vw/UXf1E7_aEpI/AAAAAAAAA3A/U5sToqt9cQs/clip_image001_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;211&quot;&gt;&lt;/a&gt; &lt;p&gt;These three levels exposes a different set of information to the user. &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-bOH1DYhvKQ8/UXf1FBBnogI/AAAAAAAAA3I/NJ94QUyNNlQ/s1600-h/clip_image002%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;clip_image002&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;clip_image002&quot; src=&quot;http://lh6.ggpht.com/-CBUBmmb4xU4/UXf1Fw9_47I/AAAAAAAAA3Q/x13jRc2aBgU/clip_image002_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;112&quot;&gt;&lt;/a&gt; &lt;p&gt;A user acceding the Web Access with a &lt;b&gt;Limited Access&lt;/b&gt; level is roughly the same as the old Work Item Only View in Team System Web Access, so the user can access to what belongs to him without the need of a CAL. &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-LQsr2LDumk4/UXf1GMyc1vI/AAAAAAAAA3Y/ElYh5rBC7I8/s1600-h/clip_image003%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;clip_image003&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;clip_image003&quot; src=&quot;http://lh3.ggpht.com/-RT1bihXpKRQ/UXf2Yrn11oI/AAAAAAAAA3k/5YK1FAUCeg4/clip_image003_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;165&quot;&gt;&lt;/a&gt; &lt;p&gt;The &lt;b&gt;Standard&lt;/b&gt; level is for who has access to Visual Studio 2012 Professional, and it adds all the standard Web Access features plus the Agile Boards introduced with the 2012 release. &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-vPGnLDV9O00/UXf2ZHycGkI/AAAAAAAAA3s/tMZpEJchutM/s1600-h/clip_image004%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;clip_image004&quot; style=&quot;border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline&quot; border=&quot;0&quot; alt=&quot;clip_image004&quot; src=&quot;http://lh4.ggpht.com/-GoTYoj7U5o4/UXf2ZtqmrmI/AAAAAAAAA30/a4Dd98DHsOg/clip_image004_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;188&quot;&gt;&lt;/a&gt; &lt;p&gt;The &lt;b&gt;Full&lt;/b&gt; level is for who has access to Visual Studio 2012 Premium and above, it enables every feature of the Web Access, so the Backlog Management Tools, the Feedback Management and – with the Update 2 – the Web Test Case Management.   </description>
        <pubDate>Wed, 24 Apr 2013 15:12:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/04/24/web-access-licensing-for-dummies/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/04/24/web-access-licensing-for-dummies/</guid>
      </item>
    
      <item>
        <title>A clarification on the Team Foundation Server Integration Platform support</title>
        <description>Often many people think that as the Team Foundation Server Integration Platform is an open-source project, it has no support.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;WRONG!&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;It is the only Microsoft supported solution for all the migration needs you might have. &lt;br /&gt;&lt;strong&gt;But only if you download the Visual Studio Gallery &lt;a href=&quot;http://visualstudiogallery.msdn.microsoft.com/eb77e739-c98c-4e36-9ead-fa115b27fefe&quot;&gt;package&lt;/a&gt;&lt;/strong&gt;, which is the stable and supported version. If you have an issue with it, you can raise a call to the Customer Support Service.&lt;br /&gt;&lt;br /&gt;If you download the Codeplex &lt;a href=&quot;http://tfsintegration.codeplex.com/&quot;&gt;package&lt;/a&gt; (with the source code), you might get the betas, which are obviously not supported.&lt;br /&gt;&lt;br /&gt;I hope this clarifies a bit around this really important topic &lt;img alt=&quot;Smile&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; src=&quot;http://lh3.ggpht.com/-GPIaLnSucHo/UVs4RR5ejRI/AAAAAAAAA1A/robvZYpEw8s/wlEmoticon-smile2.png?imgmax=800&quot; /&gt;</description>
        <pubDate>Sun, 14 Apr 2013 14:41:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/04/14/a-clarification-on-team-foundation/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/04/14/a-clarification-on-team-foundation/</guid>
      </item>
    
      <item>
        <title>Solving mess on behalf of others: tf undo</title>
        <description>Sometimes it happens the TFS Administrator has to solve problems caused by unexperienced (or untrained) users, and maybe the most common is to undo ‘ghost check-outs’.&lt;br /&gt;Here’s the answer: Attrice Corporation Team Foundation Sidekicks. Cool. But sometimes you can’t use third-party tools, and you only have to rely on what Microsoft provided in the OOB installation.&lt;br /&gt;&lt;br /&gt;So here’s the &lt;em&gt;real &lt;/em&gt;answer, since Team Foundation Server 2005:&amp;nbsp;fire the &lt;strong&gt;Developer Command Prompt&lt;/strong&gt;, and launch the &lt;strong&gt;tf undo&lt;/strong&gt; command with the proper switches. &lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/c72skhw4(v=vs.110).aspx&quot;&gt;Here&lt;/a&gt; there is the relative documentation.</description>
        <pubDate>Tue, 09 Apr 2013 11:36:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/04/09/solving-mess-on-behalf-of-others-tf-undo/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/04/09/solving-mess-on-behalf-of-others-tf-undo/</guid>
      </item>
    
      <item>
        <title>DevOps 101: IntelliTrace to the rescue</title>
        <description>We have seen how to fix the gap between development and operation teams in a quick&amp;amp;dirty way. There is a lot more to do, and tons of tools which can help us: the main one is IntelliTrace.&lt;br /&gt;When we create an Operational Issue, an IntelliTrace log is attached to the work item itself:&lt;br /&gt;&lt;a href=&quot;http://lh5.ggpht.com/-rhCC-MMTzdE/UUeIuMy5FhI/AAAAAAAAAzo/qqv855HV1NU/s1600-h/image3.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;104&quot; src=&quot;http://lh5.ggpht.com/-q30HnOwtgcY/UUeIvnkzpEI/AAAAAAAAAzw/fk_NAOT5JDs/image_thumb1.png?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;466&quot; /&gt;&lt;/a&gt;&lt;br /&gt;but it features just the minimum subset of information related to the alert.&lt;br /&gt;The first way would be manually get a .iTrace file with our custom collector. Nothing that difficult, but if the main motto of DevOps is “automate everything”, we are going against it.&lt;br /&gt;Or – way better – I can ask the Ops folks to record a detailed IntelliTrace log, of course everything integrated with Team Foundation Server. It’s just needed to set the work item to “awaiting evidence” with a resolution note telling them to provide me a better IntelliTrace log:&lt;br /&gt;&lt;a href=&quot;http://lh4.ggpht.com/-nbgk_EVpKwA/UUeIwSaHZ1I/AAAAAAAAAz0/a8nrwfGAnYU/s1600-h/devops52.png&quot;&gt;&lt;img alt=&quot;devops5&quot; border=&quot;0&quot; height=&quot;158&quot; src=&quot;http://lh5.ggpht.com/-b8A7brQ8s7U/UUeIxRCktKI/AAAAAAAAA0A/YA1h1V9XFas/devops5_thumb.png?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;devops5&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Then the Ops guy is going to use the &lt;strong&gt;IntelliTrace Tasks &lt;/strong&gt;tab to gather what Engineering wants. Definitely easy!&lt;br /&gt;&lt;a href=&quot;http://lh4.ggpht.com/-yXzUEdawL2Y/UUeIyR5Lk0I/AAAAAAAAA0I/i84XRp3CnBw/s1600-h/image6.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;146&quot; src=&quot;http://lh6.ggpht.com/-ZMJ7z4g0Ico/UUeIzeu5UyI/AAAAAAAAA0Q/lODO1k8l7cY/image_thumb2.png?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;213&quot; /&gt;&lt;/a&gt;&lt;br /&gt;He can collect a snapshot of the current state of the involved application pool, or better he can start collecting a new IntelliTrace file, replicating/let someone replicate the scenario on behalf of the user, and then the new IntelliTrace file is going to be attached to the related Work Item.&lt;br /&gt;All the IntelliTrace files are going to be stored into a network share, one folder for each alert, so remember to keep an eye on the storage size!</description>
        <pubDate>Sat, 30 Mar 2013 20:29:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/03/30/devops-101-intellitrace-to-rescue/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/03/30/devops-101-intellitrace-to-rescue/</guid>
      </item>
    
      <item>
        <title>DevOps 101: Managing Operational Issues</title>
        <description>&lt;p&gt;As we’ve seen, once Operations send to Engineering issues, they are just Team Foundation Server’s Work Items.&lt;/p&gt; &lt;p&gt;This specific Work Item Type is tailored on the need of explaining a production incident, probably a bug, so it features several useful information out-of-the-box. It’s tied to the AVICode informations, and the most important thing here is the state:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-46BceZIquxE/UUnEli4l5YI/AAAAAAAAA0g/N9XnIijjQZY/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-CwM2CAN4F8A/UUnEmZfT6JI/AAAAAAAAA0o/2darN44MvWw/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;151&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;After we acknowledge we are on the Issue itself, we have a broad range of states to be set: this is essential for organizations with a structured process (think about ITIL).&lt;/p&gt; &lt;p&gt;Apart from that, it’s a standard WIT, so there is not so much to say on the Engineering side. Hey, we are who were already working with Team Foundation Server! &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh4.ggpht.com/-BRlBr1h6qqQ/UUnEnTSdZMI/AAAAAAAAA0w/6K5gptUHafE/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;There is an IntelliTrace file too, as mentioned. In the next post we are going to see how to better capture all the information we need.&lt;/p&gt;  </description>
        <pubDate>Wed, 20 Mar 2013 14:15:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/03/20/devops-101-managing-operational-issues/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/03/20/devops-101-managing-operational-issues/</guid>
      </item>
    
      <item>
        <title>DevOps 101: from production errors (ouch!) to Engineering</title>
        <description>I decided to name this series after the classic introductive American class: 101. We are talking about DevOps (with Visual Studio ALM 2012), so DevOps 101 &lt;img alt=&quot;Smile&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; src=&quot;http://lh5.ggpht.com/-qw3GfTDRRrI/UT4MP9oH2WI/AAAAAAAAAyQ/LJNxg8iVOaI/wlEmoticon-smile2.png?imgmax=800&quot; /&gt;&lt;br /&gt;&lt;a href=&quot;http://lh5.ggpht.com/--oO10o2zZZQ/UT4MQ6lrgjI/AAAAAAAAAyY/EimSmrYUDjw/s1600-h/devops03.png&quot;&gt;&lt;img alt=&quot;devops0&quot; border=&quot;0&quot; height=&quot;270&quot; src=&quot;http://lh3.ggpht.com/-Euw6gvCfscs/UT4MRrWG2jI/AAAAAAAAAyg/UV39Ol-No1w/devops0_thumb1.png?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;devops0&quot; width=&quot;259&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;KABOOM!&lt;/strong&gt;&lt;br /&gt;The first step toward Developer Operations is allowing production errors to get intercepted and stored into Work Item Types for the Engineering team. As we saw in the last post, there is a new, dedicated WIT for that: Operational Issue.&lt;br /&gt;Once we hit a bug in production, one (or more, depending on what caused the error) alert is raised. This alert can be sent via email, too, in order to trigger both a formal (via the SCOM Console) and informal (via email) communication.&lt;br /&gt;&lt;a href=&quot;http://lh6.ggpht.com/-fDpHTiTbLTg/UT4MSlTtRuI/AAAAAAAAAyo/6DN4eL-6NJY/s1600-h/devops15.png&quot;&gt;&lt;img alt=&quot;devops1&quot; border=&quot;0&quot; height=&quot;93&quot; src=&quot;http://lh3.ggpht.com/-O-g2NlLlV4k/UT4MTu5-hCI/AAAAAAAAAyw/2iZGnlrt9H8/devops1_thumb3.png?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;devops1&quot; width=&quot;386&quot; /&gt;&lt;/a&gt;&lt;br /&gt;It’s not just a simple ‘alert’: it features all the information we are going to push to the Operational Issue. &lt;br /&gt;&amp;nbsp;&lt;a href=&quot;http://lh4.ggpht.com/-GRaTZwyKExE/UT4MU4qSaaI/AAAAAAAAAy4/pFcJ6zSvUWk/s1600-h/devops23.png&quot;&gt;&lt;img alt=&quot;devops2&quot; border=&quot;0&quot; height=&quot;395&quot; src=&quot;http://lh5.ggpht.com/-OxgIVssEDGk/UT4MVpGU-jI/AAAAAAAAAzA/bhs0jJ9cuDw/devops2_thumb1.png?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;devops2&quot; width=&quot;338&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Once we modify the status to &lt;strong&gt;Assigned to Engineering&lt;/strong&gt;, it is pushed. Aside from all the tabs (it wouldn’t be a 101 post otherwise &lt;img alt=&quot;Smile&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; src=&quot;http://lh5.ggpht.com/-qw3GfTDRRrI/UT4MP9oH2WI/AAAAAAAAAyQ/LJNxg8iVOaI/wlEmoticon-smile2.png?imgmax=800&quot; /&gt;) let’s have a look at the &lt;strong&gt;Alert Description&lt;/strong&gt; box. It features an hyperlink to an URL which uses port 45451. What’s that?!&lt;br /&gt;&lt;a href=&quot;http://lh6.ggpht.com/-Y3bMSA6Circ/UT4MWq-5brI/AAAAAAAAAzI/2GEMctMMRP8/s1600-h/devops33.png&quot;&gt;&lt;img alt=&quot;devops3&quot; border=&quot;0&quot; height=&quot;284&quot; src=&quot;http://lh3.ggpht.com/-bzM-GgndKHE/UT4MXqLq1WI/AAAAAAAAAzQ/6dOBYES0cAw/devops3_thumb1.png?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;devops3&quot; width=&quot;386&quot; /&gt;&lt;/a&gt;&lt;br /&gt;It’s the result of the Microsoft’s &lt;a href=&quot;http://www.microsoft.com/en-in/server-cloud/system-center/avicode.aspx&quot;&gt;acquisition&lt;/a&gt; of AVICode. A full-featured application monitoring system has been integrated inside SCOM, and the information it gathers are rendered by this service, capturing every kind of stuff you can think at the surface level.&lt;br /&gt;Beware: an IntelliTrace file is added to the work item, but it’s not that huge. We are going to see in a separate post why, and how to integrate IntelliTrace in our DevOps workflow.&lt;br /&gt;The next post is going to the other side, so what happens in Engineering when a Operational Issue is raised in Team Foundation Server. Stay tuned &lt;img alt=&quot;Winking smile&quot; class=&quot;wlEmoticon wlEmoticon-winkingsmile&quot; src=&quot;http://lh4.ggpht.com/-7IHw2naSCjM/UT4MYcFMpXI/AAAAAAAAAzU/dhuURPZaaPk/wlEmoticon-winkingsmile2.png?imgmax=800&quot; /&gt;</description>
        <pubDate>Sat, 16 Mar 2013 14:31:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/03/16/devops-101-from-production-errors-ouch/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/03/16/devops-101-from-production-errors-ouch/</guid>
      </item>
    
      <item>
        <title>Basics on Developer Operations with Team Foundation Server 2012</title>
        <description>&lt;p&gt;As we saw in the last post, the DevOps movement is making so much noise in the IT world &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh3.ggpht.com/-qH59DxrAMn8/UTnE_94m6JI/AAAAAAAAAxA/bGaMJSFz8AE/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt; and of course Team Foundation Server is not behind: here is the basics on the integration with System Center Operations Manager in order to integrate the two worlds.&lt;/p&gt; &lt;p&gt;First of all, we need to set the server and the Team Project Collection for the application we want to monitor:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href=&quot;http://lh5.ggpht.com/-6njBkUJxhe4/UTnFBWfCbeI/AAAAAAAAAxI/zSuBGcrq9fk/s1600-h/devops0%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;devops0&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;devops0&quot; src=&quot;http://lh5.ggpht.com/-dQR4rIaeR08/UTnFDfvKeRI/AAAAAAAAAxQ/upmYLz7gJu0/devops0_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;144&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Then we can set the Projects where the new Work Item Type – Operational Issues – are going to be stored. We can set the appropriate Area Path.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href=&quot;http://lh3.ggpht.com/-X8LqdNohvrA/UTnFEQuEMwI/AAAAAAAAAxY/ovoKrGyos-s/s1600-h/devops1%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;devops1&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;devops1&quot; src=&quot;http://lh5.ggpht.com/-77kPIL4BWUY/UTnFFWI-4LI/AAAAAAAAAxg/i2qBceRC8oY/devops1_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;224&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Apart from the connection between SCOM and TFS, a huge aid in bridging Operations to Engineering is brought by Alerts. Whenever the state of a Operational Issue changes, an alert is triggered for the Operations administrator:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-4pM6t88PMZk/UTnFGOsyoaI/AAAAAAAAAxo/Dh0ZQuFVJOU/s1600-h/devops2%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;devops2&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;devops2&quot; src=&quot;http://lh6.ggpht.com/-uFbic4DBTjg/UTnFH2oZEQI/AAAAAAAAAxw/ayIcYzbDbcw/devops2_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;167&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Then we have a dashboard recapping all the information we entered. I highlighted the possibility of importing Operational Issue work items: this is really important when it comes to consolidation, an often under considered topic.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-nhTKJE5JlbM/UTnFIoeDMiI/AAAAAAAAAx4/sj5gYqdbMZw/s1600-h/devops3%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;devops3&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;devops3&quot; src=&quot;http://lh3.ggpht.com/-CAnCXnVB8Kk/UTnFJWYMqqI/AAAAAAAAAyA/C470d9Uk2Kg/devops3_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;118&quot;&gt;&lt;/a&gt;&lt;/p&gt;  </description>
        <pubDate>Fri, 08 Mar 2013 11:01:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/03/08/basics-on-developer-operations-with/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/03/08/basics-on-developer-operations-with/</guid>
      </item>
    
      <item>
        <title>UK, here I come!</title>
        <description>&lt;p&gt;As somebody knows, I am going to relocate in a few weeks in the United Kingdom. It’s a dream I had since I was a child, which now becomes true &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh6.ggpht.com/-ECWP6wG5RS4/US89Ms0U_dI/AAAAAAAAAwM/aNzcjxtHyEY/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;I am going to relocate in Taunton, Somerset – working for Quest Software (acquired by Dell in September 2012) as a Team Foundation Server Administrator for their Visual Studio ALM platform. It’s not only that, but for some more details I have to start working for them &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh6.ggpht.com/-ECWP6wG5RS4/US89Ms0U_dI/AAAAAAAAAwM/aNzcjxtHyEY/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt; around five weeks to go, though.&lt;/p&gt; &lt;p&gt;But the fun is not over: with the relocation I also have to change my country as a MVP. So I am going to be a UK MVP, and I am surely going to have the pleasure of working with &lt;a href=&quot;https://mvp.support.microsoft.com/profile=59FE5790-D13C-40D8-9E99-B82DE635E4EE&quot;&gt;Richard Fennell&lt;/a&gt;, &lt;a href=&quot;https://mvp.support.microsoft.com/profile=DEEDC820-BDF1-4E4F-A034-5F1869050B3D&quot;&gt;Mike Fourie&lt;/a&gt;, all the other UK &amp;amp; Ireland MVPs and my new MVP Lead Claire Smyth!&lt;/p&gt; &lt;p&gt;So, now I only have to complete the toughest part of the job: packing everything and doing the move! And the best is yet to come &lt;img class=&quot;wlEmoticon wlEmoticon-winkingsmile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Winking smile&quot; src=&quot;http://lh3.ggpht.com/-_ZSe-Y9Jcx0/US89Nin97II/AAAAAAAAAwU/1H4H56Y2LCI/wlEmoticon-winkingsmile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt;  </description>
        <pubDate>Thu, 28 Feb 2013 11:19:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/02/28/uk-here-i-come/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/02/28/uk-here-i-come/</guid>
      </item>
    
      <item>
        <title>What’s all this noise around Developer Operations?</title>
        <description>&lt;p&gt;During the last months a huge movement is gaining more and more importance in the IT world: the &lt;a href=&quot;http://en.wikipedia.org/wiki/DevOps&quot;&gt;DevOps&lt;/a&gt; one.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-iVxgpIo4bdQ/USqFF8MSmZI/AAAAAAAAAvQ/aCsNPksqERk/s1600-h/image3.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-M_1QW18ih2E/USqFIKmsboI/AAAAAAAAAvY/tgGDWWx8xpI/image_thumb1.png?imgmax=800&quot; width=&quot;488&quot; height=&quot;264&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;What we usually covered until now is the Define-Develop side of the process. We never went deep on Operate, as “these are tasks for IT guys”. Release Management is another sample of it, but we are going to cover it separately.&lt;/p&gt; &lt;p&gt;But as we are living in a dynamic world, things change. Microsoft started a &lt;a href=&quot;http://www.microsoft.com/en-us/news/press/2007/jun07/06-04teched07pr.aspx&quot;&gt;vision&lt;/a&gt; of that (from the IT side to be sincere, but still a vision) in 2007. Did we get there? Not really, but so far so good.&lt;/p&gt; &lt;p&gt;In the picture I highlighted some of the most common issues, which almost everybody went through at least once in their career.&lt;/p&gt; &lt;h2&gt;&lt;strong&gt;Non consistent tool&lt;/strong&gt;&lt;/h2&gt; &lt;p&gt;Is there a ‘standard’ –read ‘mainstream’ operations backlog management tool, integrated with the Engineering side? Never heard of. Almost every organization has a tool, but it is often custom, standalone and rarely integrated with the developers’ systems.&lt;/p&gt; &lt;h2&gt;Production incidents hard to debug and resolve&lt;/h2&gt; &lt;p&gt;Sometimes bugs happen because of production-only issues. The VS2010 momentum of “no more no-repro” was the first leap toward solving this problem, but now we need something more.&lt;/p&gt; &lt;h2&gt;No Knowledge Base management&lt;/h2&gt; &lt;p&gt;This is like the ‘non consistent tool’ one, but worse as almost nobody (I would say less than 25% of the companies I worked with and upon) do that.&lt;/p&gt; &lt;h2&gt;Can’t get actionable feedback&lt;/h2&gt; &lt;p&gt;Linked to the one on production incidents, getting actionable feedbacks is quite hard as far as now. So it’s definitely needed an improvement in this area.&lt;/p&gt; &lt;p&gt;There is a lot to fill the gap, as possibilities are almost endless. And there is still a lot in place, think about Lab Management and its end-to-end workflows. This is a sample of an integrated Release Management with Developer Operations, for stuff up to the QA stage. We now need to go further.&lt;br&gt;&lt;br&gt;With Visual Studio 2012 we finally got the possibility of bringing all the needed information in a seamless way from production back to engineering, as we are going to see in the next posts, trying to close the gap it exists in there.&lt;/p&gt; &lt;p&gt;Some insights on it? SCOM, TFS, IntelliTrace. Stay tuned &lt;img class=&quot;wlEmoticon wlEmoticon-winkingsmile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Winking smile&quot; src=&quot;http://lh3.ggpht.com/-Yh2VYXFi0OE/USqFKaNrrMI/AAAAAAAAAvg/jPC_O0tgl7Y/wlEmoticon-winkingsmile2.png?imgmax=800&quot;&gt;&lt;/p&gt;  </description>
        <pubDate>Sun, 24 Feb 2013 21:24:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/02/24/whats-all-this-noise-around-developer/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/02/24/whats-all-this-noise-around-developer/</guid>
      </item>
    
      <item>
        <title>ALM Summit sessions are out!</title>
        <description>&lt;p&gt;I have just been notified that all the ALM Summit content has been delivered &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh3.ggpht.com/-19_2FkD4dqc/USOkkQyWzSI/AAAAAAAAAuo/_evJIr1V3c4/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;You can find the slide decks &lt;a href=&quot;http://sdrv.ms/Tb5zuj&quot;&gt;here&lt;/a&gt;, and the videos hosted on &lt;a href=&quot;http://channel9.msdn.com/Events/ALM-Summit/ALM-Summit-3/&quot;&gt;Channel 9&lt;/a&gt;. These are great content for ALM with tons of useful information!&lt;/p&gt;  </description>
        <pubDate>Tue, 19 Feb 2013 16:13:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/02/19/alm-summit-sessions-are-out/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/02/19/alm-summit-sessions-are-out/</guid>
      </item>
    
      <item>
        <title>Web Test Case Management in Team Foundation Service</title>
        <description>&lt;p&gt;Again, after the announcement at the the ALM Summit, I am covering one of the new features introduced with the release of the CTP of Update 2, which is going to add these on-premise, but if you are a Team Foundation Service user the update has already been enabled by setting the right &lt;em&gt;feature flag&lt;/em&gt; &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh5.ggpht.com/-g7Ktj5dwOt4/URvzU0uuRiI/AAAAAAAAAtQ/psD0NEpivv8/wlEmoticon-smile2.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;Enabling Test Case Management on the cloud is not just a matter of technology. As you can imagine, it opens up a broad range of possibilities for testing, because you’re not that deeply tied to Test Manager for the QA tasks but you can freely use the web interface. &lt;/p&gt; &lt;p&gt;You can find it under the new &lt;strong&gt;TEST&lt;/strong&gt; hub in the web UI: &lt;a href=&quot;http://lh6.ggpht.com/-i6k-6nnn33s/URvzVBQmmuI/AAAAAAAAAtY/MDddtwxNiAM/s1600-h/image2.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-emzIvA1d9HM/URvzVtqjr0I/AAAAAAAAAtg/Vkce4haqaNk/image_thumb.png?imgmax=800&quot; width=&quot;118&quot; height=&quot;48&quot;&gt;&lt;/a&gt; and it enables you to interact with existing test plans.&lt;/p&gt; &lt;p&gt;I can add test cases just like in MTM!&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-BksFD4Hn9xk/URvzWXPWChI/AAAAAAAAAto/Agm6DHMR5yA/s1600-h/image6.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-9-ZjP6ylVCE/URvzWwSnC7I/AAAAAAAAAtw/ekcjYWMAY8c/image_thumb2.png?imgmax=800&quot; width=&quot;451&quot; height=&quot;302&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Please notice: these test cases are already integrated with the new Tags system.&lt;/p&gt; &lt;p&gt;Then I can run my test cases, a side window opens just like in MTM:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-5C_iBbThK3k/URvzXpSVGNI/AAAAAAAAAt4/V6VJpdJ2SFA/s1600-h/image10.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-UjhG4A-wN_k/URvzYNQRI3I/AAAAAAAAAuA/SM77-X2Yg4c/image_thumb4.png?imgmax=800&quot; width=&quot;126&quot; height=&quot;369&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;As you could see, the whole execution lifecycle is now accessible via web. Think about this scenario: you have to test a piece of code you run on a HP Supedome [HP-UX so, a mainframe] and you obviously can’t install MTM on it. The user doesn’t know MTM and doesn’t need it, as Web TCM solves this &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh5.ggpht.com/-g7Ktj5dwOt4/URvzU0uuRiI/AAAAAAAAAtQ/psD0NEpivv8/wlEmoticon-smile2.png?imgmax=800&quot;&gt; and not only, of course.&lt;/p&gt;  </description>
        <pubDate>Wed, 13 Feb 2013 20:11:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/02/13/web-test-case-management-in-team/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/02/13/web-test-case-management-in-team/</guid>
      </item>
    
      <item>
        <title>Review – Professional Team Foundation Server 2012</title>
        <description>&lt;p&gt;We went through a general overview of the platform, a detailed deep dive on the client, it’s now time for the server part of Visual Studio ALM: Team Foundation Server.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-LIc6l0_nFuU/URDTHe2bz7I/AAAAAAAAAsg/-7AS9qq-_UQ/s1600-h/WP_20130116_001-1_thumb13.jpg&quot; rel=&quot;lightbox&quot;&gt;&lt;img title=&quot;WP_20130116_001 (1)_thumb[1]&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;WP_20130116_001 (1)_thumb[1]&quot; src=&quot;http://lh3.ggpht.com/-T8H42cSfe-c/URDTIHsuYnI/AAAAAAAAAsk/CtKSs-slcv4/WP_20130116_001-1_thumb1_thumb.jpg?imgmax=800&quot; width=&quot;230&quot; height=&quot;405&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This book is considered as ‘the Bible’ for everyone who deals with Team Foundation Server. It covers in details everything you have to know and everything you &lt;em&gt;should&lt;/em&gt; know about it.&lt;/p&gt; &lt;p&gt;Why did I say that? “have to know” and “should know”? &lt;/p&gt; &lt;p&gt;The reason is fairly easy: the book is not just a compendium of documentation, how-tos, etc., but it empowers &lt;strong&gt;direct experience from the field&lt;/strong&gt;. So the authors (Ed Blankenship – &lt;em&gt;Program Manager for Test and Lab Management&lt;/em&gt;, Martin Woodward – &lt;em&gt;Program Manager for Team Foundation Server cross-platform tools&lt;/em&gt;, Grant Holliday – &lt;em&gt;Senior Premier Field Engineer &lt;/em&gt;and Brian Keller – &lt;em&gt;Principal Technical Evangelist for Visual Studio ALM&lt;/em&gt;) shared the knowledge they got from years of experience, in order to provide the most complete book on the topic.&lt;/p&gt; &lt;p&gt;The table of content is pretty straightforward: it covers from the deployment planning to the administration and all the maintenance activities, 27 chapters in total.&lt;/p&gt; &lt;p&gt;As a sample of the &lt;em&gt;direct experience from the field&lt;/em&gt; I was mentioning before, it is worth a look at the chapter regarding the deployment planning: there you can find even a basic estimation on times, really useful if you are not into the product and you need to have a rough order of magnitude on the required effort.&lt;/p&gt; &lt;p&gt;It’s still a great purchase, even if you already have the 2010 version. The book has been updated with all the new stuff of the 2012 release, and it’s worth having it if you work with Team Foundation Server in a role which is not the ‘end user’.&lt;/p&gt;  </description>
        <pubDate>Tue, 05 Feb 2013 09:38:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/02/05/review-professional-team-foundation/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/02/05/review-professional-team-foundation/</guid>
      </item>
    
      <item>
        <title>Tags in Team Foundation Service work items</title>
        <description>&lt;p&gt;At the ALM summit it has been announced that a tag system is now supported on Team Foundation Service.&lt;br&gt;What does that mean? Well, that’s really easy J  &lt;p&gt;I can now add simple tags to my tasks, PBI, etc:  &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-EShzbSLA8Ow/UQlTbfL3ppI/AAAAAAAAArA/VtNz8KOlO3A/s1600-h/clip_image0023.png&quot;&gt;&lt;img title=&quot;clip_image002&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;clip_image002&quot; src=&quot;http://lh5.ggpht.com/-8HhqmNRNFuw/UQlTcR-SIgI/AAAAAAAAArI/7HYKQTF6Mr4/clip_image002_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;62&quot;&gt;&lt;/a&gt;  &lt;p&gt;Just inserting text into it:  &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-z4koWczbgNs/UQlTdULdEBI/AAAAAAAAArM/9sOoej8A2j4/s1600-h/clip_image0033.png&quot;&gt;&lt;img title=&quot;clip_image003&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;clip_image003&quot; src=&quot;http://lh4.ggpht.com/-M3hlWU5WF4Q/UQlTeIOSIvI/AAAAAAAAArY/X0rcs8x5o10/clip_image003_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;135&quot;&gt;&lt;/a&gt;  &lt;p&gt;As it’s a column in the Work Item Type, you can filter for them:&lt;a href=&quot;http://lh4.ggpht.com/-JbydnDZ0mX0/UQlTfdFVynI/AAAAAAAAArg/CAz3zqHiiU0/s1600-h/clip_image0043.png&quot;&gt;&lt;img title=&quot;clip_image004&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;clip_image004&quot; src=&quot;http://lh6.ggpht.com/-ZTGn0M4vAQk/UQlTgmEmNwI/AAAAAAAAAro/rDBR6Grxb6w/clip_image004_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;150&quot;&gt;&lt;/a&gt;  &lt;p&gt;And here we are!  &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-_YPHHhT0bcw/UQlThdZvdAI/AAAAAAAAArw/xhlPWhJ5cYM/s1600-h/clip_image0053.png&quot;&gt;&lt;img title=&quot;clip_image005&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;clip_image005&quot; src=&quot;http://lh3.ggpht.com/-TqXT9TUiJB8/UQlTiRZY0DI/AAAAAAAAAr4/IRcZvBiHSEE/clip_image005_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;93&quot;&gt;&lt;/a&gt;  &lt;p&gt;You have to remember it’s a first release, and as the Team Foundation Service delivery model is based on Continuous Delivery, we can expect further improvements and new features added soon.    </description>
        <pubDate>Wed, 30 Jan 2013 17:08:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/01/30/tags-in-team-foundation-service-work/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/01/30/tags-in-team-foundation-service-work/</guid>
      </item>
    
      <item>
        <title>MCSD:ALM – WTF?</title>
        <description>&lt;p&gt;Despite it can sound like a really complex acronym &lt;img class=&quot;wlEmoticon wlEmoticon-openmouthedsmile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Open-mouthed smile&quot; src=&quot;http://lh3.ggpht.com/-476l_dIHMMI/UQg0DzpHeEI/AAAAAAAAAqY/UYwIPVXnxDE/wlEmoticon-openmouthedsmile%25255B2%25255D.png?imgmax=800&quot;&gt; this is the new certification launched today at the ALM Summit, purposely &lt;em&gt;baked&lt;/em&gt; for Application Lifecycle Management.&lt;/p&gt; &lt;p&gt;It’s made up of three exams: the 70-496 (&lt;em&gt;&lt;a href=&quot;http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-496&quot;&gt;Administering Microsoft Visual Studio Team Foundation Server 2012&lt;/a&gt;&lt;/em&gt;) is the first one you should approach, because it’s the most generic one on Team Foundation Server and it covers all the basis for an efficient administration of the platform.&lt;/p&gt; &lt;p&gt;The second one is the 70-497 (&lt;em&gt;&lt;a href=&quot;http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-497&quot;&gt;Software Testing with Visual Studio 2012&lt;/a&gt;&lt;/em&gt;), and it’s focused on the testing capabilities of the platform. So it is going to cover Test Manager, planning of test cases and correct management of them, analysis of results, etc.&lt;/p&gt; &lt;p&gt;The last one is the – guess what? – 70-498 (&lt;em&gt;&lt;a href=&quot;http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-498&quot;&gt;Delivering Continuous Value with Visual Studio 2012 Application Lifecycle Management&lt;/a&gt;&lt;/em&gt;), covering an effective definition of a end to end SDLC, and then expanding it to the whole ALM – for instance. Then Quality, and Operations.&lt;/p&gt; &lt;p&gt;As for all the new certifications, a &lt;em&gt;recertification&lt;/em&gt; must be taken after two years from the completion.&lt;/p&gt;  </description>
        <pubDate>Tue, 29 Jan 2013 20:41:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/01/29/mcsdalm-wtf/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/01/29/mcsdalm-wtf/</guid>
      </item>
    
      <item>
        <title>400 characters path limit in Team Foundation Server 2012</title>
        <description>&lt;p&gt;This is a brief post to answer a simple question.&lt;/p&gt; &lt;p&gt;“I have been told Team Foundation Server 2012 supports paths longer than 260 chars. How is it possible? How can I manage it?”&lt;/p&gt; &lt;p&gt;Simple question, simple answer: if you have to work on a specific branch, which goes over the limit (eg.: $/Project/SubProject/Branch/…./WhatINeed, over 260 chars) you just have to map it to a shorter local path.&lt;/p&gt; &lt;p&gt;Rationale behind it? This is a needed change in cases we have a huge branching strategy in place, sometimes inherited from migrations of older projects. It impacts just the server, not the clients, so you are still subject to the Windows limit.&lt;/p&gt;  </description>
        <pubDate>Thu, 24 Jan 2013 08:25:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/01/24/400-characters-path-limit-in-team/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/01/24/400-characters-path-limit-in-team/</guid>
      </item>
    
      <item>
        <title>git-tf, linking the Distributed and the Centralized worlds</title>
        <description>&lt;p&gt;Recently Microsoft &lt;a href=&quot;http://aka.ms/git-tf&quot;&gt;released&lt;/a&gt; a new open source &lt;a href=&quot;http://gittf.codeplex.com/&quot;&gt;project&lt;/a&gt;, aimed at all these developers who would rather avoid to use Team Foundation Server but they must do so – for several reasons – instead of using Git.&lt;/p&gt; &lt;p&gt;Then it came out git-tf: a bridge for using Git as a local repostitory, after which every commit can be merged as Team Foundation Server changesets.&lt;/p&gt; &lt;p&gt;After you set a local repository up (git init), I suggest you to copy the git-tf files over there. Then you have to bind the local repository to the Server and the Team Project:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-aIMASjoCzRU/UPO-l_w9ZdI/AAAAAAAAAow/CxhmWy7Mgns/s1600-h/gittf3.png&quot;&gt;&lt;img title=&quot;gittf&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;gittf&quot; src=&quot;http://lh3.ggpht.com/-7x5sqsC8-4I/UPO-msMFEKI/AAAAAAAAAo0/byuj2mMLIXQ/gittf_thumb1.png?imgmax=800&quot; width=&quot;356&quot; height=&quot;73&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Once you’ve done this, you can start adding/modifying the involved files. As a sample, I added a file into the local repo and I committed the file:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href=&quot;http://lh6.ggpht.com/-qeUVmkQgAJk/UPO-nENWpJI/AAAAAAAAAo8/IEFaS-wUm7U/s1600-h/gittf12.png&quot;&gt;&lt;img title=&quot;gittf1&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;gittf1&quot; src=&quot;http://lh4.ggpht.com/-TK4wvcU868M/UPO-oUw_T4I/AAAAAAAAApE/DOD3LCxP3eE/gittf1_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;141&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;We’re only missing the check-in &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh5.ggpht.com/-R5TX9wC39sA/UPO-pYYYWpI/AAAAAAAAApQ/dYPj3WasTqk/wlEmoticon-smile2.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-gll8DJKWijQ/UPO-qf7zt2I/AAAAAAAAApU/pulr2tg2Aq8/s1600-h/gittf22.png&quot;&gt;&lt;img title=&quot;gittf2&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;gittf2&quot; src=&quot;http://lh3.ggpht.com/-DJ5XVmtfmS0/UPO-rDgHL0I/AAAAAAAAApg/30Eoe-l_cnE/gittf2_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;69&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;and here we are! &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-4PoNI3e4iOY/UPO-rj9HjWI/AAAAAAAAApo/7v2wmi2ME8g/s1600-h/image4.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-OEBObzlT0ds/UPO-s7spKxI/AAAAAAAAAps/XjojFuQRkqA/image_thumb2.png?imgmax=800&quot; width=&quot;451&quot; height=&quot;54&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This is the first step toward the Distributed Version Control System from Microsoft &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh5.ggpht.com/-R5TX9wC39sA/UPO-pYYYWpI/AAAAAAAAApQ/dYPj3WasTqk/wlEmoticon-smile2.png?imgmax=800&quot;&gt;It still misses some features, but from version 2.0 (so the latest) on it is a feasible way of letting everybody use what they want inside the company &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh5.ggpht.com/-R5TX9wC39sA/UPO-pYYYWpI/AAAAAAAAApQ/dYPj3WasTqk/wlEmoticon-smile2.png?imgmax=800&quot;&gt;&lt;/p&gt;  </description>
        <pubDate>Mon, 14 Jan 2013 08:15:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/01/14/git-tf-linking-distributed-and/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/01/14/git-tf-linking-distributed-and/</guid>
      </item>
    
      <item>
        <title>What’s the difference between the Backlog Board and the Kanban Board?</title>
        <description>&lt;p&gt;As you know, in one of the latest Team Foundation Service deployments (I recall it, the team works on a three-weeks-long sprint) and soon to be in the Quarterly Update 1 for Team Foundation Server, there has been a nice new feature: the Kanban Board.&lt;/p&gt; &lt;p&gt;Kanban is a process based on the boundaries imposed by the work-in-progress limits. Everything is in a queue, with defined states (eg. Development Ready, Test Ready, Release Ready, etc.), and the to-do jobs are governed by the capacity of the team. Ideally, this is the best way for ‘just in time’ production&lt;/p&gt; &lt;p&gt;It has a fairly interesting history, as it’s been created by a Japanese man watching american stocking habits in supermarkets. More on &lt;a href=&quot;http://en.wikipedia.org/wiki/Kanban_(development)&quot;&gt;Wikipedia&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Kanban forces the team to rely on their self-control, continuously adjusting their queue based on the work they can do. Using it together with Scrum – for instance, inside the sprints – makes software development like a Swiss clock. That is my opinion, of course &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh4.ggpht.com/-3D1rmlO5jl0/UOnp0ffVXAI/AAAAAAAAAno/qC7Zet1BdrM/wlEmoticon-smile2.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;How does that fit in Team Foundation Service? The Kanban Board is the main tool for adopting Kanban: it’s visual, and effective.&lt;/p&gt; &lt;p&gt;In our case, it doesn’t affect the existing Backlog Board, they are complementary! Here’s what I mean:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-hownNFRxkAo/UOnp1v_x4hI/AAAAAAAAAns/mty057-jt5Y/s1600-h/image3.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-nEtok8yejhc/UOnp2x7muWI/AAAAAAAAAn4/y4bX4s7lQWA/image_thumb1.png?imgmax=800&quot; width=&quot;467&quot; height=&quot;201&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This is a sample Backlog Board: I can see on the left my PBIs, with the inner tasks composing it, and their status.&lt;/p&gt; &lt;p&gt;Here is the correspondent Kanban Board on the same project:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-NSYjDUbR6Ds/UOnp4Q3SB-I/AAAAAAAAAn8/AUz-prZ5vyY/s1600-h/image9.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-Zclb5ksL0zs/UOnp5TDx03I/AAAAAAAAAoI/QpO4fk2oxvE/image_thumb5.png?imgmax=800&quot; width=&quot;462&quot; height=&quot;122&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;I can just see the User Stories, and not the linked Work Items. And as I am the only project member, I entered 1 as the maximum WIP load. So I can understand just looking at it that I am overcommitted.&lt;/p&gt; &lt;p&gt;So the Backlog Board can be used to understand a finer grain load, at a task level, for my team. The Kanban Board is a useful tool for a project level inspection. They are two different tool but they might be used together &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh4.ggpht.com/-3D1rmlO5jl0/UOnp0ffVXAI/AAAAAAAAAno/qC7Zet1BdrM/wlEmoticon-smile2.png?imgmax=800&quot;&gt;&lt;/p&gt;  </description>
        <pubDate>Sun, 06 Jan 2013 21:17:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/01/06/whats-difference-between-backlog-board/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/01/06/whats-difference-between-backlog-board/</guid>
      </item>
    
      <item>
        <title>Back to back, to back, to back!</title>
        <description>&lt;p&gt;Great news for this year: I have been awarded for the 4th time in a row (here’s the title &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh5.ggpht.com/-rLCOPDGotB4/UOQvwpTKvpI/AAAAAAAAAnE/m0MRZ4MG3gk/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;) as a Microsoft MVP for Visual Studio ALM. &lt;/p&gt; &lt;p&gt;So you can expect a new, great year of content around ALM, Team Foundation Server and Visual Studio.&lt;/p&gt; &lt;p&gt;And I am really happy to be still part of the &lt;em&gt;family. &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh5.ggpht.com/-rLCOPDGotB4/UOQvwpTKvpI/AAAAAAAAAnE/m0MRZ4MG3gk/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/em&gt;&lt;/p&gt;  </description>
        <pubDate>Wed, 02 Jan 2013 13:01:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2013/01/02/back-to-back-to-back-to-back/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2013/01/02/back-to-back-to-back-to-back/</guid>
      </item>
    
      <item>
        <title>Review – Professional Visual Studio 2012</title>
        <description>&lt;p&gt;This heavy, 1054 pages book is the reference for every developer approaching Visual Studio 2012.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-IbAQMVKMXt0/UMxMthA4ReI/AAAAAAAAAmQ/UwLvTg4CFwk/s1600-h/Photo-00126.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;Photo-0012&quot; border=&quot;0&quot; alt=&quot;Photo-0012&quot; src=&quot;http://lh4.ggpht.com/-7yc8Pyun0qU/UMxMwEr_GII/AAAAAAAAAmY/VySWgN_TVo0/Photo-0012_thumb2.jpg?imgmax=800&quot; width=&quot;287&quot; height=&quot;394&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;If the review would be just one sentence long, this would be my review &lt;img style=&quot;border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;http://lh4.ggpht.com/-i2Fquo9Jf5E/UMxMxMyXSTI/AAAAAAAAAmc/hSaDZ52amc0/wlEmoticon-smile2.png?imgmax=800&quot;&gt; but it isn’t, so here’s the thoughts: the book is huge, wrote by Bruce Johnson (&lt;em&gt;Visual C# MVP&lt;/em&gt;) and provides an analytic insight inside the new Microsoft IDE.&lt;/p&gt; &lt;p&gt;As it is focused on the IDE itself, it doesn’t do deep dives on ASP.NET MVC or WPF, just to say, but it provides some technology samples to quickly start up beginners. Every tech sample is in both VB and C#.&lt;/p&gt; &lt;p&gt;You might think it’s just for beginners: that’s wrong. It’s a deep dive on the IDE feature set, and it’s not targeted at providing code apart from the related one. It’s useful as well for experienced developers.&lt;/p&gt; &lt;p&gt;A notable example: the Visual Studio Extensibility chapter is really complete and provides several samples regarding the model, guiding step-by-step the reader from the bottom-up.&lt;/p&gt; &lt;p&gt;Completing the field, the book provides some separate chapters for Visual Studio Ultimate and its exclusive features, and Team Foundation Server, making them fit inside the Microsoft’s ALM family of products.&lt;/p&gt; &lt;p&gt;I really liked it, and I strongly suggest it to all the developers working with Visual Studio 2012.&lt;/p&gt;  </description>
        <pubDate>Sat, 15 Dec 2012 10:11:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/12/15/review-professional-visual-studio-2012/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/12/15/review-professional-visual-studio-2012/</guid>
      </item>
    
      <item>
        <title>Workspace Templates: a useful helper for non-VS users</title>
        <description>&lt;p&gt;If you have a user which doesn’t use Visual Studio (reasons may vary: designers, stakeholders, analysts, etc.) but uses the Windows Explorer Integration brought you by the Team Foundation Server Power Tools, this user must go through the Team Explorer at least for setting the workspace.&lt;/p&gt; &lt;p&gt;Letting them use the Team Explorer is a shocking experience, from a users’ point of view: they are not used to the complexity of Visual Studio, and this can lead to errors and problems.&lt;/p&gt; &lt;p&gt;In order to fix that, we can use the tf workspace command-line tool, with the /template switch.&lt;/p&gt; &lt;p&gt;It’s extremely easy:&lt;/p&gt; &lt;p align=&quot;left&quot;&gt;&lt;em&gt;tf workspace /new /template:myworkspace;TFSAdmin /collection:http://server:8080/tfs/Collection&lt;/em&gt;&lt;/p&gt; &lt;p align=&quot;left&quot;&gt;It takes a &lt;em&gt;myworkspace&lt;/em&gt; linked to the user (in my case, &lt;em&gt;TFSAdmin&lt;/em&gt;) and it creates for the current user a copy of it. So the project is already mapped, and the user can start using the Windows Explorer Integration alone.&lt;/p&gt;  </description>
        <pubDate>Tue, 11 Dec 2012 08:47:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/12/11/workspace-templates-useful-helper-for/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/12/11/workspace-templates-useful-helper-for/</guid>
      </item>
    
      <item>
        <title>Batched Gated Check-ins</title>
        <description>&lt;p&gt;A &lt;i&gt;subtle&lt;/i&gt; new feature in Team Build 2012 is the possibility of batching the gated check-ins workflow, which enables you to “sum up” your check-ins and let the Team Build elaborate them together.  &lt;p&gt;It’s available under the Gated Check-in trigger in the Build Definition configuration:  &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-l08LdavfKoY/ULxmr03AKxI/AAAAAAAAAlg/hlRU9ST88W4/s1600-h/image3.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-1M2AZM3aTcw/ULxmsxbQB8I/AAAAAAAAAlo/QqCmigRNDNY/image_thumb1.png?imgmax=800&quot; width=&quot;488&quot; height=&quot;95&quot;&gt;&lt;/a&gt;  &lt;p&gt;Then, what happens if one of the queued builds fail? No problem, they are going to be sequentially reinitialized and individually elaborated, in order to avoid further problems.  &lt;p&gt;It’s a feature which finds its fit just inside big teams, I admit it…but it can still be useful even in other scenarios.    </description>
        <pubDate>Mon, 03 Dec 2012 08:45:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/12/03/batched-gated-check-ins/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/12/03/batched-gated-check-ins/</guid>
      </item>
    
      <item>
        <title>Review - Visual Studio Team Foundation Server 2012: Adopting Agile Software Practices: From Backlog to Continuous Feedback</title>
        <description>&lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-Ve74RpN67O0/UK_qLs2YR_I/AAAAAAAAAk0/FdoQRxRBvn0/s1600-h/6882812033.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;688281203&quot; border=&quot;0&quot; alt=&quot;688281203&quot; src=&quot;http://lh6.ggpht.com/-wvrTLofYM1o/UK_qNhT0n9I/AAAAAAAAAk8/Vr1oW1G1HgQ/688281203_thumb1.jpg?imgmax=800&quot; width=&quot;302&quot; height=&quot;415&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This book, wrote by Sam Guckenheimer (&lt;em&gt;Product Owner for the Visual Studio ALM family&lt;/em&gt;) and Neno Loje (&lt;em&gt;Microsoft MVP for Visual Studio ALM&lt;/em&gt;) is a complete, five star journey into the world of Agile Software Development.&lt;/p&gt; &lt;p&gt;After introducing the Agile Consensus and what rounds around it, the book covers all the basis for the Product Ownership, and details how every sprint should be managed. The first section is not just for beginners: there are concepts which even after a years-long seniorship, could be hard to fully understand. Do not underestimate how these concepts might be similar but different: after these the destiny of your project can be strictly dependent.&lt;/p&gt; &lt;p&gt;Then we have a chapter for everyone of the four classic pillars of Software Development, using Team Foundation Server: Architecture, Development, Build and Lab, Test. But do not expect anything ‘classic’ here: the content is extremely fit to the topic of the book, and it’s really comprehensive.&lt;/p&gt; &lt;p&gt;The last two chapters are not product or methodology focused: one is about the lesson learned at Microsoft – inside the Developer Division – and believe me, every word is worth of notice because it clearly explains what happens in a huge division like DevDiv, and what are issues and stop factors you might find in a real world scenario like that.&lt;/p&gt; &lt;p&gt;The other is on how to integrate the Continuous Feedback inside the usual workflow of the team, not technology focused but more on the theoretical side of the problem.&lt;/p&gt; &lt;p&gt;The target is pretty clear - Product Owners, Scrum Masters – but, again, not just for beginners: concepts explained here are not just Visual Studio ALM tied or step-by-step tutorials, they are just &lt;em&gt;declined&lt;/em&gt; on the product, but agnostic on their side.&lt;/p&gt; &lt;p&gt;The book has lots in common with the previous release, it’s normal as it’s on methodologies and practices, but it has been broadly update for Visual Studio 2012 – so don’t expect a mere copy&amp;amp;paste. In the end, it’s a great resource for people working with planning, prioritizations and code quality.&lt;/p&gt;  </description>
        <pubDate>Fri, 23 Nov 2012 21:27:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/11/23/review-visual-studio-team-foundation/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/11/23/review-visual-studio-team-foundation/</guid>
      </item>
    
      <item>
        <title>Candidate Changes with Local Workspaces</title>
        <description>&lt;p&gt;As with the Local Workspaces we can work offline in a easier way than before, there’s another really useful side-effect of this: the so-called &lt;strong&gt;Candidate Changes&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;When we add a file or delete something outside Visual Studio (in Windows Explorer for instance), regardless of the connection to the Team Foundation Server, it recognizes there’s something different:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-Burd2DlQi5M/UKbDLrBkLEI/AAAAAAAAAjo/kdk0IPfjgyY/s1600-h/image6.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-qcbiLggGEQQ/UKbDMocoocI/AAAAAAAAAjs/dg-8ayw4weM/image_thumb2.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;77&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Those changes are not included by default, as it was not an action done with Visual Studio, so another confirmation is required – I tried &lt;strong&gt;deleting the Program.cs&lt;/strong&gt; file:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-YZ3t8o4FpeU/UKbDNfUwfkI/AAAAAAAAAj4/t1COAmFw3-4/s1600-h/image3.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-99BTTf2jfV8/UKbDO7ba4bI/AAAAAAAAAkA/x4w7adoNI98/image_thumb1.png?imgmax=800&quot; width=&quot;452&quot; height=&quot;323&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;If I rename a file, it’s like every file renaming in Visual Studio: a &lt;strong&gt;delete&lt;/strong&gt; followed by a &lt;strong&gt;add&lt;/strong&gt; operation. If I select both, it can understand it and treat these two operations as a &lt;strong&gt;rename – &lt;/strong&gt;in my case I renamed the App.config file to App&lt;strong&gt;file&lt;/strong&gt;.config:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-t_Ny9uWXXGk/UKbDPp_vmXI/AAAAAAAAAkI/J8RYYqp5bxc/s1600-h/image17.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/--nH5FnHSkdc/UKbDQn82-iI/AAAAAAAAAkM/YcxYK3ed1ao/image_thumb7.png?imgmax=800&quot; width=&quot;468&quot; height=&quot;300&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;It’s a really powerful feature, both with and without connection to the Team Foundation Server, which allows us to keep tidy our operations outside Visual Studio (but not including those made with the Windows Explorer Shell Extension of the PowerTools).&lt;/p&gt;  </description>
        <pubDate>Fri, 16 Nov 2012 22:50:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/11/16/candidate-changes-with-local-workspaces/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/11/16/candidate-changes-with-local-workspaces/</guid>
      </item>
    
      <item>
        <title>Visual SourceSafe Upgrade to Team Foundation Server, the new way</title>
        <description>&lt;p&gt;Some minutes ago the Visual SourceSafe tool for migration to Team Foundation Server and Team Foundation Service. It is already available inside your Team Foundation Administration Console or from the &lt;a href=&quot;http://visualstudiogallery.msdn.microsoft.com/867f310a-db30-4228-bbad-7b9af0089282&quot;&gt;Visual Studio Gallery&lt;/a&gt;. Beware, it requires a reboot of the server.&lt;/p&gt; &lt;p&gt;The installation is pretty straightforward: next next finish &lt;img style=&quot;border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;http://lh4.ggpht.com/-rEB6OL-o6Zg/UJ0tgP0OzjI/AAAAAAAAAhk/Q5frl3KLp-o/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-Wb4nm-KIr-c/UJ0thsVEAJI/AAAAAAAAAhs/wPnsHEarexA/s1600-h/vss00%25255B2%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;vss00&quot; border=&quot;0&quot; alt=&quot;vss00&quot; src=&quot;http://lh4.ggpht.com/-8_AQWEBz6Ho/UJ0tj7B3x-I/AAAAAAAAAh0/7d-CSyJRYGw/vss00_thumb.png?imgmax=800&quot; width=&quot;216&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://lh6.ggpht.com/-XFsqgELISVk/UJ0tkrWyNGI/AAAAAAAAAh8/oeesjWduQB4/s1600-h/vss01%25255B2%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;vss01&quot; border=&quot;0&quot; alt=&quot;vss01&quot; src=&quot;http://lh4.ggpht.com/-aRI5GMVN7H0/UJ0tmSjVHZI/AAAAAAAAAiE/xqO2bys_5IY/vss01_thumb.png?imgmax=800&quot; width=&quot;177&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://lh5.ggpht.com/-ReP7eVUqpRU/UJ0tndIyiAI/AAAAAAAAAiI/wsrecgaxbUA/s1600-h/vss02%25255B2%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;vss02&quot; border=&quot;0&quot; alt=&quot;vss02&quot; src=&quot;http://lh3.ggpht.com/-6v3BDOVIojM/UJ0tpN9tqqI/AAAAAAAAAiU/g3SjUUwngpA/vss02_thumb.png?imgmax=800&quot; width=&quot;176&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;After you launch it, it’s going to ask you for what repository you are going to use, and which projects you’d like to migrate. You have to manually use Analyze, before of doing so. And you may select just some projects, if needed:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-j35IjexZmk4/UJ0tpwdzNlI/AAAAAAAAAic/wp3ujJUMnCc/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-toBaObPOKP8/UJ0trE8O5wI/AAAAAAAAAik/_k9MwaWaY6E/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;412&quot; height=&quot;336&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;After this you have to select the destination for the Team Project…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/--wcjDbPJcAg/UJ0tsJTTG4I/AAAAAAAAAio/1XM9_mH8cjo/s1600-h/image%25255B7%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-zwaOeBSV0js/UJ0ttOXbN7I/AAAAAAAAAi0/t27INc6hZE4/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;382&quot; height=&quot;139&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;…and the SQL Server to use as a storage, together with the migration type, full or tip:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-Ci3-yL3YONA/UJ0tt4zznzI/AAAAAAAAAi4/DfrpElga4Bk/s1600-h/image%25255B11%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-54CCpi_j7Zw/UJ0tuhQFPLI/AAAAAAAAAjA/h29JYfcW0P8/image_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;479&quot; height=&quot;255&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;At the end of the migration the tool is going to provide you a report like the one you were used with vssconverter.&lt;/p&gt; &lt;p&gt;Inside the MSDN library you can find the documentation about it, which is pretty comprehensive and includes &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms253090.aspx&quot;&gt;how to use the command-line VSSUpgrade&lt;/a&gt; – the underlying command line tool you can use when you need to automate the migration or in some borderline cases (like when you have a huge database and you want to prevent errors caused by network connectivity disruption) – and the most common troubleshooting &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms253170.aspx&quot;&gt;operations&lt;/a&gt;.&lt;/p&gt;  </description>
        <pubDate>Fri, 09 Nov 2012 16:22:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/11/09/visual-sourcesafe-upgrade-to-team/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/11/09/visual-sourcesafe-upgrade-to-team/</guid>
      </item>
    
      <item>
        <title>Review - Professional Application Lifecycle Management with Visual Studio 2012</title>
        <description>&lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-ON1y2eZVIrw/UJP1sDcXiqI/AAAAAAAAAgw/JeAOMV5EKQw/s1600-h/677902730%25255B3%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;677902730&quot; border=&quot;0&quot; alt=&quot;677902730&quot; src=&quot;http://lh5.ggpht.com/-Bs5oPp2vgRc/UJP1uZCU5YI/AAAAAAAAAg4/kUMX_U5WlIc/677902730_thumb%25255B1%25255D.jpg?imgmax=800&quot; width=&quot;240&quot; height=&quot;329&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;If you have to start approaching the Application Lifecycle Management, this is going to be your bible.&lt;/p&gt; &lt;p&gt;Written by Mickey Gousset (&lt;em&gt;Visual Studio ALM MVP&lt;/em&gt;), Brian Keller (&lt;em&gt;Microsoft Senior Developer Evangelist&lt;/em&gt; ), Martin Woodward (&lt;em&gt;Microsoft Program Manager for Team Foundation Server) &lt;/em&gt;the book starts with a six-chapters-long introduction to Team Foundation Server, describing in detail what’s this &lt;em&gt;mystical object&lt;strong&gt; &lt;/strong&gt;&lt;/em&gt;and how it can be useful for us &lt;img style=&quot;border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;http://lh4.ggpht.com/-0W3aLxGFujg/UJP1v0LVorI/AAAAAAAAAhA/pD2llE3agVU/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt; That’s different from the 2010 version, but I really like it because it enables the reader to fully understand the platform, instead on focusing on a series of tools and practices. It’s detailed but introductive, perfect for the target audience.&lt;/p&gt; &lt;p&gt;After that, it describes how to gather feedbacks from stakeholders, and how to let them participate in the requirements management phase.&lt;/p&gt; &lt;p&gt;The Project Management section is comprehensive, rounding from Work Items to Dashboards, describing all the tools involved in a complete ALM process. It’s not just about the tools and how to use them, several pages are dedicated to process and methodologies, making it a manual in the manual for Project Management with Team Foundation Server.&lt;/p&gt; &lt;p&gt;After these first three parts, the following are more code-focused: Architecture, Software Development and Testing. They fully cover the new features but always with the process companion. Really useful for both novice and experienced people who might want to have a reference.&lt;/p&gt; &lt;p&gt;Despite it has the same title of the 2010 version, several parts have been redone both after feedbacks and to have a different approach. I really liked this book, it’s a must-have for everyone.&lt;/p&gt;  </description>
        <pubDate>Fri, 02 Nov 2012 16:33:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/11/02/review-professional-application/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/11/02/review-professional-application/</guid>
      </item>
    
      <item>
        <title>Upgrading Team Foundation 2012 Express</title>
        <description>&lt;p&gt;It can happen that you have to migrate from a TFS Express installation (reasons can be various) to a full featured one.  &lt;p&gt;It’s pretty easy: as the Team Foundation Server database is the same regardless of the edition installed, it’s just a matter of upgrading the Application Tier in order to enable all the missing features.  &lt;p&gt;The first thing to do is to uninstall Team Foundation Server Express if you’re doing an in-place upgrade, otherwise the installer is going to notify it to you:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-mVd9o-nQdeI/UJIum2BHykI/AAAAAAAAAe0/a5tE6isoSQo/s1600-h/002.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;00&quot; border=&quot;0&quot; alt=&quot;00&quot; src=&quot;http://lh5.ggpht.com/-ZnOlM7dmrOM/UJIupF12tWI/AAAAAAAAAe8/8NZ4QVXCiUQ/00_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;234&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Then, after the Team Foundation Server installation (again, in case of an in-place upgrade, otherwise after attaching the databases), the only required step is the Application-Tier Only procedure inside the Wizard.  &lt;p&gt;After the Welcome screen, we just have to select the database instance and list the resident databases:  &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-l3-QoWay7JM/UJIuqT_MHII/AAAAAAAAAfE/HH3brUOni3M/s1600-h/022.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;02&quot; border=&quot;0&quot; alt=&quot;02&quot; src=&quot;http://lh5.ggpht.com/-AyWDhAgKIKM/UJIurniMJ7I/AAAAAAAAAfM/xJBm_KGtK7k/02_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;184&quot;&gt;&lt;/a&gt;  &lt;p&gt;So we have to select the Service Account, in order to run the services:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-DAAHsM7g_mI/UJIusjBNxLI/AAAAAAAAAfU/jhfEU6aScdM/s1600-h/032.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;03&quot; border=&quot;0&quot; alt=&quot;03&quot; src=&quot;http://lh3.ggpht.com/-4b4uYcjnATE/UJIuuHPMkwI/AAAAAAAAAfc/o1i2TamHypM/03_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;185&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Then we review the configuration…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-BcX_L4kOMD0/UJIuvQT1xeI/AAAAAAAAAfk/XVXrvyJxktE/s1600-h/042.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;04&quot; border=&quot;0&quot; alt=&quot;04&quot; src=&quot;http://lh4.ggpht.com/-G8liAjxyHvk/UJIuwpk3waI/AAAAAAAAAfs/t0eB-tOwCmE/04_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;186&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;…and scan for the readiness:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-GOGAP1FCcOI/UJIuxlUbuEI/AAAAAAAAAf0/zV7yBVQaVc4/s1600-h/065.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;06&quot; border=&quot;0&quot; alt=&quot;06&quot; src=&quot;http://lh5.ggpht.com/-61_6a6N3hCk/UJIuy-LLy-I/AAAAAAAAAf8/HxbrLWsndxs/06_thumb1.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;185&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;After clicking &lt;b&gt;Configure&lt;/b&gt;, the Application Tier is going to be added and your database are going to be fully functional.  &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-EbU4TeOZFvw/UJIuz-4eeCI/AAAAAAAAAgE/2bukxfwSsJ8/s1600-h/072.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;07&quot; border=&quot;0&quot; alt=&quot;07&quot; src=&quot;http://lh5.ggpht.com/-70XDRnPfR9A/UJIu1EmyYtI/AAAAAAAAAgM/7jgZMcH_NX0/07_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;185&quot;&gt;&lt;/a&gt;&lt;/p&gt;  </description>
        <pubDate>Thu, 01 Nov 2012 08:12:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/11/01/upgrading-team-foundation-2012-express/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/11/01/upgrading-team-foundation-2012-express/</guid>
      </item>
    
      <item>
        <title>Team Foundation Service is RTM!</title>
        <description>&lt;p&gt;Today at //Build Microsoft unveiled what a lot of people was waiting for: the RTM of Team Foundation Service. &lt;p&gt;You can reach it at &lt;a href=&quot;http://tfs.visualstudio.com/&quot;&gt;http://tfs.visualstudio.com/&lt;/a&gt;, despite the old &lt;a href=&quot;http://tfspreview.com&quot;&gt;http://tfspreview.com&lt;/a&gt; will still work for some time. Billing is still not active, but now we know somewhat more over it &lt;p&gt;Here’s what you were waiting for: as promised, there’s still a free level of service.  &lt;p&gt;It’s going to be free for team up to five users, with no feature limits! &lt;p&gt;And moreover, who has a MSDN Premium, Test Professional or Ultimate is entitled to have an unlimited subscription included inside his MSDN!  &lt;p&gt;There’s going to be a paid service with unlimited users for who has not a MSDN Subscription but it’s still early to talk about that. &lt;p&gt;The only Team Foundation Service component still in beta is the Hosted Team Build.&lt;/p&gt;  </description>
        <pubDate>Wed, 31 Oct 2012 17:07:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/10/31/team-foundation-service-is-rtm/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/10/31/team-foundation-service-is-rtm/</guid>
      </item>
    
      <item>
        <title>Marking transactions on Team Foundation Server’s databases</title>
        <description>&lt;p&gt;As we know, in the Team Foundation Server PowerTools for the 2010 version and built-in in the 2012 version we have a Backup&amp;amp;Restore utility which is added to the Administration console for…backup purposes J  &lt;p&gt;But it’s not always feasible: in some organization this kind of tooling could not be allowed, and therefore we have to follow the old manual procedure documented in MSDN.  &lt;p&gt;It’s a little bit tedious, as it’s fully manual and we have to repeat this for each database in our Team Foundation Server deployment, so it can be error-prone, and during troubleshooting sessions it can lead to issues.  &lt;p&gt;So, in order to minimize this, there’s a useful step to follow to track down all the transactions on the TFS’ databases: the transaction table.  &lt;p&gt;It’s fairly easy: we have to create an empty table in each database, using the following script: &lt;br&gt; &lt;div class=&quot;csharpcode&quot;&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;Use&lt;/span&gt; TFS_Configuration &lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;Create&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;Table&lt;/span&gt; Tbl_TransactionLogMark &lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;( &lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt; logmark &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   5:  &lt;/span&gt;) &lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;GO&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   7:  &lt;/span&gt;Insert &lt;span class=&quot;kwrd&quot;&gt;into&lt;/span&gt; Tbl_TransactionLogMark (logmark) &lt;span class=&quot;kwrd&quot;&gt;Values&lt;/span&gt; (1) &lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   8:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;GO&lt;/span&gt; &lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;style type=&quot;text/css&quot;&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, &quot;Courier New&quot;, courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;After that, we can create a Stored Procedure which marks every transaction on the TFS’ databases, and reports back to the table: &lt;br&gt;&lt;br /&gt;&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;Create&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;PROCEDURE&lt;/span&gt; sp_SetTransactionLogMark &lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;@name nvarchar (128) &lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   3:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;AS&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   4:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;BEGIN&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;TRANSACTION&lt;/span&gt; @name &lt;span class=&quot;kwrd&quot;&gt;WITH&lt;/span&gt; MARK &lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   5:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;UPDATE&lt;/span&gt; TFS_Configuration.dbo.Tbl_TransactionLogMark &lt;span class=&quot;kwrd&quot;&gt;SET&lt;/span&gt; logmark = 1 &lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   6:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;COMMIT&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;TRANSACTION&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   7:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;GO&lt;/span&gt; &lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;style type=&quot;text/css&quot;&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, &quot;Courier New&quot;, courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Then you can run the Stored Procedure, and mark the transactions with a mark. As MSDN states, “TFSMark”.&lt;br&gt;&lt;br /&gt;&lt;div class=&quot;csharpcode&quot;&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;EXEC&lt;/span&gt; sp_SetTransactionLogMarkAll &lt;span class=&quot;str&quot;&gt;&apos;TFSMark&apos;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=&quot;lnum&quot;&gt;   2:  &lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;GO&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;style type=&quot;text/css&quot;&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, &quot;Courier New&quot;, courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;So you can automate this Stored Procedure, and use it as a ‘filtered log’ on your database activities. &lt;br /&gt;&lt;p&gt;It’s nothing new in the end, but as it’s hidden inside the MSDN documentation I’ve never seen it out there, and IMHO it was worth of a mention. &lt;/p&gt;  </description>
        <pubDate>Mon, 22 Oct 2012 19:50:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/10/22/marking-transactions-on-team-foundation/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/10/22/marking-transactions-on-team-foundation/</guid>
      </item>
    
      <item>
        <title>Rollback Changeset in Team Foundation Server: the time machine</title>
        <description>&lt;p&gt;It may happen you have the need of rolling back a previous changeset (due to various reasons). As far as today, you could do it with Get Latest Version – compare – Merge&amp;amp;Fix. Fairly rough, and not intuitive.&lt;/p&gt; &lt;p&gt;To be honest, this feature existed since Team Foundation Server 2010. It was just &lt;strong&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/dd380776(v=vs.100).aspx&quot;&gt;tf rollback&lt;/a&gt;&lt;/strong&gt;, and no GUI was provided.&lt;/p&gt; &lt;p&gt;Then the PowerTools integrated it with Visual Studio, but now it has been promoted as a first class feature in Visual Studio 2012.&lt;/p&gt; &lt;p&gt;The time machine (as I called it) works as following:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-11BdTdghxxE/UHXLzKBpLzI/AAAAAAAAAeI/-BVRkT1nzxo/s1600-h/image3.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-22Id7oOgCLQ/UHXL0kwl-0I/AAAAAAAAAeQ/iANkCT0yQoM/image_thumb1.png?imgmax=800&quot; width=&quot;342&quot; height=&quot;118&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Then you get it inside the Pending Changes, and you only have to check it in the Team Foundation Server. It’s possible to rollback even selected changesets, ranges, etc.&lt;/p&gt;  </description>
        <pubDate>Wed, 10 Oct 2012 19:26:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/10/10/rollback-changeset-in-team-foundation/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/10/10/rollback-changeset-in-team-foundation/</guid>
      </item>
    
      <item>
        <title>Random questions I got on Team Foundation Service</title>
        <description>&lt;p&gt;During the last months I went back and forth demoing Team Foundation Service, and several questions came up. Despite there’s a FAQ page out there, it seems people don’t read corporate pages &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh4.ggpht.com/-FVfdOs7ojtY/UGwmDwhQmiI/AAAAAAAAAdA/h3_0hc1iO88/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;, so I decided of putting them all together in this page.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Am I tied to Windows Live for my users? Can I use Office365 or corporate accounts?&lt;br&gt;&lt;/strong&gt;The answer is &lt;strong&gt;not yet&lt;/strong&gt;. The Team Foundation Service authentication relies on Windows Azure ACS, so it’s technically possible to federate users or use corporate accounts but at this time (October 2012) it is not an enabled scenario, and you still have to rely on Windows Live for authentication. Nothing prevents you to make your corporate accounts Windows Live IDs, just signing up with the &lt;strong&gt;Use an existing account&lt;/strong&gt; option.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Are upgrades managed by Microsoft? Which version of Team Foundation Server do I get signing up on tfspreview.com?&lt;br&gt;&lt;/strong&gt;The Microsoft’s approach on this is pretty clear. The hosted version is going to be always the most recent version on the market, as Brian Harry &lt;a href=&quot;http://blogs.msdn.com/b/bharry/archive/2012/08/28/tfs-shipping-cadence.aspx&quot;&gt;pointed out&lt;/a&gt; on his blog. The Team Foundation Service team works on a &lt;strong&gt;three weeks&lt;/strong&gt;-long sprint, and delivers straight to the service, so you won’t have to wait for Service Packs or Cumulative Updates. Moreover, tfspreview is not subjected to the Patch Tuesday, as critical patches are applied daily if needed.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What about my data? I don’t trust Microsoft to be the hoster of my source code!&lt;br&gt;&lt;/strong&gt;Despite you won’t be attracted by Microsoft’s policies and behavior, they are &lt;strong&gt;never&lt;/strong&gt; going to read your data. It’s clearly written in the EULA you accept when you sign up for the service, they can just move your data for backup and high availability purposes, but &lt;strong&gt;they are not able to see&lt;/strong&gt; what’s inside their databases. It’s a legal agreement, and because of this it’s not meant to be interpreted. It’s as it, period.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What about my data? I want to be able to move away from Team Foundation Service whenever I want!&lt;br&gt;&lt;/strong&gt;Again, your data is your data. But remember tfspreview is…a preview &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh4.ggpht.com/-FVfdOs7ojtY/UGwmDwhQmiI/AAAAAAAAAdA/h3_0hc1iO88/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt; and so not feature-complete at the moment. Maybe the top priority now for Microsoft is to enable you to easily export your data. Meanwhile, you can always sync it to your on-premise instance of Team Foundation Service via the Integration Platform.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;How expensive is the service going to be? How much is it going to cost?&lt;br&gt;&lt;/strong&gt;In the Pricing &lt;a href=&quot;http://tfspreview.com/en-us/pricing/information/&quot;&gt;page&lt;/a&gt; of tfspreview.com it’s clearly stated that there’s going to be a free level of service. We still don’t know what does that mean (in terms of features), but it’s a fact.&lt;/p&gt; &lt;p&gt;These are just the five most common questions I got during these months. For a more complete set of answers, I suggest to go to tfspreview.com &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh4.ggpht.com/-FVfdOs7ojtY/UGwmDwhQmiI/AAAAAAAAAdA/h3_0hc1iO88/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt; you’re going to find all you need there.&lt;/p&gt;  </description>
        <pubDate>Wed, 03 Oct 2012 11:48:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/10/03/random-questions-i-got-on-team/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/10/03/random-questions-i-got-on-team/</guid>
      </item>
    
      <item>
        <title>Team Alerts as an automated notification tool</title>
        <description>&lt;p&gt;Communication among team members is the main pillar for the modern ALM, no excuses.&lt;/p&gt; &lt;p&gt;There are many ways of getting all the team members involved, but sometimes a communication needs to be asynchronous and, more importantly, automated.  &lt;p&gt;Here’s our help: the Team Alerts.  &lt;p&gt;Alerts are customizable on a user basis, but with the new Team concept of Visual Studio ALM, we get Team Alerts. This alerts can be sent when a specific event happen, to a list of users.  &lt;p&gt;In my case, I created a “Test Build Team”, which contains just one user (me J) and it is obviously nested inside the main project team. In a real world scenario, this is supposed to contain all the users whose job is to manage the build.  &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-yKntVTw8ghY/UFwBsqtv6KI/AAAAAAAAAbU/2nMnlds2h18/s1600-h/image2.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-176Yp5AwjzA/UFwBt_sBZ2I/AAAAAAAAAbc/cjWtk81bHCU/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;88&quot;&gt;&lt;/a&gt;  &lt;p&gt;After that, I can configure a new Team Alert, just for the Test Build Team (when a build fails, it’s triggered)  &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-M-vmMlLxg-I/UFwBu3ZWGgI/AAAAAAAAAbg/4jfxqfsLqO8/s1600-h/image5.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-01k3opYChOo/UFwBvr1m6KI/AAAAAAAAAbs/zBMZhNwEUqk/image_thumb1.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;177&quot;&gt;&lt;/a&gt;  &lt;p&gt;Then notice some details: thesubscriber is &lt;b&gt;the whole team&lt;/b&gt;:  &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-MBPScoEOy-8/UFwBweh_6uI/AAAAAAAAAb0/9q7Agq2xwb8/s1600-h/image8.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-JE9kzcziBKA/UFwBxRbuvAI/AAAAAAAAAb4/ypnCDEgbsAo/image_thumb2.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;83&quot;&gt;&lt;/a&gt;  &lt;p&gt;The alert is generated upon a query:  &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-XoDuMKcpOPY/UFwBySlVzgI/AAAAAAAAAcA/Zjjf6TayBBQ/s1600-h/image11.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-sL0-E2XRchQ/UFwBzDY6nsI/AAAAAAAAAcM/YllN-Je7P3w/image_thumb3.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;34&quot;&gt;&lt;/a&gt;  &lt;p&gt;And the alert is sent to the email address of &lt;b&gt;the whole team&lt;/b&gt; (so it can be a DL, for instance):  &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-1ewCvr60mjk/UFwB0F7Uu4I/AAAAAAAAAcU/sGHPtvCUbmI/s1600-h/image14.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-3rtN5FBA78U/UFwB1IpKKMI/AAAAAAAAAcY/amS3U3Gy5o4/image_thumb4.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;62&quot;&gt;&lt;/a&gt;  </description>
        <pubDate>Fri, 21 Sep 2012 05:57:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/09/21/team-alerts-as-automated-notification/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/09/21/team-alerts-as-automated-notification/</guid>
      </item>
    
      <item>
        <title>Understanding user loads with the Team Members tab</title>
        <description>&lt;p&gt;With the new wave of Visual Studio tooling for Project Management, I’ve been asked for a quick way of understanding commitment of the developers as a high level overview. &lt;p&gt;There are lots of ways doing so, but IMHO the quickest is the following: the &lt;strong&gt;Team Members&lt;/strong&gt; tab in the Board. &lt;p&gt;Look at that: &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-Dw4273Oh3Ek/UFA8Id9m-DI/AAAAAAAAAaI/aQHIgqAqcWM/s1600-h/clip_image002%25255B3%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;clip_image002&quot; border=&quot;0&quot; alt=&quot;clip_image002&quot; src=&quot;http://lh4.ggpht.com/-4FlML2a3C8A/UFA8Kp4BqJI/AAAAAAAAAaQ/EPEnp7V8-3M/clip_image002_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;137&quot;&gt;&lt;/a&gt; &lt;p&gt;In order to get a full picture I had to zoom it out. It’s pretty messy, and it’s good it is, but it’s not that useful… &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-sSqKaQpV4NI/UFA8LanVtxI/AAAAAAAAAaY/nUEfNHFx95M/s1600-h/clip_image003%25255B3%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;clip_image003&quot; border=&quot;0&quot; alt=&quot;clip_image003&quot; src=&quot;http://lh4.ggpht.com/-_Ssoff-WGpA/UFA8MHJLoSI/AAAAAAAAAag/idm0QpsQS_c/clip_image003_thumb.png?imgmax=800&quot; width=&quot;197&quot; height=&quot;81&quot;&gt;&lt;/a&gt; &lt;p&gt;So clicking on the &lt;strong&gt;team members&lt;/strong&gt; tab, gives us a pretty comprehensive table: &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-aU7tix3jymA/UFA8NIqY2pI/AAAAAAAAAao/UI8ou9NxfiI/s1600-h/clip_image005%25255B3%25255D.jpg&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;clip_image005&quot; border=&quot;0&quot; alt=&quot;clip_image005&quot; src=&quot;http://lh6.ggpht.com/-F-KGSOB0i9U/UFA8Nx-CArI/AAAAAAAAAaw/19SYnfF10I0/clip_image005_thumb.jpg?imgmax=800&quot; width=&quot;244&quot; height=&quot;85&quot;&gt;&lt;/a&gt; &lt;p&gt;This is definitely more readable than understanding a full taskboard on the run.   </description>
        <pubDate>Wed, 12 Sep 2012 07:39:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/09/12/understanding-user-loads-with-team/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/09/12/understanding-user-loads-with-team/</guid>
      </item>
    
      <item>
        <title>Remote UAC with Standard Environment and Workgroup Machines</title>
        <description>&lt;p&gt;As using workgroup machines in Standard Environment is a borderline scenario, there are some issues and stuff to care about, like the careful usage of &lt;a href=&quot;http://mattvsts.blogspot.it/2012/05/standard-environment-in-visual-studio.html&quot;&gt;shadow accounts&lt;/a&gt; or the right management of &lt;a href=&quot;http://support.microsoft.com/kb/951016&quot;&gt;Remote UAC&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;In certain scenarios, having Remote UAC enabled may lead to wrong or misleading behaviors, as basically it doesn’t leases a admin token but (correctly, from a security perspective) just a limited one.&lt;/p&gt; &lt;p&gt;For example, the automated installation of the test agent inside a workgroup machine from another workgroup machine running MTM would fail, as this is a scenario where authentication and authorization (two different concept as we know). To workaround this and other cases, the solution is pretty simple. The only need is to set the &lt;strong&gt;HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\system\LocalAccountTokenFilterPolicy&lt;/strong&gt; key to &lt;strong&gt;1.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;This procedure is totally supported, as it’s stated inside this MSDN page on &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/hh546460.aspx&quot;&gt;Test Controller configuration&lt;/a&gt;.&lt;/p&gt;  </description>
        <pubDate>Sun, 02 Sep 2012 17:19:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/09/02/remote-uac-with-standard-environment/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/09/02/remote-uac-with-standard-environment/</guid>
      </item>
    
      <item>
        <title>Beware of the Microsoft Account!</title>
        <description>&lt;p&gt;The introduction of the Microsoft Account as an identification method on Windows 8 is great, it enables several scenarios in a seamless way and it makes life easy for users.&lt;/p&gt; &lt;p&gt;But there’s a downside over there: some services won’t work as the required impersonation (there’s always going to be a “shadow user” of your Microsoft Accounton your pc) is not allowed to be done from a security perspective.&lt;/p&gt; &lt;p&gt;This leads to problems in particular with Visual Studio Team Lab Management, where a massive usage of the impersonation is done in order to use the Lab features.&lt;/p&gt; &lt;p&gt;In my case, I verified tons of troubles when, with a Standard Environment made of workgroup machines. In this case, the installation of the required agents inside the machines always failed, with no particular reason (and without a real error!):&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-jrMUmLReBHg/UDJAEb7UOwI/AAAAAAAAAZI/LIFnDV5NWVc/s1600-h/clip_image002%25255B4%25255D.jpg&quot;&gt;&lt;img title=&quot;clip_image002&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;clip_image002&quot; src=&quot;http://lh4.ggpht.com/-4KEKKheklfE/UDJAFWQ81YI/AAAAAAAAAZQ/kDV_h_nyLn0/clip_image002_thumb%25255B1%25255D.jpg?imgmax=800&quot; width=&quot;465&quot; height=&quot;198&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Obviously I don’t want to manually install anything, so the solution is to use another Windows Account (warning: a &lt;strong&gt;local&lt;/strong&gt; Windows Account) as the Lab Service Account:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-hSxk226F4eE/UDJAGJxiEEI/AAAAAAAAAZY/wVghROGTks4/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-fl2LU8aKzcM/UDJAHLVvzLI/AAAAAAAAAZg/M4GYgLQNg3A/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;364&quot; height=&quot;108&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;That’s it &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh4.ggpht.com/-GAJ74emzSic/UDJAIUA4cEI/AAAAAAAAAZk/3lFQuSs2aqo/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt;  </description>
        <pubDate>Mon, 20 Aug 2012 13:48:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/08/20/beware-of-windows-live-id/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/08/20/beware-of-windows-live-id/</guid>
      </item>
    
      <item>
        <title>Tailor-made Visual Studio 2012 installations (aka unattended, the new way)</title>
        <description>&lt;p&gt;Up to Visual Studio 2010 the unattended installation was made up of many steps, making a journey into a .ini file…&lt;/p&gt; &lt;p&gt;With Visual Studio 2012, the new experience is pretty faster, cleaner and easier.&lt;/p&gt; &lt;p&gt;The first thing to do is to create a &lt;strong&gt;Network Image&lt;/strong&gt;, to be used into the company to deploy Visual Studio 2012. You have to create a &lt;em&gt;X:/IDEinstall&lt;/em&gt; folder.&lt;/p&gt; &lt;p&gt;Then the only needed step is to customize the &lt;strong&gt;AdminDeployment.xml&lt;/strong&gt; file! I won’t go deep dive on the schema as the MSDN &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ee225237.aspx&quot;&gt;documentation&lt;/a&gt; is self-explanative, but it can be summarized as it: you can choose which component to install in a Yes|No binary choice.&lt;/p&gt; &lt;p&gt;Once the AdminDeployment.xml file is customized as you want, you just have to grant the share all the required permissions and the users are automatically going to install Visual Studio with the defined settings. &lt;/p&gt; &lt;p&gt;Otherwise a silent installation is possible using the following command line statement:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;\\ServerName\IDEinstall\vs_Product.exe /adminfile AdminDeployment.xml /quiet /norestart&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;This statement is also the way of managing Visual Studio installations, both quiet and interactive. Again, everything relies on the &lt;strong&gt;AdminDeployment.xml&lt;/strong&gt; file.&lt;/p&gt;  </description>
        <pubDate>Fri, 17 Aug 2012 09:15:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/08/17/tailor-made-visual-studio-2012/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/08/17/tailor-made-visual-studio-2012/</guid>
      </item>
    
      <item>
        <title>Visual SourceSafe to Team Foundation Server step by step</title>
        <description>As I &lt;a href=&quot;http://twitter.com/MattVSTS/status/223069339752988673&quot;&gt;tweeted&lt;/a&gt; some weeks ago, the Visual SourceSafe 2005 support expired July 10th, 2012. So it is no more a &lt;strong&gt;supported&lt;/strong&gt; solution from Microsoft.&lt;br /&gt;&lt;br /&gt;If you have some Visual SourceSafe still lying around your datacentre, here’s how to kill them with no pain &lt;img alt=&quot;Smile&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; src=&quot;http://lh6.ggpht.com/-NI9Qk5HyYvM/UBr_NSmu5GI/AAAAAAAAAYo/XpkdeTKq67w/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot; /&gt;&lt;br /&gt;&lt;br /&gt;First of all: you’re going to need the VSSConverter, a fantastic tool contained in the Visual Studio installation, under&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&amp;lt;drive&amp;gt;:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Beware: with Team Foundation Server 2012 there’s going to be a new tool to perform migrations. I’m going to post something on the new tool as soon as I can, but for now this is the only way to migrate it. Moreover, if you won’t have Team Foundation Server 2012, you have not that much possibilities…&lt;img alt=&quot;Smile&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; src=&quot;http://lh6.ggpht.com/-NI9Qk5HyYvM/UBr_NSmu5GI/AAAAAAAAAYo/XpkdeTKq67w/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot; /&gt;&lt;br /&gt;&lt;br /&gt;I strongly suggest you to copy the VSSConverter and its related files inside a folder, like &lt;strong&gt;&amp;lt;drive&amp;gt;:\Migration&lt;/strong&gt;, in order to keep everything simple.&lt;br /&gt;&lt;br /&gt;Then you have to create two XML files: one is for the Analysis, and the other for the Migration. I won’t go into details, everything you need about those files are into the MSDN but…I provide you two samples &lt;img alt=&quot;Smile&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; src=&quot;http://lh6.ggpht.com/-NI9Qk5HyYvM/UBr_NSmu5GI/AAAAAAAAAYo/XpkdeTKq67w/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot; /&gt; here’s one for the &lt;a href=&quot;https://skydrive.live.com/redir?resid=4F49EBA58E1D0C02!481&amp;amp;authkey=!ALlL9-N2J6gK-z0&quot;&gt;Analysis&lt;/a&gt;, and here’s the other for the &lt;a href=&quot;https://skydrive.live.com/redir?resid=4F49EBA58E1D0C02!482&amp;amp;authkey=!APxfz_T__CJgfoo&quot;&gt;Migration&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To analyze the Visual SourceSafe database, use the following command (from an elevated command prompt):&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;vssconverter.exe analyze analysissettings.xml&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;It analyzes the Visual SourceSafe database (or part of it), and provides us a report, to understand whether there are errors, and a UserMap.xml file. Inside of it we can find the Visual SourceSafe users to map to the correct Active Directory user in Team Foundation Server.&lt;br /&gt;&lt;br /&gt;What does it happen if I don’t map a user (for various reasons)? Well…despite it’s &lt;strong&gt;strongly suggested&lt;/strong&gt; to do so, the difference in behavior is the following:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;With:&lt;/strong&gt;&lt;br /&gt;Changeset 4121 – Committed by DOMAIN\UserWhoDidIt – Comment&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Without:&lt;/strong&gt;&lt;br /&gt;Changeset 4121 – Committed by DOMAIN\MigrationUser – Comment (Committed by UserWhoDidIt)&lt;br /&gt;&lt;br /&gt;After finalizing the user mapping, we use the following command to migrate:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;vssconverter.exe migrate migrationsettings.xml&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;And the migration takes place &lt;img alt=&quot;Smile&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; src=&quot;http://lh6.ggpht.com/-NI9Qk5HyYvM/UBr_NSmu5GI/AAAAAAAAAYo/XpkdeTKq67w/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot; /&gt; that’s it!</description>
        <pubDate>Fri, 03 Aug 2012 07:51:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/08/03/visual-sourcesafe-to-team-foundation/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/08/03/visual-sourcesafe-to-team-foundation/</guid>
      </item>
    
      <item>
        <title>Team Build Nuggets: Automatic publishing of Web Applications with Team Build</title>
        <description>&lt;p&gt;As we’ve seen in the previous post, we can automate the creation of a deployment package to automate deployment of web applications.&lt;/p&gt; &lt;p&gt;What we’ve seen until now is just the beginning: in this post we’re going to cover the fully automated deployment workflow.&lt;/p&gt; &lt;p&gt;But before of that, we need a prerequisite: the Web Deployment Tool.&lt;/p&gt; &lt;p&gt;It’s downloadable from the Web PI Installer, and the only configuration needed is &lt;a href=&quot;http://blogs.msdn.com/b/webdevtools/archive/2009/06/05/basic-microsoft-web-deployment-tool-setup-for-visual-studio-2010.aspx&quot;&gt;this&lt;/a&gt; (on the target server).&lt;/p&gt; &lt;p&gt;After that, do you remember the &lt;strong&gt;MSBuild Argument&lt;/strong&gt; to pass inside the Build Definition? It was:&lt;/p&gt; &lt;p align=&quot;center&quot;&gt;&lt;strong&gt;/p:DeployOnPublish=true&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Instead right now we need a little more verbose one:&lt;/p&gt; &lt;p&gt;/p:DeployOnBuild=True /p:DeployTarget=MsDeployPublish /p:CreatePackageOnPublish=True /p:MSDeployPublishMethod=InProc /p:MSDeployServiceUrl=&amp;lt;server&amp;gt; /p:DeployIisAppPath=&quot;Default Web Site/&amp;lt;mypath&amp;gt;&quot; /p:UserName=&amp;lt;domain&amp;gt;\user /p:Password=&amp;lt;password&amp;gt;&lt;/p&gt; &lt;p&gt;It creates a package which gets pushed to the server running the WDT, and automatically executed. &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh3.ggpht.com/-u4pVmJPkB2k/UAp2DPhQO0I/AAAAAAAAAYc/ij5gQDUXOdY/wlEmoticon-smile2.png?imgmax=800&quot;&gt;&lt;/p&gt;  </description>
        <pubDate>Sat, 21 Jul 2012 09:27:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/07/21/team-build-nuggets-automatic-publishing/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/07/21/team-build-nuggets-automatic-publishing/</guid>
      </item>
    
      <item>
        <title>Team Build Nuggets: XCopy Deployment</title>
        <description>&lt;p&gt;What’s needed to perform an XCopy Deployment with Team Build?&lt;/p&gt; &lt;p&gt;Just that as a &lt;strong&gt;MSBuild Argument&lt;/strong&gt;:&lt;/p&gt; &lt;p&gt;/p:DeployOnBuild=true /p:DeployTarget=PipelinePreDeployCopyAllFilesToOneFolder /p:_PackageTempRootDir=&lt;em&gt;\\&amp;lt;server&amp;gt;\folder&lt;/em&gt;&lt;/p&gt;  </description>
        <pubDate>Mon, 16 Jul 2012 14:01:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/07/16/team-build-nuggets-xcopy-deployment/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/07/16/team-build-nuggets-xcopy-deployment/</guid>
      </item>
    
      <item>
        <title>Team Build Nuggets: Deployment Package</title>
        <description>&lt;p&gt;A great feature inside Team Build is the capability of creating deployment packages from the server in order to automatically deploy the application to the target server.&lt;/p&gt; &lt;p&gt;It’s really easy, you only have to create a Build Definition:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-bsrvSNMaOcI/T_79QC8TpuI/AAAAAAAAAXQ/AvoojVSpTwc/s1600-h/b0%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;b0&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;b0&quot; src=&quot;http://lh3.ggpht.com/-y3vsIayq-hw/T_79ROKk9AI/AAAAAAAAAXY/kC8fbDJJ7aQ/b0_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;168&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;and adding the &lt;strong&gt;/p:DeployOnBuild=true &lt;/strong&gt;switch to the MSBuild Arguments.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-NgByjKYypuo/T_79R1REjpI/AAAAAAAAAXc/MMlA36BbSuY/s1600-h/b1%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;b1&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;b1&quot; src=&quot;http://lh6.ggpht.com/-n0UPSFwOIVo/T_79S-qYwkI/AAAAAAAAAXo/FY7Oef2ouWs/b1_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;187&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;After building you’re going to find a &lt;em&gt;&amp;lt;Project&amp;gt;&lt;/em&gt;_Package folder…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-RuFSrGtZQZM/T_79Tjvwt9I/AAAAAAAAAXw/aMBie7JKZ04/s1600-h/b2%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;b2&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;b2&quot; src=&quot;http://lh4.ggpht.com/-rAFU4lncWOQ/T_79UZWobYI/AAAAAAAAAX4/2gOvV503XPY/b2_thumb.png?imgmax=800&quot; width=&quot;159&quot; height=&quot;133&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;…which contains the package itself. &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-1DB_J6Pi7xQ/T_79Vfwp_qI/AAAAAAAAAYA/9ufcZnc7QbM/s1600-h/b3%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;b3&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;b3&quot; src=&quot;http://lh4.ggpht.com/-gY49x8mZdPs/T_79WAoBzYI/AAAAAAAAAYE/zReH-pc2lx8/b3_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;207&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;How to deploy it? Well…run the .deploy script or wait for another Team Build Nuggets post&lt;img class=&quot;wlEmoticon wlEmoticon-winkingsmile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Winking smile&quot; src=&quot;http://lh6.ggpht.com/-ECd65NNBk2Q/T_79W-NQI1I/AAAAAAAAAYM/cbFwigGWC-U/wlEmoticon-winkingsmile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt;  </description>
        <pubDate>Thu, 12 Jul 2012 16:37:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/07/12/team-build-nuggets-deployment-package/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/07/12/team-build-nuggets-deployment-package/</guid>
      </item>
    
      <item>
        <title>Baseless Merge 101</title>
        <description>&lt;p&gt;A &lt;strong&gt;Baseless Merge&lt;/strong&gt; is a not-that-known feature of the TFS’ Version Control System.&lt;/p&gt; &lt;p&gt;It’s a merge made with two branches of a root with no relationship between them. For instance, two parallel ‘release’ branches.&lt;/p&gt; &lt;p&gt;The suggested way of performing a merge with two branches like those lying around is to reverse integrate the first one into the root and then to remerge inside the other child. But this approach is not always feasible, so you can perform a baseless merge.&lt;/p&gt; &lt;p&gt;It’s a rather risky operation: the Visual Studio ALM Rangers strongly recommend to avoid it, because of the inner troubles inside it: no propagation for deletions, and no auto-solving of conflicts.&lt;/p&gt; &lt;p&gt;Up to Visual Studio ALM 2010, the baseless merge was there! But it was not integrated inside the IDE, and then the only option was to use &lt;strong&gt;tf.exe&lt;/strong&gt; (tf merge /baseless …).&lt;/p&gt; &lt;p&gt;Nowadays we have this feature inside Visual Studio 2012, so no more command line playing. &lt;/p&gt; &lt;p&gt;For instance, in this scenario I’d want to merge Feature1 and Feature2…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-KyW7DOy2jrE/T_bBpIfoKYI/AAAAAAAAAWs/fhPvuiR1fgY/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-fKAOC8rpric/T_bBqBDeoII/AAAAAAAAAW0/7vUXXdWFEmo/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;408&quot; height=&quot;230&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;…I can do it by calling the Merge Wizard.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-ehYw6cdN8E4/T_bBrErZJsI/AAAAAAAAAW8/x7yE4pcHQYE/s1600-h/image%25255B7%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-JD3jzuCXaRQ/T_bBs5zaqCI/AAAAAAAAAXE/v2TFIdk_LtM/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;376&quot; height=&quot;336&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;It’s explicitly warning me I’m doing something risky: the baseless merge has &lt;strong&gt;no relationship&lt;/strong&gt; with its siblings.&lt;/p&gt; &lt;p&gt;Moreover, if you try to drag and drop from the Hierarchy Viewer, &lt;strong&gt;you won’t be able to do a baseless merge&lt;/strong&gt;. As of its nature, it must be done just purposefully and not ‘by error’.&lt;/p&gt;  </description>
        <pubDate>Fri, 06 Jul 2012 10:45:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/07/06/baseless-merge-101/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/07/06/baseless-merge-101/</guid>
      </item>
    
      <item>
        <title>How to instrument an application with PreEmptive Analytics for Team Foundation Server</title>
        <description>&lt;p&gt;As I previously posted, in this release we have a powerful instrumentation tool for our exceptions: PreEmptive Analytics.&lt;/p&gt; &lt;p&gt;Given the required server side configuration, here’s what’s needed on the client side:&lt;/p&gt; &lt;p&gt;Open up Dotfuscator:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href=&quot;http://lh3.ggpht.com/-_ku9QIUQFbM/T9YmbTpz4jI/AAAAAAAAASQ/7u3YrwuQpDk/s1600-h/pa12.png&quot;&gt;&lt;img title=&quot;pa1&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;pa1&quot; src=&quot;http://lh6.ggpht.com/-A7Z9Cz1Cq4I/T9YmcG0H7yI/AAAAAAAAASY/RRAGBYJWh3I/pa1_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;116&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Set a new executable to target:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-GTqrONJGi28/T9YmcvXrVOI/AAAAAAAAASg/wNzTDfphG0c/s1600-h/pa22.png&quot;&gt;&lt;img title=&quot;pa2&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;pa2&quot; src=&quot;http://lh5.ggpht.com/-fxE1wlqiW48/T9YmdbHhxlI/AAAAAAAAASo/j7-n71_aW8E/pa2_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;160&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-jFh63-XwAEg/T9YmdvxkCAI/AAAAAAAAASw/RqiT38xj9Xc/s1600-h/pa32.png&quot;&gt;&lt;img title=&quot;pa3&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;pa3&quot; src=&quot;http://lh3.ggpht.com/-lk033WWpamo/T9YmeRkvM_I/AAAAAAAAAS4/b0-X2rhqXXk/pa3_thumb.png?imgmax=800&quot; width=&quot;219&quot; height=&quot;118&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Then select Analytics…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-G3BGxgGfNjs/T9Yme8atECI/AAAAAAAAATA/-CDD1CNoWgg/s1600-h/pa42.png&quot;&gt;&lt;img title=&quot;pa4&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;pa4&quot; src=&quot;http://lh6.ggpht.com/-YkMRQtyLhFY/T9YmgN-DBtI/AAAAAAAAATI/v_X8Cn59zKI/pa4_thumb.png?imgmax=800&quot; width=&quot;149&quot; height=&quot;70&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-JuDFscGnFqQ/T9Ymg4lanZI/AAAAAAAAATQ/jHtSHF2la_U/s1600-h/pa52.png&quot;&gt;&lt;img title=&quot;pa5&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;pa5&quot; src=&quot;http://lh3.ggpht.com/-uZoizaFvN3Q/T9YmiF5U_YI/AAAAAAAAATY/UeendhVuVnA/pa5_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;129&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;…and we start adding attributes:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-HdQOkpk1YeM/T9Ymi1fwckI/AAAAAAAAATg/KOfYAG4JNDY/s1600-h/pa62.png&quot;&gt;&lt;img title=&quot;pa6&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;pa6&quot; src=&quot;http://lh5.ggpht.com/-2kq63wx-Mxw/T9Ymjt2cH6I/AAAAAAAAATo/g6K73fjgH4Y/pa6_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;119&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://lh3.ggpht.com/-6PhBU9e-ofc/T9YmkOhYUII/AAAAAAAAATw/z0E3II7vhgQ/s1600-h/pa72.png&quot;&gt;&lt;img title=&quot;pa7&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;pa7&quot; src=&quot;http://lh5.ggpht.com/-EeurjJjKhgk/T9YmkhkQYEI/AAAAAAAAAT4/br6CTim1jCI/pa7_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;154&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;One of the few things we need is an Application ID:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-10EeXmJ1cm0/T9YmlQFM2mI/AAAAAAAAAUA/fVA-IzwHNns/s1600-h/pa82.png&quot;&gt;&lt;img title=&quot;pa8&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;pa8&quot; src=&quot;http://lh4.ggpht.com/-m4IMDKuqie0/T9YmmEGpUdI/AAAAAAAAAUI/ZcuAELgipcA/pa8_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;34&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-46msy4aO9SE/T9YmmneAMTI/AAAAAAAAAUQ/Wl1p4sbIXgw/s1600-h/pa92.png&quot;&gt;&lt;img title=&quot;pa9&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;pa9&quot; src=&quot;http://lh4.ggpht.com/-Tb8rHRbaJNU/T9YmnKzNd2I/AAAAAAAAAUY/epVZUW5TRj0/pa9_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;71&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Then we add the SetupAttribute to instrument our methods:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-2jrfZC1UxkA/T9YmnwFMllI/AAAAAAAAAUg/FPQ2WFzOCAo/s1600-h/pa102.png&quot;&gt;&lt;img title=&quot;pa10&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;pa10&quot; src=&quot;http://lh4.ggpht.com/-ULUeM7LXFwY/T9YmoSGsLDI/AAAAAAAAAUo/w5uug2vSgCY/pa10_thumb.png?imgmax=800&quot; width=&quot;139&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-HeXa4gMJu3A/T9Ymo7kEdEI/AAAAAAAAAUw/ZYl5tlrWKaw/s1600-h/pa112.png&quot;&gt;&lt;img title=&quot;pa11&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;pa11&quot; src=&quot;http://lh5.ggpht.com/-FrPgkVeyz3k/T9YmprfIHRI/AAAAAAAAAU4/JRgbNGvAUtw/pa11_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;148&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Here we need to configure the Endpoint: as a default setting, the address to set is &lt;strong&gt;tfsserver:8000/Message/Endpoint.ashx&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-lSpFEnSsjvg/T9YmqFft7DI/AAAAAAAAAVA/8_d0G-MWB8c/s1600-h/pa122.png&quot;&gt;&lt;img title=&quot;pa12&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;pa12&quot; src=&quot;http://lh5.ggpht.com/-tDfuHLWLUWI/T9YmqgPkzUI/AAAAAAAAAVI/VYDoFfCsajQ/pa12_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;48&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-jhASLHkKnno/T9YmrTp9wuI/AAAAAAAAAVQ/DaoLXfKoes4/s1600-h/pa132.png&quot;&gt;&lt;img title=&quot;pa13&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;pa13&quot; src=&quot;http://lh6.ggpht.com/-raaKSNdwYKc/T9YmsDWn8QI/AAAAAAAAAVY/VA2ua-ei6go/pa13_thumb.png?imgmax=800&quot; width=&quot;181&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The Teardown attribute is needed to clean up after the execution;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/--kqwGsdlLD0/T9YmsihKnaI/AAAAAAAAAVg/eBiMcwdI1Y0/s1600-h/pa142.png&quot;&gt;&lt;img title=&quot;pa14&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;pa14&quot; src=&quot;http://lh3.ggpht.com/-ROibK1gs64Q/T9YmtQTnhqI/AAAAAAAAAVo/u1rjyefxYd0/pa14_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;163&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;The only missing stuff is the configuration itself:&lt;a href=&quot;http://lh5.ggpht.com/-bRROIur53KE/T9Ymt-krL_I/AAAAAAAAAVw/uolWC3wN8BI/s1600-h/pa152.png&quot;&gt;&lt;img title=&quot;pa15&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;pa15&quot; src=&quot;http://lh6.ggpht.com/-dMBNMnI1y3M/T9Ymuq7ZuaI/AAAAAAAAAV4/aH6kcpN0cDc/pa15_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;163&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;We go creating a new subscription:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-3l_OlSGAsFc/T9YmvOr33kI/AAAAAAAAAWA/D8NMe9cI5g0/s1600-h/pa162.png&quot;&gt;&lt;img title=&quot;pa16&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;pa16&quot; src=&quot;http://lh5.ggpht.com/-GIvako_UcB4/T9YmwvEsFjI/AAAAAAAAAWI/TeefuHqsglY/pa16_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;94&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Copy-paste the IDs needed (Company and Application). The most important setting here is the &lt;strong&gt;Threshold&lt;/strong&gt;: if we set it to 1, we’ll have an &lt;strong&gt;Incident&lt;/strong&gt; work item for &lt;strong&gt;every&lt;/strong&gt; time the exception raises.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-1xKfmF6cB24/T9YmxSKj5RI/AAAAAAAAAWQ/XW6rlUMAw08/s1600-h/pa172.png&quot;&gt;&lt;img title=&quot;pa17&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;pa17&quot; src=&quot;http://lh6.ggpht.com/-_nogUaRbW1Q/T9YmybJu9II/AAAAAAAAAWY/FvfJhmZcn6g/pa17_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;172&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;That’s it people &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh3.ggpht.com/-VD917qXYpL4/T9Ymyy35FJI/AAAAAAAAAWg/Zl28zpOZfTg/wlEmoticon-smile2.png?imgmax=800&quot;&gt;&lt;/p&gt;  </description>
        <pubDate>Mon, 11 Jun 2012 17:11:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/06/11/how-to-instrument-application-with/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/06/11/how-to-instrument-application-with/</guid>
      </item>
    
      <item>
        <title>Forward Compatibility Patch for Visual Studio 2008 to support TFS 2012 and Service is out!</title>
        <description>&lt;p&gt;For who is still using Visual Studio 2008 and wants to connect to Team Foundation Server 2012 or Team Foundation Service, the GDR patch has just been released!&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://support.microsoft.com/kb/2673642&quot;&gt;Here&lt;/a&gt;’s the download.&lt;/p&gt; &lt;p&gt;Matteo&lt;/p&gt;  </description>
        <pubDate>Wed, 06 Jun 2012 18:43:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/06/06/forward-compatibility-patch-for-visual/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/06/06/forward-compatibility-patch-for-visual/</guid>
      </item>
    
      <item>
        <title>Configure PreEmptive Analytics for Team Foundation Server 11</title>
        <description>&lt;p&gt;As I previously talked about, PreEmptive included an instrumentation and analysis tool for Team Foundation Server.&lt;/p&gt; &lt;p&gt;After you install it, it’s needed a little bit of configuration. So you have to open the &lt;strong&gt;PreEmptive Analytics Aggregator Administration Console&lt;/strong&gt;:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-Lk7s1FqkJHU/T8aCIsoRjxI/AAAAAAAAARM/fwNmq2yovoA/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-AGT-ssICwBM/T8aCJkXikcI/AAAAAAAAARU/vO0gRxEMDwA/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;215&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;On the left side, click on the &lt;strong&gt;+&lt;/strong&gt; sign to add a Team Foundation Server.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-hR92RIaatlQ/T8aCLdauOXI/AAAAAAAAARc/0fAqq_FLQCI/s1600-h/image%25255B9%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-1BmGBueKqSA/T8aCMOPY3zI/AAAAAAAAARk/Gg5YUJf0s1M/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;352&quot; height=&quot;300&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;After that, the form is populated with the data from TFS. You need to &lt;strong&gt;deploy the PA items&lt;/strong&gt; then:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-2gjwIEMXrnI/T8aCM6p1xAI/AAAAAAAAARs/a7ZHCfA9nuc/s1600-h/image%25255B12%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-JYuHpCHNrtU/T8aCN6bSuTI/AAAAAAAAAR0/rqG4HBBoW6U/image_thumb%25255B4%25255D.png?imgmax=800&quot; width=&quot;216&quot; height=&quot;226&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This operation adds a Work Item Definition, a query, and two reports if reporting services are found:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-mZPZNaw7xJQ/T8aCPvGKKGI/AAAAAAAAAR8/ksiCZ3y89sU/s1600-h/image%25255B16%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-qFP6xA1a51w/T8aCRO-tIOI/AAAAAAAAASE/YC2CDQsGY78/image_thumb%25255B6%25255D.png?imgmax=800&quot; width=&quot;422&quot; height=&quot;81&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;After that, you might have to configure the Exception Sets caught by PA, but that’s not required.&lt;/p&gt; &lt;p&gt;Limits: the PA Community Edition includes just one Team Project Collection monitoring and two Team Project inside it. It can only record unhandled exceptions and there is a three exception rules limit.&lt;/p&gt;  </description>
        <pubDate>Wed, 30 May 2012 20:25:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/05/30/configure-preemptive-analytics-for-team/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/05/30/configure-preemptive-analytics-for-team/</guid>
      </item>
    
      <item>
        <title>Step by step configuration of the Team Foundation Server and Project Server Integration Feature Pack</title>
        <description>&lt;p&gt;This post is aimed at helping who has never configured the Team Foundation Server and Project Server integration &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh3.ggpht.com/-7bBi04Xm63c/T7CZ-lT41bI/AAAAAAAAAP8/wrFZ_kBN6DM/wlEmoticon-smile2.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;First of all: do &lt;strong&gt;not &lt;/strong&gt;use NT AUTHORITY\Network Service as a service account.&lt;/p&gt; &lt;p&gt;After this &lt;em&gt;sanity check&lt;/em&gt;, the prerequisites: a Team Foundation Server 2010 or above, a Project Server 2007 or 2010, and the &lt;strong&gt;&lt;em&gt;Microsoft Team Foundation Server 2010 and Microsoft Project Server Integration Feature Pack &lt;/em&gt;&lt;/strong&gt;(FP for us &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh3.ggpht.com/-7bBi04Xm63c/T7CZ-lT41bI/AAAAAAAAAP8/wrFZ_kBN6DM/wlEmoticon-smile2.png?imgmax=800&quot;&gt;, it must be installed on the servers)&lt;/p&gt; &lt;p&gt;Then, the configuration. It’s a four steps procedure, from the Visual Studio command prompt.&lt;/p&gt; &lt;p&gt;First: I register the Project Web Access with the Team Foundation Server.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-ymi6R3bUEl4/T7CZ_t97z8I/AAAAAAAAAQE/dzUzHWbD6qc/s1600-h/ps02.png&quot;&gt;&lt;img title=&quot;ps0&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;ps0&quot; src=&quot;http://lh4.ggpht.com/-HWpjhZun1iI/T7CaAb5C2rI/AAAAAAAAAQI/tTV9GALnCnA/ps0_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;127&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Second: I map the Project Web Access with the Project Collection I need.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-LSK35m8Z1oE/T7CaBT394NI/AAAAAAAAAQQ/1bvDPO0Al7M/s1600-h/ps12.png&quot;&gt;&lt;img title=&quot;ps1&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;ps1&quot; src=&quot;http://lh5.ggpht.com/-A5lxbrisBW0/T7CaCboP3HI/AAAAAAAAAQY/9Ig9k1qjHQg/ps1_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;58&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Third: I load the field mapping.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-SXEZUHwsF54/T7CaDOr4VyI/AAAAAAAAAQg/yCbNuDIyo1A/s1600-h/ps22.png&quot;&gt;&lt;img title=&quot;ps2&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;ps2&quot; src=&quot;http://lh4.ggpht.com/-H2GxQd4dXZw/T7CaEFKntDI/AAAAAAAAAQo/6j97mSIyo2I/ps2_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;54&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Fourth: I map the Project Server’s Enterprise Project to the Team Foundation Server’s Team Project&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-gsTo6PqDiNs/T7CaFGMMkoI/AAAAAAAAAQw/ZccW5AqgKzQ/s1600-h/ps32.png&quot;&gt;&lt;img title=&quot;ps3&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;ps3&quot; src=&quot;http://lh3.ggpht.com/-U9aj_z2YAiA/T7CaGAN2klI/AAAAAAAAAQ4/Nb3QqvAuxkI/ps3_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;50&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;That’s it &lt;img class=&quot;wlEmoticon wlEmoticon-smile&quot; style=&quot;border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none&quot; alt=&quot;Smile&quot; src=&quot;http://lh3.ggpht.com/-7bBi04Xm63c/T7CZ-lT41bI/AAAAAAAAAP8/wrFZ_kBN6DM/wlEmoticon-smile2.png?imgmax=800&quot;&gt;&lt;/p&gt;  </description>
        <pubDate>Mon, 14 May 2012 05:37:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/05/14/step-by-step-configuration-of-team/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/05/14/step-by-step-configuration-of-team/</guid>
      </item>
    
      <item>
        <title>How to run local Web and Performance tests with Visual Studio 11</title>
        <description>&lt;p&gt;In Visual Studio 2010 to run Web Tests or Performance Tests you were editing locally, you had to run them from the &lt;strong&gt;Test&lt;/strong&gt; menu, telling Visual Studio itself to pick up the &lt;strong&gt;local.testsettings&lt;/strong&gt; file.&lt;/p&gt; &lt;p&gt;In Visual Studio 11 everything has been reshaped, and now it’s only needed to tick the &lt;strong&gt;Active Load and Web Test Settings &lt;/strong&gt;flag, after right-clicking on the Test Settings file.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-zz3-4Ln7P00/T6VuTt0P_uI/AAAAAAAAAPo/TGUL1GFJ8n0/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-j73SPPj5m80/T6Vugujf6kI/AAAAAAAAAPw/70QtKN7QcuA/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;361&quot; height=&quot;319&quot;&gt;&lt;/a&gt;&lt;/p&gt;  </description>
        <pubDate>Sat, 05 May 2012 18:16:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/05/05/how-to-run-local-web-and-performance/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/05/05/how-to-run-local-web-and-performance/</guid>
      </item>
    
      <item>
        <title>Team Foundation Server upgrade of April 27th: what changed?</title>
        <description>&lt;p&gt;April 27th Team Foundation Service got upgraded to a new version. As you know (and if not, I’m going to explain now &lt;img style=&quot;border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;http://lh5.ggpht.com/-LJWMXOpbMps/T6I8oCZWAiI/AAAAAAAAAPc/lgc7gZMICi4/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;), Team Foundation Service doesn’t have a RTM – GDR – Service Pack maintenance cycle, but every update is rolled out with a cadence of circa a month/five weeks.&lt;/p&gt; &lt;p&gt;Then, there are some new UIs…&lt;/p&gt; &lt;p&gt;&lt;img src=&quot;http://blogs.msdn.com/cfs-filesystemfile.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-36-52-metablogapi/8130.logout_5F00_39495A21.png&quot; width=&quot;470&quot; height=&quot;339&quot;&gt;&lt;/p&gt; &lt;p&gt;You can now reorder your backlog using the Alt+Up/Down combination.&lt;/p&gt; &lt;p&gt;The taskboard has been improved for touchscreens.&lt;/p&gt; &lt;p&gt;You can filter your areas and iterations, really useful for large projects.&lt;/p&gt; &lt;p&gt;They removed the identity screen in most all cases, letting you automatically sign in with Windows Live. Why that? They found out some bugs because it was just a view to live.com, so for instance in Visual Studio it didn’t properly work. They’re now working on fixing it (remember: they already &lt;em&gt;support &lt;/em&gt;other providers apart from Windows Live ID, because they use Windows Azure ACS, but this capability is currently disabled).&lt;/p&gt; &lt;p&gt;There’s now the Windows Azure 1.6 on the Hosted Build machines.&lt;/p&gt; &lt;p&gt;That’s it &lt;img style=&quot;border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;http://lh5.ggpht.com/-LJWMXOpbMps/T6I8oCZWAiI/AAAAAAAAAPc/lgc7gZMICi4/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt;  </description>
        <pubDate>Thu, 03 May 2012 08:06:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/05/03/team-foundation-server-upgrade-of-april/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/05/03/team-foundation-server-upgrade-of-april/</guid>
      </item>
    
      <item>
        <title>Standard Environment in Visual Studio ALM 11 using Workgroup machines</title>
        <description>&lt;p&gt;As I mentioned before, there’s the possibility of creating Standard Environments using Workgroup-joined machines and not just domain-joined machines.&lt;/p&gt; &lt;p&gt;All you need is to use Shadow Accounts (ie. “DOMAIN\account” and “account” on the local machine, or both “account”), better in the form .\account.&lt;/p&gt; &lt;p&gt;The magic is behind that is really easy: as the Microsoft’s KB &lt;a href=&quot;http://support.microsoft.com/kb/102716&quot;&gt;says&lt;/a&gt;, “…NetLogon does not differentiate between a nonexistent domain, an untrusted domain, and an incorrectly typed domain name.”.&lt;/p&gt; &lt;p&gt;So if you use the same account&amp;amp;password couple, you won’t have problems in using them in Standard Environments &lt;img style=&quot;border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;http://lh3.ggpht.com/-Xx9ixFGioRg/T6F6QJZ1O4I/AAAAAAAAAPQ/yEBwr3XtTgs/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt;  </description>
        <pubDate>Wed, 02 May 2012 18:17:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/05/02/standard-environment-in-visual-studio/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/05/02/standard-environment-in-visual-studio/</guid>
      </item>
    
      <item>
        <title>Creating Standard Environments in Visual Studio ALM 11</title>
        <description>&lt;p&gt;What’s new in Visual Studio Team Lab Management 11? Well, IMHO the most important new feature is the Standard Environments capability.&lt;/p&gt; &lt;p&gt;As far as today, if you wanted to use VSTLM you were forced to use Hyper-V and System Center Virtual Machine Manager to get the full flavoured Lab Management. Other kinds of machines could have been used, but it was not that automated and integrated.&lt;/p&gt; &lt;p&gt;Today with VSTLM 11 you can use whatever you want reaching almost the functionality of the Hyper-V and SCVMM equivalent! (with some exceptions we&apos;re going to see).&lt;/p&gt; &lt;p&gt;The only prerequisite is to have a Team Foundation Server 11 (Express, Basic, tfspreview.com, whatever…) with Team Build installed and configured.&lt;/p&gt; &lt;p&gt;We have to install the Test Controller…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/j3r/Windows-Live-Writer/Standard-Environment-in-Visual-Studio-Te_12F1A/lab0.png&quot;&gt;&lt;img title=&quot;lab0&quot; border=&quot;0&quot; alt=&quot;lab0&quot; src=&quot;http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/j3r/Windows-Live-Writer/Standard-Environment-in-Visual-Studio-Te_12F1A/lab0_thumb.png&quot; width=&quot;200&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/j3r/Windows-Live-Writer/Standard-Environment-in-Visual-Studio-Te_12F1A/lab1.png&quot;&gt;&lt;img title=&quot;lab1&quot; border=&quot;0&quot; alt=&quot;lab1&quot; src=&quot;http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/j3r/Windows-Live-Writer/Standard-Environment-in-Visual-Studio-Te_12F1A/lab1_thumb.png&quot; width=&quot;197&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/j3r/Windows-Live-Writer/Standard-Environment-in-Visual-Studio-Te_12F1A/lab2.png&quot;&gt;&lt;img title=&quot;lab2&quot; border=&quot;0&quot; alt=&quot;lab2&quot; src=&quot;http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/j3r/Windows-Live-Writer/Standard-Environment-in-Visual-Studio-Te_12F1A/lab2_thumb.png&quot; width=&quot;191&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;…and we have to configure the Test Controller (default configuration at least, which is by setting the linked Project Collection):&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/j3r/Windows-Live-Writer/Standard-Environment-in-Visual-Studio-Te_12F1A/lab4.png&quot;&gt;&lt;img title=&quot;lab4&quot; border=&quot;0&quot; alt=&quot;lab4&quot; src=&quot;http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/j3r/Windows-Live-Writer/Standard-Environment-in-Visual-Studio-Te_12F1A/lab4_thumb.png&quot; width=&quot;186&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/j3r/Windows-Live-Writer/Standard-Environment-in-Visual-Studio-Te_12F1A/lab5.png&quot;&gt;&lt;img title=&quot;lab5&quot; border=&quot;0&quot; alt=&quot;lab5&quot; src=&quot;http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/j3r/Windows-Live-Writer/Standard-Environment-in-Visual-Studio-Te_12F1A/lab5_thumb.png&quot; width=&quot;244&quot; height=&quot;196&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;That’s it! Obviously you won’t get the automated provisioning and all it’s related to SCVMM, but now you can use VMWare, Xen Server, physical machines or what you want with no hassle!&lt;/p&gt; &lt;p&gt;Let’s see how to create a Standard Environment:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/j3r/Windows-Live-Writer/Standard-Environment-in-Visual-Studio-Te_12F1A/lab6.png&quot;&gt;&lt;img title=&quot;lab6&quot; border=&quot;0&quot; alt=&quot;lab6&quot; src=&quot;http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/j3r/Windows-Live-Writer/Standard-Environment-in-Visual-Studio-Te_12F1A/lab6_thumb.png&quot; width=&quot;231&quot; height=&quot;244&quot;&gt;&lt;/a&gt;   &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-8jlqf3sUU2w/T5vEViKKDeI/AAAAAAAAAM0/2QOl-dPR8r8/s1600-h/lab7%25255B3%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;lab7&quot; border=&quot;0&quot; alt=&quot;lab7&quot; src=&quot;http://lh3.ggpht.com/-0lvp307MzaY/T5vEWTIyZCI/AAAAAAAAAM4/qRJdc0-y50I/lab7_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;448&quot; height=&quot;191&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;I insert the machine name, the credentials for the test user (it must be a local administrator on the test machine) and what role does it ‘impersonate’ (it can be: client, server, web server, web client, domain controller, database server).&lt;/p&gt; &lt;p&gt;If I need them, I can use some tags:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-p3DTaacV9L0/T5vEWz3BxoI/AAAAAAAAANE/D-PTP4PibO4/s1600-h/lab9%25255B2%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;lab9&quot; border=&quot;0&quot; alt=&quot;lab9&quot; src=&quot;http://lh4.ggpht.com/-6up52bxvPaQ/T5vEYj_S3aI/AAAAAAAAANM/c1Co5x_U9Dw/lab9_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;177&quot;&gt;&lt;/a&gt;&amp;nbsp; &lt;a href=&quot;http://lh3.ggpht.com/-ES_AqaF9AB4/T5vEZuwdXwI/AAAAAAAAANU/U1KRU0fDAgY/s1600-h/lab8%25255B2%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;lab8&quot; border=&quot;0&quot; alt=&quot;lab8&quot; src=&quot;http://lh6.ggpht.com/-Y8ONISmP6HQ/T5vEbKuGYoI/AAAAAAAAANc/0gIPAk8Vczw/lab8_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;192&quot;&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Then I have to configure the capabilities for the tests I want to execute (unit tests, Coded UI tests, etc.)&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-lwmICf8izP0/T5vEbzPVcqI/AAAAAAAAANk/CLjqhfzprhY/s1600-h/lab10%25255B5%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;lab10&quot; border=&quot;0&quot; alt=&quot;lab10&quot; src=&quot;http://lh5.ggpht.com/-O07V4PgxCfI/T5vEdGgdF6I/AAAAAAAAANs/cbvZ-Sy3QWk/lab10_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;157&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://lh5.ggpht.com/-7U30MCfN34Y/T5vEhddczvI/AAAAAAAAAN0/Z1SAPLnJiBA/s1600-h/lab11%25255B2%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;lab11&quot; border=&quot;0&quot; alt=&quot;lab11&quot; src=&quot;http://lh4.ggpht.com/-bR83iq1R8GA/T5vEiFpEimI/AAAAAAAAAN8/00NuZ-6YKlw/lab11_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;163&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Now it does some checks on prerequisites:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-qtgkb9bkAJY/T5vEjlfjUEI/AAAAAAAAAOE/ADfxAH2QQR4/s1600-h/lab12%25255B2%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;lab12&quot; border=&quot;0&quot; alt=&quot;lab12&quot; src=&quot;http://lh4.ggpht.com/-7rmLCUhfZFg/T5vEmoz22SI/AAAAAAAAAOM/Z1lbrhGlLuY/lab12_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;133&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-_dVgag7xCcA/T5vEqqFwpsI/AAAAAAAAAOU/gqpnmOkkhlA/s1600-h/lab13%25255B3%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;lab13&quot; border=&quot;0&quot; alt=&quot;lab13&quot; src=&quot;http://lh3.ggpht.com/-_dL1bTaU6VE/T5vEsn8NCKI/AAAAAAAAAOc/QyRBmPXikEw/lab13_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;383&quot; height=&quot;110&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;And then, it installs the needed agents and prepares the machine to be used. It takes some minutes, don’t worry &lt;img style=&quot;border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;http://lh6.ggpht.com/-DzY2lTMvE9A/T5vEtqNwWqI/AAAAAAAAAOk/7HHrxi2g35s/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-XgSn4NiK4b0/T5vEutpWYGI/AAAAAAAAAOs/5mORImwrV_Q/s1600-h/lab14%25255B2%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;lab14&quot; border=&quot;0&quot; alt=&quot;lab14&quot; src=&quot;http://lh5.ggpht.com/-wzBdW0Wx5Tg/T5vEvpjHHxI/AAAAAAAAAO0/oDn5YuZr010/lab14_thumb.png?imgmax=800&quot; width=&quot;184&quot; height=&quot;202&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Finished!&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-60mUlPUrE6o/T5vEwbAOr1I/AAAAAAAAAO4/Ad8fS3q5QCY/s1600-h/lab15%25255B2%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;lab15&quot; border=&quot;0&quot; alt=&quot;lab15&quot; src=&quot;http://lh6.ggpht.com/-djJP0HdQ6m0/T5vExW0l1dI/AAAAAAAAAPE/MidKmFRop40/lab15_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;110&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Now I can use it for my Build-Deploy-Test cycle. &lt;/p&gt; &lt;p&gt;Limitations: I can use only Windows Server 2008, Windows Server 2008 R2 and Windows 7 as a guest OS. For now, there’s no support for Windows 8 and Windows Server 2012, it will be supported by far in RTM or RC (I still don’t know).&lt;/p&gt; &lt;p&gt;The machines must be in a Active Directory domain, because you need a trust relationship with the Test Controller in order to automatically install the agents. In a later post we’re going to see how to workaround this and use workgroup machines &lt;img style=&quot;border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;http://lh6.ggpht.com/-DzY2lTMvE9A/T5vEtqNwWqI/AAAAAAAAAOk/7HHrxi2g35s/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;Last but not least, &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ee390842(v=VS.110).aspx&quot;&gt;here&lt;/a&gt;’s the MSDN documentation.&lt;/p&gt;  </description>
        <pubDate>Sat, 28 Apr 2012 10:21:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/04/28/creating-standard-environments-in/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/04/28/creating-standard-environments-in/</guid>
      </item>
    
      <item>
        <title>Run alternative unit test frameworks from Visual Studio 11</title>
        <description>&lt;p&gt;With Visual Studio 11 the whole set of testing features has been trashed out and remodelled upon a completely new shape.&lt;/p&gt; &lt;p&gt;If until Visual Studio 2010 you had as a default and mandatory choice MSTest (apart from the fact that you could patch-and-try another test framework, but that was not for mainstream developers IMHO, and moreover it was out of the IDE itself) from Visual Studio 11 on you can choose whatever testing framework you want.&lt;/p&gt; &lt;p&gt;The magic running underneath is quite simple. If before MSTest was just the way to do, now the whole test runner and all the testing tools rely on a brand new pluggable layer, which means you can plug-and-play (it sounds so Windows 95ish, isn’t it? &lt;img style=&quot;border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;http://lh6.ggpht.com/-F1gDVSkW9gU/T4uy5dPhd5I/AAAAAAAAAMM/mslYlxZBdaw/wlEmoticon-smile2.png?imgmax=800&quot;&gt;) NUnit, xUnit.NET, and all the frameworks that will provide a plugin to integrate in Visual Studio 11.&lt;/p&gt; &lt;p&gt;This is true on a test project, but even inside a test class!&lt;/p&gt; &lt;p&gt;To add support to other test framework is astonishingly easy: you just have to add them via NuGet:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-Q_kiHbca6uc/T4uy53X7KYI/AAAAAAAAAMQ/DSCNId0esY0/s1600-h/image4.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-1Dq2QYnzeQo/T4uy6-iXnZI/AAAAAAAAAMY/NzElMbJS3QA/image_thumb2.png?imgmax=800&quot; width=&quot;459&quot; height=&quot;131&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-BB7rgc4qqH0/T4uy76Zs2XI/AAAAAAAAAMg/YgfmiziMhvc/s1600-h/image8.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-IpwGUFW8kjo/T4uy8lsw0wI/AAAAAAAAAMo/a_EaIrEAS8A/image_thumb4.png?imgmax=800&quot; width=&quot;465&quot; height=&quot;127&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Then you can remove the &lt;strong&gt;Microsoft.VisualStudio.TestTools.UnitTesting&lt;/strong&gt; reference from your code, add the NUnit (or whatever) one, and start writing down tests as you always did with your favourite testing franework.&lt;/p&gt;  </description>
        <pubDate>Mon, 16 Apr 2012 05:49:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/04/16/run-alternative-unit-test-frameworks/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/04/16/run-alternative-unit-test-frameworks/</guid>
      </item>
    
      <item>
        <title>Excluding actions on certain software using Microsoft Test Manager</title>
        <description>&lt;p&gt;The possibility of doing Exploratory Testing (as I mentioned in my last post) includes some times where you have to use certain tools without being recorded by the MTM recorder.&lt;/p&gt; &lt;p&gt;You can configure selective exclusion in MTM just by selecting &lt;strong&gt;Local Test Run&lt;/strong&gt; under &lt;strong&gt;Test Settings&lt;/strong&gt; in &lt;strong&gt;Manual Runs&lt;/strong&gt; on Test Plan’s properties:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-nYur--w5M9s/T4RYYqqKh0I/AAAAAAAAAK8/zJePdMi16fE/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-5t5o6pDV61w/T4RYZBc1FWI/AAAAAAAAALE/UeZ0iW5fEY0/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;365&quot; height=&quot;85&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Then opening it you’re going to find out, under the &lt;strong&gt;Data and Diagnostics&lt;/strong&gt; tab, the &lt;strong&gt;Action Log&lt;/strong&gt; flag.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-yGWc2ftF14s/T4RYaLaVy2I/AAAAAAAAALM/dLWJWxnZBRM/s1600-h/image%25255B7%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-kmwdc2CntAU/T4RYbbkk2WI/AAAAAAAAALU/XtHKvPB-n8I/image_thumb%25255B3%25255D.png?imgmax=800&quot; width=&quot;480&quot; height=&quot;119&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Clicking &lt;strong&gt;Configure&lt;/strong&gt;, you can specify certain applications for which you do not need recording actions:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-eqPXOjjBzfk/T4RYcl2NFoI/AAAAAAAAALc/5Yy99LitZDc/s1600-h/image%25255B11%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-1qWV-e55VUQ/T4RYdxUcNiI/AAAAAAAAALk/aehkf3vKmbs/image_thumb%25255B5%25255D.png?imgmax=800&quot; width=&quot;485&quot; height=&quot;174&quot;&gt;&lt;/a&gt;&lt;/p&gt;  </description>
        <pubDate>Tue, 10 Apr 2012 15:57:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/04/10/excluding-actions-on-certain-software/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/04/10/excluding-actions-on-certain-software/</guid>
      </item>
    
      <item>
        <title>Tips for Exploratory Testing in a real world consultancy scenario</title>
        <description>&lt;p&gt;As the name itself suggests, Exploratory Testing is made to &lt;em&gt;explore&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;One of the best scenarios you can use it is in the early phase of a consultancy.&lt;/p&gt; &lt;p&gt;Imagine it, you’ve being called to fix some bugs and improve a web application. A deep look at the code is mandatory but…why not to add a lap around the web application itself, in order to quickly understand where principal bottlenecks may be located.&lt;/p&gt; &lt;p&gt;So, to do that, open MTM, connect to the related Team Project on Team Foundation Server, and create a new Test Suite for your Exploratory Testing (XT from now on) run.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-4G9JeKiz8lE/T33pWbw8eaI/AAAAAAAAAKM/lARnCt9aWtE/s1600-h/image3.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-0Loxtzrr0lk/T33pZjiopfI/AAAAAAAAAKU/LVIVLZqjKAg/image_thumb1.png?imgmax=800&quot; width=&quot;460&quot; height=&quot;160&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Then start the session:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-QU_dbHdln0I/T33pao-_GKI/AAAAAAAAAKY/S8VtTbgaWOA/s1600-h/image7.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-JiHcTKSE14Y/T33pcGTvoiI/AAAAAAAAAKk/-JZSapRKfFk/image_thumb3.png?imgmax=800&quot; width=&quot;396&quot; height=&quot;156&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;While you’re testing your application, you can use other softwares (fiddler, for instance).&lt;/p&gt; &lt;p&gt;Once you’ve done with it, you can attach whatever form of log or file (via a Network Share or a URL) to the Test Plan to make it more explanative as well.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-4P8a-l8mD2w/T33peGV6aOI/AAAAAAAAAKo/Ue7jMzindC4/s1600-h/image3%25255B1%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-T2x68XwS3so/T33pfAoLdTI/AAAAAAAAAKw/JIaJls4wYWc/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;80&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;It enables new scenarios based on &lt;em&gt;exploration&lt;/em&gt;, really useful for developers hired on a need.&lt;/p&gt;  </description>
        <pubDate>Thu, 05 Apr 2012 18:50:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/04/05/tips-for-exploratory-testing-in-real/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/04/05/tips-for-exploratory-testing-in-real/</guid>
      </item>
    
      <item>
        <title>How to get IntelliTrace in production for Windows Applications in Visual Studio 11</title>
        <description>&lt;p&gt;As we saw in the last post, we can get IntelliTrace logs from web applications.&lt;/p&gt; &lt;p&gt;But this is possible for Windows Applications, too!&lt;/p&gt; &lt;p&gt;Locate the IntelliTrace application under &lt;em&gt;C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\CommonExtensions\Microsoft\IntelliTrace\11.0.0&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Then launch it, with the following syntax:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;intellitrace.exe launch /cp:&amp;lt;CollectionPlanPath&amp;gt; /f:&amp;lt;LogFilePath&amp;gt; &amp;lt;ExecutablePath&amp;gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;That’s all, we finished &lt;img style=&quot;border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;http://lh6.ggpht.com/-SOQt2t078z0/T3LvmX-uR4I/AAAAAAAAAKE/DSvw_l2BAFo/wlEmoticon-smile2.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;After that the itrace file is analysable as usual.&lt;/p&gt;  </description>
        <pubDate>Wed, 28 Mar 2012 11:01:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/03/28/how-to-get-intellitrace-in-production_28/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/03/28/how-to-get-intellitrace-in-production_28/</guid>
      </item>
    
      <item>
        <title>How to get IntelliTrace in production for Web Applications with Visual Studio 11</title>
        <description>&lt;p&gt;Until yesterday, IntelliTrace in production environment was not supported, so the usefulness of it was a bit argued.&lt;/p&gt; &lt;p&gt;But now with Visual Studio 11, we can collect IntelliTrace logs from production environment in a completely supported way! And moreover, if you ask the Microsoft CSS (Customer Support Service) for help, the first question would be: “May you send me the IntelliTrace log please?”&lt;/p&gt; &lt;p&gt;Before of configuring IntelliTrace logs collection, we have to set security for the IIS Application pool account:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;icacls &lt;em&gt;sitepath&lt;/em&gt; “&lt;em&gt;IIS APPPOOL\&amp;lt;AppPool Account&amp;gt;”:(F)&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-h98cTkgjy7Q/T22LOvq3uxI/AAAAAAAAAIc/sy89Ca1Cd9Y/s1600-h/image12.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-lDU2WFoyM_E/T22LPkK3ouI/AAAAAAAAAIk/Bhu7WdV9OFA/image_thumb6.png?imgmax=800&quot; width=&quot;487&quot; height=&quot;149&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Then, hands on the bits. Suppose we have a web application throwing an exception.&lt;/p&gt; &lt;p&gt;Firstly, we have to deploy IntelliTrace to the target environment. Pretty easy, just extract content from the IntelliTraceCollection.cab file you can find under the &lt;em&gt;C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\CommonExtensions\Microsoft\IntelliTrace\11.0.0 &lt;/em&gt;path.&lt;/p&gt; &lt;p&gt;Then we have to extract it to the target server. I suggest using the &lt;em&gt;expand&lt;/em&gt; command from a command prompt:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;expand.exe /f:* IntelliTraceCollection.cab &lt;em&gt;path&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Lastly, bring up PowerShell:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-UlXDCH9Gh9c/T22LQVPG0UI/AAAAAAAAAIs/bTVB8tSlbcQ/s1600-h/image3.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-NLkd_867m7s/T22LSJJNhqI/AAAAAAAAAI0/YJee4byp95o/image_thumb1.png?imgmax=800&quot; width=&quot;496&quot; height=&quot;123&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;We have to load the IntelliTrace PowerShell Module:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Import-Module &lt;em&gt;sitepath\Microsoft.VisualStudio.IntelliTrace.PowerShell.dll&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;After doing so, we can get the full list of commands we can use:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Get-Command *IntelliTrace*&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-IQbwKQbwVEA/T22LS0LGVII/AAAAAAAAAI4/PcWVSLoUg3M/s1600-h/image8.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-ksT8C7LKFr8/T22LUOeLyUI/AAAAAAAAAJE/WmIlF7FRN3M/image_thumb4.png?imgmax=800&quot; width=&quot;493&quot; height=&quot;170&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;And now we collect logs about the target application:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Start-IntelliTraceCollection &lt;em&gt;ApplicationPool CollectionPath OutputPath &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;CollectionPath&lt;/strong&gt; is the path we chose for IntelliTrace. In there, there are two “profiles”: &lt;strong&gt;collection_plan.ASP.NET.default.xml &lt;/strong&gt;which collects only IntelliTrace events, and &lt;strong&gt;collection_plan.ASP.NET.trace.xml&lt;/strong&gt;, which traces also function calls and events. &lt;/p&gt; &lt;p&gt;&lt;strong&gt;OutputPath&lt;/strong&gt; is where we store logs.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-CIG3_MM9dcs/T22LVIoOygI/AAAAAAAAAJI/dX7gb895jBU/s1600-h/image4.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-4rWG8RALaWI/T22LV5i7zyI/AAAAAAAAAJU/q-GLYpKnwUs/image_thumb11.png?imgmax=800&quot; width=&quot;491&quot; height=&quot;112&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;After deciding Yes (to all &lt;img style=&quot;border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;http://lh5.ggpht.com/-Pam3pVyPSUE/T22LXRYK1ZI/AAAAAAAAAJc/ldplEjRwnkU/wlEmoticon-smile2.png?imgmax=800&quot;&gt;) we have to run the application.&lt;/p&gt; &lt;p&gt;When we got the error, we have to snapshot the log file:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Checkpoint-IntelliTraceCollection &lt;em&gt;ApplicationPool&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/--KuCgaHaUqQ/T22LYCHIz-I/AAAAAAAAAJk/mgvZhlZ-TxA/s1600-h/image81.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-Iq5WB2__s54/T22LZKXiSTI/AAAAAAAAAJo/39hpIBJispU/image_thumb3.png?imgmax=800&quot; width=&quot;490&quot; height=&quot;97&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;And then we have to stop collecting it.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Stop-IntelliTraceCollection &lt;em&gt;ApplicationPool&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-YGrz_wZ0NZM/T22LZzyszGI/AAAAAAAAAJ0/RksCNbNA7VU/s1600-h/image121.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-vcvH8EtHYog/T22LbZHGmuI/AAAAAAAAAJ8/UCLso5pvrrA/image_thumb5.png?imgmax=800&quot; width=&quot;494&quot; height=&quot;73&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;That’s all: we have the logs.&lt;/p&gt; &lt;p&gt;To analyse them, it’s just a classic IntelliTrace analysis as we always did.&lt;/p&gt;  </description>
        <pubDate>Sat, 24 Mar 2012 08:53:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/03/24/how-to-get-intellitrace-in-production/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/03/24/how-to-get-intellitrace-in-production/</guid>
      </item>
    
      <item>
        <title>Code Review in Visual Studio ALM 11</title>
        <description>&lt;p&gt;Code Review is one of the new features in Visual Studio ALM 11 focused on collaboration among team members.&lt;/p&gt; &lt;p&gt;Everything starts with a request for review: you can add as much reviewers as you want.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-4Apn9Tntb0I/T2iWSFFfZNI/AAAAAAAAAGI/e9ULpznxam4/s1600-h/tr03.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;tr0&quot; border=&quot;0&quot; alt=&quot;tr0&quot; src=&quot;http://lh4.ggpht.com/--ceDwg_ewWo/T2iWTC2v8II/AAAAAAAAAGQ/z8CwG4W7u7M/tr0_thumb1.png?imgmax=800&quot; width=&quot;221&quot; height=&quot;313&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Then after submitting the request, a work item is opened on behalf of me for the reviewer(s).&lt;/p&gt; &lt;p&gt;The reviewer can see there’s an incoming activity:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-zZwSN5SP-Sw/T2iWUgd_mwI/AAAAAAAAAGY/427qwODKHvE/s1600-h/tr12.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;tr1&quot; border=&quot;0&quot; alt=&quot;tr1&quot; src=&quot;http://lh5.ggpht.com/-EuLPuBWruos/T2iWWEw0WGI/AAAAAAAAAGg/sRMGyB30UQk/tr1_thumb.png?imgmax=800&quot; width=&quot;216&quot; height=&quot;95&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Opening it the Team Explorer shows up all the information needed.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-nSTzxKWmPCE/T2iWXGzX3BI/AAAAAAAAAGo/zcDukOH56xw/s1600-h/tr23.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;tr2&quot; border=&quot;0&quot; alt=&quot;tr2&quot; src=&quot;http://lh5.ggpht.com/-ILqkR2KhxCo/T2iWYjTOZZI/AAAAAAAAAGw/1Sb5sa8dLLo/tr2_thumb1.png?imgmax=800&quot; width=&quot;197&quot; height=&quot;361&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Clicking on the code file affected by the review brings up the new diffmerge (we’ll see some insights about it in a later post).&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-Jcz9HYLqu3Y/T2iWao-rxtI/AAAAAAAAAG4/koknTR8HfX0/s1600-h/tr33.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;tr3&quot; border=&quot;0&quot; alt=&quot;tr3&quot; src=&quot;http://lh4.ggpht.com/-dpSgtS3LgEY/T2iWb7pQSJI/AAAAAAAAAHA/F7wPqmYdCyA/tr3_thumb1.png?imgmax=800&quot; width=&quot;389&quot; height=&quot;270&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;I obviously can add a comment on my review…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-qyewh7NGaCM/T2iWdGXN6-I/AAAAAAAAAHI/UATZaz3ZxFU/s1600-h/tr56.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;tr5&quot; border=&quot;0&quot; alt=&quot;tr5&quot; src=&quot;http://lh3.ggpht.com/-HNl8_0yl-c8/T2iWffhBYPI/AAAAAAAAAHQ/njPrtX9pKEs/tr5_thumb1.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;171&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;…and define how did I valued the content:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/--gAGCoAsSYI/T2iWgoteVGI/AAAAAAAAAHY/Q-YAPdKNOos/s1600-h/TR62.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;TR6&quot; border=&quot;0&quot; alt=&quot;TR6&quot; src=&quot;http://lh6.ggpht.com/-c33zhPhm3QQ/T2iWiGoZ9FI/AAAAAAAAAHg/yzi9jYRClos/TR6_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;131&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;After sending the completed review, the requestor has a complete overview of what did the reviewer do.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-fJsf66hj_i0/T2iWi0s7-xI/AAAAAAAAAHo/pZ651edanoQ/s1600-h/tr73.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;tr7&quot; border=&quot;0&quot; alt=&quot;tr7&quot; src=&quot;http://lh6.ggpht.com/-7a5tBsblvU8/T2iWlj0zYrI/AAAAAAAAAHw/ia8By-1fzYk/tr7_thumb1.png?imgmax=800&quot; width=&quot;184&quot; height=&quot;318&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Mostly important: now Code Review is not an external process, but completely merged into the ALM in a seamless way.&lt;/p&gt;  </description>
        <pubDate>Tue, 20 Mar 2012 14:39:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/03/20/code-review-in-visual-studio-alm-11/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/03/20/code-review-in-visual-studio-alm-11/</guid>
      </item>
    
      <item>
        <title>Continuous Test Runner</title>
        <description>&lt;p&gt;Continuous Testing means running unit tests after each build in an automated way.&lt;/p&gt; &lt;p&gt;In the new Team Explorer, we have this functionality built-in.&lt;/p&gt; &lt;p&gt;To enable it, the only needed task is to check the &lt;strong&gt;Run Tests After Build &lt;/strong&gt;flag under the Unit Test Settings menu:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-I9V4xld3jTc/T2JRAXLJ7TI/AAAAAAAAAF4/9CCV2kgUIuo/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-WzX96MabqGo/T2JRCVOWawI/AAAAAAAAAGA/w-dYHQ5D5c4/image_thumb%25255B1%25255D.png?imgmax=800&quot; width=&quot;463&quot; height=&quot;172&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;That’s it, now everytime we hit CTRL+SHIFT+B our test suite is going to be run again.&lt;/p&gt;  </description>
        <pubDate>Thu, 15 Mar 2012 20:28:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/03/15/continuous-test-runner/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/03/15/continuous-test-runner/</guid>
      </item>
    
      <item>
        <title>What’s happened to Test Impact Analysis?</title>
        <description>&lt;p&gt;If you remember Visual Studio 2010 (&lt;img style=&quot;border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;http://lh5.ggpht.com/--VCXyVNPFYM/T13hcCbf9AI/AAAAAAAAAFg/JlJqJZklrp4/wlEmoticon-smile2.png?imgmax=800&quot;&gt;) there was a nice feature called Test Impact Analysis. It used to analyse your test suite and provide a report of what’s being touched.&lt;/p&gt; &lt;p&gt;In Visual Studio 11 this feature is no more available in the IDE, but it’s inside the Team Build, and enabled by default.&lt;/p&gt; &lt;p&gt;If you go through the Build Definition settings, and you look at the Process Template for the build, you can see the Test Impact Analysis is still there:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-W8Ll5naUBis/T13hc2QSe8I/AAAAAAAAAFk/LUHgFyjJVFU/s1600-h/image3.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-zU0jQ5ECUE8/T13hea0_G4I/AAAAAAAAAFw/IKPtXb4SICs/image_thumb1.png?imgmax=800&quot; width=&quot;404&quot; height=&quot;132&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;And it’s enabled by default &lt;img style=&quot;border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;http://lh5.ggpht.com/--VCXyVNPFYM/T13hcCbf9AI/AAAAAAAAAFg/JlJqJZklrp4/wlEmoticon-smile2.png?imgmax=800&quot;&gt;&lt;/p&gt;  </description>
        <pubDate>Mon, 12 Mar 2012 11:43:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/03/12/whats-happened-to-test-impact-analysis/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/03/12/whats-happened-to-test-impact-analysis/</guid>
      </item>
    
      <item>
        <title>Licensing changes for Team Foundation Server</title>
        <description>&lt;p&gt;Mr. Brian Harry informs us that &lt;a href=&quot;http://www.microsoft.com/download/en/details.aspx?id=28983&quot;&gt;Team Explorer Everywhere&lt;/a&gt;, the cross-platform solution to access Team Foundation Server from Eclipse-based IDEs, running on Windows, Mac OSX, Linux, and different flavours of Unix is now free of charge!&lt;/p&gt; &lt;p&gt;So now it’s exactly as the Team Explorer. This change is for the &lt;a href=&quot;http://www.microsoft.com/download/en/details.aspx?id=25125&quot;&gt;2010 SP1&lt;/a&gt; version too.&lt;/p&gt; &lt;p&gt;Then: no more CAL required to access Team Foundation Server’s reports!&lt;/p&gt; &lt;p&gt;Latest: integrating System Center Operations Manager 2012 with Team Foundation Server, who does SCOM operations will no more need a CAL.&lt;/p&gt; &lt;p&gt;The Brian’s post is &lt;a href=&quot;http://blogs.msdn.com/b/bharry/archive/2012/03/08/even-better-access-to-team-foundation-server.aspx&quot;&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Have a nice day &lt;img style=&quot;border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;http://lh5.ggpht.com/-zbhAujFlV5U/T1mo3WNmRGI/AAAAAAAAAFY/rNdgj5sCllQ/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt;  </description>
        <pubDate>Fri, 09 Mar 2012 06:53:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/03/09/licensing-changes-for-team-foundation/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/03/09/licensing-changes-for-team-foundation/</guid>
      </item>
    
      <item>
        <title>Code Clone Analysis: a quality enhancer in day by day use</title>
        <description>&lt;p&gt;A huge problem we have in team development is code recycling.&lt;/p&gt; &lt;p&gt;Sometimes it may be good, recycling some factory-like code we previously created to be reusable, but most of the times it’s a mere copy-paste which leads to problems.&lt;/p&gt; &lt;p&gt;In Visual Studio 11 we have a great aid in avoiding this: Code Clone Analysis.&lt;/p&gt; &lt;p&gt;By selecting a code snippet, we can right-click it and selecting “Find Matching Clones in Solution”&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-X9oqC7Kz27I/T1iOkNdCrVI/AAAAAAAAAEo/7Hi0wu9pbJw/s1600-h/image3.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-szGcOhYpn84/T1iOk9fbfdI/AAAAAAAAAEw/QcqB8PAsT8Q/image_thumb1.png?imgmax=800&quot; width=&quot;392&quot; height=&quot;125&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;It searches in the current document for clones, with various level of matching&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-IGirpN4CHJo/T1iOl24Vc1I/AAAAAAAAAE4/rszncKVJUko/s1600-h/image7.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-uHN3C4ck8iA/T1iOnHquQKI/AAAAAAAAAFA/4WIwtuB9Qts/image_thumb3.png?imgmax=800&quot; width=&quot;326&quot; height=&quot;156&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;This could be extended to the whole solution, by selecting “Analyse Solution for Code Clones” under the Analyze menu.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-AfO1Arh3dx8/T1iOn925xaI/AAAAAAAAAFE/7HECPwT288I/s1600-h/image10.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/-keWnxPlIeFM/T1iOoxKmXKI/AAAAAAAAAFQ/_85putV08_w/image_thumb4.png?imgmax=800&quot; width=&quot;197&quot; height=&quot;244&quot;&gt;&lt;/a&gt;&lt;/p&gt;  </description>
        <pubDate>Thu, 08 Mar 2012 10:49:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/03/08/code-clone-analysis-quality-enhancer-in/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/03/08/code-clone-analysis-quality-enhancer-in/</guid>
      </item>
    
      <item>
        <title>My Work: changing the foundation of Team Explorer</title>
        <description>&lt;p&gt;In this release of Visual Studio one of the biggest change is the new Team Explorer, completely different from the previous release.&lt;/p&gt; &lt;p&gt;The first thing you are going to notice is the concept rounding around it: “what do I have to do?”&lt;/p&gt; &lt;p&gt;Starting from the foundation, one of the Visual Studio ALM 11 pillars is to allow seamless communication inside the development team. This is the base of the new Team Explorer.&lt;/p&gt; &lt;p&gt;So, here it is!&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-6JTEPQ7w1oo/T1OH8xcepiI/AAAAAAAAAEI/YocTIlKXM5Q/s1600-h/image3.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-7Z-ublRGfgk/T1OH9kJCbdI/AAAAAAAAAEQ/U7JPIOj4eO0/image_thumb1.png?imgmax=800&quot; width=&quot;209&quot; height=&quot;392&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Everything is one click away, Web Access, Pending Changes, Work Items.&lt;/p&gt; &lt;p&gt;My Work is the latest addition, and the biggest and most noticeable.&lt;/p&gt; &lt;p&gt;Using it, we notice My Work evolving to a status dashboard answering the “what do I have to do? (and what did I do?)”&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-3IbvUiM7eBw/T1OH_cuKKBI/AAAAAAAAAEY/K_2ErdTErFQ/s1600-h/image8.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/-gC6k0b6Xl2s/T1OIAGPsXVI/AAAAAAAAAEg/tJHtBX39FBc/image_thumb4.png?imgmax=800&quot; width=&quot;213&quot; height=&quot;398&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;So at the moment of the check-in we now what did we modify, related to what, enabling a fluent and ‘easy’ user experience.&lt;/p&gt;  </description>
        <pubDate>Sun, 04 Mar 2012 15:19:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/03/04/my-work-changing-foundation-of-team/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/03/04/my-work-changing-foundation-of-team/</guid>
      </item>
    
      <item>
        <title>PreEmptive Analytics Community Edition</title>
        <description>&lt;p&gt;Before I start talking about Team Foundation Server 11, I want to point out a little new thing came out with the Beta wave.&lt;/p&gt; &lt;p&gt;TFS11 now includes a Community Edition of &lt;a href=&quot;http://www.preemptive.com/news-events/press-releases/402&quot;&gt;PreEmptive Analytics&lt;/a&gt;, a service which aggregates informations from applications’ crash and provides automated work items creation.&lt;/p&gt; &lt;p&gt;It’s installable from the Team Foundation Server Configuration Center&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-k6QTVn7nQ4Y/T1FDBiOtIhI/AAAAAAAAAD4/YwT81aPC-54/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/-demRjdGbJKQ/T1FDCSRQm-I/AAAAAAAAAEA/BA-riTNpUrE/image_thumb.png?imgmax=800&quot; width=&quot;244&quot; height=&quot;60&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;In this brief video &lt;a href=&quot;http://www.youtube.com/watch_popup?v=OnOPBOulpBA&quot;&gt;Justin Marks&lt;/a&gt;, Program Manager for Team Foundation Server, shows up how it works.&lt;/p&gt;  </description>
        <pubDate>Fri, 02 Mar 2012 22:00:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/03/02/preemptive-analytics-community-edition/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/03/02/preemptive-analytics-community-edition/</guid>
      </item>
    
      <item>
        <title>Speaker @ MS Days 2012 in Sofia!</title>
        <description>&lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/-lyVnzkxEuB0/T0_U5eDrSwI/AAAAAAAAADg/SjmcjvlJtws/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://lh5.ggpht.com/-SWBZLemyUM0/T0_U6Q0IGlI/AAAAAAAAADk/h0a7MID9cy0/image_thumb.png?imgmax=800&quot; width=&quot;225&quot; height=&quot;225&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;I’m going to have two sessions in this &lt;a href=&quot;http://msbgregistration.com&quot;&gt;big conference&lt;/a&gt;, held in Sofia, Bulgaria.&lt;/p&gt; &lt;p&gt;The first one (on March 28th) is an introduction to Visual Studio ALM 11, the wonderful new platform from Microsoft for Application Lifecycle Management.&lt;/p&gt; &lt;p&gt;The second one (on March 29th) is a hands-on session on how Hyper-V can be a must-have aid for developers.&lt;/p&gt; &lt;p&gt;It’s one month to go, see you there! &lt;img style=&quot;border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;http://lh3.ggpht.com/-Mi7Tz66FVzo/T0_U7Ej3jHI/AAAAAAAAADs/9Xx06ZS9C2E/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt;  </description>
        <pubDate>Thu, 01 Mar 2012 19:58:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/03/01/speaker-ms-days-2012-in-sofia/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/03/01/speaker-ms-days-2012-in-sofia/</guid>
      </item>
    
      <item>
        <title>Team Foundation Server Express Installation</title>
        <description>&lt;p&gt;With the Visual Studio ALM 11 release of yesterday, one of the greatest things you may notice is the presence of a Express Edition of Team Foundation Server 11.&lt;/p&gt; &lt;p&gt;It has some limitations, obviously:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Just Single Server installation  &lt;li&gt;It relies on SQL Server 2012 (currently RC0) Express Edition  &lt;li&gt;It has only Source Control, Work Items Tracking and Build Automation  &lt;li&gt;Some agile management stuff like the taskboard, but no planning or feedback management tools  &lt;li&gt;Free for five users  &lt;li&gt;No Reporting Services  &lt;li&gt;No SharePoint  &lt;li&gt;No Version Control Proxy&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Here’s the installation on Windows 8 Consumer Preview&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/--3n1Tzm_Zl0/T08Whh-7ArI/AAAAAAAAAAg/9xfc-FHtHBA/s1600-h/tfs1_thumb22.png&quot; rel=&quot;lightbox&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;tfs1_thumb2&quot; border=&quot;0&quot; alt=&quot;tfs1_thumb2&quot; src=&quot;http://lh3.ggpht.com/-5mA5NyZ5QyA/T08WitaNTbI/AAAAAAAAAAk/0gj7gKWEWuw/tfs1_thumb2_thumb.png?imgmax=800&quot; width=&quot;411&quot; height=&quot;304&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Classic installation page, accept the EULA…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-rLdMr-Cj5ZE/T08WjUK4ENI/AAAAAAAAAAs/r0hpuLQlFIU/s1600-h/tfs2_thumb22.png&quot; rel=&quot;lightbox&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;tfs2_thumb2&quot; border=&quot;0&quot; alt=&quot;tfs2_thumb2&quot; src=&quot;http://lh4.ggpht.com/-LdKiMoTtMyQ/T08WkNPA9QI/AAAAAAAAAA4/cfRvXzBgb9U/tfs2_thumb2_thumb.png?imgmax=800&quot; width=&quot;410&quot; height=&quot;303&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Do I really want to install it? &lt;img style=&quot;border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;http://lh3.ggpht.com/-RdUjZ5lfH1o/T08WlTdmddI/AAAAAAAAAA8/vxyQH5sVZgo/wlEmoticon-smile2.png?imgmax=800&quot;&gt; yes I do!&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-R76DQ4jNukk/T08WlxPUiTI/AAAAAAAAABE/4A1wBCNOd34/s1600-h/tfs3_thumb12.png&quot; rel=&quot;lightbox&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;tfs3_thumb1&quot; border=&quot;0&quot; alt=&quot;tfs3_thumb1&quot; src=&quot;http://lh3.ggpht.com/-mOty4_uVmD4/T08Wmqhh21I/AAAAAAAAABM/f5ekxhl3BCQ/tfs3_thumb1_thumb.png?imgmax=800&quot; width=&quot;68&quot; height=&quot;45&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Just a note: a new metro-fied icon &lt;img style=&quot;border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;http://lh3.ggpht.com/-RdUjZ5lfH1o/T08WlTdmddI/AAAAAAAAAA8/vxyQH5sVZgo/wlEmoticon-smile2.png?imgmax=800&quot;&gt; it enforces the meaning of team collaboration IMHO&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-80rOZ-iL43I/T08WnxtrasI/AAAAAAAAABY/3IHlQV0y8Ws/s1600-h/tfs4_thumb22.png&quot; rel=&quot;lightbox&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;tfs4_thumb2&quot; border=&quot;0&quot; alt=&quot;tfs4_thumb2&quot; src=&quot;http://lh4.ggpht.com/-Pk0N-xPKIOc/T08WonDaSNI/AAAAAAAAABc/NjcdvCCe-zE/tfs4_thumb2_thumb.png?imgmax=800&quot; width=&quot;418&quot; height=&quot;311&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Meanwhile we’re talking about the new icon, the installer copies all the needed files…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-_vv8iJKUW5c/T08WpjhIdnI/AAAAAAAAABk/X0o9DGtnLkA/s1600-h/tfs5_thumb22.png&quot; rel=&quot;lightbox&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;tfs5_thumb2&quot; border=&quot;0&quot; alt=&quot;tfs5_thumb2&quot; src=&quot;http://lh6.ggpht.com/-ItqKn2KD7xI/T08WqVhBJxI/AAAAAAAAABw/LJtDctHTLQQ/tfs5_thumb2_thumb.png?imgmax=800&quot; width=&quot;422&quot; height=&quot;312&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Done&lt;img style=&quot;border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;http://lh3.ggpht.com/-RdUjZ5lfH1o/T08WlTdmddI/AAAAAAAAAA8/vxyQH5sVZgo/wlEmoticon-smile2.png?imgmax=800&quot;&gt; Now configuration:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/-uVLnTqWVzqs/T08Wr9zUbPI/AAAAAAAAAB0/StXJueQ1t8c/s1600-h/tfs6_thumb32.png&quot; rel=&quot;lightbox&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;tfs6_thumb3&quot; border=&quot;0&quot; alt=&quot;tfs6_thumb3&quot; src=&quot;http://lh6.ggpht.com/-F2oUYD310z4/T08WsrDcBWI/AAAAAAAAAB8/h8hQf7nfdag/tfs6_thumb3_thumb.png?imgmax=800&quot; width=&quot;421&quot; height=&quot;318&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Next…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-psKNBOWyjMU/T08WuMrx39I/AAAAAAAAACI/2cT-JfT1edg/s1600-h/tfs7_thumb32.png&quot; rel=&quot;lightbox&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;tfs7_thumb3&quot; border=&quot;0&quot; alt=&quot;tfs7_thumb3&quot; src=&quot;http://lh3.ggpht.com/-6MqSxMOTG7U/T08WvPh_qsI/AAAAAAAAACM/H26bm4q6118/tfs7_thumb3_thumb.png?imgmax=800&quot; width=&quot;420&quot; height=&quot;316&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;If we don’t want to configure a different port or user account for Team Foundation Server we may click Next…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-jzR_DSkDEeY/T08Wvj7fDaI/AAAAAAAAACU/MggaZiJsE1k/s1600-h/tfs8_thumb32.png&quot; rel=&quot;lightbox&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;tfs8_thumb3&quot; border=&quot;0&quot; alt=&quot;tfs8_thumb3&quot; src=&quot;http://lh5.ggpht.com/-WTS_sogdutY/T08WwjNzY2I/AAAAAAAAACc/XUVpUkLICzo/tfs8_thumb3_thumb.png?imgmax=800&quot; width=&quot;424&quot; height=&quot;320&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Pre-installation readiness checks: everything runs fine&lt;img style=&quot;border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;http://lh3.ggpht.com/-RdUjZ5lfH1o/T08WlTdmddI/AAAAAAAAAA8/vxyQH5sVZgo/wlEmoticon-smile2.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-vhdnkE8yhQ4/T08WxSIcu4I/AAAAAAAAACk/GxMqRfIog8M/s1600-h/tfs9_thumb22.png&quot; rel=&quot;lightbox&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;tfs9_thumb2&quot; border=&quot;0&quot; alt=&quot;tfs9_thumb2&quot; src=&quot;http://lh5.ggpht.com/-bqsBtYIv7Ng/T08Wx5rybQI/AAAAAAAAACs/9esT_oK5Kls/tfs9_thumb2_thumb.png?imgmax=800&quot; width=&quot;427&quot; height=&quot;323&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;It configures all the needed stuff…&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/-KETGoYt1Vms/T08WyyjLoUI/AAAAAAAAAC0/ztJEmI0jMm0/s1600-h/tfs9.1_thumb22.png&quot; rel=&quot;lightbox&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;tfs9.1_thumb2&quot; border=&quot;0&quot; alt=&quot;tfs9.1_thumb2&quot; src=&quot;http://lh6.ggpht.com/-rRUBIEh47d0/T08Wz06PumI/AAAAAAAAAC8/m81emBeF-kk/tfs9.1_thumb2_thumb.png?imgmax=800&quot; width=&quot;429&quot; height=&quot;324&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;That’s all folks!&lt;img style=&quot;border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;http://lh3.ggpht.com/-RdUjZ5lfH1o/T08WlTdmddI/AAAAAAAAAA8/vxyQH5sVZgo/wlEmoticon-smile2.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/-Bw_clzkVuLw/T08W0yHya6I/AAAAAAAAADE/S5T4GXBaIIE/s1600-h/tfs9.2_thumb12.png&quot; rel=&quot;lightbox&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;tfs9.2_thumb1&quot; border=&quot;0&quot; alt=&quot;tfs9.2_thumb1&quot; src=&quot;http://lh6.ggpht.com/-8aBdDIMVHQQ/T08W1oqIxpI/AAAAAAAAADM/DAK-RPAommg/tfs9.2_thumb1_thumb.png?imgmax=800&quot; width=&quot;436&quot; height=&quot;328&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Then we have a brief recap of the installation.&lt;/p&gt; &lt;p&gt;With a bunch of clicks we have an essential but full featured ALM platform, totally free. Remember that with the new Visual Studio 11 Express Editions for Windows and Web you have the possibility of connecting to a Team Foundation Server.&lt;/p&gt; &lt;p&gt;We’re a long time away from the 2005 installations…&lt;img style=&quot;border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none&quot; class=&quot;wlEmoticon wlEmoticon-winkingsmile&quot; alt=&quot;Winking smile&quot; src=&quot;http://lh5.ggpht.com/-TsuUYoRPHbQ/T08W2jBnF3I/AAAAAAAAADU/UaQ6WzqvfQo/wlEmoticon-winkingsmile2.png?imgmax=800&quot;&gt;&lt;/p&gt;  </description>
        <pubDate>Thu, 01 Mar 2012 06:27:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/03/01/team-foundation-server-express/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/03/01/team-foundation-server-express/</guid>
      </item>
    
      <item>
        <title>A new start</title>
        <description>&lt;p&gt;At the end…I did it.&lt;/p&gt; &lt;p&gt;I thought a lot of times about having an english-only blog…but I never had enough time to make a decision based on some requirements (I already started talking in ALMish slang…shame on me!) I had, like self-hosting, the blogging platform, etc.&lt;/p&gt; &lt;p&gt;Tonight I decided to open it &lt;img style=&quot;border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;http://lh6.ggpht.com/-vkbHwOpE1PU/T06mntVJRXI/AAAAAAAAAAY/KToVAL7Z-7U/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt; So, here is the place. Why Blogspot? Wordpress didn’t have a free url with MattVSTS, my nickname &lt;img style=&quot;border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;http://lh6.ggpht.com/-vkbHwOpE1PU/T06mntVJRXI/AAAAAAAAAAY/KToVAL7Z-7U/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt; that was the reason.&lt;/p&gt; &lt;p&gt;From now on you’ll essentially find posts I write in italian on my other blog, written in English. And the future direction of this blog is going to be decided by the direction my life is going to take. So…maybe surprises are around the corner!&lt;/p&gt; &lt;p&gt;Quite philosophical, isn’t it? &lt;img style=&quot;border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;http://lh6.ggpht.com/-vkbHwOpE1PU/T06mntVJRXI/AAAAAAAAAAY/KToVAL7Z-7U/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt; &lt;p&gt;Anyway, some infos for the folk who came on this blog rounding about the Internet…&lt;/p&gt; &lt;p&gt;My name is Matteo, but just call me Matt, it’s easier.&lt;/p&gt; &lt;p&gt;I’m a Visual Studio ALM MVP since 2010 (well…I was a Visual Studio Team System MVP in 2010, before the name changed &lt;img style=&quot;border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;http://lh6.ggpht.com/-vkbHwOpE1PU/T06mntVJRXI/AAAAAAAAAAY/KToVAL7Z-7U/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt; and as you can see from my nickname, I loved that name!), former Microsoft Student Partner (youngest ever in Italy, and the first ever being both MSP and MVP) and a 360 degrees geek.&lt;/p&gt; &lt;p&gt;I guess that’s enough for today &lt;img style=&quot;border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none&quot; class=&quot;wlEmoticon wlEmoticon-smile&quot; alt=&quot;Smile&quot; src=&quot;http://lh6.ggpht.com/-vkbHwOpE1PU/T06mntVJRXI/AAAAAAAAAAY/KToVAL7Z-7U/wlEmoticon-smile%25255B2%25255D.png?imgmax=800&quot;&gt;&lt;/p&gt;  </description>
        <pubDate>Wed, 29 Feb 2012 22:28:00 +0000</pubDate>
        <link>https://mattvsts.github.io//2012/02/29/new-start/</link>
        <guid isPermaLink="true">https://mattvsts.github.io//2012/02/29/new-start/</guid>
      </item>
    

    
      
        
      
    
      
        
          <item>
            <title>About</title>
            <description>&lt;p&gt;Welcome, this is my technical blog. I work in the technology industry, and my focus has always been on Application Lifecycle Management, DevOps and modern Software Engineering practices.&lt;/p&gt;

&lt;p&gt;Here you won’t find much code on its own, but a rather different approach based on certain features of the tools I know and deal with on a daily basis. I am a solution-focused enthusiast, technology on its own just bores me. What really makes me tick is when a good crafted technology solution design meets a well executed business process, providing value at an order of magniture larger than the effort.&lt;/p&gt;

&lt;p&gt;I hold a &lt;a href=&quot;https://www.scrum.org/user/168055&quot;&gt;Professional Scrum Master 1&lt;/a&gt; certification, but I am more of a pragmatist - processes should bring value, not just the inhevitable disruption followed by change. I believe we should always do what makes sense in an organisation.&lt;/p&gt;

&lt;p&gt;Since 2010 Microsoft awarded me a &lt;a href=&quot;https://mvp.microsoft.com/en-us/PublicProfile/4027206?fullName=Matteo Emili&quot;&gt;Most Valuable Professional Award&lt;/a&gt; for my contributions to the community, an effort I do on my own time and which I really care about. I am also a founder of several technical communities in different countries, where I contribute by running the regular community meetings, organising conferences or facilitating networking, and a regular speaker at European meetups and conferences.&lt;/p&gt;
</description>
            <link>https://mattvsts.github.io//about.html</link>
          </item>
        
      
    
      
        
          <item>
            <title>Speaking engagements</title>
            <description>&lt;h1 id=&quot;this-is-my-speaking-calendar-for-2026&quot;&gt;This is my speaking calendar for 2026&lt;/h1&gt;
&lt;p&gt;I am always happy to come and speak at your meetup, event or conference.&lt;br /&gt;
You can find my speaker profile &lt;a href=&quot;https://sessionize.com/matteoemili&quot;&gt;here&lt;/a&gt; with my most recent abstracts, however feel free to get in touch if there is a specific topic you would like to see discussed.&lt;/p&gt;

&lt;p&gt;These are my currently confirmed engagements for 2026!&lt;/p&gt;

&lt;h2 id=&quot;february&quot;&gt;February&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.meetup.com/devops-society/events/313189131/&quot;&gt;DevOps Society&lt;/a&gt; - London, UK&lt;br /&gt;
&lt;a href=&quot;https://www.dddnorth.co.uk/sessions&quot;&gt;DDD North 2026&lt;/a&gt; - Hull, UK&lt;/p&gt;

&lt;h2 id=&quot;march&quot;&gt;March&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://ai-athens.gr/&quot;&gt;Azure AI Connect 2026&lt;/a&gt; - Online&lt;br /&gt;
&lt;a href=&quot;https://devopsnotdead.com/2026-london-q1/&quot;&gt;DevOps Not Dead 2026 Q1&lt;/a&gt; - London, UK&lt;/p&gt;

&lt;h2 id=&quot;may&quot;&gt;May&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://devopscon.io/london/&quot;&gt;DevOpsCon London 2026&lt;/a&gt; - London, UK&lt;/p&gt;

&lt;h2 id=&quot;june&quot;&gt;June&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://devopscon.io/berlin/&quot;&gt;DevOpsCon Berlin 2026&lt;/a&gt; - Berlin, Germany&lt;br /&gt;
&lt;a href=&quot;https://vibekode.it&quot;&gt;VibeKode Munich 2026&lt;/a&gt; - Munich, Germany&lt;/p&gt;
</description>
            <link>https://mattvsts.github.io//engagements.html</link>
          </item>
        
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    

  </channel>
</rss>