20171212

Export Automático de una KB.

Desde que Genexus basó la estructura de las KB en los archivos de Base de Datos, el proceso de "respaldar" una KB, pasó a depender en gran medida de la capacidad de el Motor de BD (que muchas veces no está instalado en nuestro PC) de realizar sus respaldos "sin errores".
En caso de un Problema, restauramos la ultima versión del respaldo de nuestra KB, con las consiguientes "perdidas" de trabajos realizados, ya que al restaurar la BD a una situación anterior, todos los cambios realizados con posterioridad, se "pierden".
El restaurar la BD es una situación muy buena, en el caso de un fallo catastrófico en nuestra KB, pero tratar de solucionar de esta manera problemas puntuales, es como querer practicar neurocirugía con un machete.
Ya no existe la opción de "respaldar el directorio" de la KB, y, si el servidor de BD es local, los archivos de la BD de nuestra KB estarán en ese directorio (si no especificamos algo diferente).
Realizar un ZIP (o RAR) diario de la carpeta de nuestra KB ya no nos soluciona nada.
La opción que personalmente me parece mas práctica, es realizar un EXPORT de todos los objetos de la KB, de forma diaria.
Al momento de tener que solucionar un problema, hay que abrir el archivo del export (.xpz) que nos interesa, e importar el respaldo puntual de lo que queremos reparar.
Acordarnos de hacer diariamente un EXPORT de la KB, puede ser un proceso que tarde o temprano olvidemos, con los consiguientes problemas.
Entonces, luego de investigar un poco, les traigo aca la solución que A MI me ha servido.
Esta solucón usa MSBUILD para construir el respaldo. 

 1) Crear un archivo (en mi caso BKP.msbuild) como el que aparece a continuación
<Project DefaultTargets="BKP" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <Import Project="C:\Program Files (x86)\Artech\GeneXus\GeneXusXEv3\Genexus.Tasks.targets" />
   <PropertyGroup>
      <KBPath>C:\Models\APC</KBPath>
   <ExportFileName>F:\BKP\APC.xpz</ExportFileName>
   </PropertyGroup>
   <Target Name="BKP">
  <OpenKnowledgeBase Directory="$(KBPath)" />
  <Export File="$(ExportFileName)"/>
   </Target>

</Project>
 Donde 
 a) C:\Models\APC // Es la ruta del Modelo que vamos a respaldar (En mi caso el Modelo se llama APC)
 b) F:\BKP\APC.xpz // es el archivo (con la ruta) de nuestro Export (en mi caso APC.xpz) 

2) Crear un archivo (En mi caso BKP.cmd) como el que aparece a continuacion 
F: 
cd \ 
cd BKP 
c:\Windows\Microsoft.NET\Framework\v3.5\MSBuild bkp.msbuild 
for /f "usebackq tokens=1,2 delims= " %%i in (`date /t`) do set tmpfecha=%%j 
for /f "usebackq tokens=1,2,3 delims=/" %%i in (`echo %tmpfecha%`) do set a=%%k_%%i_%%j 
move APC.xpz APC_%a%.xpz 
El proceso por lotes creado 
 a) me posiciona en el directorio donde hare el respaldo 
 b) Ejecuta el MSBUILD llamando al archivo bkp.msbuild creado en el paso 1 (El archivo esta en la ruta F:\BKP)
 c) Cambia el nombre del archivo APC.xpz creado a APC_YYYY_MM_DD.xpz (conde YYYY es el Año, MM el Mes y DD el día en que se realiza el proceso) 

3) Crear una tarea programada que ejecute el proceso por lotes BKP.cmd con la frecuencia deseada. 


Al ejecutarse obtendrán una salida como se muestra a continuación

f:\BKP>BackupModelo.cmd
f:\BKP\>f:
f:\BKP\>cd \
f:\>cd BKP
f:\BKP>
f:\BKP>c:\Windows\Microsoft.NET\Framework\v3.5\MSBuild bkp.msbuild
Microsoft (R) Build Engine, versión 3.5.30729.8795
[Microsoft .NET Framework, versión 2.0.50727.8784]
Copyright (C) Microsoft Corporation 2007. Reservados todos los derechos.

Build started 12/11/2017 13:29:25.
Project "f:\BKP\bkp.msbuild" on node 0 (default targets).
  ========== Open Knowledge Base Task started ==========
  &gt; Open Knowledge Base Task Success
  ========== Open Knowledge Base Task finished ==========
  ========== Export started ==========
  Exporting Category 'Main Programs'...
  Exporting Folder 'CommonApi'...
  Exporting Folder 'GeneralWeb'...
  Exporting Folder 'WebApi'...
  Exporting Folder 'SmartDevicesApi'...
.........
  Exporting Theme Class 'ReadonlyBlobContentAttSubTitle'...
  Exporting Theme Class 'BlobContentAttSubTitle'...
  Exporting Theme Class 'AttSubTitle'...
  Exporting Theme Class 'ReadonlyAttSubTitle'...
  Exporting Theme Class 'ReadonlyCheckBox'...
  Exporting Theme Class 'CheckBox'...
  Exporting Theme Class 'WorkWith'...
  Exporting Theme Class 'DisplayAttribute'...
  Exporting Theme Class 'Table100x100'...
  Exporting Theme Class 'header_pink_line'...
.........
  Exporting Attribute 'LRMicro'...
  Exporting Attribute 'LRCierre'...
  Compressing output file...
  Export File Created At: 'f:\BKP\APC.xpz'
  Export Time: XXXXXX seconds
  &gt; Export Success
  ========== Export finished ==========
Done Building Project "f:\BKP\bkp.msbuild" (default targets).
Build succeeded.
    0 Warning(s)
    0 Error(s)
Time Elapsed XX:XX:XX
f:\BKP>for /F "usebackq tokens=1,2 delims= " %i in (`date /t`) do set tmpfecha=%j
f:\BKP>set tmpfecha=12/11/2017
f:\BKP>for /F "usebackq tokens=1,2,3 delims=/" %i in (`echo 12/11/2017`) do set a=%k_%i_%j
f:\BKP>set a=2017_12_11
f:\BKP>move APC.xpz APC_2017_12_11.xpz
Se han movido         1 archivos.
f:\BKP>


Espero la solución pueda servir a aquellos que como yo, a veces necesitamos recuperar algo puntual y el proceso de respaldar lo hecho, restaurar la BD, impactar cambios, o realizar un Export de lo que necesitamos puntualmente, volver al respaldo antes del Import e impactar lo que exportamos, le resulta poco práctico. 

NOTA IMPORTANTE : NO USAR el MSBUILD de 64 bits !!!

No hay comentarios:

Publicar un comentario