文章出處
緣起:以前寫過一篇文章《Discuz!NT持續集成實戰》介紹CruiseControl.net 來做Discuz!NT項目的持續集成 。最近喜歡上了 Powershell ,由于本人向來懶惰,遂將日常工作中一些瑣碎的,重復的事情用 powershell 來做了。為此某不才,讀了 PowerShell 自帶的 《GettingStarted》和《UserGuide》 ,基本的東西也就差不多了。在實踐的過程中也曾被一些小問題卡住,在ps自帶的文檔中沒有發現解決辦法。幸而得到高人相助,一句話道破天機。(悄悄說:這位高人最近醞釀一件關于ps的作品)
廢話少說,上代碼:
Code dnt_publish.ps1
#dnt_publish.ps1 Create by 戲水 2008年12月23日13:05:22 zjneter.cnblogs.com
#環境變量
Set-Location -path E:\publish
. .\functions.ps1 #引入外部文件,相當于include
$Src = "E:\source\dnt\3"
$SetupPublishTo = "E:\publish\pub_dnt26"
$SourcePublishTo = "E:\publish\source\dnt26"
$ZipSetupFileName = ".\dnt_26_n2.zip"
$ZipSourceFileName = ".\dnt26_n2_src"
$ExcludeFile = get-content -path .\ExcludeFile.txt
$ExcludeDir = get-content -path .\ExcludeDir.txt
$IsZipSetup=Read-Host("是否生成安裝包?[y\n]")
$IsZipSource=Read-Host("是否生成源碼包?[y\n]")
$IsUploadSetupToDntWebServer=Read-Host("是否上傳安裝包到nt官方?[y\n]")
$IsUploadSetupToDownloadServer=Read-Host("是否上傳安裝包到下載服務器?[y\n]")
$IsUploadSourceToDownloadServer=Read-Host("是否上傳源碼包到下載服務器?[y\n]")
#SVN更新
svn up $Src
#編譯解決方案
C:\Windows\Microsoft.NET\Framework\v3.5\MSBuild.exe $Src\Discuz_vs08.sln /t:Build /v:m /fileLoggerParameters:LogFile=MyLog.log;
#生成模板
#處理安裝包
if ($IsZipSetup -eq "y") #如果變量IsZipSetup=="y"
{
#復制及清理文件
robocopy $Src\Discuz.Web $SetupPublishTo\upload_files /E /XF $ExcludeFile /XD $ExcludeDir /MIR
.\clear.bat #在這個bat中進行了一些清理文件的操作
#開始壓縮
wzzip $ZipSetupFileName $SetupPublishTo -r -p #調用winzip的命令行 生成壓縮包,參數說明請google
}
#處理源代碼包 ,ExportDNTSource 是戲水自己寫的function
if ($IsZipSource -eq "y")
{
ExportDNTSource 'https://svn.bugaosuni.com/dnt' E:\publish\source\dnt26
wzzip $ZipSourceFileName $SourcePublishTo -r -p
}
#是否發布到nt.discuz.net
if ($IsUploadSetupToDntWebServer -eq "y")
{
#Write-Host "UploadSetupToDntWebServer $IsUploadSetupToDntWebServer"
UploadSetupToDntWebServer
}
#是否發布到download.comsenz.com
if ($IsUploadSetupToDownloadServer -eq "y")
{
#Write-Host "UploadSetupToDownloadServer $IsUploadSetupToDownloadServer"
UploadToDownloadServer $ZipSetupFileName "2.6"
}
if ($IsUploadSourceToDownloadServer -eq "y")
{
UploadToDownloadServer $ZipSourceFileName "src"
}
下面是一些功能函數 :
Code
function.ps1
#function.ps1 Create by 戲
水 2008年12月23日
13:16:43 zjneter.cnblogs.com
#上傳ftp
function global:Upload
{
#param定義函數接受的參數,可以指定默認值
param([string]$h, [string]$u, [string]$p,[string]$f,[string]$cd="\")
$cmd = "open $h
user $u $p
binary
cd $cd
put $f"
$cmd | ftp -n
}
function UploadSetupToDntWebServer
{
Write-Host -foregroundcolor green "開始ftp上傳到官方網站"
Upload -h 221.194.139.228 -u nicai -p !@#$%^&*() -f $ZipSetupFileName
if ($?)
{
Write-Host -foregroundcolor green "上傳到官方網站成功!"
}
else
{
Write-Host -foregroundcolor red "上傳到官方網站失敗!"
}
#$?變量表示最后一個操作成功與否,成功返回true
}
function UploadToDownloadServer
{
param([string]$filename,[string]$cd)
Write-Host -foregroundcolor green "開始ftp上傳到下載服務器"
Upload -h download.comsenz.com -u nizaicai -p !@#$%^&*() -f $filename -cd $cd
if ($?)
{
Write-Host -foregroundcolor green "上傳到下載服務器成功!"
}
else
{
Write-Host -foregroundcolor red "上傳到下載服務器失敗!"
}
}
function ExportDNTSource
{
param([string]$url,[string]$path)
Remove-Item $path -force -recurse
svn export $url $path 從svn中導出無版本控制的源代碼
if ($?)
{
Write-Host -foregroundcolor green "導出源代碼成功!"
}
else
{
Write-Host -foregroundcolor red "導出源代碼失敗!"
}
}
這里需要注意的是 dnt_publish.ps1文件中 引入 function.ps1文件的方法:文件名前用了兩個點,而且兩個點中間需要有空格。
閑言碎語:不才初步體驗了PowerShell 一下,感覺很不錯哦,像粘合劑一樣 把一些小工具 ,WMI .Net Framework 等聯系起來 組成超級強大的武器。 語法么還是稍稍感覺有些怪,不太舒服,不過習慣就好了。 另外如果VS能支持 PowerShell 就好了,感覺 PowerShellPlus 用起來還是稍稍不爽。自從寫了這個腳本,一切只需輕輕的點一下鼠標,真個過程就自動ok了 (過程: svn check out -> MSBuild 編譯解決方案 -> 上傳到FTP服務器) 。當然 結合前天代震軍同學翻譯的文章
http://www.cnblogs.com/daizhj/archive/2008/12/22/1352019.html ,就可以實現整個的打包發布流程咯。
行文倉促,如有謬誤 ,還請指正
編輯器不好用,上面的代碼可能有問題, 提供源代碼下載:http://files.cnblogs.com/zjneter/dnt_publish.rar
留言列表