Deploy a SharePoint site using automated powershell script

This blog is about deploying a SharePoint solution using powershell script. Usually during the development phase, a developer creates a web application, creates a site collection, then install the WSP solution manually. But the whole process can be automated in order to make deployment simple in testing, UAT or production environments.

We need 3 files in all for the deployment that needs to be placed in same folder:

1. Deploy.bat - A batch file that is used as a trigger to execute the powershell script and can be called from command prompt.
2. Deploy.ps1 - The powershell script file (.ps1).
3. Demo.Project.wsp - The SharePoint solution file.

 

Deploy.bat

powershell -Command "& {Set-ExecutionPolicy bypass}" -NoExitpowershell -Command "& {.\Deploy.ps1}" -NoExit

pause

 

We need some information about the environment and names of objects like site collection, web application, etc. Here we will have all these data stores in configurable variables.

The script will execute following steps including validation checks:

1. Create a web application
2. Create a site collection
3. Add and install WSP solution

You need to set the values of the variables mentioned at starting of the script under headings: Web Application settings, Site Collection Settings and Solution Settings. Once these configuration settings are done, you can run the script

Deploy.ps1

Add-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue

Write-Host Write-Host "Initializing..." -foregroundcolor Green

# Web Application settings$WebAppName = "WebAppTest"$WebAppPort = 100$sp_webapp_url = "https://MACH-I-NE"  #Machine name$WebAppAppPool = "AppPoolTest"$WebAppAppPoolAccount = "domain\user"$WebAppDatabaseName = "WebAppTest_Content_Database"$WebAppDatabaseServer = "MACH-I-NE\SP_SQLDBINSTANCE" 

# Site collection settings$SiteCollectionName = "TestSiteCollection" $SiteCollectionURL =  $sp_webapp_url + ":" + $WebAppPort$SiteCollectionLanguage = 1033 $SiteCollectionOwner = "domain\user"$SiteCollectionTemplate = "BICenterSite#0"    #This is BI site template, you need to select as per your requirement

#Solution settings$SolutionName = "Demo.Project.wsp"

Write-Host Write-Host "-------------------------------------" -foregroundcolor GreenWrite-Host "Creating WebApp using Classic authentication..." -foregroundcolor GreenWrite-Host "-------------------------------------" -foregroundcolor Green

$sp = Get-SPWebApplication | Where {$_.DisplayName -eq $WebAppName} if($sp -eq $null) {   New-SPWebApplication -Name $WebAppName -Port $WebAppPort -URL ($sp_webapp_url) -ApplicationPool $WebAppAppPool -ApplicationPoolAccount (Get-SPManagedAccount $WebAppAppPoolAccount) -DatabaseName $WebAppDatabaseName -DatabaseServer $WebAppDatabaseServer

 # display site info Write-Host  Write-Host "Web App created" -foregroundcolor Green Write-Host "-------------------------------------" -foregroundcolor Green} else {        Write-Host        Write-Host "Web Application already exists, skipping this step" -foregroundcolor yellow}

Write-Host Write-Host "-------------------------------------" -foregroundcolor GreenWrite-Host "Creating site collection..." -foregroundcolor Green

 # Delete any existing site found at target URL 

$targetUrl = Get-SPSite | Where-Object {$_.Url -eq $SiteCollectionURL} if ($targetUrl -ne $null)  {   Write-Host "Site already exist, Deleting existing site : " $SiteCollectionURL -foregroundcolor yellow

   Remove-SPSite -Identity $SiteCollectionURL -Confirm:$false     Write-Host    Write-Host "Existing site collection deleted..." -foregroundcolor yellow }

 # Create new site collection 

New-SPSite -URL $SiteCollectionURL -OwnerAlias $SiteCollectionOwner -Language $SiteCollectionLanguage -Template $SiteCollectionTemplate -Name $SiteCollectionName

Write-Host Write-Host "Site collection created" -foregroundcolor GreenWrite-Host "-------------------------------------" -foregroundcolor Green

Write-Host Write-Host "-------------------------------------" -foregroundcolor GreenWrite-Host "Deploying WSP package..." -foregroundcolor GreenWrite-Host "-------------------------------------" -foregroundcolor Green

 # If solution already exists, Retract, Remove old solution and Add, Deploy new solution

$solution = Get-SPSolution $SolutionName -ErrorAction SilentlyContinue if ($solution -ne $null)  {   Write-Host   Write-Host "Solution already exists. " $solution -foregroundcolor Yellow     $solution | Uninstall-SPSolution -AllWebApplications  -confirm:$false          Write-Host "Retracting solution..." -foregroundcolor Yellow

 # Retracting job is assigned to timer job, so we need to wait for it to complete before removing solution. 

    while ( $solution.JobExists )   {    sleep 3    write-host "."   }   write-host "solution retracted" -foregroundcolor yellow   Write-Host   Write-Host "Removing solution " $solution -foregroundcolor Yellow      $solution | Remove-SPSolution -confirm:$false

   Write-Host "Removed"

  }

   Write-Host    Write-Host "Adding solution " $solution -foregroundcolor Green    Add-SPSolution $SolutionName     Write-Host    Write-Host "Solution Added. Now Installing WSP solution..." -foregroundcolor Green

  $SolutionName | Install-SPSolution –WebApplication $WebAppName -language 0 -GACDeployment

 # Wait for timer job to complete     $solution.JobExists

   while ( $solution.JobExists )   {    sleep 3    write-host "."   }

 write-host "Deployment complete" -foregroundcolor Green Write-Host "-------------------------------------" -foregroundcolor GreenRemove-PsSnapin Microsoft.SharePoint.PowerShell

 

 

 

 Please note that this script does not have all the steps or commands that might be needed for a generic project, but it will give a clear idea about the approach and you can add or remove commands as per your requirements.