Deep dive into feature versioning in SharePoint 2010


Published on

Published in: Technology
  • Be the first to comment

No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide
  • In 2007 provisioning artefacts and then upgrading them was like head butting a brick wall. It’s quick and easy to create these things in the Web UI in one environment, and extremely easy to add new Site Columns to existing Content Types. Or modify Web Part properties.But when you have 10 Site Collections with 20 Content Types and have to modify them in Development, Test and Production. This is tedious for every promotion of a change. This is why we do development over configuration.
  • Some things are easier than others to replace.Definitions vs InstancesMost are not aware that although you define a Content Type at the Site Collection level, if you create a List in a sub site and attach a Content Type to the List it creates an Instance which has a “link” back to the definition. The same is true of List Templates, although this works slightly different again in that once a List Instance is created, if you modify the List Template the changes are promoted to the List Instance. This is by design, you would need to imperatively update each List Instance. This is why it is encouraged to use Content Types because at least you can push down changes to Fields that way.Pushing Changes DownIn the UI you can change the definition and it pushes the changes down to these instances, but if you do it imperatively in code you have to be careful. It is unsupported to change Content Type Definitions declaratively.Module PagesModule Pages in a Site Collection will reference the file deployed in the Feature within the SharePoint Root (hive), and as long as they are not customised, will automatically take the updated version.
  • Module PagesModule Pages in a Site Collection will reference the file deployed in the Feature within the SharePoint Root (hive), and as long as they are not customised, will automatically take the updated version.
  • Deactivate/ActivateThis is a common approach where you just deactivate the feature and reactive which will run the Feature Receiver code where you could imperatively “do stuff” like check columns existed on Content Types etc. to ensure that they matched the Definition in the Content Type manifest in the Feature.In most instances it will pull out the Content Type defintions etc. if they are not used and then on Activation it will provision the new updated Definition. This does not work if the Content Type is in use, which in most cases it will be.Clean upSome people will actually remove Definitions on Deactivation to clean up. Such as Content Type Definitions or even List Templates and Web Parts. Remember that when you deactivate, by default it will leave any instances deployed by Module elements e.g. Web Part Definitions and Master Pages.PowerShellIn 2007 some people used PowerShell to imperatively go through instances in each Site Collection and tweak them. Sometimes, as a Developer it was often slower to sit and work out the API to modify a Content Type compared to a few seconds in the UI. There’s snippets of code all over the web for this and we’ll have the same issues again in SharePoint 2010 although a lot of the SharePoint 2007 stuff is re usable.Don’t overuse features where you are for instance just creating a Images Library on100 sites and deploy a Solution Package with a Feature with List Instance in it. Simply recurse through the sites with PowerShell to provision it.
  • Feature Version actually means something in SharePoint 2010. It was unused attribute in SharePoint 2007.
  • #create new project#create content type based on Article#run package solutionAdd-SPSolution -LiteralPath "C:\\Users\\sp_admin\\Documents\\Visual Studio 2010\\Projects\\SharePointProject4\\SPDevWiki.ContentTypesFarmDemo\\bin\\debug\\SPDevWiki.ContentTypesFarmDemo.wsp"Install-SPSolution -Identity "SPDevWiki.ContentTypesFarmDemo.wsp" -GACDeployment#show that farm feature has it at | where {$_.DisplayName -eq 'SPDevWiki.ContentTypesFarmDemo_SPDevWiki.ContentTypesFarmDemo' } | select DisplayName, Version#show that feature doesn't exist at Site Collection yet$site = get-spsite "http://sp2010rtm:99"$feature = $site.Features | where {$_.DefinitionId -eq 'cc9f1e0b-44ac-4a75-880c-768576cfd4eb' }$featureEnable-SPFeature -Identity "SPDevWiki.ContentTypesFarmDemo_SPDevWiki.ContentTypesFarmDemo" -Url "http://sp2010rtm:99"#show that feature does exist at Site Collection$site = get-spsite "http://sp2010rtm:99"$feature = $site.Features | where {$_.DefinitionId -eq 'cc9f1e0b-44ac-4a75-880c-768576cfd4eb' }$feature#Add UpgradeActions for new Site column on Content Type#add a ApplyElementManifests#add the xml snippet#create the new Manifest File - highlight that field isn't a new SPI#Increment Feature Version from to -Identity "SPDevWiki.ContentTypesFarmDemo.wsp" -LiteralPath "C:\\Users\\sp_admin\\Documents\\Visual Studio 2010\\Projects\\SharePointProject4\\SPDevWiki.ContentTypesFarmDemo\\bin\\debug\\SPDevWiki.ContentTypesFarmDemo.wsp" -GACDeployment#Show how feature is updated in Farm - show it doesn't show up updated versionget-spfeature | where {$_.DisplayName -eq 'SPDevWiki.ContentTypesFarmDemo_SPDevWiki.ContentTypesFarmDemo' } | select DisplayName, Version#Need to shut down PowerShell to reflect the change here!get-spfeature | where {$_.DisplayName -eq 'SPDevWiki.ContentTypesFarmDemo_SPDevWiki.ContentTypesFarmDemo' } | select DisplayName, Version#Show how Version isn't updated on site yet$site = get-spsite "http://sp2010rtm:99"$feature = $site.Features | where {$_.DefinitionId -eq 'cc9f1e0b-44ac-4a75-880c-768576cfd4eb' }$feature#Run the upgrade$feature.Upgrade($false);#show that feature has upgraded on Site Collection now$feature#show Content Type updated showing new field#now show feature installed on new Site Collection that hasn't had it enabled beforeEnable-SPFeature -Identity "SPDevWiki.ContentTypesFarmDemo_SPDevWiki.ContentTypesFarmDemo" -Url "http://sp2010rtm:81"#show ContentType re-appears and that feature is now on$site = get-spsite "http://sp2010rtm:81"$feature = $site.Features | where {$_.DefinitionId -eq 'cc9f1e0b-44ac-4a75-880c-768576cfd4eb' }$feature#show that content Type does not have the new field#Run the upgrade$feature.Upgrade($false);#Show that content Type still does not have the new field$feature#Raise importance that you still need to add the stuff to the base content type too#Upgrade is purely to incrementally upgrade instances!#add <FieldRef /> to contenttypeUpdate-SPSolution -Identity "SPDevWiki.ContentTypesFarmDemo.wsp" -LiteralPath "C:\\Users\\sp_admin\\Documents\\Visual Studio 2010\\Projects\\SharePointProject4\\SPDevWiki.ContentTypesFarmDemo\\bin\\debug\\SPDevWiki.ContentTypesFarmDemo.wsp" -GACDeployment#Show that feature now has the new field#now add a feature receiver and add the code snippets#copy the feature assembly info into the upgrade feature assembly bits in properties window#add <CustomUpgradeAction Name="Upgrade6.0.0.0To7.0.0.0" /> to new VersionRangeUpdate-SPSolution -Identity "SPDevWiki.ContentTypesFarmDemo.wsp" -LiteralPath "C:\\Users\\sp_admin\\Documents\\Visual Studio 2010\\Projects\\SharePointProject4\\SPDevWiki.ContentTypesFarmDemo\\bin\\debug\\SPDevWiki.ContentTypesFarmDemo.wsp" -GACDeployment#close powershell#run$site = get-spsite "http://sp2010rtm:99"$feature = $site.Features | where {$_.DefinitionId -eq 'cc9f1e0b-44ac-4a75-880c-768576cfd4eb' }$feature#note that if this fails, stays at existing feature version but antying it's managed to do declaritively and imperatively will be done and not rolled out (ARGHHH!)$feature.Upgrade($false);$feature#not used#remove featureDisable-SPFeature -Identity "SPDevWiki.ContentTypesFarmDemo_SPDevWiki.ContentTypesFarmDemo" -Url "http://sp2010rtm:99"#show it gone from Content Types list#now remove v2.0.0.0 in fullUninstall-SPSolution -Identity "SPDevWiki.ContentTypesFarmDemo.wsp"Remove-SPSolution -Identity "SPDevWiki.ContentTypesFarmDemo.wsp"#now add v3.0.0.0 solutionAdd-SPSolution -LiteralPath "C:\\Users\\sp_admin\\Documents\\Visual Studio 2010\\Projects\\SharePointProject4\\SPDevWiki.ContentTypesFarmDemo\\bin\\debug\\SPDevWiki.ContentTypesFarmDemo.wsp"Install-SPSolution -Identity "SPDevWiki.ContentTypesFarmDemo.wsp" -GACDeploymentEnable-SPFeature -Identity "SPDevWiki.ContentTypesFarmDemo_SPDevWiki.ContentTypesFarmDemo" -Url "http://sp2010rtm:99"
  • You should probably start a new instance of PowerShell after each time you build, otherwise the actions you perform may be run against an outdated version of your assembly from the GAC.  The same thing sometimes applies to Visual Studio deployment, for instance if one solution refers to an assembly in another solution!
  • (get-spweb http://sp2010rtm:99/).Features | where {$_.DefinitionId -eq '7cd284c9-b998-457b-b782-4473744b7daf' }get-spfeature | where {$_.DefinitionId -eq '7cd284c9-b998-457b-b782-4473744b7daf' } | select DisplayName, Version
  • SPFeatureQueryResultCollection Depending on at what level you query the returned features could cover various scopesSPWebServiceFinds all instances of the feature with given id that require upgrade in the farm. All scopes of features (Farm, Web Application, Site collection, Web) are supported.SPWebApplicationFinds all instances of the feature with given id in all content databases. Web app/site collection/web scoped features are supported.SPContentDatabaseOverloads of QueryFeatures function of this class find site and web scoped features in content database that conform to filtering criteria. Returned collection is ordered with regard to web hierarchy. Parent web features goes before child web features and traversal of the tree is done in depth-first manner.SPSiteOverloads of QueryFeatures function of this class find web scoped features in site collection that conform to filtering criteria. Returned collection is ordered with regard to web hierarchy. Parent web features goes before child web features and traversal of the tree is done in depth-first manner. Overloads of QueryFeatures function of this class will be available in Client OM.
  • Deep dive into feature versioning in SharePoint 2010

    1. 1. Deep dive into feature versioning and upgrade support in SharePoint 2010<br />Jeremy Thake<br />
    2. 2. Jeremy Thake <br />Enterprise Architect since April ’11 at AvePoint<br />SharePoint MVP since July ’10<br />Co-Founder of<br />Speaker at MS TechEd 2009/10, SPC 11<br /><br /> @jthake<br />
    3. 3.
    4. 4.
    5. 5.
    6. 6. <Field><br /><ContentType><br /><ListInstance><br /><WebPart><br /><WorkflowInstance><br />
    7. 7. Some easier than others<br />Definition vs. Instance<br />Site Column <Field><br />SPSite, SPWeb<br />Content Type <ContentType> <br />SPSite, SPWeb, SPList<br />Web Part <WebPart> <br />WP Gallery, Instances on pages<br />List Template<br />SPSite, SPWeb, Instances at SPWeb<br />
    8. 8. Some easier than others<br />Module (Page Layout, Master Page, Style sheets)<br />As long as not ‘customised’<br />Renaming files<br />
    9. 9. “OLD SKOOL”<br />Imperative in-place upgrade<br />Deactivate/Activate -> “if column missing add it”<br />Deactivate/Retract/Remove/Add/Deploy/Activate<br />Won’t work if in USE!<br />Field<br />Content Types – blocks delete<br />Web Parts out of gallery and Web Part Instances<br />List Templates – removes but breaks List instances<br />Workflow – removes assembly, breaks Workflow instances<br />New Feature - Stapling<br />PowerShell<br />
    10. 10. V1.0.0.0<br />V12.0.0.0<br />
    11. 11.
    12. 12. One farm many feature versions active<br />SITE A<br />SITE B<br />SITE C<br />SPDevWiki<br />V1.0.0.0<br />SPDevWiki<br />V3.0.0.0<br />SPDevWiki<br />V2.0.0.0<br />SPDevWiki<br />V3.0.0.0<br />SPDevWiki<br />V3.0.0.0<br />SPDevWiki<br />V1.0.0.0<br />SPDevWiki<br />V2.0.0.0<br />SPDevWiki<br />V3.0.0.0<br />
    13. 13.
    14. 14.
    15. 15. Upgrading features declaratively<br />Version attribute not just for show ;-)<br />Not set by default in XML so uses<br />ActivationDependencies can specify version<br />UpgradeActions element<br />VersionRange with Begin & End versions<br />MinimumVersion<br />ApplyElementManifest<br />AddContentTypeField<br />MapFile<br />
    16. 16. Upgrading Features Declaratively<br />DEMO<br />
    17. 17. AddContentTypeField<br />Add Columns to ContentType<br />
    18. 18. ApplyElementManifests<br />Integrated new artefacts into existing feature<br />E.g. New Fields in a Content Type<br />
    19. 19. Mapfile<br />Repoint a file to a new location on filesystem<br />E.g. renaming/relocating a deployed style sheet<br />Uncustomised files only<br />
    21. 21. Upgrading Feature Instances<br />DEMO<br />
    22. 22. Code ran<br />update-spsolution -identity SharePointProject.wsp-literalpathbinDebugSharePointProject.wsp –GACDeployment<br />
    23. 23. Powershell<br />get-spfeature | where {$_.DefinitionId -eq '7cd284c9-b998-457b-b782-4473744b7daf' }<br />| select DisplayName, Version<br />(get-spweb http://sp2010rtm:99/).Features | where {$_.DefinitionId -eq '7cd284c9-b998-457b-b782-4473744b7daf' }<br />psconfig -cmd upgrade -inplaceb2b<br />$site = get-spsite http://siteurl<br />$enabledfeature = $site.Features | where {$_.DefinitionId -eq '7cd284c9-b998-457b-b782-4473744b7daf' }<br />if($enabledfeature)<br />{<br /> $enabledfeature.Upgrade($false)<br />}<br />
    24. 24.
    25. 25. Upgrade actions Imperative<br />Provide assembly & class in UpgradeActions<br />CustomUpgradeActionss element provides Name and Parameters<br />Fires FeatureUpgrading event receiver<br />
    26. 26. Upgrading Features Imperatively<br />DEMO<br />
    29. 29.
    30. 30. TIPS<br />Don’t forget to change definition as well do upgrade<br />ALWAYS quit PowerShell when rebuilding WSP<br />Or use different names for WSP<br />If CustomUpgradeAction fails, doesn’t upgrade feature<br />Will leave things “half baked” – defensive coding<br />Adjust ULS logs to see messages<br />‘Feature Infrastructure’, ‘Fields’, ‘General’<br />
    31. 31. What to watch - Definitions<br />Copy definition, create new one, hide old version<br />List Templates<br />Workflow<br />Site Definitions<br />or Feature stapling<br />
    32. 32. What to watch - instances<br />Web Parts<br />Imperatively modify properties<br />Assembly upgrade<br />List Instances<br />Incrementally upgrade<br />Workflows<br />Assembly upgrade on existing activities<br />Changing what activities exist on current instances<br />“You’re on your own soldier”<br />
    33. 33. SANDBOXED SOLUTIONS<br />Slightly different!<br />Upgrade button for Sandboxed Solutions<br />On upgrading a Solution<br />All Features are upgraded automatically!<br />
    34. 34. Solution version<br />Defined by having new wsp name <br />e.g. SPDevWiki_v1.0.0.0.wsp and SPDevWiki_v2.0.0.0.wsp<br />Sandboxed Solutions<br />Deploying different versions to different Site Collections in Farm<br />Supported in Farm Solutions<br />Easy way to identify what version in different Farms <br />no other way of identifying solutions<br />only keeps most recent<br />
    35. 35. Assembly versions<br />New Assembly Version<br />Workflow instances + Web Part instances<br />Will remove old version from GAC breaking old Web Parts<br />Use Binding Redirect if not worried about old assembly version – if so why do it in the first place?<br />Assembly Versioning broken in Sandboxed Solutions<br />
    36. 36. Feature upgrade object model<br />QueryFeatures method (4 overloads)<br />GuidfeatureId<br />GuidfeatureId, boolneedsUpgrade<br />GuidfeatureId, Version featureVersion<br />SPFeatureScope scope, boolneedsUpgrade<br />Available from SPWebService(Farm), SPWebApplication, SPContentDatabase & SPSite<br />
    37. 37. Versioning strategies<br />Main Goal<br />Identify which versions are across farm<br />Assembly version and Feature versions will diverge<br />Release notes needed!<br />Stick with one approach<br />Major.Minor.Build.Revision<br />Change severity (breaking/major/minor)<br />Shipping/non-shipping (product orientated)<br />Incorporate sprint/iteration<br />Incorporate changeset number<br />Other crazy approaches!<br />
    38. 38. How can I prepare 2007 code?<br />Start versioning your features – default<br /><SharePoint:UIVersionedContentUIVersion=“4”><br />Deprecated API’s<br />Binding redirects<br />VSeWSS -> VS2010 supported<br />WSPBuilder/STSDev/STSADM/custom -> manual<br />
    39. 39.
    40. 40. Sharepoint HEROES<br /><ul><li>Mike Morton (Microsoft)
    41. 41. Chris O’Brien (SharePoint MVP)
    42. 42. Josh Carlisle (SharePoint Brain Freeze)</li></li></ul><li>UI Feature upgrade<br /><br />
    43. 43. Visual Studio 2010 add-in <br />TechNet walkthrough for building VSIX add-in<br /><br />Tommy Segoro (WA, AUS)<br />Completed code sample<br /><br />
    44. 44. REFERENCES<br />Recorded webinar and scripts from session<br /><br />My Delicious Links<br /><ul><li>
    45. 45. SharePoint 2010 Developer Resources
    46. 46. Upgrading Custom Solutions</li></ul>SharePoint Patterns & Practices Group (SPG)<br /><ul><li>
    47. 47. Getting Started in SharePoint 2010 development
    48. 48. Building a SharePoint 2010 Dev Machine</li></ul>SPDevWiki Web Cast<br /><ul><li>Running SharePoint 2010 DevEnv</li></li></ul><li>Q & A<br />