Get rid of web.*.config files after deployment

Share your PowerShell scripts for Deployment Manager

Get rid of web.*.config files after deployment

Postby rborges » Tue Mar 04, 2014 10:42 pm

In addition to getting rid of web.*.config files we also keep our actual appSettings and connectionStrings values in a Config directory

Environments:
  • Dev
  • QA
  • QC
  • We do not currently have a Prod environment due to firewall requirements, but do maintain Prod configs
Config files example
  • Confg\\Dev\\appSettings.config
  • Config\\QA\\connectionStrings.config

We only want to keep the config files for the current environment, delete the rest, and delete the web.*.config files

Special requirement: when deploying to QC, we want to keep our Prod configs to help makes our production deployments a little easier.


Code: Select all
<#
   This is the post deployment script that will run after
   Red Gate Deployment Manager completes a deployment
   to one of the servers

   Expected Red Gate Variables:
      $RedGateEnvironmentName - should be either null, Dev, QA, QC

   This script should be placed at the root of every web site or web application that
   will be deployed using Deployment Manager

   This script will remove the web.*.config files and
   will delete the Configuration/* directories that don't apply to the current environment

   Example config files, if the current environment is QA:
      Web.config -> this file gets transformed
      Web.Debug.config -> will be deleted
      Web.Dev.config -> will be deleted
      Web.QA.config -> Deployment Manager will run this transform after the release config, this file will be deleted
      Web.QC.config -> will be deleted
      Web.Prod.config -> will be deleted
      Web.Release.config -> Deployment Manager always runs this file's transformations first

   Example config directories, if the current environment is QA:
      Configurations/Debug -> will be deleted
      Configurations/Dev -> will be deleted
      Configurations/QA -> will NOT be deleted
      Configurations/QC -> will be deleted
      Configurations/Prod -> will be deleted. If the current environment is QC, then this will not be deleted in order to aid with the deployment process
#>

# log file
$stream = [System.IO.StreamWriter] \"PostDeployLog.log\"

# name of, coming from Deployment Manager
$environmentName = $RedGateEnvironmentName

# path that the script is running in
$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition

if(!$environmentName)
{
   $stream.WriteLine(\"Environment not found. Will do nothing\")
}
else
{
   $stream.WriteLine(\"Environment is \" + $environmentName)
   
   # delete config transform files
   $webConfigs = Get-ChildItem web.*.config
   foreach($file in $webConfigs)
   {
      $stream.WriteLine(\"Removing file: \" + $file)
      Remove-Item $file.Name
      $stream.WriteLine(\"File removed: \" + $file)
      $stream.WriteLine(\"\")
   }
   # end delete config transform files

   # Delete config directories
   [System.IO.DirectoryInfo]$directInf = New-Object IO.DirectoryInfo($scriptPath + \"\\Configurations\")
   $folders = $directInf.GetDirectories()
   
   $stream.WriteLine(\"\")
   $stream.WriteLine(\"Deleting unnecessary folders in the Configurations directory\")   

   foreach($directory in $folders)
   {
      $stream.WriteLine(\"Current directory is: \" + $directory.Name)

      <#
         This is a mild attempt to reduce cyclomatic complexity
         if the current environment is QC and current directory is QC
            dont delete
         if the current environment is QC and the current directory is Prod
            dont delete
         if the current environment is QC and is any other directory
            delete
         if the current environment is not QC and the folder is the same as the environment
            dont delete
         if the current environment is not QC and the folder is not the same as the environment
            delete
      #>

      $isQcEnvironment = [string]::Compare($environmentName, \"QC\", $True)
      $currentDirectoryIsQc = [string]::Compare($directory.Name, \"QC\", $True)
      $currentDirectoryIsProd = [string]::Compare($directory.Name, \"Prod\", $True)
      $isFolderSameAsEnvironment = [string]::Compare($directory.Name, $environmentName, $True)

      if ($isQcEnvironment -eq 0 -and $currentDirectoryIsQc -eq 0)
      {
         $stream.WriteLine(\"Don't delete QC folder\")
      }
      elseif($isQcEnvironment -eq 0 -and $currentDirectoryIsProd -eq 0)
      {
         $stream.WriteLine(\"Don't delete Prod folder\")
      }
      elseif($isQcEnvironment -eq 0)
      {
         $stream.WriteLine(\"Delete \" + $directory.Name + \" folder\")
         $removalName = $directory.FullName
         $stream.WriteLine($removalName)
         Remove-Item $removalName  -recurse
      }
      elseif($isQcEnvironment -ne 0 -and $isFolderSameAsEnvironment -eq 0)
      {
         $stream.WriteLine(\"Don't delete \" + $directory.Name + \" folder\")
      }
      elseif($isQcEnvironment -ne 0 -and $isFolderSameAsEnvironment -ne 0)
      {
         $stream.WriteLine(\"Delete \" + $directory.Name + \" folder\")
         $removalName = $directory.FullName
         $stream.WriteLine($removalName)
         Remove-Item $removalName  -recurse
      }
      $stream.WriteLine(\"\")
   }
   # end Delete config directories
}
   
$stream.close()


rborges
 
Posts: 2
Joined: Tue Mar 04, 2014 10:23 pm

Return to Deployment Manager PowerShell Scripts

Who is online

Users browsing this forum: No registered users and 1 guest

cron