Octopus.Script exported 2015-08-25 by jaymickey belongs to ‘IIS’ category.
Create an IIS virtual directory.
Parameters
When steps based on the template are included in a project’s deployment process, the parameters below can be set.
Virtual path
VirtualPath =
The full path to the virtual directory you wish to create. Do not include the application (if any) the directory will be created under. The path, not including the virtual directory itself must already exist. Eg. If the virtual directory is to be created under myapp/someFolder/myVdir
enter: someFolder/myVdir
.
Application
ApplicationName =
Name of the IIS application to create the virtual directory under (not required).
Physical path
PhysicalPath =
Physical folder that the application will serve files from. Example: C:\MyApp
.
Create Physical Path (If not exists)
CreatePhysicalPath = False
Create the physical path if it does not exist.
Parent site
ParentSite
The name of the IIS web site to attach the application to. For example, to put the application under the default web site, enter:
Default Web Site
Username
Username
Pass-through authentication username
Password
Password
Pass-through authentication password
Script body
Steps based on this template will execute the following PowerShell script.
## --------------------------------------------------------------------------------------
## Input
## --------------------------------------------------------------------------------------
$virtualPath = $OctopusParameters['VirtualPath'].TrimStart('/',' ').TrimEnd('/', ' ')
$physicalPath = $OctopusParameters['PhysicalPath']
$parentSite = $OctopusParameters['ParentSite']
$application = $OctopusParameters['ApplicationName']
$username = $OctopusParameters['Username']
$password = $OctopusParameters['Password']
$createPhysicalPath = $OctopusParameters['CreatePhysicalPath']
## --------------------------------------------------------------------------------------
## Helpers
## --------------------------------------------------------------------------------------
# Helper for validating input parameters
function Confirm-Parameter([string]$parameterInput, [string[]]$validInput, $parameterName) {
Write-Host "${parameterName}: $parameterInput"
if (! $parameterInput) {
throw "No value was set for $parameterName, and it cannot be empty"
}
if ($validInput) {
if (! $validInput -contains $parameterInput) {
throw "'$input' is not a valid input for '$parameterName'"
}
}
}
# Helper to run a block with a retry if things go wrong
$maxFailures = 5
$sleepBetweenFailures = Get-Random -minimum 1 -maximum 4
function Invoke-CommandWithRetry([ScriptBlock] $command) {
$attemptCount = 0
$operationIncomplete = $true
while ($operationIncomplete -and $attemptCount -lt $maxFailures) {
$attemptCount = ($attemptCount + 1)
if ($attemptCount -ge 2) {
Write-Output "Waiting for $sleepBetweenFailures seconds before retrying..."
Start-Sleep -s $sleepBetweenFailures
Write-Output "Retrying..."
}
try {
& $command
$operationIncomplete = $false
} catch [System.Exception] {
if ($attemptCount -lt ($maxFailures)) {
Write-Output ("Attempt $attemptCount of $maxFailures failed: " + $_.Exception.Message)
}
else {
throw "Failed to execute command"
}
}
}
}
## --------------------------------------------------------------------------------------
## Configuration
## --------------------------------------------------------------------------------------
Confirm-Parameter $virtualPath -parameterName "Virtual path"
Confirm-Parameter $physicalPath -parameterName "Physical path"
Confirm-Parameter $parentSite -parameterName "Parent site"
if (![string]::IsNullOrEmpty($application)) {
$application = $application.TrimStart('/',' ').TrimEnd('/',' ')
}
Add-PSSnapin WebAdministration -ErrorAction SilentlyContinue
Import-Module WebAdministration -ErrorAction SilentlyContinue
## --------------------------------------------------------------------------------------
## Run
## --------------------------------------------------------------------------------------
Write-Host "Getting web site $parentSite"
$site = Get-Website -name $parentSite
if (!$site) {
throw "The web site '$parentSite' does not exist. Please create the site first."
}
$virtualFullPath = $virtualPath
if ($application) {
Write-Host "Verifying existance of application $application"
$app = Get-WebApplication -site $parentSite -name $application
if (!$app) {
throw "The application '$parentSite' does not exist. Please create the application first."
} else {
$virtualFullPath = $application + '/' + $virtualPath
}
}
# If the physical path down not exist and $createPhysicalPath is true,
# then attempt create it, otherwise throw an error.
if (!(Test-Path $physicalPath)) {
if ($createPhysicalPath) {
try {
Write-Host "Attempting to create physical path '$physicalPath'"
New-Item -Type Directory -Path $physicalPath -Force
} catch {
throw "Couldn't create physical path!"
}
} else {
throw "Physical path does not exist!"
}
}
# This needs to be improved, especially given applicaltions can be nested.
if ($application) {
$existing = Get-WebVirtualDirectory -site $parentSite -Application $application -Name $virtualPath
} else {
$existing = Get-WebVirtualDirectory -site $parentSite -Name $virtualPath
}
Invoke-CommandWithRetry {
$virtualDirectoryPath = "IIS:\Sites\$parentSite\$virtualFullPath"
if (!$existing) {
Write-Host "Creating virtual directory '$virtualPath'"
New-Item $virtualDirectoryPath -type VirtualDirectory -physicalPath $physicalPath
Write-Host "Virtual directory created"
}
else {
Write-Host "The virtual directory '$virtualPath' already exists. Checking physical path."
$currentPath = (Get-ItemProperty $virtualDirectoryPath).physicalPath
Write-Host "Physical path currently set to $currentPath"
if ([string]::Compare($currentPath, $physicalPath, $True) -ne 0) {
Set-ItemProperty $virtualDirectoryPath -name physicalPath -value $physicalPath
Write-Host "Physical path changed to $physicalPath"
}
}
## Set vdir pass-through credentails, if applicable
if (![string]::IsNullOrEmpty($username) -and ![string]::IsNullOrEmpty($password)) {
Write-Host "Setting Pass-through credentials for username '$username'"
Set-ItemProperty $virtualDirectoryPath -Name userName -Value $username
Set-ItemProperty $virtualDirectoryPath -Name password -Value $password
Write-Host "Pass-through credentials set"
}
}
Provided under the Apache License version 2.0.
To use this template in Octopus Deploy, copy the JSON below and paste it into the Library → Step templates → Import dialog.
{
"Id": "2cfbcd72-cf43-43fd-8291-9bb564cc512c",
"Name": "IIS Virtual Directory - Create",
"Description": "Create an IIS virtual directory.",
"Version": 7,
"ExportedAt": "2015-08-25T13:55:15.518+00:00",
"ActionType": "Octopus.Script",
"Author": "jaymickey",
"Parameters": [
{
"Name": "VirtualPath",
"Label": "Virtual path",
"HelpText": "The full path to the virtual directory you wish to create. Do not include the application (if any) the directory will be created under. The path, not including the virtual directory itself must already exist. Eg. If the virtual directory is to be created under `myapp/someFolder/myVdir` enter: `someFolder/myVdir`.",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Name": "ApplicationName",
"Type": "String",
"Label": "Application",
"HelpText": "Name of the IIS application to create the virtual directory under (not required).",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Name": "PhysicalPath",
"Label": "Physical path",
"HelpText": "Physical folder that the application will serve files from. Example: `C:\\MyApp`.",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Name": "CreatePhysicalPath",
"Label": "Create Physical Path (If not exists)",
"HelpText": "Create the physical path if it does not exist.",
"DefaultValue": "False",
"DisplaySettings": {
"Octopus.ControlType": "Checkbox"
}
},
{
"Name": "ParentSite",
"Label": "Parent site",
"HelpText": "The name of the IIS web site to attach the application to. For example, to put the application under the default web site, enter:\n\n Default Web Site",
"DefaultValue": null,
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Name": "Username",
"Label": "Username",
"HelpText": "Pass-through authentication username",
"DefaultValue": null,
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Name": "Password",
"Label": "Password",
"HelpText": "Pass-through authentication password",
"DefaultValue": null,
"DisplaySettings": {
"Octopus.ControlType": "Sensitive"
}
}
],
"Properties": {
"Octopus.Action.Script.ScriptBody": "## --------------------------------------------------------------------------------------\n## Input\n## --------------------------------------------------------------------------------------\n\n$virtualPath = $OctopusParameters['VirtualPath'].TrimStart('/',' ').TrimEnd('/', ' ')\n$physicalPath = $OctopusParameters['PhysicalPath']\n$parentSite = $OctopusParameters['ParentSite']\n$application = $OctopusParameters['ApplicationName']\n$username = $OctopusParameters['Username']\n$password = $OctopusParameters['Password']\n$createPhysicalPath = $OctopusParameters['CreatePhysicalPath']\n\n## --------------------------------------------------------------------------------------\n## Helpers\n## --------------------------------------------------------------------------------------\n# Helper for validating input parameters\nfunction Confirm-Parameter([string]$parameterInput, [string[]]$validInput, $parameterName) {\n Write-Host \"${parameterName}: $parameterInput\"\n if (! $parameterInput) {\n throw \"No value was set for $parameterName, and it cannot be empty\"\n }\n\n if ($validInput) {\n if (! $validInput -contains $parameterInput) {\n throw \"'$input' is not a valid input for '$parameterName'\"\n }\n }\n\n}\n\n# Helper to run a block with a retry if things go wrong\n$maxFailures = 5\n$sleepBetweenFailures = Get-Random -minimum 1 -maximum 4\nfunction Invoke-CommandWithRetry([ScriptBlock] $command) {\n $attemptCount = 0\n $operationIncomplete = $true\n\n while ($operationIncomplete -and $attemptCount -lt $maxFailures) {\n $attemptCount = ($attemptCount + 1)\n\n if ($attemptCount -ge 2) {\n Write-Output \"Waiting for $sleepBetweenFailures seconds before retrying...\"\n Start-Sleep -s $sleepBetweenFailures\n Write-Output \"Retrying...\"\n }\n\n try {\n & $command\n\n $operationIncomplete = $false\n } catch [System.Exception] {\n if ($attemptCount -lt ($maxFailures)) {\n Write-Output (\"Attempt $attemptCount of $maxFailures failed: \" + $_.Exception.Message)\n\n }\n else {\n throw \"Failed to execute command\"\n }\n }\n }\n}\n\n## --------------------------------------------------------------------------------------\n## Configuration\n## --------------------------------------------------------------------------------------\nConfirm-Parameter $virtualPath -parameterName \"Virtual path\"\nConfirm-Parameter $physicalPath -parameterName \"Physical path\"\nConfirm-Parameter $parentSite -parameterName \"Parent site\"\n\nif (![string]::IsNullOrEmpty($application)) {\n $application = $application.TrimStart('/',' ').TrimEnd('/',' ')\n}\n\nAdd-PSSnapin WebAdministration -ErrorAction SilentlyContinue\nImport-Module WebAdministration -ErrorAction SilentlyContinue\n\n\n## --------------------------------------------------------------------------------------\n## Run\n## --------------------------------------------------------------------------------------\n\nWrite-Host \"Getting web site $parentSite\"\n$site = Get-Website -name $parentSite\nif (!$site) {\n throw \"The web site '$parentSite' does not exist. Please create the site first.\"\n}\n\n$virtualFullPath = $virtualPath\n\nif ($application) {\n Write-Host \"Verifying existance of application $application\"\n $app = Get-WebApplication -site $parentSite -name $application\n if (!$app) {\n throw \"The application '$parentSite' does not exist. Please create the application first.\"\n } else {\n $virtualFullPath = $application + '/' + $virtualPath\n }\n}\n\n# If the physical path down not exist and $createPhysicalPath is true,\n# then attempt create it, otherwise throw an error.\nif (!(Test-Path $physicalPath)) {\n if ($createPhysicalPath) {\n try {\n Write-Host \"Attempting to create physical path '$physicalPath'\"\n New-Item -Type Directory -Path $physicalPath -Force\n } catch {\n throw \"Couldn't create physical path!\"\n }\n } else {\n throw \"Physical path does not exist!\"\n }\n}\n\n# This needs to be improved, especially given applicaltions can be nested.\nif ($application) {\n $existing = Get-WebVirtualDirectory -site $parentSite -Application $application -Name $virtualPath\n} else {\n $existing = Get-WebVirtualDirectory -site $parentSite -Name $virtualPath\n}\n\nInvoke-CommandWithRetry {\n\n $virtualDirectoryPath = \"IIS:\\Sites\\$parentSite\\$virtualFullPath\"\n\n if (!$existing) {\n Write-Host \"Creating virtual directory '$virtualPath'\"\n\n New-Item $virtualDirectoryPath -type VirtualDirectory -physicalPath $physicalPath\n\n Write-Host \"Virtual directory created\"\n }\n else {\n Write-Host \"The virtual directory '$virtualPath' already exists. Checking physical path.\"\n\n $currentPath = (Get-ItemProperty $virtualDirectoryPath).physicalPath\n Write-Host \"Physical path currently set to $currentPath\"\n\n if ([string]::Compare($currentPath, $physicalPath, $True) -ne 0) {\n Set-ItemProperty $virtualDirectoryPath -name physicalPath -value $physicalPath\n Write-Host \"Physical path changed to $physicalPath\"\n }\n }\n\n ## Set vdir pass-through credentails, if applicable\n if (![string]::IsNullOrEmpty($username) -and ![string]::IsNullOrEmpty($password)) {\n Write-Host \"Setting Pass-through credentials for username '$username'\"\n\n Set-ItemProperty $virtualDirectoryPath -Name userName -Value $username\n Set-ItemProperty $virtualDirectoryPath -Name password -Value $password\n\n Write-Host \"Pass-through credentials set\"\n }\n}\n",
"Octopus.Action.Script.Syntax": "PowerShell"
},
"Category": "IIS",
"HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates//opt/buildagent/work/75443764cd38076d/step-templates/iis-vdir-create.json",
"Website": "/step-templates/2cfbcd72-cf43-43fd-8291-9bb564cc512c",
"Logo": "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",
"$Meta": {
"Type": "ActionTemplate"
}
}
Page updated on Tuesday, August 25, 2015