Looks like the good folks in Redmond got some time to write up a much-needed troubleshooting guide for TFS server installations. You can find the guide on MSDN using the following link: Troubleshooting installation of Team Foundation The guide goes over how to interpret the installer log files, as well as diagnosis for many common TFS errors. Here's a list: Error 32000. The Commandline ‘[1]’ returned non-zero value: [2] Error 29112. Team Foundation Report Server Configuration: Either SQL Reporting Services is not properly configured, or the Reporting Services Web site could not be reached. Use the Reporting Services Configuration tool to confirm that SQL Reporting Services is configured properly and that the Reporting Service Web site can be reached, and then run the installation again. For more information, see the Team Foundation Installation Guide. Error 29109. Team Foundation Report Server Configuration: SQL Reporting Services configuration encountered an unknown error. Verify that you have sufficient permissions to configure SQL Reporting Services, and try again. Error 28806. An unexpected error occurred. Verify that SQL Server Reporting Services is installed and running on the Team Foundation app tier and that you have sufficient privileges to access it. For more information, see the setup log. Error 29000. An unexpected error occurred. Verify that SQL Server Reporting Services is installed and running on the Team Foundation app tier and that you have sufficient privileges to access it. For more information, see the setup log. Error 28805. The setup program cannot complete the request to the server that is running SQL Server Reporting Services. Verify that SQL Server Reporting Services is installed and running on the Team Foundation app tier and that you have sufficient permissions to access it. For more information, see the setup log. There is an error with the collation settings for SQL Server. The collation settings are not compatible with Team Foundation Server. There are also sections for troubleshooting the installation of Team Build or Team Explorer in Visual Studio, as well as some helpful hints for post-installation pains. This article has now taken the place of a dozen of my favorites -- thanks Microsoft! Technorati Tags: TFS,VSTS,Troubleshooting
I'm not a big fan of New Year's Resolutions, but I've got some bad habits (like many of us) that I'd like to break, and some new good habits that I'd like to get into. Here's my short list of changes for 2009.
[More]
One of the best features and biggest drawbacks to CRM 4.0's entity model is the ability to modify forms in CRM using Javascript. While this level of customization is something any sizable implementation will need, it's been reduced to pasting a bunch of Javascript code into a text box in CRM. Not that I've got anything against pasting code in a textbox in CRM, but this isn't exactly an integrated development experience. In this post, I'll demonstrate how to have the onLoad() script in a CRM entity dynamically load one or more Javascript files (externally) and then run a load script once all the files have completely loaded. First, let's talk about a little housekeeping. The image to your left (click to enlarge) represents the solution explorer view of a web project I've created that contains an ISV solution for CRM. There's some important things to note here. First, I've got a folder called "Javascript". This folder houses my site-wide Javascript, and the basis for the OnLoad() handler that I'll bind to each entity. Let's take a look at some of the files in this folder. CrmFormHelper.js Houses functions that help handle form events easily. After loaded by our dynamic scripting engine, the form helper is available to any form in CRM via the document.FormHelper object. CrmFormIFrame.js Houses functions that allow CRM to manipulate the IFRAME instance where a page appears CrmWebService.js Houses functions that easily allow CRM web services to be consumed through Javascript. DiagnosticsWindow.js When enabled, provides a trace window that shows events as they fire in CRM using the Javascript scaffolding in this article OnLoad.js Provides a stock OnLoad() implementation for your entities OnSave.js Provides a stock OnSave() implementation for your entities. For the purposes of this post, I'm going to focus on CrmFormHelper and OnLoad.js. What's in these fancy scripts, anyhow? Let's take a look:CrmFormHelper.js 1: CrmFormHelper = function() {
2:
3: //Trace - Start
4: var TraceWindowHandle = null; var TraceLastTrace = new Date(); function TraceClear() { if (TraceWindowHandle == null) return; alert(TraceWindowHandle.document.body.innerHTML); TraceWindowHandle.document.body.innerHTML = '<body>'; TraceWindowHandle.document.writeln('<a href="javascript:opener.TraceClear();">Clear Window</a>'); } function Trace(cat, message) { if (typeof TraceWindowEnabled == 'undefined') return; message = message.split('<').join('<'); message = message.split('>').join('>'); if (TraceWindowHandle == null) { TraceWindowHandle = open('', 'TraceWindow', 'width=500,height=500,location=no,menubar=no,resizable=yes,left=200,top=20,directories=no,status=no,scrollbars=yes'); TraceWindowHandle.document.writeln('<a href="javascript:opener.TraceClear();">Clear Window</a>'); } try { date_now = new Date(); elapsedMS = date_now.getTime() - TraceLastTrace.getTime(); TraceLastTrace = date_now; TraceWindowHandle.document.writeln('<br>' + date_now + '(' + elapsedMS + ') ' + ':' + cat + ':' + message); TraceWindowHandle.window.scroll(0, TraceWindowHandle.document.body.scrollHeight + 10); } catch (err) { TraceWindowHandle = null; } } function TraceWriteRaw(markup) { if (typeof TraceWindowEnabled == 'undefined') return; if (TraceWindowHandle == null) { TraceWindowHandle = open('', 'TraceWindow', 'width=500,height=500,location=no,menubar=no,resizable=yes,left=200,top=20,directories=no,status=no,scrollbars=yes'); TraceWindowHandle.document.writeln('<a href="javascript:opener.TraceClear();">Clear Window</a>'); } try { TraceWindowHandle.document.writeln(markup); } catch (err) { TraceWindowHandle = null; } }
5: //Trace - End
6:
7: CrmFormHelper.prototype.IsEditForm = function() {
8: var CRM_Form_TYPE_EDIT = 2;
9:
10: if (crmForm.FormType == CRM_Form_TYPE_EDIT)
11: return true;
12: else
13: return false;
14: }
15:
16: CrmFormHelper.prototype.HandleFormOnLoad = function() {
17: Trace('HandleFormOnLoad', 'Starting');
18:
19: var CRM_Form_TYPE_CREATE = 1;
20: var CRM_Form_TYPE_EDIT = 2;
21:
22: switch (crmForm.FormType) {
23: case CRM_Form_TYPE_CREATE:
24: if (this.OnFormLoadCreate != null) {
25: Trace('HandleFormOnLoad', 'Calling OnFormLoadCreate');
26:
27: try {
28: this.OnFormLoadCreate();
29: }
30: catch (e) {
31: Trace("HandleFormOnLoad", "Error while calling OnFormLoadCreate: " + e.Description);
32:
33: debugger;
34: }
35:
36: Trace('HandleFormOnLoad', 'Done Calling OnFormLoadCreate');
37: }
38:
39: break;
40: case CRM_Form_TYPE_EDIT:
41: if (this.OnFormLoadEdit != null) {
42: Trace('HandleFormOnLoad', 'Calling OnFormLoadEdit');
43:
44: try {
45: this.OnFormLoadEdit();
46: }
47: catch (e) {
48: Trace("HandleFormOnLoad", "Error while calling OnFormLoadEdit: " + e.Description);
49:
50: debugger;
51: }
52:
53: Trace('HandleFormOnLoad', 'Done Calling OnFormLoadEdit');
54: }
55:
56: break;
57: }
58:
59: Trace('HandleFormOnLoad', 'Ending');
60: }
61:
62: CrmFormHelper.prototype.OnFormLoadCreate = function() {
63: Trace('OnFormLoadCreate', 'Default implementation called - no action taken');
64: }
65:
66: CrmFormHelper.prototype.OnFormLoadEdit = function() {
67: Trace('OnFormLoadEdit', 'Default implementation called - no action taken');
68: }
69:
70:
71: CrmFormHelper.prototype.HandleFormOnSave = function() {
72: Trace('HandleFormOnSave', 'Starting');
73: if (crmForm.IsDirty) {
74: Trace('HandleFormOnSave', 'Calling OnFormSaveDirty');
75: if (!this.OnFormSaveDirty()) {
76: Trace('HandleFormOnSave', 'OnFormSaveDirty setting return value to false, since onsavedirty returned false');
77: // Cancel the save operation.
78: event.returnValue = false;
79: }
80: Trace('HandleFormOnSave', 'Done Calling OnFormSaveDirty');
81: }
82: else {
83: Trace('HandleFormOnSave', 'Calling OnFormSaveClean');
84: this.OnFormSaveClean();
85: Trace('HandleFormOnSave', 'Done Calling OnFormSaveClean');
86: }
87: Trace('HandleFormOnSave', 'Ending');
88: }
89:
90: CrmFormHelper.prototype.OnFormSaveDirty = function() {
91: Trace('OnFormSaveDirty', 'Default implementation called - no action taken');
92: }
93:
94: CrmFormHelper.prototype.OnFormSaveClean = function() {
95: Trace('OnFormSaveClean', 'Default implementation called - no action taken');
96: }
97:
98: CrmFormHelper.prototype.GetDefaultLookupValue = function(guid, type, label) {
99: var lookupItem = new Array();
100: lookupItem[0] = new LookupControlItem(guid, type, label);
101: return lookupItem;
102: }
103: }
104:
105: document.FormHelper = new CrmFormHelper();
What does all this code do, anyhow? Well, basically, we're creating a Javascript class that can responsibly handle form events (load and save). This means that a different function can be called on Create or Edit mode for a form, and a different function can be called based on the form's state (clean or dirty) upon save. You'll also notice a bit of error handling code on each call, where we'll dump failures to the Trace window and launch the debugger. In our setup, all of the code above lives in an external Javascript file. This means, using Visual Studio 2008, you can set a breakpoint in any portion of this code and get full debugging support.
But how do I get this external code to load when my entity's form is displayed? Basically, you can copy and paste the following 40 lines of code in your entity's onLoad handler. Let's take a closer look. 1: function onLoad() {
2: window.DynamicScripts = new Array();
3: window.DynamicScriptsLoaded = 0;
4:
5: // *** BEGIN EDITS HERE *** Add any scripts you want to be loaded when the page begins, CrmFormHelper.js is required.
6: window.DynamicScripts[0] = "/ISV/Custom/Javascript/CrmFormHelper.js";
7: window.DynamicScripts[1] = "/ISV/Custom/Javascript/CrmWebService.js";
8: window.DynamicScripts[2] = "/ISV/Custom/Price List/Javascript/PriceListForm.js";
9: // *** END EDITS HERE ***
10:
11: //Trace - Start
12: var TraceWindowHandle = null; var TraceLastTrace = new Date(); function TraceClear() { if (TraceWindowHandle == null) return; alert(TraceWindowHandle.document.body.innerHTML); TraceWindowHandle.document.body.innerHTML = '<body>'; TraceWindowHandle.document.writeln('<a href="javascript:opener.TraceClear();">Clear Window</a>'); } function Trace(cat, message) { if (typeof TraceWindowEnabled == 'undefined') return; message = message.split('<').join('<'); message = message.split('>').join('>'); if (TraceWindowHandle == null) { TraceWindowHandle = open('', 'TraceWindow', 'width=500,height=500,location=no,menubar=no,resizable=yes,left=200,top=20,directories=no,status=no,scrollbars=yes'); TraceWindowHandle.document.writeln('<a href="javascript:opener.TraceClear();">Clear Window</a>'); } try { date_now = new Date(); elapsedMS = date_now.getTime() - TraceLastTrace.getTime(); TraceLastTrace = date_now; TraceWindowHandle.document.writeln('<br>' + date_now + '(' + elapsedMS + ') ' + ':' + cat + ':' + message); TraceWindowHandle.window.scroll(0, TraceWindowHandle.document.body.scrollHeight + 10); } catch (err) { TraceWindowHandle = null; } } function TraceWriteRaw(markup) { if (typeof TraceWindowEnabled == 'undefined') return; if (TraceWindowHandle == null) { TraceWindowHandle = open('', 'TraceWindow', 'width=500,height=500,location=no,menubar=no,resizable=yes,left=200,top=20,directories=no,status=no,scrollbars=yes'); TraceWindowHandle.document.writeln('<a href="javascript:opener.TraceClear();">Clear Window</a>'); } try { TraceWindowHandle.document.writeln(markup); } catch (err) { TraceWindowHandle = null; } }
13: //Trace - End
14:
15: TraceWindowEnabled = true;
16: Trace("Dynamic Scripts", "Script loading started");
17:
18: for (i = 0; i < window.DynamicScripts.length; i++) {
19: var script = document.createElement("SCRIPT");
20:
21: script.language = "javascript";
22: script.src = window.DynamicScripts[i] + "?nocache=" + Math.random();
23: script.onreadystatechange = function() {
24: if (this.readyState == "loaded" || this.readyState == "complete") {
25: window.DynamicScriptsLoaded += 1;
26:
27: Trace("Dynamic Scripts", this.src + " " + this.readyState);
28:
29: if (window.DynamicScriptsLoaded == window.DynamicScripts.length) {
30: Trace("Dynamic Scripts", "Script loading complete");
31:
32: if (document.FormHelper != null)
33: document.FormHelper.HandleFormOnLoad();
34: }
35: }
36: }
37:
38: document.getElementsByTagName("HEAD")[0].appendChild(script);
39: }
40: }
41:
Basically, lines 5-9 of the above snippet specify which external script files should be loaded before the page's CrmFormHelper's load methods are called. You can add any number of Javascript files here. Lines 18-36 dynamically build <SCRIPT> tags and add them to the header. At this point when all the scripts are loaded, then (and only then) is the FormLoad() fired (line 33). This guarantees that all of your script libraries are available to your OnLoad script.
So, what happens when the page loads? Looking at line 9 of the above code snippet, we see that one of the external javascript files is "/ISV/Custom/Price List/Javascript/PriceListForm.js". This external Javascript file is real small and houses 2 different functions that fire when my page loads (one for edit mode, one for creation). 1: /// <reference path="../../Javascript/CrmFormHelper.js" />
2: /// <reference path="../../Javascript/CrmWebService.js" />
3: /// <reference path="../../Javascript/Intellisense/new_custompricelist.js" />
4:
5: document.FormHelper.OnFormLoadCreate = function() {
6: alert("Form create was called");
7: }
8:
9: document.FormHelper.OnFormLoadEdit = function() {
10: alert("Form edit was called");
11: }
What's most important about this file is the first 3 lines. Those comments actually tell Visual Studio 2008 to load the specified Javascript files (which are loaded using our DynamicScript above) for interpretation in Intellisense. Yes, you got the right -- by referencing those external scripts in the first 3 lines of this file, you'll get full Intellisense support.
That concludes this post. In summary, using external Javascript files gets us a first class debugging experience in Visual Studio. Try it!
Technorati Tags: VSTS,CRM 4.0,Javascript
Can't wait until VSTS and TFS 2010 to have hierarchical work items? There's a way around this, provided you're ready to use either Microsoft Excel or Microsoft Project to do work item tracking. Introducing Area Paths Area Paths allow architects to clearly define portions of an application as independent subsystems. You do this through a tree-view interface. How do you access Area Paths in TFS? Using the Team Explorer Client Right click on your project in Team Explorer and select "Team Project Settings", then "Areas and Iterations". You can organize Area Paths and Iteration Paths in an unlimited hierarchical view using the provided TreeView. Using Team System Web Access You may also modify Area Paths and Iteration Paths using Team System Web Access. To do so, use the Settings menu on the right side of your screen. Select "Team Project" and then "Areas" or "Iterations". Adding Tasks to TFSWhen adding tasks to TFS, be sure to choose the area path and iteration path that you wish each task to follow. I find it best if you number the paths (1, 1.1, 1.1.1, etc.) so that you can sort by area path easily. After you do so, you'll have a query of work items in your development cycle that looks something like this: I've removed a client name here for privacy purposes, and hopefully your screen won't have a big white blob all over it. This certainly makes things easier to organize inside TFS, but what about viewing this data in a hierarchy? Enter Microsoft ProjectSome great functionality in TFS is it's ability to link data automatically with Excel and Project. The publish/refresh model is extremely light, fast and easy to use. First, you'll need to import work items in to your project plan. It's easy, just click the "Get Work Items" button from the toolbar in project. Next, you'll need to add the headers/hierarchy back in from your area path in Microsoft Project. You can do so by: Pressing Ins in the task list (a new row appears). Type the name of your new task Highlight the sub-tasks below it, and use the indent arrow button (or Tab) to make them subordinate to the header above Repeat this process for multiple levels Make sure to take your new header tasks aren't published to TFS (since the subordinate tasks already are). How do you do this? Add the Publish and Refresh column to your view in project (if it's not already there). Simply set the option to "No" for your header rows. When you're all done, you should have a view in Microsoft project that looks something like this (I've collapsed some of the headers for effect): Technorati Tags: VSTS,TFS,Microsoft Project,Area Paths
Microsoft made a formal announcement about BizSPpark today. From their web site: Microsoft® BizSpark™ is a global program designed to help accelerate the success of early stage startups by providing key resources when they need it the most: Basically, Microsoft is doing a solid for startups by providing them with a bunch of full-featured, licensed development tools (including VSTS and TFS Standard Edition to say the least), the MSDN library and a whole lot more. What do you need to do to qualify? Actively be engaged in development of a software-based product or service that will form a core piece of its current or intended business[1], Be privately held, Be in business for less than 3 years[2], and Generate less than USD $1 million in annual revenue[3].Since that pretty well represents the little guy (including my own business in it's first three years) - I imagine a lot of people are really going to benefit from this program. Kudos to Microsoft for recognizing their social responsibility in growing new businesses. Technorati Tags: BizSpark,VSTS,TFS
Microsoft has now made the Visual Studio 2010 bits available for download at PDC. The following link has the download, feedback forms, FAQ and help. I'd love to hear what you're doing with VSTS 2010 -- feel free to contact me and let me know. Technorati Tags: VSTS,Visual Studio 2010
"Rosario" is the name of Microsoft's next release of Team Foundation Server. Got a great look at new features in Brian Harry's 3:30 session. TFS "Rosario" at a high level Protect the quality of your code - Making sure the quality of the code that makes it into the tree is of the highest quality; issues that are found early are rejected and fixed. Understanding parallel development - how does the development team handle lots of branches, releases and builds Managing your project - A number of enhancements have been made to make PM tasks easier Reporting on your entire portfolio - New enhancements help managers and team members understand what's going on across multiple projects Coordinate across development platforms - New support for Eclipse, Mac development tools, etc. Administer TFS in your environment - New improvements in flexibility and scalability for large enterprises Protecting the quality of your code Gated check-in and buddy builds - an evolution of continuous integration; build server can automatically build, test and deploy interactively with proofing upon check-in; Buddy builds allow user to package up changes, ship it off to build server and run tests on isolated server without deployment Workflow based builds - In TFS 2005, 2008, build engine is based on MSBuild. New enhancements in TFS 2010 allow builds to be triggered as Windows Workflow events. Brian demonstrated this during his presentation - trust me when I tell you it kicks ass. Build queuing - manage large groups of many people doing many builds Build agent pooling - setup farms of build machines; kickoff builds and TFS finds available build machines and builds Symbol server and source server support - making it easier to debug builds that come out of the automated build (since there's no symbols on the build server) Understanding Parallel Builds First class branches Visualize branch relationships Track changes across branches (History, Timeline, Annotate) Conflict resolution Rollback Managing your Projects Agile project management workbooks Work item linking and hierarchy Work item usability (Rich text, Links control, HTML link control, drag and drop support) Traceability queries Query folders (with independent permissions) Excel and Project improvements (excel workbooks no longer lose their custom stuff upon TFS refresh; new styles and report workbooks) Reporting on your entire portfolio Customizable dashboards SharePoint web parts Excel reports using MOSS Relational warehouse Excel reporting At the end of the session Brian had time to take some Q&A. I asked if the Team System Web Access for 2010 would be as functional as the Visual Studio integrated Team Explorer, which he responded with a resounding "Yes". I also asked if there were improvements in customizing process guidance or work item templates -- unfortunately not for this release -- let's hope for some service pack improvements! Truthfully, I think Brian had even more amazing content to go over in his demo but got cut short on time. TFS Rosario literally has hundreds of new features and enhancements. I'll blog more about the product as I have bits and more information is made available! Technorati Tags: TFS 2010,Rosario
Nikita and I got to spend some time with some folks in Orlando this week talking about Team Foundation Server 2008. A few questions came up that we weren't prepared to answer on the spot, and I promised an online follow-up. Here it is! Is TFS integration supported in the Expression line of products? The unfortunate short answer is "Not yet". I installed Expression Studio2 (and applied SP1 for Blend) and there's no source control support. I found a few posts asking Microsoft to remedy this problem, and apparently they are in fact taking steams to remedy the situation. What are the differences between the various Visual Studio SKUs? Good question. First, here's an update on nomenclature since we're all undoubtedly confused by a certain marketing department's notorious change of heart regarding product names: Visual Studio 2005 Visual Studio 2008 Visual Studio Team System Visual Studio Team System 2008 Visual Studio 2005 Team Suite Visual Studio Team System 2008 Team Suite Visual Studio 2005 Team Edition for Software Architects Visual Studio Team System 2008 Architecture Edition Visual Studio 2005 Team Edition for Software Developers Visual Studio Team System 2008 Development Edition Visual Studio 2005 Team Edition for Software Testers Visual Studio Team System 2008 Test Edition Visual Studio 2005 Team Edition for Database Professionals Visual Studio Team System 2008 Database Edition Visual Studio 2005 Team Foundation Server Visual Studio Team System 2008 Team Foundation Server Visual Studio 2005 Team Test Load Agent Visual Studio Team System 2008 Test Load Agent What about Standard and Professional builds of Visual Studio? Visual Studio Express SKU's are free "lite" versions of Visual Studio designed to get new developers on board with the Microsoft development platform. There's no add-in support or extensibility, and the language/project features are limited. Visual Studio 2008 Standard is the baseline SKU and includes the Visual Studio shell, add-in and extensibility (VSX) support, project upgrade wizard, etc. Visual Studio 2008 Professional is the first version that adds "full setup" for Visual Studio, the full MSDN library, advanced debugging (remote processes, clustered debugging), the object test bench, Office development support, mobile device development support, and more goodies. No TFS CAL is included with Visual Studio 2008 Standard or Professional. Beyond the inclusion of a TFS 2008 CAL, VSTS provides a few additional benefits over Visual Studio Professional (namely 64-bit debugging support). Each VSTS SKU has it's own benefits, highlighted below: SKU Features Architect Edition Application Design project template; Application designer; Bind application; Configure connections to external databases; Conform .NET Web Service Endpoints to WSDL Files; Custom Prototypes; Define Deployment; Deployment Designer; Generate Deployment Report; Implement Application; Logical Datacenter Design; Reverse Engineer Projects in Existing Solutions; Settings and Constraints Editor; Synchronize with Datacenter; System Designer; Validate Diagram; Versioning; Web Service Details Database Edition Add Database Reference; Custom Data Generators; Data Compare; Data Generation; Database Refactoring; Database Schema Build & Deployment Tools; Database Unit Testing; Offline Database Schema; Project Version; Schema Compare; T-SQL Editor Developer Edition Auto-Suppress Generated Code Option; C/C++ Code Analysis tool; Code Analysis Check-In Policy; Code Metrics; Managed Code Analysis tool; Spelling Checker with Custom Dictionary Support; Application Verifier; Compare Reports; Compressed Report Files; Copy Report View Data to HTML; Filtered Analysis; Hot Path; Line-Level Sampling; Portable CPU Counters; Profiler Runtime Control; Profiling Tools; Profiling Tools Report; Report Noise Reduction; Runtime Profiling Control window; Stand-Alone Profiler; Windows Communications Foundation Profiler Support; Windows Counter Support Test Edition Call a Web Test from a Web Test; Code Coverage; Custom Host Adapters; Easier Load Test Analysis; Generic Tests; Load Modeling; Load Test Results Repository Management; Load Tests; Manual Tests; Web Test Data Binding; Web Test Validation Rules; Web Tests; XML File Converter Utility Team Suite All of the above are available in one edition. If these short one-liner feature names aren't enough, a full side-by-side comparison of Visual Studio SKU's is available. If you're looking for a great deal, Microsoft runs promotions on Visual Studio flavors from time to time. What does the TFS 2008 Upgrade Process look like? Many of you read my install guide from a few weeks back and wanted to know about the pitfalls of a TFS 2008 upgrade. What's most important to know is that the TFS upgrade is really a 4 product install comprising of the following tasks: WSS 2.0 to WSS 3.0 Upgrade SQL Server 2000 to SQL Server 2005/2008 Upgrade (you may already have this) TFS application tier 2005 to 2008 Upgrade TFS database tier 2005 to 2008 Upgrade Team Build 2008 install/setup (optional) WSS 2.0 to WSS 3.0 upgradeThe first component that needs to be completed is the upgrade from WSS 2.0 to WSS 3.0. During my last upgrade process, we were actually doing the upgrade, but we wanted to migrate the content database from an existing WSS 2.0 server to a new WSS 3.0 installation on Windows Server 2008. This is probably the more complex of upgrade scenarios. Before you start, I strongly recommend reading Upgrade Toolkit for Windows SharePoint Services Sites and Templates guide published by Microsoft.We were able to simplify our upgrade process by performing the following simple steps: Backup the existing WSS 2.0 Content Database Upgrade the WSS 2.0 content database to WSS 3.0 Upgrade the WSS 2.0 site templates to WSS 3.0 Take special consideration when upgrading WSS 3.0 to WS2008/Vista on IIS 7 SQL Server 2000 to SQL Server 2005 UpgradeYou'll be needing at least SQL Server 2005 and Reporting Services to run TFS 2008 against. Running this on Windows Server 2008? I recommend a full fledged SQL 2008 upgrade, but if you want, you can get SQL Server 2005 Reporting Services running on Win 2k8/IIS 7 with some work. Running into permissions issues? Check here. TFS giving you error 29112 when installing TFS 2008 and Reporting Services as part of a scale-out installation? Check here. Once again, Reporting Services will give you all sorts of hell on IIS 7. Check here for fixes. TFS Application tier 2005 to 2008 UpgradeThe recommended way to upgrade TFS is using in-place upgrade mode. Basically, you pop the TFS 2008 install DVD in the drive of your existing TFS Server, and follow some simple steps. 1) Make a backup of your TFS and WSS databases, 2) go through the install process. When you go through the install process, TFS will pick up the Application tier's installed location and perform a database and application tier upgrade in-place. This process has drastically been improved in the TFS 2008 installer, however, there's one caveat that you should know about. If you want to upgrade your TFS installation *and* move it to a new server, you will need to uninstall your existing TFS installation, upgrade your database manually and then re-install the new TFS installation. Failure to do so will cause TFS to be configured as a failover node instead of a new TFS installation (whoops). If you're having problems, here's some likely fixes: A better upgrade guide than mine accounts for TF220064, Error 29109, 32000 and 32000. This guide goes through all the steps necessary to manually update an Internet-facing TFS 2005 installation to a new server with TFS 2008. Here's another small gem which describes an error in a number of SQL Server reports in the TFS installation that can cause 32000 errors to occur. Lastly, the best idea I've heard so far is to slipstream the SP1 install into your TFS 2008 install. TFS Database Tier UpgradeThere's a way to do an upgrade on just the TFS database and not the application tier in preparation of a TFS 2008 upgrade or addition of a failover cluster. Don't do it. I won't even post the instructions in this blog post because it's just a bad, bad idea. Let the TFS installer do this job for you -- it's better that way. You're one collation setting away from disaster if you try it on your own :) Team Build 2008Team Build 2008 is words better than it's predecessor, and is a very easy install. Simply insert the TFS 2008 DVD and click install. A new Windows Service and TfsBuild database will be created to hold build definitions. Technorati Tags: TFS 2008
Last week I completed (after 4 attempts) an Internet-facing TFS 2008 deployment. All the hard effort was certainly worth it as I'm now using TFS 2008 for some personal projects and I've got a demo server that will allow me to show others the benefits of Microsoft's Team Foundation Server 2008. Without further delay, let's jump right into the installation! First, I attempted to install TFS 2008 without reading the installation guide. I wouldn't recommend anyone do this, so please learn from my mistake. I built a Windows Server 2008 (64-bit) VM from the ground up, installed SQL Server 2008 and configured IIS 7. When I went to insert the TFS DVD into the drive and go install, low-and-behold, I learned that the TFS application tier isn't currently supported on 64 bit operating systems. This was completely my goof, and I've kept the Windows Server installation configured as a sandbox for other test projects. We'll consider this attempt number 1. For attempt #2, I decided to ditch Windows Server 2008 for this install altogether. Now that I had a 64-bit Windows 2008 sandbox server configured, I didn't have a compelling reason to try Windows Server 2008 for TFS, and apparently it only adds some additional installation steps anyway. For my second attempt, I decided to clone an existing 32-bit Windows Server 2003 installation that already had IIS 6 configured and simply install SQL Server 2005 and TFS on top. So, I did. After installing SQL Server 2005 I realized I hadn't changed the SID on the new clone, so I used NewSID to do so. As it turns out, you don't want to change the SID after installing SQL Server. I wasn't able to install Service Pack 2, or un-install SQL Server afterwards. So, I had a brick for an image, let's call this attempt number 2, and start again. For attempt #3, I changed the SID before the SQL Server 2005 installation and was able to install the service pack. A little exhausted from all this work, I went on to make some lunch. In my hate, I hadn't set a "sa" password during my SQL installation, and forgot that this server was exposed to the Internet. Wouldn't you know in the hour and half break I took, the server had already been compromised and over 6 different worms had been installed. Pasky little buggers those worms, so I scrapped the image once again and moved on to attempt #4. Up until now, all the TFS installation pains I had were really my fault. I didn't read the install guide, hadn't considered the implications of changing the SID after SQL installation and got careless with security. Determined to correct these silly user errors, I set out one more time to build my TFS 2008 server image. This time, I was able to complete the TFS 2008 server installation. I also installed Team Build. With security in mind, I created 2 different user accounts (TFSService and TFSReports) responsible for managing the TFS and SSRS services. Everything was going well until I checked the event log. Errors and errors were preventing me from successfully creating a Team Project using Team Explorer. Here's the rundown: Error messages from ASP.Net about not being able to get the private byte memory limit for the W3WP process. Turns out this is a result of the cloning process not successfully changing SIDs for all the ASP.Net keys. Thanks to "Joe unfiltered" and this post for providing a resolution. "Team Project Creation Failed" error message that appears when trying to create a new Team Project. This was caused as a result of the improper permissions on the folder: %AllUsers%\Application Data\Microsoft\Crypto\RSA\MachineKeysThis folder (and it's subfolders) must have Full Control for "Everyone". Thanks to this forum post for identifying the problem/solution. Still can't create a project? I couldn't, because I was using a fully qualified domain name (FQDN) as my server from an outside network. Turns out, everything's coded to the NetBIOS name of the server (how deliciously archaic) and you have to change these values. Thankfully, this is much easier in TFS 2008 than it was in TFS 2005. Check out this blog entry By Buck Hodges for the details. After doing these 3 things, I could not connect to my TFS server and create a new project. Source Control works, WSS works, SSRS works! Time to install Service Pack 1. Unfortunately, I had some hang-up's there, too: I got a cryptic error when installing the service pack, "There is a problem with this Windows Installer package. Please refer to the setup log for more information." Ever actually read one of those .MSI installer logs? Turns out, the FQDN issue noted above was causing problems with the installation of TFS, as the TFS setup couldn't use WMI to connect to the server anymore because of it's FQDN. Time to use the TfsAdminUtil to change the server name to it's NetBIOS name, then do the install, then use the TfsAdminUtil to change it back. This procedure was sort of indicated in this forum post, which gave me the right inspiration. At this point I now had the SP1 installation complete, but couldn't connect to my TFS server anymore. If you're getting 403 (Forbidden) errors, read this blog post a solution. Finally, I had my dazzling TFS server with Service Pack 1 installed (which I promptly took a snapshot of). Now I was ready to install the awesome TFS Web Access. This installation went fairly well, with one exception: Turns out, you can't install TFS web access as a virtual directory underneath an existing WSS 3.0 web site. This limitation stinks, and the installer won't warn you about it either. Instead, you'll get a crytic SecurityException when you attempt to access the Web Access URL. This forum post explains it all. The solution is to uninstall web access, and re-install it under a new IIS website. And there you have it! This is a chronicle of my TFS 2008 install experience. I'm going to be doing a server upgrade from TFS 2005 to TFS 2008 next week, which I imagine will yield more interesting results, so you can expect a follow-on post. What's most important to say is, despite all these installation headaches, I'm still entirely in love with TFS as a product. Technorati Tags: TFS 2008,Installation,Tips and Tricks