SharePoint Solution Deployment

Octopus.Script exported 2015-10-09 by jasmin-mistry belongs to ‘SharePoint’ category.

SharePoint Solution Deployment for 2010 & 2013.

Parameters

When steps based on the template are included in a project’s deployment process, the parameters below can be set.

SharePoint Solution Package Step

NugetPackageStepName

Select the step in this project which downloads the SharePoint package.

Script body

Steps based on this template will execute the following PowerShell script.

$DeployedPath = $OctopusParameters["Octopus.Action[$NugetPackageStepName].Output.Package.InstallationDirectoryPath"]
$ReleaseNumber = $OctopusParameters["Octopus.Release.Number"]

Write-Host "Deploy Path: $DeployedPath"
Write-Host "Release Number: $ReleaseNumber"

function Deploy-SPSolution($wsp) {

	$wspName = $wsp.SubString($wsp.LastIndexOf("\") + 1)

	$solution = Get-SPSolution -Identity $wspName -ErrorAction silentlycontinue

	if ($solution -ne $null) 
	{ 
	    Write-Output "'$wspName' solution already installed - removing solution"
		
		# need to take a back up of this wsp before uninstalling it.		
		if($solution.ContainsWebApplicationResource) {
	        $solution | Uninstall-SPSolution -AllWebApplications -Confirm:$false
	    }
	    else {
	        $solution | Uninstall-SPSolution -Confirm:$false
	    }
		
		while ($solution.JobExists) {
		    Start-Sleep 30
		}
		
		Write-Output "$wspName has been uninstalled successfully."

	    Write-Output "Removing '$wspName' solution from farm" 
	    $solution | Remove-SPSolution -Force -Confirm:$false 
	
		# now install 
		Write-Output "Installing solution '$wspName'" 
		Add-SPSolution -LiteralPath "$wsp" | Out-Null
		
		Write-Output "$wsp solution added sucessfully"
		if(($solution -ne $null) -and ($solution.ContainsWebApplicationResource)) {
			Install-SPSolution -Identity $wspName –AllwebApplications -GACDeployment -Force -Confirm:$false
		}
		else {
			Install-SPSolution -Identity $wspName -GACDeployment -Force -Confirm:$false
		}

		<#
		while ($Solution.Deployed -eq $false) {
		    Start-Sleep 30
		}
		#>
	}
	else {
		Write-Output "Installing solution '$wspName'" 
		Add-SPSolution -LiteralPath "$wsp"  -ErrorAction Stop
		Install-SPSolution -Identity $wspName -GACDeployment -Force -ErrorAction Stop
	}
}

function Start-AdminService() {
	$AdminServiceName = "SPAdminV4"
	
	if ($(Get-Service $AdminServiceName).Status -eq "Stopped") {
	    Start-Service $AdminServiceName
	   	Write-Host "$AdminServiceName service was not running, now started."
		return $false;
	}
	
	return $true
}

function Stop-AdminService($IsAdminServiceWasRunning) {
	$AdminServiceName = "SPAdminV4"	
	if ($IsAdminServiceWasRunning -eq $false ) { 
		Stop-Service $AdminServiceName	
	}
}

#region Main
try
{
	# add powershell snap in for sharepoint functions
	if ((Get-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue) -eq $null) { 
	    Add-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue
	}
	
	#Admin service
	$IsAdminServiceWasRunning = $true;
	
	$IsAdminServiceWasRunning = Start-AdminService
	
	$wspFiles = @()
	
	# get all report files for deployment
    Write-Host "Getting all .wsp files"
    Get-ChildItem $DeployedPath -Recurse -Filter "*.wsp" | ForEach-Object { If(($wspFiles -contains $_.FullName) -eq $false) {$wspFiles += $_.FullName}}
    Write-Host "# of wsp files found: $($wspFiles.Count)"
	
	# loop through array
    foreach($wsp in $wspFiles) {
		Deploy-SPSolution $wsp
	}	
	
	Stop-AdminService $IsAdminServiceWasRunning
	
	#Remove SharePoint Snapin
	Remove-PsSnapin Microsoft.SharePoint.PowerShell
}
finally
{
    
}

#endregion

Provided under the Apache License version 2.0.

Report an issue

To use this template in Octopus Deploy, copy the JSON below and paste it into the Library → Step templates → Import dialog.

{
  "Id": "7ac03a43-cb18-4e83-a114-b158a2bb2a52",
  "Name": "SharePoint Solution Deployment",
  "Description": "SharePoint Solution Deployment for 2010 & 2013.",
  "Version": 1,
  "ExportedAt": "2015-10-09T16:20:24.330+00:00",
  "ActionType": "Octopus.Script",
  "Author": "jasmin-mistry",
  "Parameters": [
    {
      "Name": "NugetPackageStepName",
      "Label": "SharePoint Solution Package Step",
      "HelpText": "Select the step in this project which downloads the SharePoint package.",
      "DefaultValue": null,
      "DisplaySettings": {
        "Octopus.ControlType": "StepName"
      }
    }
  ],
  "Properties": {
    "Octopus.Action.Script.ScriptBody": "$DeployedPath = $OctopusParameters[\"Octopus.Action[$NugetPackageStepName].Output.Package.InstallationDirectoryPath\"]\n$ReleaseNumber = $OctopusParameters[\"Octopus.Release.Number\"]\n\nWrite-Host \"Deploy Path: $DeployedPath\"\nWrite-Host \"Release Number: $ReleaseNumber\"\n\nfunction Deploy-SPSolution($wsp) {\n\n\t$wspName = $wsp.SubString($wsp.LastIndexOf(\"\\\") + 1)\n\n\t$solution = Get-SPSolution -Identity $wspName -ErrorAction silentlycontinue\n\n\tif ($solution -ne $null) \n\t{ \n\t    Write-Output \"'$wspName' solution already installed - removing solution\"\n\t\t\n\t\t# need to take a back up of this wsp before uninstalling it.\t\t\n\t\tif($solution.ContainsWebApplicationResource) {\n\t        $solution | Uninstall-SPSolution -AllWebApplications -Confirm:$false\n\t    }\n\t    else {\n\t        $solution | Uninstall-SPSolution -Confirm:$false\n\t    }\n\t\t\n\t\twhile ($solution.JobExists) {\n\t\t    Start-Sleep 30\n\t\t}\n\t\t\n\t\tWrite-Output \"$wspName has been uninstalled successfully.\"\n\n\t    Write-Output \"Removing '$wspName' solution from farm\" \n\t    $solution | Remove-SPSolution -Force -Confirm:$false \n\t\n\t\t# now install \n\t\tWrite-Output \"Installing solution '$wspName'\" \n\t\tAdd-SPSolution -LiteralPath \"$wsp\" | Out-Null\n\t\t\n\t\tWrite-Output \"$wsp solution added sucessfully\"\n\t\tif(($solution -ne $null) -and ($solution.ContainsWebApplicationResource)) {\n\t\t\tInstall-SPSolution -Identity $wspName –AllwebApplications -GACDeployment -Force -Confirm:$false\n\t\t}\n\t\telse {\n\t\t\tInstall-SPSolution -Identity $wspName -GACDeployment -Force -Confirm:$false\n\t\t}\n\n\t\t<#\n\t\twhile ($Solution.Deployed -eq $false) {\n\t\t    Start-Sleep 30\n\t\t}\n\t\t#>\n\t}\n\telse {\n\t\tWrite-Output \"Installing solution '$wspName'\" \n\t\tAdd-SPSolution -LiteralPath \"$wsp\"  -ErrorAction Stop\n\t\tInstall-SPSolution -Identity $wspName -GACDeployment -Force -ErrorAction Stop\n\t}\n}\n\nfunction Start-AdminService() {\n\t$AdminServiceName = \"SPAdminV4\"\n\t\n\tif ($(Get-Service $AdminServiceName).Status -eq \"Stopped\") {\n\t    Start-Service $AdminServiceName\n\t   \tWrite-Host \"$AdminServiceName service was not running, now started.\"\n\t\treturn $false;\n\t}\n\t\n\treturn $true\n}\n\nfunction Stop-AdminService($IsAdminServiceWasRunning) {\n\t$AdminServiceName = \"SPAdminV4\"\t\n\tif ($IsAdminServiceWasRunning -eq $false ) { \n\t\tStop-Service $AdminServiceName\t\n\t}\n}\n\n#region Main\ntry\n{\n\t# add powershell snap in for sharepoint functions\n\tif ((Get-PSSnapin \"Microsoft.SharePoint.PowerShell\" -ErrorAction SilentlyContinue) -eq $null) { \n\t    Add-PSSnapin \"Microsoft.SharePoint.PowerShell\" -ErrorAction SilentlyContinue\n\t}\n\t\n\t#Admin service\n\t$IsAdminServiceWasRunning = $true;\n\t\n\t$IsAdminServiceWasRunning = Start-AdminService\n\t\n\t$wspFiles = @()\n\t\n\t# get all report files for deployment\n    Write-Host \"Getting all .wsp files\"\n    Get-ChildItem $DeployedPath -Recurse -Filter \"*.wsp\" | ForEach-Object { If(($wspFiles -contains $_.FullName) -eq $false) {$wspFiles += $_.FullName}}\n    Write-Host \"# of wsp files found: $($wspFiles.Count)\"\n\t\n\t# loop through array\n    foreach($wsp in $wspFiles) {\n\t\tDeploy-SPSolution $wsp\n\t}\t\n\t\n\tStop-AdminService $IsAdminServiceWasRunning\n\t\n\t#Remove SharePoint Snapin\n\tRemove-PsSnapin Microsoft.SharePoint.PowerShell\n}\nfinally\n{\n    \n}\n\n#endregion",
    "Octopus.Action.Script.Syntax": "PowerShell"
  },
  "Category": "SharePoint",
  "HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates//opt/buildagent/work/75443764cd38076d/step-templates/sharepoint-solution-deployment.json",
  "Website": "/step-templates/7ac03a43-cb18-4e83-a114-b158a2bb2a52",
  "Logo": "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",
  "$Meta": {
    "Type": "ActionTemplate"
  }
}

History

Page updated on Friday, October 9, 2015