Deploy WSP with SharePoint 2010 PowerShell

The stsadm command was replaced by PowerShell cmdlets in 2010. To deploy on a Produciton, QA or DEV server you may probably need PowerShell scripts (with .ps1 suffix). However if you prefer GUI, you'll thank to Visual Studio 2010 as development and deployment is as simple as a few clicks.
You can use PowerShell to deploy on non-local servers and/or carry admin tasks. If the following message shows on the first line

The local farm is not accessible. Cmdlets with FeatureDependencyId are not registered.


then you may grant yourself access to the farm. Run as Aministrator and run

Add-SPShellAdmin -UserName domain\user

Then

Get-SPShellAdmin

It will show shell admin accounts. You mast be in that group. PowerShell authorization is very different to Central Admin, where you perform all tasks using Application Pool's account. If you cannot add yourself to SPShellAdmin group, try to add machinename\user instead and always run as administrator from the SharePoint 2010 group in Start Menu.

Make sure no warning message comes when you run SharePoint PowerShell then you can create an XML file and a script file to deploy wsp solution files.

config.xml:
<Solutions>
    <Solution Path="VisualWebPartProject.wsp" CASPolicies="false" GACDeployment="true">
        <WebApplications>
            <WebApplication>http://deploy</WebApplication>
        </WebApplications>
    </Solution>
</Solutions>

PowerShell script:

#install.ps1
    function Install-Solutions([string]$configFile)
    {
        if ([string]::IsNullOrEmpty($configFile)) { return }

        [xml]$solutionsConfig = Get-Content $configFile
        if ($solutionsConfig -eq $null) { return }

        $solutionsConfig.Solutions.Solution | ForEach-Object {
            [string]$path = $_.Path
            $path = "$pwd\$path"
            [bool]$gac = [bool]::Parse($_.GACDeployment)
            [bool]$cas = [bool]::Parse($_.CASPolicies)
            $webApps = $_.WebApplications.WebApplication
            Install-Solution $path $gac $cas $webApps
        }
    }

    function Install-Solution([string]$path, [bool]$gac, [bool]$cas, [string[]]$webApps = @())
    {
        $spAdminServiceName = "SPAdminV4"
        [string]$name = Split-Path -Path $path -Leaf
        $solution = Get-SPSolution $name -ErrorAction SilentlyContinue
        if ($solution -ne $null) {
            #Retract the solution
            if ($solution.Deployed) {
                Write-Host "Retracting solution $name..."
                if ($solution.ContainsWebApplicationResource) {
                    $solution | Uninstall-SPSolution -AllWebApplications -Confirm:$false
                } else {
                    $solution | Uninstall-SPSolution -Confirm:$false
                }
                Stop-Service -Name $spAdminServiceName
                Start-SPAdminJob -Verbose
                Start-Service -Name $spAdminServiceName    
            
                #Block until we're sure the solution is no longer deployed.
                do { Start-Sleep 2 } while ((Get-SPSolution $name).Deployed)
            }
            
            #Delete the solution
            Write-Host "Removing solution $name..."
            Get-SPSolution $name | Remove-SPSolution -Confirm:$false
        }
        
        #Add the solution
        Write-Host "Adding solution $name..."
        $solution = Add-SPSolution $path
        #Deploy the solution
        if (!$solution.ContainsWebApplicationResource) {
            Write-Host "Deploying solution $name to the Farm..."
            $solution | Install-SPSolution -GACDeployment:$gac -CASPolicies:$cas -Confirm:$false
        } else {
            if ($webApps -eq $null -or $webApps.Length -eq 0) {
                Write-Warning "The solution $name contains web application resources but no web applications were specified to deploy to."
                return
            }
            $webApps | ForEach-Object {
                Write-Host "Deploying solution $name to $_..."
                $solution | Install-SPSolution -GACDeployment:$gac -CASPolicies:$cas -WebApplication $_ -Confirm:$false
            }
        }

        Stop-Service -Name $spAdminServiceName
        Start-SPAdminJob -Verbose
        Start-Service -Name $spAdminServiceName    
        
        #Block until we're sure the solution is deployed.
        do { Start-Sleep 2 } while (!((Get-SPSolution $name).Deployed))
    }

$pwd=Get-Location
Install-Solution $pwd+"/config.xml"

When the two files are prepared, at PowerShell prompt type .\Install.ps1 will invoke the script. All you need to modify is the config.xml file.

Script is modified from:
http://stsadm.blogspot.com/2010/06/deploying-sharepoint-2010-solution.html

Comments

Popular posts from this blog

SharePoint 2010 upgrade from 2007 (content database, UI etc)

Ubuntu upgrade

Emacs keybinding in Visual Studio 2010