Una de las tareas que me han asignado en mi nuevo trabajo consiste en la generación de las diferentes versiones del proyecto en el que trabaja el equipo de desarrollo al que pertenezco. Además de llevar todo el tema de branching y builds del servidor de TFS, al final de cada Build exitosa, hay que realizar un proceso que hasta ahora solo se hacía de forma manual, y que consistía en desplegar el resultado de la compilación en un Servidor FTP para que otro equipo (QA) lo pruebe y ponga en “Producción”.

Después de generar 3 versiones de la aplicación a mano, ya tenia noción suficiente para determinar que parte de todo el proceso podría ser automatizada. Una vez comprendido todo el proceso en lugar de crearme una aplicación con C# o VB.NET decidí utilizar “PowerShell” para crear un script que realice todas las operaciones mecánicas de copiar, renombrar y subir ficheros al FTP, al final también estoy usando .NET

Dentro de todos estos procesos, el de subir una carpeta y todos sus ficheros de forma recursiva es algo que seguramente reutilizaré en algún otro script, por lo que es esta es una buena oportunidad para crear otra entrada en este blog.

Descripción del proceso

Una de las mejoras que le han añadido a la versión 2 de Powershell, es la integración de un IDE para la creación y/o modificación de scripts. En este caso le han llamado ISE que significa (Integrated Scripting Environment) y entre otras cosas permite la depuración de scripts con “puntos de parada” (Break Points) y todo.

PowerSellISE

Entrando en materia. Lo parte fundamental de proceso consiste en ejecutar la siguiente línea de comandos.

ftp "-s:$FtpCommandFilePath" $HOSTNAME

Donde $FtpCommandFilePath no es más que la ruta a un fichero que contiene todos los comandos que queremos pasarle a la conexión con el FTP, desde el usuario y la contraseña que vamos a utilizar para conectarnos hasta el “Quit” final para desconectarnos.

Es script para la creación de este fichero y la ejecución final del comando es el siguiente.

Param (
    $LOCALFOLDER = "C:\Test"
    )
# FTP Configuration where the final structure is uploaded
$HOSTNAME = "192.168.1.10"; # FTP server's IP
$UPLOAD_DIR = "ChildFolder";    # Folder where the final structure is uploaded
$USER = "user";     # Enter a user name for FTP Server
$PASS = "password"; # Enter a password for FTP Password

if( $USER.Length -eq 0 ) { throw "Please provide a FTP server user name at Line 7"; }
if( $PASS.Length -eq 0 ) { throw "Please provide a FTP server password at Line 8"; }

function CopyFolderToFTP($sourceFolder, $uploadFiles)
{
    $name = [System.IO.Path]::GetFileName($sourceFolder);
    $result =  $result + "MKD `"" + $name + "`"`r`n"
    $result =  $result + "CD " + $name + "`r`n";
    
    if($uploadFiles)
    {
        foreach ($file in [System.IO.Directory]::GetFiles($sourceFolder))
        {
            $result = $result + "PUT `"" + $file + "`"`r`n";
        }
    }
    foreach ($folder in [System.IO.Directory]::GetDirectories($sourceFolder))
    {                    
        $result = CopyFolderToFTP $folder $uploadFiles;
    }
    $result =  $result + "CD ..`r`n";
    return $result;
}


"Uploading file to FTP server..."
$FtpCommandFilePath = [System.IO.Path]::GetFullPath([System.IO.Path]::Combine( $pwd.ToString(), "FTPCommand.txt" ) );    
if( $UPLOAD_DIR.Length -gt 0 ) { $FtpChdirCommand = "CD " + $UPLOAD_DIR; }
    
$FtpUploadCommand = CopyFolderToFTP $LOCALFOLDER $TRUE;
    
$FtpCommands = @( $USER, $PASS, $FtpChdirCommand, "BINARY", $FtpUploadCommand, "QUIT" );
$FtpCommand = [String]::Join( "`r`n", $FtpCommands );
set-content $FtpCommandFilePath $FtpCommand
    
ftp "-s:$FtpCommandFilePath" $HOSTNAME
    
del $FtpCommandFilePath
"FTP Complete."

Para ejecutarlo solo tienes que abrir Powershell navegar hasta la carpeta donde tienes el script y ejecutarlo pasándole como parámetro la carpeta que quieres subir al FTP. En mi caso lo tengo creado en el escritorio y quiero subir la carpeta “C:\Test”

RunScript

Y con esto tendríamos. Espero que este script le sea útil a alguien más.


 |