Mostrando las entradas con la etiqueta GeneXus. Mostrar todas las entradas
Mostrando las entradas con la etiqueta GeneXus. Mostrar todas las entradas

domingo, 21 de abril de 2013

Automatizando Builds con GXserver y CruiseControl.NET

Imagen de 'Automatizando Builds con GXserver y CruiseControl.NET'Una de las ventajas de utilizar un repositorio de control de cambios, como es GeneXus Server para el desarrollo con GeneXus, es la posibilidad de automatizar el proceso de armado de un proyecto a partir de los cambios que van haciendo los desarrolladores.

Esta es una guía de cómo poner esto en práctica.


Para qué automatizar el armado del proyecto

Tener un proceso automático es uno de los componentes básicos de Integración Continua, una práctica en el desarrollo de software que consiste en integrar frecuentemente (varias veces por día), el trabajo de los diferentes desarrolladores con el objetivo de detectar lo más pronto posible los problemas de integración. Los ambientes de trabajo de los diferentes desarrolladores se integran por medio de los commits que estos hacen a un repositorio central, y la integración es verificada por un proceso automático de armado del proyecto, que también puede incluir otros tests.

Pero sea en el contexto de Integración Continua, o de integraciones menos frecuentes, el solo hecho automatizar el armado a partir de lo que está en el repositorio tiene ventajas en sí mismo.

El armado de un sistema suele ser un proceso complejo que involucra múltiples etapas, desde obtener los últimos cambios del repositorio, generar y compilar todo lo necesario, ejecutar reorganizaciones, hasta mover los programas al ambiente de ejecución, por nombrar sólo los más visibles.

Si a esto le agregamos los detalles del armado de múltiples versiones del proyecto (que toman cosas de diferentes lugares, necesitan componentes de diferentes versiones, que dejan los resultados en otro lugar, etc.), y diferentes variantes de armado (con o sin tests, armando o no ciertos módulos, produciendo o no un setup, etc.), la complejidad puede crecer significativamente.

Automatizar este proceso implica, entre otras cosas:
  • No tener que dedicar a una persona para ejecutar cada etapa, verificar los resultados, decidir el siguiente paso a ejecutar, etc.,
  • No depender del conocimiento de una persona para ejecutar estos pasos correctamente y en el orden adecuado. ¿Qué pasa cuando esta persona se enferma o se toma vacaciones?
  • No correr el riesgo de que esa persona se equivoque, cosa que frecuentemente ocurre en los momentos de mayor estrés, es decir, cuando puede producir más daño.
Pero además, el tener la posibilidad de ejecutar todo el proceso de armado en forma totalmente desatendida y con un solo comando, nos habilita la posibilidad de dar el siguiente gran paso, que es automatizar también el propio disparo del proceso. Por ejemplo, uno podría querer que cada cierto tiempo se verificara si hubo nuevos commits en el repositorio, y que en caso afirmativo se ejecutara automáticamente el armado del proyecto. Para algunos podría querer hacer esto varias veces por día, para otros sólo durante las noches e incluso algunos solo durante los fines de semana. Aquí es donde entran en escena los llamados servidores de integración continua, de los cuales CruiseControl.NET es un ejemplo.

Combinando GeneXus Server y CruiseControl.NET

Un servidor de integración continua es un servicio que se encarga de monitorear cierto repositorio de software para ver si se produjeron cambios, en cuyo caso puede disparar un proceso de armado del proyecto.

En nuestro caso, lo que vamos a utilizar como servidor de integración continua es CruiseControl.NET. Este software va a monitorear con la frecuencia que indiquemos bases de conocimiento administradas por un GeneXus Server, y en caso de que se hayan producido nuevos commits, se encargará de actualizar una copia de la KB, y ejecutar el proceso de armado. Tanto la actualización como el armado se ejecutarán a través de tareas MSBuild, de forma que no sea necesario levantar GeneXus para ello.

Guía de Configuración

Proceso general

En primer lugar se necesita una máquina en la que estén instalados GeneXus, y CruiseControl.NET. También será necesario poder acceder desde allí a un GXserver, que podrá estar instalado en la misma máquina o no.

Luego de instalar el software conviene obtener desde GXserver una copia de la KB y ejecutar el build de forma manual, para asegurarse de que todo funciona correctamente. Luego de eso se puede proceder a la automatización del build a través de Cruise Control.

Paso 1 - Seleccionar la máquina

El primer paso es elegir la máquina en la que se va a instalar el servidor de Builds. Esta máquina tiene que tener la capacidad de tener instalado tanto GeneXus como CruiseControl.NET.

Requerimientos de instalación de GeneXus
Requerimientos de instalación de CruiseControl.NET

Para poder utilizar la consola web de CruiseControl.NET (WebDashboard) es necesario también tener instalado IIS con ASP.NET habilitado.

En caso de que el GXserver a utilizar no esté en la misma máquina, será necesario tener conectividad HTTPS con la máquina en la que esté instalado GXserver, ya sea a través de intranet o internet.

Paso 2 - Descargar e instalar GeneXus

Es necesario instalar GeneXus versión X Evolution 1 U7 en adelante.

Descargar GeneXus X Evolution 2
Manual de instalación de GeneXus

El programa instalación de GeneXus guarda la ruta del directorio de instalación en la variable de entorno GX_PROGRAM_DIR. Verificar el contenido de esta variable, y ajustarlo en caso de que fuera necesario.

Copiar los siguientes archivos en el directorio de instalación de GeneXus:

Artech.Samples.GXserverExtraTasks.dll
Artech.Samples.GXserverExtraTasks.targets

Paso 3 - Descargar e instalar el cliente de GXserver por línea de comando

Instalar los siguientes archivos en algún directorio local, por ejemplo C:\GXserverClient. En adelante nos referiremos a este directorio como [GXserverClient].

TeamDev.exe
TeamDev.exe.config
TeamDev.msbuild

Paso 4 - Descargar e instalar CruiseControl.NET.

Descargar CruiseControl.NET
Documentación de CruiseControl.NET

El setup presenta tres componentes para instalar. Es necesario como mínimo el CruiseControl.NET Server y se recomienda también instalar el Web Dashboard.



También se recomienda dejar marcadas las opciones de "Install CC.Net server as Windows service" y "Create virtual directory in IIS for Web Dashboard".



Como es usual, se puede elegir también el directorio de instalación, que por defecto es algo similar a C:\Program Files\CruiseControl.Net. En adelante, nos referiremos a este directorio de instalación como [CruiseControl]

Paso 5 - Agregar add-in de GXserver a Cruise Control

CruiseControl reconoce en su configuración por defecto varios sistemas de repositorio (SVN, CVS, etc.). Con este add-in, CruiseControl puede reconocer también a GXserver como un repositorio válido e interactuar con él.

Copiar CCNet.GXserver.Plugin.dll al directorio [CruiseControl]\server.

Paso 6 - Iniciar servidor de CruiseControl.NET

CruiseControl.NET puede ser ejecutado de dos maneras: como un servicio de Windows o como una aplicación de consola. Para el funcionamiento normal, lo recomendado es utilizar el servicio, pero en las primeras etapas de configuración, puede ser útil la aplicación de consola, ya que brinda información inmediata con mensajes en la consola y puede ser más fácil de detener y volver a ejecutar. Una vez que se ha estabilizado la configuración se puede pasar a utilizar el servicio.

Ambas aplicaciones se encuentran en el directorio [CruiseControl]\server, y se llaman ccservice.exe (el servicio) y ccnet.exe (la aplicación de consola), y cuentan con sus respectivos archivos de configuración ccservice.exe.config y ccnet.exe.config. En estos archivos se pueden configurar aspectos específicos a una u otra forma de ejecutar, y cada uno de ellos utiliza un tercer archivo de configuración (ccnet.config), usualmente compartido, donde en particular se establecen cuáles son los diferentes proyectos de armado (build projects).

Cada proyecto de armado indica un cierto repositorio de fuentes, qué cosas obtener de él, cada cuánto hay que consultarlo para saber si hubo cambios, dónde mantener una copia local de los fuentes, y qué ejecutar para realizar el build.

La ubicación por defecto del archivo ccnet.config es también en el directorio [CruiseControl]\server, aunque se puede especificar otra ubicación agregando una entrada como la siguiente en la sección <appSettings> de ccservice.exe.config y ccnet.exe.config:

<appSettings>
   <!-- Without this appSetting ccservice will look for ccnet.config
        in its own directory.
-->
   <add key="ccnet.config" value="c:\some\path\to\ccnet.config"/>
   ...
</appSettings>
A su vez, el contenido inicial del archivo ccnet.config es el siguiente:

<cruisecontrol xmlns:cb="urn:ccnet.config.builder">
  <!-- This is your CruiseControl.NET Server Configuration file. Add
       your projects below!
-->

  <project name="MyFirstProject"
           description="demoproject showing a small config">
    <triggers>
      <!-- check the source control every X time for changes,
       and run the tasks if changes are found -->
     <intervalTrigger name="continuous"
                      seconds="30"
                      buildCondition="IfModificationExists"
                      initialSeconds="5"/>
    </triggers>

   <sourcecontrol type="nullSourceControl"
                  alwaysModified="true" />

    <tasks>
      <exec>
        <!-- if you want the task to fail,
             ping an unknown server
-->
       <executable>ping.exe</executable>
       <buildArgs>localhost</buildArgs>
       <buildTimeoutSeconds>15</buildTimeoutSeconds>
       <description>Pinging a server</description>
      </exec>
    </tasks>

    <publishers>
     <xmllogger />
     <artifactcleanup cleanUpMethod="KeepLastXBuilds"
                      cleanUpValue="50" />
    </publishers>

  </project>

</cruisecontrol>


Como se ejemplifica allí, en cada </project> declarado en el archivo ccnet.config, se pueden establecer una serie de elementos:
  • <triggers> - disparadores de la consulta por cambios en los fuentes. En el ejemplo, el disparo es simplemente por tiempo, y se consultará al repositorio si hay nuevos cambios cada 30 segundos, y se ejecutará el build si hay modificaciones.
  • <sourcecontrol> - el repositorio desde el cual se obtienen los fuentes. El tipo de repositorio puede ser alguno de los repositorios estándar ("svn", "cvs", etc.) o bien, como veremos más adelante, gracias al plugin que instalamos en el paso 4, también "gxserver". En el ejemplo se utiliza un tipo especial "nullSourceControl", que tiene una respuesta fija como que siempre hay nuevos cambios.
  • <tasks> - las tareas a ejecutar cuando se encuentran cambios en los fuentes. Usualmente aquí se utiliza una tarea que ejecute el proceso de build, y en el ejemplo esto es simulado con un comando ping, simplemente para que ejecute algo.
  • <publishers> - son tareas a ejecutar luego de finalizado el build y generalmente se utiliza para recolectar y publicar los resultados.
Esta configuración inicial no realiza el armado de ningún fuente, pero es útil para ejecutar el CruiseControl.NET y verificar si funciona hasta este punto. Una vez en funcionamiento, cualquier cambio en el archivo de configuración será detectado automáticamente.

Para iniciar el servidor, vamos a ejecutar el ccnet.exe desde una ventana de comandos (alternativamente podemos ejecutar la opción CruiseControl.NET en el menú de inicio de Windows.

Luego de iniciar el servidor, para verificar que todo está funcionando bien, se puede acceder a la URL del servidor: [http://localhost/ccnet], en donde aparecerá la consola (Web Dashboard) de CruiseControl.NET:

Paso 7 - Crear la copia de trabajo de la KB

En cada item de armado en CruiseControl.NET, a los cuales se les llama proyectos (projects) se va a especificar cuál es la KB en GXserver de que se trata, qué versión (si hay más de una), qué environment, etc.. Para cada uno de esos proyectos, se va a especificar también la ubicación de una KB local, que se utilizará como copia de trabajo para actualizar con lo que haya en GXserver y realizar el proceso de build.

Se recomienda centralizar todas las copias de trabajo que vayan a ser utilizadas con CruiseControl.NET en una misma estructura de directorios, de forma tal que para cada proyecto exista un directorio, dentro del cual esté como hijo el directorio de la KB de trabajo propiamente dicha.

Por ejemplo, si se va a automatizar el proceso de Build de dos KBs, una KB llamada Bobsville (en su versión principal y en otra llamada "Version 1.0"), y otra KB llamada Sunflower Valley (en su versión principal y en otra llamada "Versión 2.2"), el árbol de directorios podría ser el siguiente:

CruiseControlData
  |
   --- Bobsville
  |      |
  |       --- Principal
  |      |      |
  |      |       --- WorkingCopy
  |      |
  |       --- Version1.0
  |             |
  |              --- WorkingCopy
  |
   --- Sunflower Valley
  |      |
  |       --- Principal
  |      |      |
  |      |       --- WorkingCopy
  |      |
  |       --- Version2.2
  |             |
  |              --- WorkingCopy
  |
  .
  .
  .
Los proyectos que corresponden a una misma KB del server (Bobsville y Sunflower Valley en este caso) aparecen allí agrupados bajo un mismo directorio, aunque esto no es estrictamente necesario. Lo que sí es importante, por razones que se verán más adelante, es que para cada proyecto de armado, exista un directorio específico al proyecto, dentro del cual esté a su vez el directorio de la KB de trabajo.

A los efectos de continuar con el proceso de configuracíón de la integración continua, vamos a considerar que automatizaremos en primer lugar el armado de la versión principal de la KB Bobsville, para lo cual crearemos la copia de trabajo en el directorio C:\CruiseControlData\Bobsville\Principal\WorkingCopy. La KB Bobsville se puede obtener del GXserver de Sandbox de la Evolution 2, es decir en la URL http://sandbox.genexusserver.com/xev2. A continuación se puede ver el contenido de la ventana de Create Knowledge Base from GeneXus Server al momento de crear esta copia de trabajo.

Paso 8 - Primer update y build manual

Luego de crear la copia de trabajo es necesario hacer un Update y un Build, lo cual a su vez requiere definir (o crear) la base de datos operativa, especificar y generar todo por primera vez. Este proceso podría evitarse si se parte de una KB de trabajo existente que ya esté armada, y se copia para aquí con todos sus archivos ya generados.

En cualquier caso, lo importante es verificar que es posible hacer un Update y un Build en forma manual, resolviendo cualquier problema que pudiera surgir, para estar seguros de que está todo bien configurado con respecto a GeneXus y GXserver, y que a partir de este punto solo es necesario proceder a la automatización.

Paso 9 - Configurar el proyecto de armado

Para configurar un proyecto de armado es necesario editar el archivo ccnet.config, para agregar en el XML un nuevo elemento de tipo <project>.

En primer lugar, vamos a declarar algunas variables, cuyo valor depende de cada instalación, y que se van a referenciar después desde la declaración de los datos del proyecto. De esta forma, esas variables pueden ser compartidas para varios proyectos y es más sencillo actualizarlas. Copiar lo siguiente inmediatamente después del elemento raíz del XML (<cruisecontrol xmlns:cb="urn:ccnet.config.builder">):

<!-- GeneXus installations -->
<cb:define GxXEv1U8Dir="C:\Program Files\Artech\GeneXus\GeneXusXEv1U8" />
<cb:define GxXEv2U2="C:\Program Files\Artech\GeneXus\GeneXusXEv2U2" />
<cb:define GxDefault="$(GxXEv2U2)" />

<!-- GXserver credentials -->
<cb:define GXserverUser="GXtechnical\user" />
<cb:define GXserverPassword="**********" />

<!-- MSBuild executable -->
<cb:define MSBuildExe="C:\Windows\Microsoft.NET\Framework\v3.5\msbuild.exe" />

<!-- CruiseControl configuration -->
<cb:define CruiseControlServerDir="C:\Program Files\CruiseControl.NET\server" />
<
cb:define CruiseControlDataDir="C:\CruiseControlData" />
<cb:define GXserverClientDir="C:\GXserverClient" />
<cb:define TeamDevExePath="$(GXserverClientDir)\TeamDev.exe" />
Naturalmente que es necesario modificar algunos de los valores de estas variables (aquellos resaltados con fondo amarillo) con lo que corresponda en cada caso. Luego, a continuación de estas declaraciones de variables, hay que agregar lo siguiente que es la declaración del proyecto de armado:

<project name="Bobsville Principal">
  <sourcecontrol type="gxserver">
    <serverUrl>http://sandbox.genexusserver.com/xev2</serverUrl>
    <serverUsername>$(GXserverUser)</serverUsername>
    <serverPassword>$(GXserverPassword)</serverPassword>
    <serverKbAlias>Bobsville</serverKbAlias>
    <serverKbVersion>Bobsville</serverKbVersion>
    <getAllKbVersions>false</getAllKbVersions>
    <workingDirectory>$(CruiseControlDataDir)\Bobsville\Principal\WorkingCopy</workingDirectory>
    <workingVersion></workingVersion>
    <workingEnvironment></workingEnvironment>
    <localSettings>$(CruiseControlDataDir)\Bobsville\Principal\settings.local</localSettings >
    <dbaseServerInstance></dbaseServerInstance>
    <createDbInKbFolder>true</createDbInKbFolder>
    <dbaseUseIntegratedSecurity>true</dbaseUseIntegratedSecurity>
    <dbaseServerUsername></dbaseServerUsername>
    <dbaseServerPassword></dbaseServerPassword>
    <dbaseName></dbaseName>
    <executable>$(TeamDevExePath)</executable>
    <teamDevTasks>"$(GXserverClientDir)\TeamDev.msbuild"</teamDevTasks>
    <msbuildExecutable>$(MSBuildExe)</msbuildExecutable>
    <autoGetSource>true</autoGetSource>
    <cleanCopy>false</cleanCopy>
    <tagOnSuccess>false</tagOnSuccess>
  </sourcecontrol>
  <triggers>
    <intervalTrigger seconds="600"/>
  </triggers>
  <tasks>
    <msbuild>
      <executable>$(MSBuildExe)</executable>
      <projectFile>$(GXserverClientDir)\TeamDev.msbuild</projectFile>
      <buildArgs>
        /v:Normal
        /t:Build
        /p:WorkingDirectory="$(CruiseControlDataDir)\Bobsville\Principal\WorkingCopy"
        /p:ServerUsername=$(GXserverUser)
        /p:ServerPassword=$(GXserverPassword)
        /p:GX_PROGRAM_DIR="$(GxDefault)"
        /p:MSBuildExtensionsPath="c:\Program Files\MSBuild"
      </buildArgs>
      <logger>$(CruiseControlServerDir)\ThoughtWorks.CruiseControl.MsBuild.dll</logger>
      <timeout>18000</timeout>
    </msbuild>
  </tasks>
  <publishers>
    <xmllogger />
    <artifactcleanup cleanUpMethod="KeepLastXBuilds" cleanUpValue="50" />
    <modificationHistory />
  </publishers>
</project>
Al salvar el contenido del archivo ccnet.config, el cambio será detectado por CruiseControl.NET y si volvemos a la consola (Web Dashboard), veremos ahora nuestro nuevo proyecto. A partir de ahora, cada vez que CruiseControl.NET detecte que hay un nuevo commit (va a estar consultando a GXserver cada 10 minutos, según lo que pusimos en <intervalTrigger>) ejecutará el build de la KB, y podremos ver los resultados desde la propia consola.

¿Todavía por aquí?

Si llegaron hasta este punto, habiendo seguido todos los pasos de arriba, me interesa saber cómo les fue. ¿Problemas, errores, sugerencias?

¿Funcionó todo bien? Si es así, los invito a firmar en el Libro de Visitas. Busquen en la KB Bobsville un objeto con ese nombre, anótense allí y hagan commit para que todos nos enteremos.

Por supuesto, siéntanse libres también de colaborar en el desarrollo de la KB Bobsville. ♦

Imagen: Assembly line robots, publicada por Annette Davis, bajo licencia CC BY-NC-ND 3.0.

jueves, 3 de noviembre de 2011

7 razones para usar GXserver con un solo desarrollador

GeneXus Server es la herramienta de control de versiones para GeneXus. Debido a que representa la mejor solución para la coordinación de desarrollo en equipo, muchas veces suponemos que sólo es adecuado si los que desarrollan en un proyecto son dos o más personas. Sin embargo, hay muchas razones por las cuales no sólo es razonable utilizar un repositorio de control de versiones aunque haya un solo desarrollador, sino que de hecho es la mejor opción para un trabajo profesional.

1 – Viajar al pasado

El registro histórico de cambios nos da toda la información sobre qué cambió, cuándo, y por qué. Por ejemplo, nos permite responder preguntas como “¿qué cambié en la última semana que puede haber producido este nuevo error?”.

Es verdad que si trabajamos sin GXserver, GeneXus también provee una historia de cambios por objeto, creando una revisión cada vez que el usuario lo salva. Pero la historia de los cambios en GXserver va mucho más allá de esto, porque cuando hacemos un commit, estamos definiendo un grupo lógico de objetos que cambian al mismo tiempo y con una intención específica y declarada (ie: comentarios del commit). Los comentarios incluso pueden tener una referencia a un número de ticket de un sistema de seguimiento de errores o de manejo de proyectos.

Cuando algo falla, tenemos todo lo necesario para revertir los errores. Muchas veces los cambios en un objeto están relacionados con cambios a otros objetos. Por ejemplo, si cambiamos los parámetros de un procedimiento, tendremos que cambiar también los objetos que lo llamaban. Tener el conocimiento de cuáles fueron todos los objetos modificados en cada commit, nos permite estar seguros de que estamos corrigiendo todos los objetos que lo necesitan.

De la misma forma, para entender por qué a un objeto le hicimos cierto cambio, es fundamental la información de contexto; es decir qué otros objetos cambiaron en ese mismo momento, e incluso cuál era el estado de los que no cambiaron.

2 – Mejor manejo de versiones

Por supuesto que también podemos tener versiones congeladas y nuevas ramas de desarrollo en una KB incluso sin GXserver, pero usando GXserver obtenemos además la facilidad de publicar cualquiera de estas ramas a procesos externos o servidores de armado o integración continua, en forma desacoplada y sin las penalidades de performance asociadas a un acceso compartido por la red a una KB.

La KB en la que desarrollamos solo necesita tener la rama en la que estamos haciendo cambios, mientras que en el server podemos tener todas las versiones congeladas y todas las ramas de desarrollo. Un servidor de integración continua puede estar monitoreando los commits que hagamos en cualquiera de las versiones, para disparar un proceso de armado de la versión, ejecución de tests, deploy, etc.

3 – Libre experimentación

En nuestra KB local, podemos experimentar y probar libremente, contando con la seguridad de que nada de esto afecta la versión “oficial” a menos que explícitamente hagamos commit de los cambios. Una vez que estamos listos para hacer un commit, podemos revisar el reporte de cambios pendientes de commit, comparar cada objeto con su estado original, y decidir cuáles incluir en el commit, cuáles fácilmente revertir a su estado inicial, y cuáles mantener como cambios locales.

GXserver controlará además que el conjunto de objetos incluido en el commit sea coherente (por ejemplo, que no incluyamos una llamada a un objeto nuevo que olvidamos incluir), y en caso de cualquier error rechazará todos los cambios sin modificar nada, de forma de asegurar que todo commit forme una unidad lógica de cambios completa y que nunca perdemos la integridad de la KB del server.

4 – Respaldos más fáciles

Nunca es necesario hacer respaldo de múltiples copias de una misma KB, y siempre tenemos claro qué es exactamente lo que necesitamos respaldar: las KBs administradas por el server. En tanto hagamos commit y tengamos una adecuada política de respaldo de las KBs del server, estamos asegurados de posibles pérdidas de las KBs locales, sean debidas a fallas de discos, notebooks robados, o cualquier causa similar.

Si utilizamos el GXserver Online (suscripción a GXserver en la nube), incluso contamos con respaldos automáticos de todas las KBs.

5 – Inspección online de la KB

GXserver provee una consola web por la cual podemos inspeccionar las KBs, el contenido de sus objetos, y la actividad de cambios. No es necesario contar con GX para esto, alcanza con un browser. Si tenemos nuestra instalación de GX y las KBs en la oficina, igual podemos usar esta consola desde casa o cuando estamos de viaje.

6 – Integración de otros actores

Podemos dar acceso a la consola de GXserver para integrar a otras personas que aunque no desarrollan están involucradas en el proyecto y necesitan monitorear su desarrollo, como por ejemplo, un gerente, o un cliente para el cual estamos desarrollando el sistema.

Por otra parte, el desarrollo de un proyecto muchas veces requiere de la participación de varios otros actores que pueden utilizar la consola del server para tener acceso a la información de la KB, sin necesidad de que tengan efectivamente la KB ni tampoco una licencia de GX. Ejemplos de esto pueden ser los que trabajan en la documentación, traducciones, o el diseño gráfico.

7 – Cualquier momento, cualquier lugar

Incluso si somos el único desarrollador, podemos obtener una copia actualizada del server desde cualquier lugar. Por ejemplo, podemos tener una KB local en la oficina y otra en casa, y sincronizarlas a través de GXserver sin esfuerzo.

En caso de que agreguemos un nuevo desarrollador, ya sea en forma permanente o temporaria, es sumamente fácil obtener su KB de trabajo, en el momento que sea, y esté donde esté.

En resumen

Usar una herramienta de manejo de versiones y la metodología asociada a esto, es una de esas cosas que a veces nos parece que no vamos a necesitar, hasta que comenzamos a usarlas. Luego nos damos cuenta de que las ventajas son muchísimas, y entonces nos parece mentira que antes pudiéramos trabajar sin ella.

Una de las ventajas más notorias es la facilidad con que podemos incorporar el trabajo de diferentes personas en un mismo proyecto, logrando que todas ellas trabajen en forma autónoma, sin interferencias, pero al mismo tiempo facilitando y organizando la integración del trabajo de todos.

Sin embargo, las ventajas de utilizar metodología y herramientas de control de versiones son tantas, aun para un solo desarrollador, que resulta indispensable para un desarrollo de software profesional. Las de arriba son solo algunas de las ventajas más salientes, pero sin duda que puede haber muchas más.

De hecho, esto no es específico de GeneXus o GXserver; aplica igualmente para cualquier desarrollo de software con lenguajes tradicionales, y siempre que surge la pregunta, la recomendación es la misma: conviene utilizar control de versiones aunque haya un solo desarrollador.♦

Imagen: One Man Band, Marc Dobson performing at Milliken's Reef, Cape Canaveral, Florida

viernes, 7 de diciembre de 2007

GeneXus Rocha Beta 2: de dónde bajarla (download)

Imagen: anuncio aparecido en televisión. (Bueno, algo parecido)

Downloads / Descargas:
GeneXus Rocha Beta 2
GXextensions SDK Beta 2
[Actualización: estas descargas ya no están disponibles desde la liberación de la versión RC. Las descargas de la RC están disponibles en la sección Downloads de la columna de la izquierda]

Ayer se hizo público el download de la Beta 2 de GeneXus Rocha con importantes mejoras con respecto a la Beta 1: conversión de KBs de la versión 9.0, posibilidad de múltiples ambientes , manejo de versiones, y muchas otras cosas interesantes.

¿Querés probarla? ¿Todavía no sos Beta tester? Comenzá por aquí. ♦

viernes, 9 de noviembre de 2007

No sos vos, soy yo

Una historia de amor sin frases hechas


Imagen de 'Nos sos vos, soy yo'Imagen: El carácter chino para "amor". (es interesante que unos cuantos de esos trazos parezcan lágrimas)

GeneXus Rocha tiene una personalidad compleja, de eso no hay duda, y para muestra basta un botón: en su incansable afán de expandir sus horizontes, de alcanzar puntos a los que nunca había llegado, de vivir nuevas experiencias y sensaciones, se asocia y relaciona con múltiples er... llamemosle "contrapartes" a falta de mejor nombre, que lo complementan y lo extienden, por así decirlo, si se me permite la expresión.

GeneXus no promete exclusividad, y ellas lo saben, pero como no podía ser de otra manera, a todas les da su atención, les permite expresarse, e incluso les da participación en muchas de sus decisiones. Tampoco pone reparos en que se comuniquen directamente entre ellas e interactúen tanto como quieran: vivir y dejar vivir, ese es su lema. En definitiva, la situación está planteada así, y a la hora de la verdad, todos parecen disfrutarlo y ninguno se queja, a lo hecho pecho, y a otra cosa mariposa.

Pero detenerse es una forma de retroceder; GeneXus lo tiene muy claro y el conformismo nunca fue lo suyo. La vida pasa, el futuro no espera, el show debe continuar, y es tiempo de afrontar nuevos desafíos. Por eso, todos los días nace un nuevo GeneXus.

En ocasiones, los cambios son tales que una o más de las partes se ve afectada, la relación se vuelve incompatible, y será necesario dejarla atrás, por duro que resulte. Sí, es claro que como consecuencia de cada una de estas relaciones, y de la suma de ellas, GeneXus goza de una vida más saludable, disfruta experiencias más enriquecedoras, y por si todo esto fuera poco, aumenta significativamente su poder. Pero también es sabido que un gran poder implica una gran responsabilidad, y a veces, lo que comienza como un pequeño "problemita" en alguna de ellas, puede provocar efectos que irremediablemente se transmitirán al conjunto, y naturalmente todos terminarán sufriendo, de una manera o de otra. No es algo que pueda tomarse a la ligera, alguien debe tomar el toro por los cuernos y cortar por lo sano, para evitar males mayores.

Por eso a partir de ahora, luego de cada cambio importante, GeneXus se cuidará de verificar que aquellas que quieran seguirlo acompañando, estén dispuestas a renovar su compromiso explícitamente. De no ser así, y hasta tanto eso no se cumpla, no habrá otra altertiva que interrumpir la relación. Quizá sea triste, pero así es la vida.

— Tenemos que hablar. Lo he estado pensando mucho, y he llegado a la conclusión de que lo nuestro no da para más. Mirá..., yo ahora estoy en una nueva etapa y ya no puedo volver atrás. Necesito que quienes me acompañen estén dispuestos a aceptarme como soy, para bien o para mal, y seguirme apoyando en cada paso que doy. Creo que sería bueno que nos diéramos un tiempo para reflexionar, cada uno por su lado. Te juro que me duele más a mí que a vos. Te deseo lo mejor. Por supuesto, no sos vos, soy yo.
♦

miércoles, 24 de octubre de 2007

jueves, 20 de septiembre de 2007

Radiolandia 2007

Imagen de 'Subiendo hacia atrás'Falta muy poquito para que comience el Encuentro GeneXus de este año, y una manera interesante de comenzar a vivirlo puede ser la Radio del Encuentro.

Este año, la Radio funciona utilizando entrevistas grabadas que se publican en formato mp3. Las primeras entrevistas comenzaron a aparecer desde hace unos días en la Página de la Radio, pero a partir de hoy, están también disponibles en formato podcast, lo cual tiene una doble utilidad: por un lado, que suscribiendose a ese feed, uno puede estar al tanto de las nuevas entrevistas que se vayan publicando, y por otro lado aquellos que utilizan iPod o similares, pueden descargarse las entrevistas para escucharlas offline. ♦

viernes, 24 de agosto de 2007

El Experimento PhotoShop: Chrlas 2.0 (Beta)

Imagen de 'El Experimento PhotoShop'Todo comenzó con un mensaje a la lista de Artech, preguntando si alguno me podía dar una mano con unos montajes de fotos que quiero hacer para una charla en el próximo Encuentro GeneXus (a propósito, ¿ya vieron el video?).

Como no tengo ninguna experiencia, ni tiempo suficiente como para ponerme a aprender, preferí pedir ayuda. Por las dudas aclaré que tampoco estaba buscando nada demasiado sofisticado, sino simplemente cambiar alguna cara en una foto con los rostros de otras personas, y sin mayores pretensiones de que no se note (en realidad parte de la gracia es que sí se note).

La verdad es que cuando lo mandé pensaba que podía sentirme afortunado si alguno respondía. Para mi sorpresa, al poco rato ya había recibido, no una sino seis contestaciones de personas dispuestas a darme una mano. Algunos de los mensajes eran del estilo "soy conocedor, me tengo fe", y otros eran más del tipo "alguna vez hice algo, pero si no conseguís otro mejor, avisáme", pero todos se mostraban dispuestos a ayudar. Así fue como de pronto me vi enfrentado a demasiadas opciones: ¿cómo hacer para elegir a alguno? Aunque después de todo...

¿Por qué tendría que elegir sólo a uno? En lugar de eso, le respondí a todos contándoles de qué trataba la charla y qué era lo que pretendía hacer en ella con esas fotos trucadas (por supuesto pidiéndoles confidencialidad, porque tampoco es cuestión de andar quemándola ☺), y les propuse que trabajáramos en forma conjunta, cada uno proponiendo cuantas opciones quisiera de aquello que les describí, para luego entre todos elegir tres para utilizar en la charla. La parte más interesante era que el resto de las propuestas no iban a ser en vano, sino que la idea era formar una suerte de "extras del DVD" para pasar al final de la charla (si da el tiempo), para mandar a los amigos, para publicar en internet, o para lo que queramos.

Debo confesar que lo mandé con muchas dudas: ¿no era forzar demasiado? ¿les resultaría divertido? ¿aceptaría alguno? A pesar de mis dudas, sorpresa N° 2, resultó que sí, que la mayoría lo encontró divertido, y como no les implica mucho tiempo, ni les impone una responsabilidad, la mayoría se prendió de la idea. Así fue como de pronto me encontré con que contaba con todo un equipo de creativos.

Pero las sorpresas no terminaron ahí. Resulta que de mi primer mensaje, parece que alguien entendió que estaba buscando un diseñador gráfico para contratar (y digo contratar en aquel sentido antiguo en que uno tenía que pagar por lo que la gente hacía), y se lo pasó a una amiga diseñadora gráfica [1], quien rápidamente me escribió poniéndose a disposición. Le contesté explicándole que no, que en realidad no estaba pensando en contratar sino en que alguno me ayudara "de onda". Su siguiente respuesta me hizo levantar una ceja [2]:


ok, no hay problema. De todos modos si no encontrás a nadie dentro de Artech que sepa Photoshop avisame y si no es algo que lleve muchas horas, yo te ayudo "de onda" :)

Hmm... ¡sorpresa N° 3! Sin pensarlo demasiado, le mandé copia de lo que ya habían recibido los otros, y le dije que si le divertía, también era bienvenida. Para hacer la historia corta, sorpresa N° 4 que sí, que se anotaba, y sorpresa N° 5, ¡me envió las dos primeras contribuciones al grupo!

— ¡Santas coincidentes sorpresas, Batman! — dije para mí [3]. ¿Hasta dónde llega esto? ¿Habrá más gente interesada en participar? ¿Por qué no publicarlo en forma abierta para quien quiera sumarse? ¿Eeeeh?

Así que aquí estoy haciendo precisamente esa invitación:


Si te manejás bien con el PhotoShop [4], y te divierte la idea de participar de este proyecto colaborativo, sin presiones, y sin mucho esfuerzo, ponete en contacto conmigo (jlr arroba artech.com.uy) y te cuento exactamente de qué se trata.

¿Cuántos llegarán a sumarse? ¿Habrá una sorpresa N° 6? El tiempo será testigo. Mientras tanto, de ayer a hoy, el grupo inicial ya produjo cuatro montajes, todos muy divertidos y estoy seguro de que surgirán muchos más. Ya lo verán. ♦


---
[1] Nunca supe quién era su amigo dentro de Artech que le había pasado el aviso, pero si está leyendo esto, muchas gracias.
[2] Me refiero a levantar una sola, pero digamos que es una licencia literaria: nunca aprendí a levantar una ceja sin levantar también la otra.
[3] Otra licencia: no suelo hablarme en esos términos, ni decirme a mí mismo Batman, y mucho menos (aclaro por las dudas) vestirme como Robin, pero quería poner en algún lado el link a esa página.
[4] No hace falta ser experto. Si sos capaz de sustiuir una cara en una foto, tenés lo que se necesita

domingo, 24 de junio de 2007

Lejos del teclado, cerca del ratón

Imagen de 'Lejos del teclado, cerca del ratón'Durante las próximas tres semanas voy a estar de viaje en plan de vacaciones familiares, y entre los preparativos para eso y la cercana liberación del próximo CTP de la Rocha, llevaba ya bastante tiempo sin escribir nada aquí. Por eso antes de irme, quería descargar algunos comentarios que venía acumulando en el tintero.

Boca campeón

Un saludo público para mi amigo Mastropietro, y para todos los hinchas de Boca, por la reciente obtención de la Copa Libertadores. No todos los días un equipo logra superar las cinco Libertadores de Peñarol :p

Videos online

Están disponibles los videos de las charlas de Marcos, Daniel, y mía, que diéramos en la tercera reunión del Grupo de Usuarios GeneXus de Montevideo. Las charlas se puede ver en Google video, o si prefieren, pueden descargar en forma completa una versión con mucha mejor calidad de video. El audio lamentablemente no es muy bueno (probablemente un problema de conexión del micrófono que no notamos en el momento), pero aún así se entiende sin problemas. Las tres charlas son:

Generador de Lenguaje Dinámico RUBY/¿PHP? por Daniel Méndez
ver en Google video - Descargar archivo

Demos de GXextensions, por Marcos Crispino
ver en Google Video - Descargar archivo

Jugo de GXextensions, por José Lamas
ver en Google Video - Descargar archivo

Documentación de GXextensions

De a poco vamos incorporando más documentación, tratando de guiarnos por las preguntas que van surgiendo en el foro. En particular, agregamos una página Getting Started with GXextensions, como punto de partida básico para quienes recién comienzan. Para quienes están desarrollando GXextensions o piensan hacerlo, les recomiendo estar atentos a esa página porque desde ahí iremos apuntando a nuevos documentos e instructivos.

Marcos otra vez

Marcos publicó una nueva GXextension. Esta vez se trata de GXObjects from Tables, que es la misma acerca de la cual hizo la demo en la reunión del grupo de usuarios de Montevideo. Pero atención que en este artículo de su blog en el que lo anuncia, también explica cómo hacer para disparar comandos desde la Start Page, y cómo hacer para abrir objetos en la interfaz de GX desde el código de una GXextension.

GXextensions en las noticias

En las noticias GeneXus de esta semana se publicó la primera parte de una nota sobre las GXextensions, basada en entrevistas a gente involucrada con su desarrollo. Vean quiénes están (con foto y todo) en esta primera parte. Hay varios entrevistados más, que apareceran en la continuación de la nota.

Desafío 2007

Otra noticia publicada esta semana es la confirmación del lanzamiento del GeneXus Challenge 2007. Hay dos categorías, una para aplicaciones desarrolladas con GeneXus 9.0 y otra para GXextensions. Ambas cuentan con importantes premios, y el plazo de inscripciones, que ya comenzó, termina el 15 de julio. Los interesados, que me consta que son varios, ¡no se dejen estar!

Hasta la vuelta, ♦

viernes, 1 de junio de 2007

Te Veo Tus Tablas

Imagen de 'Te Veo Tus Tablas'Glauber C. Weddigen de Migrate Company me ha enviado su primera GXextension para publicar, y agregar a la lista de las que se pueden descargar e instalar automáticamente desde la Start Page de GeneXus Rocha.

Se llama TableViewer y consiste en una herramienta que permite, dada una tabla, comparar su composición e índices con respecto a la tabla correspondiente en la base de datos operacional.

La ventana reacciona a la selección de una tabla en el árbol de objetos, o incluso a la selección de una transacción, tomando su tabla asociada. Además de obtener los datos de la tabla en la KB, obtiene los datos de la configuración del DBMS para conectarse a él y obtener la composición actual en la base de datos. Luego presenta ambos árboles de composición para que sea fácil compararlos, como se puede ver en la imagen.

Según me ha dicho Glauber, esto es apenas una primera versión como para ir experimentando pero también está trabajando en otra GXextension de la que tendremos noticias más adelante.

A propósito, la lista en la Start Page ya está quedando un poco grande, así que vamos a tener que inventar algo porque no puede crecer indefinidamente. Quizá deberíamos mostrar las más recientes, o las más descargadas, o ambas, y dejar las restantes para consultar en una página adicional... ♦

lunes, 28 de mayo de 2007

Nos vemos allá

Imagen de 'Nos vemos allá'En el sitio del XVII Encuentro, se agregó una página con imágenes que se pueden utilizar para destacar que se va a participar de él. Cómo ejemplo, pueden ver la que acabo de poner en este blog, en la columna de la izquierda.

Para los que quieran hacer algo similar en su página web o blog, les pueden ser de utilidad las tablas que incluyo a continuación. Contienen las diferentes imágenes disponibles para español, portugués, e inglés.

En cada tabla, junto a cada imagen, encontrarán un recuadro de texto con el código que necesitarían incluir en su página para agregarla. Para aquellos que usan blogger, sin embargo, tienen la gran ventaja de que pueden simplemente usar el botón que está debajo de cada imagen para agregar el componente al blog en forma automática (les va a pedir la identificación y password si es necesario) sin que tengan que preocuparse por escribir nada.

Español



Português



English

♦