您的位置:首页 > 其它

Automated Deployment for Websites and Web Services

2011-03-18 18:21 489 查看




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.





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

Get latest code from code base.

Deploy
Execute Script to do automated deployment

Deploy to 1st server
Build and generate packages on target server

Deploy packages to target server

Archive packages to backup folder.

Deploy to 2nd server
Build and generate packages on target server

Deploy packages to target server

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.

Install PowerShell 2.0 on build server and target servers and enable PowerShell remoting on target servers.

Install MSDeploy 1.0 on target servers.

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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: