Tuesday, April 5, 2011

Autonomy Interwoven TeamSite -> TortoiseSVN integration process

The following Perl script synchronises the TeamSite ‘STAGING’ area with SVN repository. 

#!/usr/bin/perl
####################################################################
            # Purpose:                   Teamsite -> SVN integration

            # Args:                        $iwwapath
####################################################################

            use POSIX qw(getcwd strftime);

            use Cwd;

                        try {

                                    my $dir = $ARGV[0];

                                    ## Constants declaration

                                    my $odLogIndex = "E:\\Req_Sys_SW\\Interwoven\\OpenDeployNG\\log\\rcv. appsPROD_flist.RUNDEPOLY.branch.log";

                                    my $odLog = "E:\\Req_Sys_SW\\Interwoven\\OpenDeployNG\\log\\rcv.appsPROD_flist.RUNDEPOLY.SourceServer.to. branch.log";                            

                                    my $username = "SVNuser";  #User should have access to all SVN applications Trunk folders

                                    my $password = "****";

                                    my $drive = "f:";

                                    my $share = "teamsite_integration";

                                    my $appDir = "application";

                                    my $target = "checkout";

                                    my $webdev = "\\inetpub\\webdev\\";

                                    my $commitSVN = " --message \"Automatic Teamsite Update\"";

                                    ##

                                    my $workDir = $drive . "\\" . $share . "\\" . $appDir . "\\";

                                    my $scriptLog = $0;

                                    my $currentLocation = substr($scriptLog, 0, get_last_pos($scriptLog,"\\"));

                                    my @svn, @app, @devSite, @url, $line, $drive, $appVal, $svnVal, $tmpVal, $tmpApp;

                                    my $pos1, $pos2, $devSiteVal, $appIndex, $replace , $find, $i;

                                    my $chkDirExists, $chkFolders, $lid, @folders, $chkFolderExists;

                                    my $msg = "";

                                    my $cmd = "";

                                    my $tmpTarget = "";

                                    my $beginJob = 0;

                                    my $endJob = 0;

                                    my $count_files = 0;

                                   

                                                $commitSVN = $commitSVN . " --username " . $username . " --password " . $password . " --non-interactive";

                                                $conf::date_format = "%d/%m/%Y";

                                                $conf::time_format = "%H:%M:%S";

                                                $scriptLog =~ s/.pl/.log/g;

                                                $app[0] = "app1";

                                                $app[1] = "app2";

                                                $app[2] = "app3";

                                                $svn[0] = "svn://server/app1/Trunk/";

                                                $svn[1] = "svn://server/app2/Trunk/";

                                                $svn[2] = " svn://server/app3/Trunk/";

                                                $devSite[0] = $drive . $webdev . "app1";

                                                $devSite[1] = $drive . $webdev . "app2";

                                                $devSite[2] = $drive . $webdev . "app3";

                                                # Get Open Deploy Job ID

                                                            if(-e $odLogIndex && -r $odLogIndex) {

                                                                        open(IN, "<$odLogIndex") || die "Couldn't open $odLogIndex: $!";

                                                            }

                                                            while ($line = <IN>) {

                                                                        if ((index($line, "Elapsed Time=") > -1)) {

                                                                                                $pos1 = index ($line, "Job ID=") + length("Job ID=");

                                                                                                $pos2 = index ($line, "   Deployment leg=") - length("   Deployment leg=");

                                                                                                $jobid = substr($line, $pos1, $pos2 - $pos1);

                                                                                    }

                                                            }

                                                            close(IN);

                                                            if (length($jobid) eq 0) {

                                                                        exit;

                                                            }         

                                                            $msg = "Step 1 of 9 : Get Open Deploy Job ID";

                                                            debug($scriptLog, $msg);

                                                            $msg = "Start: " . get_now_date() . " " . get_now_time();

                                                            debug($scriptLog, $msg);      

                                                            $msg = "Open Deploy Job ID: " . $jobid;

                                                            debug($scriptLog, $msg);

                                                            $msg = "Step 2 of 9 : Initialising - removing $target directory if exists";

                                                            debug($scriptLog, $msg);

                                                            $currentLocation = $currentLocation . "\\" . $target;

                                                            if (-d $currentLocation) {

                                                              $cmd = "rmdir " . $drive . "\\" . $share . "\\" . $target . " /S /Q" . " >> " . $scriptLog;

                                                              $msg = "Run: " . $cmd;

                                                              debug($scriptLog, $msg);

                                                             `$cmd`;

                                                            }

                                                            $tmpVal = "-- Processing file(";

                                                            $msg = "Step 3 of 9 : Extract all Received File/s to array";

                                                            debug($scriptLog, $msg);

                                                            if(-e $odLog && -r $odLog) {

                                                                        open(IN, "<$odLog") || die "Couldn't open $odLog: $!";

                                                            }

                                                            while ($line = <IN>) {

                                                                        if ($beginJob eq 0) {

                                                                                    if ((index($line, "Job ID=" . $jobid) > -1) && (index($line, "Elapsed Time=") <= -1)) {

                                                                                                $beginJob = 1;

                                                                                    }

                                                                        }         

                                                                        if ($beginJob eq 1) {

                                                                                    if (index($line, $tmpVal) > -1) {

                                                                                                $pos1 = index($line, $tmpVal) + length($tmpVal);

                                                                                                $pos2 = index($line, ")", $pos1);

                                                                                                $dir = substr($line, $pos1, $pos2 - $pos1);

                                                                                                push(@flist, $dir);

                                                                                    }

                                                                        }

                                                                        if ((index($line, "Job ID=" . $jobid) > -1) && (index($line, "Elapsed Time=") > -1)) {

                                                                                    last;

                                                                        }         

                                                            }

                                                            close(IN);

                                                            $appIndex = 0;

                                                            foreach $tmpFile (@flist){

                                                                        $msg = "** Processing: " . $tmpFile . " **";

                                                                        debug($scriptLog, $msg);

                                                                        $count_files++;

                                                                        $i = 0; 

                                                                        foreach $tmpApp (@app){

                                                                                    if (index($tmpFile, $tmpApp) gt -1){

                                                                                                $appVal = $app[$i];

                                                                                                $svnVal = $svn[$i];

                                                                                                $devSiteVal = $devSite[$i];

                                                                                                last;

                                                                                    }         

                                                                                    $i++;

                                                                        }

                                                                        if ($appIndex eq 0) {

                                                                                    $msg = "Step 4 of 9 : Checking out";

                                                                                    debug($scriptLog, $msg);

                                                                                    $cmd = "SVN checkout " . $svnVal . " " . $drive . "\\" . $share . "\\" . $target . "\\" . $appVal . " --username \"Teamsite\" --non-interactive" . " >> " . $scriptLog;

                                                                                    $msg = "Run: " . $cmd;

                                                                                    debug($scriptLog, $msg);

                                                                                    `$cmd`;

                                                                                    $appIndex++;

                                                                        }

                                                                        $msg = "Step 5 of 9 : Updating $target from Teamsite deployment";

                                                                        debug($scriptLog, $msg);

                                                                        $tmpTarget = $tmpFile;

                                                                        $replace = "\\\\" . $appDir . "\\\\";

                                                                        $find = "\\" . $target . "\\";

                                                                        $tmpTarget =~ s/$replace/$find/g;

                                                                        $cmd = "md " . substr($tmpTarget, 0, get_last_pos($tmpTarget, "\\")) . " >> " . $scriptLog;

                                                                        $msg = "Run: " . $cmd;

                                                                        debug($scriptLog, $msg);

                                                                        `$cmd`;

                                                                        $tmpVal = $tmpFile;

                                                                        $replace = "\\\\" . $appDir . "\\\\" . $appVal . "\\\\";

                                                                        $find = "\\" . $appDir . "\\generic\\";

                                                                        $tmpVal =~ s/$replace/$find/g;

                                                                        #Update this file from the current sub-site

                                                                        if (-e $tmpFile ) {

                                                                                    $cmd = "COPY " . $tmpFile . " " . $tmpTarget . " /Y" . " >> " . $scriptLog;

                                                                                    $msg = "Run: " . $cmd;

                                                                                    debug($scriptLog, $msg);

                                                                                    `$cmd`;

                                                                        } else {

                                                                                    $msg = "Warning: File " . $tmpFile . " not exists.";

                                                                                    debug($scriptLog, $msg);

                                                                        }

                                                                        $tmpVal = substr($tmpFile, index($tmpFile, "\\" . $appVal . "\\") + length("\\" . $appVal . "\\"), length($tmpFile));

                                                                        $devSiteVal = $devSiteVal . "\\" . $tmpVal;

                                                                        $cmd = "md " . substr($devSiteVal, 0, get_last_pos($devSiteVal,"\\")) . " >> " . $scriptLog;

                                                                        $msg = "Run: " . $cmd;

                                                                        debug($scriptLog, $msg);

                                                                        `$cmd`;

                                                                        $msg = "Step 6 of 9 : Copying from " . $tmpTarget . " to " . $devSiteVal;

                                                                        debug($scriptLog, $msg);

                                                                        $cmd = "COPY " . $tmpTarget . " " . $devSiteVal . " /Y" . " >> " . $scriptLog;

                                                                        $msg = "Run: " . $cmd;

                                                                        debug($scriptLog, $msg);

                                                                        `$cmd`;

                                                                        $cmd = "DEL /A:H /F /S /Q " . $drive . "\\" . $share . "\\" . $target . " >> " . $scriptLog;

                                                                        $msg = "Delete all hidden files: " . $cmd;

                                                                        debug($scriptLog, $msg);

                                                                        `$cmd`;

                                                                        $msg = "Step 7 of 9 : Adding back to SVN";

                                                                        debug($scriptLog, $msg);                              

                                                                        $chkDirExists = substr($tmpTarget, 0, get_last_pos($tmpTarget, "\\")) . ".svn";

                                                                        $msg = "Directory " . $chkDirExists;

                                                                        if (-d $chkDirExists ) {

                                                                                    $msg = $msg . " exists.";

                                                                            debug($scriptLog, $msg);

                                                                            $cmd = "SVN add " . $tmpTarget . " --force" . " >> " . $scriptLog;           

                                                                            $msg = "Run: " . $cmd;

                                                                                    debug($scriptLog, $msg);

                                                                                    `$cmd`;

                                                                                    $msg = "Step 8 of 9 : Committing back to SVN";

                                                                                    debug($scriptLog, $msg);

                                                                                    $cmd = "SVN commit " . $tmpTarget . $commitSVN . " >> " . $scriptLog;

                                                                                    $msg = "Run: " . $cmd;

                                                                                    debug($scriptLog, $msg);

                                                                                    `$cmd`;

                                                                        } else {

                                                                            $msg = $msg . " not exists.";

                                                                                    debug($scriptLog, $msg);                                                                             

                                                                                    $lid = $drive . "\\" . $share . "\\" . $target . "\\" . $appVal;

                                                                                    $chkFolders = substr(substr($tmpTarget, 0, get_last_pos($tmpTarget, "\\")), length($lid) + 1, length(substr($tmpTarget, 0, get_last_pos($tmpTarget, "\\"))));

                                                                                    @folders = split /\\/, $chkFolders;

                                                                                    $i = scalar @folders;

                                                                                    if ($i gt 0) {

                                                                                                $chkFolderExists = $lid;

                                                                                                foreach $dir (@folders)

                                                                                                            {         

                                                                                                                        $chkFolderExists = $chkFolderExists . "\\" . $dir;

                                                                                                            $cmd = "SVN add " . $chkFolderExists . " --force" . " >> " . $scriptLog;

                                                                                                            $msg = "Run: " . $cmd;

                                                                                                            debug($scriptLog, $msg);

                                                                                                            `$cmd`;

                                                                                                            $msg = "Step 8 of 9 : Committing back to SVN";

                                                                                                                        debug($scriptLog, $msg);

                                                                                                                        $cmd = "SVN commit " . $chkFolderExists . $commitSVN . " >> " . $scriptLog;

                                                                                                                        $msg = "Run: " . $cmd;

                                                                                                                        debug($scriptLog, $msg);

                                                                                                                        `$cmd`;

                                                                                                            last;     

                                                                                                            }

                                                                                    }

                                                                        }                                                                     

                                                            }

                                                            $msg = "Step 9 of 9 : Finalising - removing $target directory";

                                                            debug($scriptLog, $msg);

                                                            $cmd = "rmdir " . $drive . "\\" . $share . "\\" . $target . " /S /Q" . " >> " . $scriptLog;

                                                            $msg = "Run: " . $cmd;

                                                            debug($scriptLog, $msg);

                                                            `$cmd`;

                                                            $msg = "End: " . get_now_date() . " " . get_now_time();      

                                                            debug($scriptLog, $msg);

                                                            $msg = "Processed: " . $count_files . " file/s.";          

                                                            debug($scriptLog, $msg);

                                                            $msg = "____________________________________________________________________";

                                                            debug($scriptLog, $msg);



                                    sub debug {

                                                open(OUT, ">>@_[0]") || return;

                                                chmod(0664, "@_[0]");

                                                print OUT "@_[1]\n";

                                                close(OUT);

                                    }

                                   

                                    sub get_now_date{

                                                return POSIX::strftime($conf::date_format, localtime(time()));

                                    }

                                   

                                    sub get_now_time{

                                                return POSIX::strftime($conf::time_format, localtime(time()));

                                    }

                                   

                                    sub get_last_pos{

                                                $pos = -1;

                                                while (($pos = index(@_[0], @_[1], $pos)) > -1){

                                                            $pos++;

                                                            $pos_last = index(@_[0], @_[1], $pos);

                                                            if ($pos_last <= -1){

                                                                        $pos_last = $pos;

                                                            }

                                                }

                                                return $pos_last;         

                                    }                     

                        }

                        catch Error with {

                                    my $ex = shift;

                                    $msg = "** Error: " . $ex . " **";

                                    debug($scriptLog, $msg);

                        };

All (dynamic) application files should be imported initially to the TeamSite branch.  The script above should be called by the workflow associated with the TeamSite branch after content approval phase.  The process consists of the following steps:

·         Find OpenDeploy Job ID from the index log file.

·         Extract all received file/s referenced by the Job ID from the OpenDeploy log file.

·         Remove the checkout folder from the integration target location

·         Checkout appropriate application files into checkout folder

·         Update checkout files from the TeamSite deployment

·         Promote updated file/s to the appropriate environment (eg. DEV)

·         Delete all hidden files as required by SVN framework

·         Add updated file/s to the appropriate SVN repository

·         Commit updated file/s to the SVN repository

·         Remove temporary created checkout directory

The TeamSite->SVN integration area (\\destinationServer\Teamsite_Integration shared folder on the destination server) shows below

If you find this script useful please donate generously.