1
#!/usr/bin/env perl2

3
use strict;4
use Config::IniFiles;5
use Date::Simple;6
use Net::FTP;7

8
# Global Var9
our $hIni;10
our $LOG;11
our $sLogFile= "/var/log/enightly-build.log";12
our $sIniFile="/root/workspace/cvsroot/install/smarteye/enterprise/tarbuild/ebuild.ini";13
our $sCurrDir=".";14
our $publishRoot=".";15
our $launchRoot=".";16
our $buildTime;17
our $productID="se8000";18
our $mainVersion="2";19
our $subVersion="1";20
our $buildCounter=1;21
our $distFtpIP;22
our $distFtpUser;23
our $distFtpPasswd;24
our $distFtpDir;25
our $distEdition;26
our $srcCvsRoot;27
our $srcWorkCopyRoot;28
our $confReposCvsRoot;29
our $confWorkCopyRoot;30

31
################### functions #########################32
sub Log33
{34
print LOG "$_[0]";35
}36
sub LogAndExit37
{38
print LOG "$_[0]";39
close LOG;40
exit 1;41
}42
sub InitBuild43
{44
open (LOG, "+>> $sLogFile") or die "Open $sLogFile Failed\n";45
open (CONFIG, "<$sIniFile") or LogAndExit ("Open $sIniFile Failed\n");46
$hIni = new Config::IniFiles -file => \*CONFIG or LogAndExit ("Create IniFile Object Failed\n");47

48
chomp ($buildTime = `date +%Y%m%d`);49
#[launch]50
$launchRoot = $hIni->val ("launch", "LaunchRoot");51
#[product_version]52
$productID = $hIni->val ("product_version", "ProductID");53
$mainVersion = $hIni->val ("product_version", "MainVersion");54
$subVersion = $hIni->val ("product_version", "SubVersion");55
$buildCounter = $hIni->val ("product_version", "BuildCounter");56
$buildCounter++;57
#[publish]58
$publishRoot = $hIni->val ("publish", "PublishRoot");59
$distFtpIP = $hIni->val ("publish", "FtpIP");60
$distFtpUser = $hIni->val ("publish", "FtpUser");61
$distFtpPasswd = $hIni->val ("publish", "FtpPasswd");62
$distFtpDir = $hIni->val ("publish", "FtpDistDir");63
$distEdition = $hIni->val ("publish", "DistEdition");64
#[src_path]65
$srcCvsRoot = $hIni->val ("src_path", "CvsRoot");66
$srcWorkCopyRoot = $hIni->val ("src_path", "WorkCopyRoot");67
#[config_repository]68
$confReposCvsRoot= $hIni->val ("config_repository", "CvsRoot");69
$confWorkCopyRoot= $hIni->val ("config_repository", "WorkCopyRoot");70
my $str = sprintf ("%03d", $buildCounter);71
#Log ("*-----------------------------Sm\@rtEye-20070527-[001]-------------------------------*\n");72
Log ("\n**************************************************************************************\n");73
Log ("*------------------------------Sm\@rtEye-$buildTime-[$str]-------------------------------*\n");74
Log ("**************************************************************************************\n\n");75
$hIni->setval ("product_version", "BuildCounter", "$buildCounter");76
chdir "$launchRoot";77
$hIni->WriteConfig ($sIniFile);78
my $cmd = "cvs commit -m \"Increase Build Counter To [$buildCounter]\" *";79
Log ("80
#must commit complete before tag81
}82
sub BuildProject83
{84
my $project = $_[0];85
my @modules = split /:/, $hIni->val ("$project", "Modules");86
my $module;87
my $distDir = "$publishRoot/$distEdition/$project";88
chomp (my $cDir = `pwd`);89
my $projectRoot = "$srcCvsRoot/$srcWorkCopyRoot";90
chdir "$projectRoot";91
Log ("92
foreach $module (@modules)93
{94
Log ("95
my $dir = $hIni->val ("$module", "Dir");96
my $bin = $hIni->val ("$module", "Bin");97
my $publishEdition = $hIni->val ("$module", "PublishEdition");98
my $make = $hIni->val ("$module", "MakeCmd");99
my $moduleroot = "$projectRoot/$dir";100
chdir "$moduleroot" or Log ("101
my $str = sprintf ("%03d", $buildCounter);102
my $publishVer = "$mainVersion\.$subVersion\.$str";103
`$make PUBLISH_VERSION=$publishVer`;104

105
Log ("106
if (! -f "$moduleroot/$publishEdition/$bin")107
{108
Log ("109
#resume110
next ;111
}112
my $cpcmd = "cp -f $moduleroot/$publishEdition/$bin $distDir/usr/sbin";113
`$cpcmd`;114
Log ("115
}116
chdir "$projectRoot";117
my $webRoot = $hIni->val ("$module", "WebRoot");118
if (length ($webRoot) != 0)119
{120
my $cpweb = "cp -rf $projectRoot/$webRoot/* $distDir/var/www/html";121
`$cpweb`;122
Log ("123
#clean CVS124
my $rmCVS = "find $distDir/var/www/html -name \"CVS\" | xargs rm -rf ";125
`$rmCVS`;126
Log ("127
}128
#resume129
chdir "$cDir";130
return 1;131
}132
sub CvsUpdate133
{134
chomp (my $cDir = `pwd`);135
#update the config-repository136
#chdir "$confReposCvsRoot/$confWorkCopyRoot";137
chdir "$confReposCvsRoot";138
my $cmd = "cvs update > /dev/null 2>&1";139
`$cmd`;140
Log ("141
#update the nightly-build config142
#chdir "$launchRoot";143
#`$cmd`;144
#Log ("
#update src146
chdir "$srcCvsRoot/$srcWorkCopyRoot";147
`$cmd`;148
Log ("149
chdir "$cDir";150
}151
sub CvsTagCommit152
{153
my $tagDir = $hIni->val ("cvs", "TagDir");154
my @arr = split /$tagDir/, $srcWorkCopyRoot;155
my $tDir = "$arr[0]";156
my $count = sprintf ("%03d", $buildCounter);157
chomp (my $cDir = `pwd`);158
chdir "$srcCvsRoot/$tDir";159

160
my $cmd = "cvs -q tag -F -c $productID-v_$mainVersion" . "_" . $subVersion . "_". "$count" . "-$buildTime" . " $tagDir";161
`$cmd`;162
Log ("163
#resume164
chdir "$cDir";165
}166
sub CreateTmpPublishDir167
{168
my $project = $_[0];169
chomp (my $cDir = `pwd`);170
my $distDir = "$publishRoot/$distEdition";171
mkdir "$publishRoot" if ! -d "$publishRoot";172
mkdir "$publishRoot/$distEdition" if ! -d "$publishRoot/$distEdition";173
#build packet174
chdir "$distDir" or return 0;175
if (! -d "$project")176
{177
my $cp = "cp -rf $confReposCvsRoot/$confWorkCopyRoot/$project .";178
my $rmCVS = "find . -name \"CVS\" | xargs rm -rf > /dev/null 2>&1";179
`$cp`;180
Log ("181
`$rmCVS`;182
Log ("183
}184
chdir "$cDir";185
return 1;186
}187
# args : ip, user, passwd, dir, upload-file188
sub FtpUpload189
{190
my ($IP, $user, $passwd, $rDir, $uploadFile) = @_;191
my $ftp;192
my $nRet = 1;193
if ($ftp = Net::FTP->new ($IP))194
{195
if ($ftp->login ("$user", "$passwd"))196
{197
$ftp->binary ();198
foreach my $dir (split /\//, $rDir)199
{200
if (! $ftp->cwd ("$dir"))201
{202
if (! ($ftp->mkdir ("$dir") and $ftp->cwd ("$dir")))203
{204
$nRet = 0;205
last;206
}207
}208
}209
if ($nRet == 1)210
{211
if ($ftp->put ("$uploadFile"))212
{213
Log ("214
$nRet = 1;215
}else216
{217
Log ("218
$nRet = 0;219
}220
}else221
{222
Log ("223
$nRet = 0;224
}225
$ftp->quit ();226
}else227
{228
Log ("229
$nRet = 0;230
}231
}else232
{233
Log ("234
$nRet = 0;235
}236
return $nRet;237

238
}239
sub PublishBuild240
{241
my $project = $_[0];242
chomp (my $currDir = `pwd`);243

244
my $distDir = "$publishRoot/$distEdition";245
chdir "$distDir";246
#create build no247
my $count = sprintf ("%03d", $buildCounter);248
my $verdir = "v_$mainVersion" . "_". $subVersion . "_". "$count" . "-" . "$buildTime";249
my $tarname = "$productID" . "-" . "$project" . "-" . "$verdir" . "\.tar\.gz";250
my $cmd = "tar -czf $tarname $project > /dev/null 2>&1";251
`$cmd`;252
Log ("253

254
#upload255
my $nRet = FtpUpload ($distFtpIP, $distFtpUser, $distFtpPasswd, "$distFtpDir/$verdir", $tarname);256

257
#resume258
chdir "$currDir";259
return $nRet;260
}261
sub main262
{263
InitBuild ;264
`alias cp='cp'`;265
chdir "$launchRoot";266
#[cvs]267
my $cvsSvrIP =$hIni->val ("cvs", "CvsSvrIP");268
my $cvsUser =$hIni->val ("cvs", "CvsUser");269
my $cvsPasswd =$hIni->val ("cvs", "CvsPasswd");270
my $cvsRoot =$hIni->val ("cvs", "CvsRoot");271
#cmd=cvs -d :pserver:cuisw:000000@10.1.150.253:/cvsroot login272
my $cmd = "cvs -d :pserver:" . $cvsUser . ":" . $cvsPasswd . "@" . $cvsSvrIP . ":/" . $cvsRoot . " login";273
#check cvs login succ or no274
my $tmpFile = "1234tmp4321";275
`$cmd > $tmpFile 2>&1`;276
open TMP, "$tmpFile";277
while (<TMP>)278
{279
if (/.*failed/s)280
{281
Log ("282
close TMP;283
unlink "$tmpFile";284
exit 1;285
}286
}287
# cvs login succ288
close TMP and unlink "$tmpFile";289

290
LogAndExit ("291
# check the project newer or no292
my $today = new Date::Simple;293
my $yesterday = $today - 1;294
my $ret = `cvs -q diff --brief -D $yesterday > /dev/null ; echo $?`;295
LogAndExit ("296

297
#we must update the config-repository if we go-to build project298
CvsUpdate;299

300
#current path is working copy root301
my @projects = split /:/, $hIni->val ("src_path", "Projects");302
my $project;303
foreach $project (@projects)304
{305
CreateTmpPublishDir ($project) and BuildProject ($project) and PublishBuild ($project);306
}307
CvsTagCommit;308
}309
################## start to run ########################310
main;第一次听说还有这么个名词儿.. 每天构建 ( nightly-build )
写了个脚本..这个是linux下的..window下的和这个差不多..就不贴出来了..
把这个脚本加入到crontab里就可以每天自动构建并上传到指定发布服务器上了..
挺不错的东西..
没有评论:
发表评论