Web Deploy - Publish Website (MSDeploy)

Octopus.Script exported 2015-07-25 by bobjwalker belongs to ‘Web Deploy’ category.

Ensure that Web Deploy 3.5 is installed on the system. The installer is downloaded from http://www.iis.net/downloads/microsoft/web-deploy if required.

Parameters

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

Publish Url

PublishUrl

Publish url to use when publishing the website.

Allow Untrusted Certificate

AllowUntrustedCertificate = False

Allow untrusted certificate at the publish URL.

Website Name

WebsiteName

Website name to use when publishing the website.

Username

Username

Username to use when authenticating with the HTTPS server.

null

Password

Password to use when authenticating with the HTTPS server. You should create a sensitive variable in your project variables, and then bind this value.

Package Step Name

WebDeployPackageStepName

Name of the previously-deployed package step that contains the files that you want to deploy.

Enable App Offline Rule

EnableAppOfflineRule = False

Enables the App Offline Rule. See here for more details

Skip Paths From Sync

SkipSyncPaths

Semi-colon separated, absolute reg-ex paths to skip/not-sync during deployment. Handy for folders that you don’t want deleted etc. (Escape slashes)

Preserve App_Data

PreserveApp_Data = True

The App_Data and its files will not be deleted when this option is enabled

Script body

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

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Web.Deployment")

# A collection of functions that can be used by script steps to determine where packages installed
# by previous steps are located on the filesystem.
 
function Find-InstallLocations {
    $result = @()
    $OctopusParameters.Keys | foreach {
        if ($_.EndsWith('].Output.Package.InstallationDirectoryPath')) {
            $result += $OctopusParameters[$_]
        }
    }
    return $result
}
 
function Find-InstallLocation($stepName) {
    $result = $OctopusParameters.Keys | where {
        $_.Equals("Octopus.Action[$stepName].Output.Package.InstallationDirectoryPath",  [System.StringComparison]::OrdinalIgnoreCase)
    } | select -first 1
 
    if ($result) {
        return $OctopusParameters[$result]
    }
 
    throw "No install location found for step: $stepName"
}
 
function Find-SingleInstallLocation {
    $all = @(Find-InstallLocations)
    if ($all.Length -eq 1) {
        return $all[0]
    }
    if ($all.Length -eq 0) {
        throw "No package steps found"
    }
    throw "Multiple package steps have run; please specify a single step"
}

function Test-LastExit($cmd) {
    if ($LastExitCode -ne 0) {
        Write-Host "##octopus[stderr-error]"
        write-error "$cmd failed with exit code: $LastExitCode"
    }
}

$stepName = $OctopusParameters['WebDeployPackageStepName']

$stepPath = ""
if (-not [string]::IsNullOrEmpty($stepName)) {
    Write-Host "Finding path to package step: $stepName"
    $stepPath = Find-InstallLocation $stepName
} else {
    $stepPath = Find-SingleInstallLocation
}
Write-Host "Package was installed to: $stepPath"

Write-Host "##octopus[stderr-progress]"
 
$websiteName = $OctopusParameters['WebsiteName']
$publishUrl = $OctopusParameters['PublishUrl']

$destBaseOptions = new-object Microsoft.Web.Deployment.DeploymentBaseOptions
$destBaseOptions.UserName = $OctopusParameters['Username']
$destBaseOptions.Password = $OctopusParameters['Password']
$destBaseOptions.ComputerName = "https://$publishUrl/msdeploy.axd?site=$websiteName"
$destBaseOptions.AuthenticationType = "Basic"

$syncOptions = new-object Microsoft.Web.Deployment.DeploymentSyncOptions
$syncOptions.WhatIf = $false
$syncOptions.UseChecksum = $true

$enableAppOfflineRule = $OctopusParameters['EnableAppOfflineRule']
if($enableAppOfflineRule -eq $true)
{
    $appOfflineRule = $null
    $availableRules = [Microsoft.Web.Deployment.DeploymentSyncOptions]::GetAvailableRules()
    if (!$availableRules.TryGetValue('AppOffline', [ref]$appOfflineRule))
    {
        throw "Failed to find AppOffline Rule"
    }
    else
    {
        $syncOptions.Rules.Add($appOfflineRule)
        Write-Host "Enabled AppOffline Rule"
    }
}

$preserveAppData = [boolean]::Parse($OctopusParameters['PreserveApp_Data'])

if ($preserveAppData -eq $true) {
    
    Write-Host "Skipping delete actions on App_Data"
    $skipAppDataFiles = new-object Microsoft.Web.Deployment.DeploymentSkipRule("appDataFiles", "Delete", "filePath", "\App_Data\.*", $null)
    $skipAppDataDirectories = new-object Microsoft.Web.Deployment.DeploymentSkipRule("appDataDirectories", "Delete", "dirPath", "\App_Data(\.*|$)", $null)

    $syncOptions.Rules.Add($skipAppDataFiles);
    $syncOptions.Rules.Add($skipAppDataDirectories);
}

$SkipSyncPaths = $OctopusParameters['SkipSyncPaths']
if ([string]::IsNullOrEmpty($SkipSyncPaths) -eq $false)
{
    $skipPaths = $SkipSyncPaths.Split(";", [System.StringSplitOptions]::RemoveEmptyEntries)
    foreach($item in $skipPaths) {
        $index = $skipPaths.IndexOf($item)
        Write-Host "Skipping sync of AbsolutePath: $item."
        $name = "SkipDirective$index"
        $value = "absolutePath=$item"
        $skipDirective = new-object Microsoft.Web.Deployment.DeploymentSkipDirective($name, $value)
        $destBaseOptions.SkipDirectives.Add($skipDirective)
    }
}

if ($OctopusParameters['AllowUntrustedCertificate'] -eq $true) {
    [System.Net.ServicePointManager]::ServerCertificateValidationCallback = { return $true; }
}

Write-Host "Publishing Website"
$deploymentObject = [Microsoft.Web.Deployment.DeploymentManager]::CreateObject("contentPath", $stepPath)

$changes = $deploymentObject.SyncTo("contentPath", $websiteName, $destBaseOptions, $syncOptions)

#Write out all the changes.
$changes | Select-Object -Property *

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": "ba8581a6-c463-40fb-ab98-3800e761b6f4",
  "Name": "Web Deploy - Publish Website (MSDeploy)",
  "Description": "Ensure that Web Deploy 3.5 is installed on the system. The installer is downloaded from http://www.iis.net/downloads/microsoft/web-deploy if required.",
  "Version": 2,
  "ExportedAt": "2015-07-25T22:00:43.204+00:00",
  "ActionType": "Octopus.Script",
  "Author": "bobjwalker",
  "Parameters": [
    {
      "Name": "PublishUrl",
      "Label": "Publish Url",
      "HelpText": "Publish url to use when publishing the website.",
      "DefaultValue": null,
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Name": "AllowUntrustedCertificate",
      "Label": "Allow Untrusted Certificate",
      "HelpText": "Allow untrusted certificate at the publish URL.",
      "DefaultValue": "False",
      "DisplaySettings": {
        "Octopus.ControlType": "Checkbox"
      }
    },
    {
      "Name": "WebsiteName",
      "Label": "Website Name",
      "HelpText": "Website name to use when publishing the website.",
      "DefaultValue": null,
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Name": "Username",
      "Label": "Username",
      "HelpText": "Username to use when authenticating with the HTTPS server.",
      "DefaultValue": null,
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Name": "Password",
      "Label": null,
      "HelpText": "Password to use when authenticating with the HTTPS server. You should create a sensitive variable in your project variables, and then bind this value.",
      "DefaultValue": null,
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Name": "WebDeployPackageStepName",
      "Label": "Package Step Name",
      "HelpText": "Name of the previously-deployed package step that contains the files that you want to deploy.",
      "DefaultValue": null,
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Name": "EnableAppOfflineRule",
      "Label": "Enable App Offline Rule",
      "HelpText": "Enables the App Offline Rule. [See here for more details](http://www.iis.net/learn/publish/deploying-application-packages/taking-an-application-offline-before-publishing)",
      "DefaultValue": "False",
      "DisplaySettings": {
        "Octopus.ControlType": "Checkbox"
      }
    },
    {
      "Name": "SkipSyncPaths",
      "Label": "Skip Paths From Sync",
      "HelpText": "Semi-colon separated, absolute reg-ex paths to skip/not-sync during deployment. Handy for folders that you don't want deleted etc. (Escape slashes)",
      "DefaultValue": null,
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Name": "PreserveApp_Data",
      "Label": "Preserve App_Data",
      "HelpText": "The App_Data and its files will not be deleted when this option is enabled",
      "DefaultValue": "True",
      "DisplaySettings": {
        "Octopus.ControlType": "Checkbox"
      }
    }
  ],
  "Properties": {
    "Octopus.Action.Script.ScriptBody": "[System.Reflection.Assembly]::LoadWithPartialName(\"Microsoft.Web.Deployment\")\n\n# A collection of functions that can be used by script steps to determine where packages installed\n# by previous steps are located on the filesystem.\n \nfunction Find-InstallLocations {\n    $result = @()\n    $OctopusParameters.Keys | foreach {\n        if ($_.EndsWith('].Output.Package.InstallationDirectoryPath')) {\n            $result += $OctopusParameters[$_]\n        }\n    }\n    return $result\n}\n \nfunction Find-InstallLocation($stepName) {\n    $result = $OctopusParameters.Keys | where {\n        $_.Equals(\"Octopus.Action[$stepName].Output.Package.InstallationDirectoryPath\",  [System.StringComparison]::OrdinalIgnoreCase)\n    } | select -first 1\n \n    if ($result) {\n        return $OctopusParameters[$result]\n    }\n \n    throw \"No install location found for step: $stepName\"\n}\n \nfunction Find-SingleInstallLocation {\n    $all = @(Find-InstallLocations)\n    if ($all.Length -eq 1) {\n        return $all[0]\n    }\n    if ($all.Length -eq 0) {\n        throw \"No package steps found\"\n    }\n    throw \"Multiple package steps have run; please specify a single step\"\n}\n\nfunction Test-LastExit($cmd) {\n    if ($LastExitCode -ne 0) {\n        Write-Host \"##octopus[stderr-error]\"\n        write-error \"$cmd failed with exit code: $LastExitCode\"\n    }\n}\n\n$stepName = $OctopusParameters['WebDeployPackageStepName']\n\n$stepPath = \"\"\nif (-not [string]::IsNullOrEmpty($stepName)) {\n    Write-Host \"Finding path to package step: $stepName\"\n    $stepPath = Find-InstallLocation $stepName\n} else {\n    $stepPath = Find-SingleInstallLocation\n}\nWrite-Host \"Package was installed to: $stepPath\"\n\nWrite-Host \"##octopus[stderr-progress]\"\n \n$websiteName = $OctopusParameters['WebsiteName']\n$publishUrl = $OctopusParameters['PublishUrl']\n\n$destBaseOptions = new-object Microsoft.Web.Deployment.DeploymentBaseOptions\n$destBaseOptions.UserName = $OctopusParameters['Username']\n$destBaseOptions.Password = $OctopusParameters['Password']\n$destBaseOptions.ComputerName = \"https://$publishUrl/msdeploy.axd?site=$websiteName\"\n$destBaseOptions.AuthenticationType = \"Basic\"\n\n$syncOptions = new-object Microsoft.Web.Deployment.DeploymentSyncOptions\n$syncOptions.WhatIf = $false\n$syncOptions.UseChecksum = $true\n\n$enableAppOfflineRule = $OctopusParameters['EnableAppOfflineRule']\nif($enableAppOfflineRule -eq $true)\n{\n    $appOfflineRule = $null\n    $availableRules = [Microsoft.Web.Deployment.DeploymentSyncOptions]::GetAvailableRules()\n    if (!$availableRules.TryGetValue('AppOffline', [ref]$appOfflineRule))\n    {\n        throw \"Failed to find AppOffline Rule\"\n    }\n    else\n    {\n        $syncOptions.Rules.Add($appOfflineRule)\n        Write-Host \"Enabled AppOffline Rule\"\n    }\n}\n\n$preserveAppData = [boolean]::Parse($OctopusParameters['PreserveApp_Data'])\n\nif ($preserveAppData -eq $true) {\n    \n    Write-Host \"Skipping delete actions on App_Data\"\n    $skipAppDataFiles = new-object Microsoft.Web.Deployment.DeploymentSkipRule(\"appDataFiles\", \"Delete\", \"filePath\", \"\\App_Data\\.*\", $null)\n    $skipAppDataDirectories = new-object Microsoft.Web.Deployment.DeploymentSkipRule(\"appDataDirectories\", \"Delete\", \"dirPath\", \"\\App_Data(\\.*|$)\", $null)\n\n    $syncOptions.Rules.Add($skipAppDataFiles);\n    $syncOptions.Rules.Add($skipAppDataDirectories);\n}\n\n$SkipSyncPaths = $OctopusParameters['SkipSyncPaths']\nif ([string]::IsNullOrEmpty($SkipSyncPaths) -eq $false)\n{\n    $skipPaths = $SkipSyncPaths.Split(\";\", [System.StringSplitOptions]::RemoveEmptyEntries)\n    foreach($item in $skipPaths) {\n        $index = $skipPaths.IndexOf($item)\n        Write-Host \"Skipping sync of AbsolutePath: $item.\"\n        $name = \"SkipDirective$index\"\n        $value = \"absolutePath=$item\"\n        $skipDirective = new-object Microsoft.Web.Deployment.DeploymentSkipDirective($name, $value)\n        $destBaseOptions.SkipDirectives.Add($skipDirective)\n    }\n}\n\nif ($OctopusParameters['AllowUntrustedCertificate'] -eq $true) {\n    [System.Net.ServicePointManager]::ServerCertificateValidationCallback = { return $true; }\n}\n\nWrite-Host \"Publishing Website\"\n$deploymentObject = [Microsoft.Web.Deployment.DeploymentManager]::CreateObject(\"contentPath\", $stepPath)\n\n$changes = $deploymentObject.SyncTo(\"contentPath\", $websiteName, $destBaseOptions, $syncOptions)\n\n#Write out all the changes.\n$changes | Select-Object -Property *",
    "Octopus.Action.Script.Syntax": "PowerShell"
  },
  "Category": "Web Deploy",
  "HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates//opt/buildagent/work/75443764cd38076d/step-templates/web-deploy-publish-website-msdeploy.json",
  "Website": "/step-templates/ba8581a6-c463-40fb-ab98-3800e761b6f4",
  "Logo": "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",
  "$Meta": {
    "Type": "ActionTemplate"
  }
}

History

Page updated on Saturday, July 25, 2015