no xcopy

Stop using XCopy to deploy your web application or web services if you are using Visual Studio 2010. Why? If You're Using XCopy, You're Doing It Wrong.

Recently, I have been looking at the deployment of my current project that contains one ASP.NET MVC project, one WCF project. All the projects need to be deploy to several physical boxes in different regions like Dallas and Franklin. And after instructions presented by Scott Hanselman in his session. I decided to give a shot with MSDeploy.

First off, the deploy process should look like the following figure.

clip_image002

And actually, I would like to archive packages for each deployment for later references. So finally, the process should look like this.

  1. Get latest code from code base.
  2. Deploy
    1. Execute Script to do automated deployment
    2. Deploy to 1st server
      1. Build and generate packages on target server
      2. Deploy packages to target server
      3. Archive packages to backup folder.
    3. Deploy to 2nd server
      1. Build and generate packages on target server
      2. Deploy packages to target server
      3. Archive packages to backup folder.

Here is the implementation to do all the jobs mentioned above.

$msbuildPath = "C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe"

$consoleproj = "D:\Project\Website.csproj"
$serviceproj = "D:\Project\WebService.csproj"

$config_target_pairs =  (
                            ("QA1", "QAServer1"), # (configuration, target server)
                            ("QA2", "QAServer2")  # (configuration, target server)
                        )

$deployFolder = "APP_DEPLOY" # This folder, C:\APP_DEPLOY, should be created, and shared on each app server
$backupFolder = "APP_BACKUP" # This folder, C:\APP_BACKUP, should be created, and shared on each app server

foreach ($config_target in $config_target_pairs){
    $config = $config_target[0]
    $target = $config_target[1]
    
    ### Generating Package
    . $msbuildPath "$consoleproj" "/T:Package" "/P:Configuration=$config;PackageLocation=\\$target\$deployFolder\ConsolePackage.zip"	#build console package
    . $msbuildPath "$serviceproj" "/T:Package" "/P:Configuration=$config;PackageLocation=\\$target\$deployFolder\ServicePackage.zip"	#build service package
    
    ### Deploying
    icm $target -ArgumentList $deployFolder {
        param($deployFolder)
        . "C:\$deployFolder\ConsolePackage.deploy.cmd" "/Y"; # deploy console
        . "C:\$deployFolder\ServicePackage.deploy.cmd" "/Y"; # deploy service
    }
    
    ### Executing backup
    $backupDir = "C:\$backupFolder\"
    
    icm $target -ArgumentList $backupDir {
        param($backupDir)
        if(!(gi $backupDir)){  # create backup folder if it's not existed
            mkdir $backupDir
        }
    }
    
    $archiveName = Get-Date -uformat "%Y-%m-%d"       # yyyy-mm-dd as archive name

    $archives = icm $target -ArgumentList $backupDir, $archiveName {
        param($backupDir, $archiveName)
        ls "$backupDir" -Filter ($archiveName + "*")  # retrive all today's archives
    }
    
    if($archives){
        if(!$archives.length){                                    # if only one archive retrived
            $archiveName = $archiveName + "-1"                    # add prefix -1 as revision
        }else{                                                    # if more than on archives are retrived
            $archiveName = $archiveName + "-" + $archives.length  # use the count of archives as revision
        }
    }

    $archiveFolder = $backupDir + $archiveName +"\"
    
    icm $target -ArgumentList $deployFolder, $archiveFolder {
        param($deployFolder, $archiveFolder)
        mkdir $archiveFolder
        mv "C:\$deployFolder\*" "$archiveFolder"
    }
}

I tried to use remote deployment feature to deploy packages, but I encountered several errors. So the work-around is to use PowerShell remoting.

Several pre-requisites are required to execute this script.

  1. Install PowerShell 2.0 on build server and target servers and enable PowerShell remoting on target servers.
  2. Install MSDeploy 1.0 on target servers.
  3. Create folders, "C:\APP_DEPLOY", "C:\APP_BACKUP", on target servers and share "APP_DEPLOY" with writing permission.

Now you are all set.

Happy deploying.

 posted on 2011-03-18 18:21  助平君  阅读(1278)  评论(0编辑  收藏  举报