{"id":65,"date":"2026-10-14T17:41:26","date_gmt":"2026-10-14T17:41:26","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2016\/08\/08\/software-development-with-team-foundation-server-2015\/"},"modified":"2026-10-14T17:41:26","modified_gmt":"2026-10-14T17:41:26","slug":"software-development-with-team-foundation-server-2015","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/software-development-with-team-foundation-server-2015\/","title":{"rendered":"Team Foundation Server 2015: Practical Guide to Planning, Git, Builds, Testing, and Integrations"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Team Foundation Server 2015 (TFS 2015) combines work tracking, source control, build automation, testing, and extensibility in a single platform. This revised guide is for teams running legacy TFS environments, supporting existing collections, or documenting a stable operating model before modernization.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Originally published on 2016-08-08; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This revision is based on the original outline post: <a href=\"https:\/\/www.devopsschool.com\/blog\/software-development-with-team-foundation-server-2015\/\">Software Development with Team Foundation Server 2015<\/a>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2016\/08\/software-development-with-t.png\" alt=\"Software development workflow with Team Foundation Server 2015\"\/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">From TFS 2013 to TFS 2015: what this feature path covers<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original material was structured as a learning path. In practice, the path groups into seven operational areas that most teams need to run day to day:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Installation and upgrade readiness (including pre-upgrade checks)<\/li><li>Agile planning (epics, features, backlog, sprint planning, dashboards)<\/li><li>Version control (Git improvements, pull requests, branch policies, CodeLens context)<\/li><li>Build setup (agents, definitions, triggers, capabilities and demands)<\/li><li>Testing (test plans, suites, shared steps\/parameters, exploratory workflows)<\/li><li>Project-level reporting and visibility (charts, alerts, cumulative flow, dashboards)<\/li><li>Integrations and extensibility (Marketplace extensions, APIs, service hooks)<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">TFS 2015 delivery workflow at a glance<\/h2>\n\n\n\n<pre class=\"mermaid\">\nflowchart LR\n    A[Refine backlog item] --> B[Plan sprint and capacity]\n    B --> C[Create branch in Git or TFVC]\n    C --> D[Commit changes linked to work item]\n    D --> E[Open pull request]\n    E --> F[Run branch policy validation build]\n    F --> G{Checks pass}\n    G -- No --> H[Fix code or tests]\n    H --> E\n    G -- Yes --> I[Merge to mainline]\n    I --> J[Run CI build and test tasks]\n    J --> K[Publish results to dashboards]\n    K --> L[Notify external tools via service hooks]\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This flow helps standardize handoffs between product owners, developers, and testers while preserving traceability from work item to code change to build and test result.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Planning and tracking with Agile tools<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">TFS 2015 planning features are strongest when teams explicitly model hierarchy and policy:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Use <strong>epics<\/strong> and <strong>features<\/strong> for portfolio visibility.<\/li><li>Keep the <strong>product backlog<\/strong> prioritized and linked to sprint commitments.<\/li><li>Use <strong>Kanban columns and swimlanes<\/strong> to separate standard and expedited work.<\/li><li>Tune <strong>working days<\/strong> and <strong>cumulative flow views<\/strong> to match actual team cadence.<\/li><li>Create <strong>work item templates<\/strong> for repetitive operational tasks.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">For sprint planning, combine capacity setup with progress tracking and alerts so blockers surface early instead of at sprint close.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Version control in TFS 2015: Git and TFVC<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">TFS 2015 supports both Git repositories and Team Foundation Version Control (TFVC). The right choice depends on repository model, branching style, and team habits.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Option<\/th><th>Best for<\/th><th>Strengths in TFS 2015<\/th><th>Trade-offs<\/th><\/tr><\/thead><tbody><tr><td>Git<\/td><td>Distributed workflows and branch-heavy collaboration<\/td><td>Pull requests, branch policies, modern branching\/review model<\/td><td>Requires team discipline on branching and merge strategy<\/td><\/tr><tr><td>TFVC<\/td><td>Centralized control and legacy enterprise patterns<\/td><td>Centralized history, familiar model for older Visual Studio\/TFS teams<\/td><td>Less flexible for distributed branching workflows<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Example Git workflow for feature delivery<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\">git checkout -b feature\/kanban-wip-limits\n<span class=\"hljs-comment\"># edit files<\/span>\ngit add .\ngit commit -m <span class=\"hljs-string\">\"Refine Kanban WIP limits and swimlane rules\"<\/span>\ngit push origin feature\/kanban-wip-limits\n\n<span class=\"hljs-comment\"># Then open a pull request in TFS and link the related work item.<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Pair this with branch policies so each pull request is validated before merge.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Build automation with agents, definitions, and triggers<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In TFS 2015, a stable build setup usually includes:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>At least one reliable build agent with known capabilities<\/li><li>Build definitions aligned to solution structure and test scope<\/li><li>Trigger strategy (CI, PR validation, and scheduled\/manual runs)<\/li><li>History review to track regressions and configuration drift<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Trigger type<\/th><th>When it runs<\/th><th>Typical use<\/th><\/tr><\/thead><tbody><tr><td>Continuous Integration<\/td><td>On each commit to selected branches<\/td><td>Fast feedback on compile\/test health<\/td><\/tr><tr><td>Pull Request Validation<\/td><td>On PR creation\/updates<\/td><td>Enforce merge quality gates<\/td><\/tr><tr><td>Manual or Scheduled<\/td><td>On demand or calendar-based<\/td><td>Nightly regression and release prep<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Example build-step commands<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs language-bash\">msbuild ContosoApp.sln \/t:Clean,Build \/p:Configuration=Release\nvstest.console.exe tests\\\\ContosoApp.Tests\\\\bin\\\\Release\\\\ContosoApp.Tests.dll \/Logger:trx<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">These are typical commands used inside build tasks; exact paths and test assemblies should match your repository layout.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Testing with Test Hub and exploratory workflows<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The testing area in the original outline emphasizes both structured and exploratory practices:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Create test plans and suites mapped to backlog scope.<\/li><li>Use shared steps and parameters to reduce duplicated test authoring.<\/li><li>Run and analyze test runs for trend visibility.<\/li><li>Connect testing to Kanban and backlog items for traceability.<\/li><li>Use exploratory testing extensions where scripted coverage is incomplete.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Integrations and extensibility: extensions, APIs, and service hooks<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">TFS 2015 can be extended through Marketplace components, custom extension packaging, API-based integrations, and service hooks for event-driven notifications.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-powershell\">$body = @{\n  event  = <span class=\"hljs-string\">\"build.completed\"<\/span>\n  status = <span class=\"hljs-string\">\"succeeded\"<\/span>\n  build  = <span class=\"hljs-string\">\"ContosoApp-CI\"<\/span>\n} | ConvertTo-Json\n\nInvoke-RestMethod -Method Post -Uri <span class=\"hljs-string\">\"http:\/\/localhost:9000\/tfs-hook\"<\/span> -ContentType <span class=\"hljs-string\">\"application\/json\"<\/span> -Body $body<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This example simulates a webhook-style payload to a downstream tool so teams can validate automation logic before wiring live events.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Upgrade and verification checklist for TFS 2015<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Run pre-upgrade checks and capture warnings.<\/li><li>Back up configuration and collection databases before upgrade windows.<\/li><li>Upgrade in a staging environment first and verify project access.<\/li><li>Validate source repositories, build definitions, test plans, and dashboards after upgrade.<\/li><li>Document any project rename or post-upgrade administrative tasks.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Best practices and common pitfalls<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Standardize branch and PR policies<\/strong> before scaling team count.<\/li><li><strong>Keep build agents deterministic<\/strong> by tracking capabilities and tool versions.<\/li><li><strong>Avoid backlog over-customization<\/strong> that breaks reporting consistency.<\/li><li><strong>Link work items to commits and test artifacts<\/strong> for reliable audit trails.<\/li><li><strong>Test extensions and hooks in non-production first<\/strong> to prevent noisy or duplicate notifications.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">If your long-term target is Azure DevOps Services or a newer Azure DevOps Server release, this operating model also gives you a clean baseline for migration planning.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This guide turns an outline-style TFS 2015 post into a practical reference for real delivery workflows. Learn how to connect Agile planning, version control, CI builds, testing, and integrations in one on-prem pipeline.<\/p>\n","protected":false},"author":1,"featured_media":3050,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[26,8],"tags":[585,1127,1143,179,800,1142,1141,363,801,1139,1138,1140],"class_list":["post-65","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tfs","category-training","tag-development","tag-introduction","tag-learn-team-foundation-server-2015","tag-software","tag-team-foundation-server-2015","tag-team-foundation-server-2015-course","tag-team-foundation-server-2015-training","tag-tfs","tag-tfs-2015","tag-tfs-2015-course","tag-tfs-2015-introduction","tag-tfs-2015-training"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/65","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=65"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/65\/revisions"}],"predecessor-version":[{"id":79367,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/65\/revisions\/79367"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/3050"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=65"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=65"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=65"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}