Saturday, July 25, 2009

Batch solution deployment between farms

Last week, we have mounted a new two-servers farm for our development environment. Among the task I had to do was to copy and deploy about 50 solutions (wsps) from the old farm to the new one. To do this, I wrote a console application to help me extract all the solutions installed and create at the same time a command file with the necessary StsAdm commands to install them in the new farm.

Here is what the console applications has to do :

- Create a folder "SolutionsToDeploy" where the WSPs will be extracted and the command file created.
- Iterate through the solutions in the solutions store, extract the wsp file and generate the Stsadm command needed to install it.

Here is the code :

Imports System.Text
Imports System.IO
Imports System
Imports Microsoft.SharePoint
Imports Microsoft.SharePoint.Administration
Imports System.Xml
Imports System.Web

Module ExtractSolutions
    Sub Main(ByVal args() As String)
            Dim solutions As SPSolutionCollection = SPFarm.Local.Solutions
            Dim Path As String = "SolutionsToDeploy/"
            Dim AllowGac As Boolean = False
            Dim AllowCas As Boolean = False

            ' Create the folder if it does not exist
            If Not System.IO.Directory.Exists(Path) Then
            End If

            'Create a file stream where StsAdm command will be added
            Dim wrt As System.IO.TextWriter = New StreamWriter(Path + "DeploySolutions.cmd")
            For Each sol As SPSolution In solutions
                'See if the parameters -AllowGacDeployment and -AllowCasPolicies are needed
                AllowGac = IIf(sol.ContainsGlobalAssembly, True, False)
                AllowCas = IIf(sol.ContainsCasPolicy, True, False)
                Dim strline As String = String.Empty

                'Extract the solution into a file
                Dim wsp As SPPersistedFile = sol.SolutionFile
                wsp.SaveAs(Path + sol.Name)

                'For every solution we need two commands : AddSolution and DeploySolution
                strline = "Stsadm -o AddSolution -FileName " + sol.Name
                If sol.DeploymentState = SPSolutionDeploymentState.GlobalAndWebApplicationDeployed Or sol.DeploymentState = SPSolutionDeploymentState.WebApplicationDeployed Then
                    For Each wapp As SPWebApplication In sol.DeployedWebApplications
                        strline = "Stsadm -o DeploySolution -name " + sol.Name + " -url " + wapp.GetResponseUri(SPUrlZone.Default).ToString() + IIf(AllowGac, " -AllowGacDeployment", "") + IIf(AllowCas, " -AllowCasPolicies", "") + " -Immediate"
                    strline = "Stsadm -o DeploySolution -name " + sol.Name + IIf(AllowGac, " -AllowGacDeployment", "") + IIf(AllowCas, " -AllowCasPolicies", "") + " -Immediate"
                End If

                ' Execute the timer job
                strline = "Stsadm -o ExecAdmSvcJobs"
            'Write the command file to disk and close the stream
            wrt = Nothing
        Catch ex As Exception            
        End Try
    End Sub
End Module

I executed the console application, copied the new folder created (SolutionsToDeploy) to the new farm and ran the command file (DeploySolutions.cmd). With one shot, all my 50 solutions were added and deployed to the new farm.

Hope this helps.

Friday, July 3, 2009

April 2009 CU Alternate Access Mapping issue... Again

I noticed in the last two weeks that many people are coming to my blog looking for information about the AAMs issue. Therefore, I want to tell you that Microsoft has been informed of the bug and that they are working on it. Let's just hope that the fix will be published in the August 2009 CU. Until then, if I find any workaround or get any information, I'll keep you informed.