lunes, 21 de marzo de 2011

Cómo montar un servidor de integración continua con CruiseControl .Net

Hola, bueno este post en realidad es meramente para documentar los pasos que tuve que seguir para montar un servidor de integración continua y en este caso la herramienta elegida fue CruiseControl .Net con el cual ya había trabajado pero no me había tocado levantar un servidor específicamente.

Resumidamente para los que no se manejen con el tema, el hecho de tener un servidor de integración continua presenta una serie de ventajas a la hora de tener un equipo de desarrollo realizando cambios continuamente sobre un proyecto en particular (o más de uno), entre ellas:
  • Detección de errores mucho antes de llegar a ambiente productivo.
  • Automatización del proceso para mantener siempre una versión estable del proyecto.
  • Producto final robusto y constantemente revisado.
  • Reducción de riesgos y mayor visibilidad del proyecto.

Básicamente al tener un servidor de integración continua nos aseguraremos que siempre exista una versión disponible del proyecto para revisión (normalmente QA) y que las subidas que realicen los desarrolladores no contengan errores o éstos serán delatados inmediatamente, con esto podemos sacar métricas de productividad por desarrollador y revisar los posibles problemas que se tengan antes de enviar el proyecto al ambiente productivo.

Bueno, para resumir lo primero que necesitamos son las siguientes herramientas (como dije esto es lo que en particular me ha tocado usar a mi en un proyecto de pruebas):
TortoiseSvn (Cliente de Subversion)
AnkhSvn (plugin de Svn para Visual Studio)
SlikSvn (control vía línea de comandos para Svn para el enganche con CruiseControl)
CruiseControl .Net (motor de integración continua)

Primeros pasos en forma resumida y asumiendo que ya se tiene el Visual Studio (2010 en mi caso) instalado:
Instalar TortoiseSvn y crear un repositorio.
Instalar AnkhSvn.
En el VS crear un proyecto o editar uno ya existente, enganchar este proyecto con el repositorio de Svn con TortoiseSvn, realizar pruebas para tomar y subir archivos con el plugin AnkhSvn.
Instalar el CruiseControl .Net (ccnet de ahora en adelante), al instalarlo vendrá con una aplicación web para revisar el estado de los proyectos, esta aplicación web debe ser montada sobre el IIS como aplicación con el alias ccnet.

En este punto debo comentar mi configuración en cuanto a máquinas:
En mi máquina local estará el servidor de ccnet además de la máquina de desarrollo.
El repositorio de Svn estará en una máquina de red, por ahora sólo actuará como repositorio.
Idealmente la máquina de ccnet será un servidor dedicado, esta máquina también podría ser usada como máquina de QA cosa de tener ambas cosas en el mismo lugar.

Volviendo a la instalación de ccnet, en este punto empezé a tener problemas al tratar de montar la aplicación web sobre el IIS 7, en primer lugar en mi máquina no estaba activado el IIS 7 por defecto así que tuve que instalarlo desde los componentes de windows.

ActivarIIS

Luego el problema fue que tuve que reinstalar el ccnet ya que no había quedado bien el registro de la aplicación web en el IIS. El siguiente problema es que tuve que ejecutar la siguiente línea de comandos para que la aplicación web por defecto del IIS soportara secuencias de doble escape ya que la aplicación web seguía con problemas:
%windir%\system32\inetsrv\appcmd set config "Default Web Site" -section:system.webServer/security/requestfiltering -allowDoubleEscaping:true
A continuación se empezó a ver la luz pero seguía con problemas con un error del tipo:
Handler "CCNetHttpHandler" has a bad module “ManagedPipelineHandler” in its module list
Por lo que tuve que reinstalar el IIS:

Para el Fw 4 de .Net:
%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i
Para el Fw 2 de .Net:
%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe –i
Recuerden ejecutar el comando anterior en una ventana de comandos con privilegios de administrador.

A continuación apareció otro error en la aplicación web del tipo:
HTTP Error 500.19 - Internal Server Error with Error Code: 0x80070021
The requested page cannot be accessed because the related configuration data for the page is invalid.
Para corregir este problema la solución fue editar el archivo:
C:\Windows\System32\inetsrv\config\applicationHost.config
Y cambiar la sección:
<section name="handlers" overrideModeDefault="Deny" />
Por:
<section name="handlers" overrideModeDefault="Allow" />

Finalmente pude ver la aplicación en mi máquina local, aunque todavía sin un proyecto asociado:

ccnetworking

Cabe recordar que primero hay que ejecutar el motor de ccnet el cual nos irá dando indicaciones si existe algún problema con nuestro archivo de configuración además de información detallada sobre qué es lo que está haciendo a cada momento:

ccnetconsole

A continuación la idea es tomar nuestro proyecto (web en mi caso) y llevarlo a ccnet usando svn para detectar cualquier cambio en las subidas de los desarrolladores y generar una nueva compilación en nuestro servidor de integración continua.

El siguiente paso es empezar a editar el siguiente archivo de configuración de ccnet:
C:\Program Files\CruiseControl.NET\server\ccnet.config 
Lo primero es agregar un proyecto, se pueden agregar rutas a varios archivos de proyectos pero en nuestro caso de prueba sólo levantaremos un proyecto por lo que sólo agregaremos una configuración de proyecto:
<project name="Test" webURL="http://localhost/ccnet">
</project>

Donde name es el nombre del proyecto en ccnet y webURL es la ruta de la aplicación web de ccnet.

Dentro de la etiqueta project primero agregaremos una tarea o task y aqui le indicaremos la solución que queremos ingresar a ccnet y que tipo de configuración tendrá:

<tasks>
    <devenv>
       <solutionfile>D:\Proyectos\nHibernateTest\nHibernateTest.sln</solutionfile>
        <configuration>Debug</configuration>
    </devenv>
</tasks>

En la siguiente sección indicaremos que tipo de control de versiones usaremos, en nuestro caso será SubVersion y le indicaremos donde se encuentra el trunk o repositorio de la solución de visual studio además del directorio de trabajo:

<sourcecontrol type="svn">
  <trunkUrl>file://192.168.208.4/desarrollo/svn/Repositorio/nHibernateTest</trunkUrl>
  <workingDirectory>D:\Proyectos\nHibernateTest\</workingDirectory>
</sourcecontrol>

En la siguiente sección indicaremos los triggers que generarán una compilación automática, en nuestro caso será un trigger por intervalos de tiempo (en segundos):

<triggers>
  <intervalTrigger name="Subversion" seconds="60" />
</triggers>

Con esta configuración es suficiente para probar nuestro servidor de ccnet, en mi caso le agregué un plugin para que le vaya poniendo etiquetas a las distintas versiones que se vayan generando:

<labeller type="svnRevisionLabeller">
  <major>7</major>
  <minor>11</minor>
  <url>file://192.168.208.4/desarrollo/svn/Repositorio/nHibernateTest</url>
</labeller>

Ojo que este plugin no viene con ccnet y lo tuve que bajar desde acá, luego copiar la dll en la carpeta del server de ccnet y reiniciar el server de ccnet.

En todo momento podemos ir revisando si nuestro archivo de configuración (ccnet.config) es válido o no con la herramienta Configuration Validator que viene con el ccnet:

Validadorccnet

Para probar que todo funcione bien es cosa de tomar cualquier archivo de nuestro proyecto en el visual studio, modificarlo y luego subirlo vía Svn, esto debería generar una compilación automática en nuestro servidor de ccnet y podremos ir monitoreando el resultado en la aplicación web de ccnet:

CompilacionExitosaCcnet

Desde la raíz de la aplicación web de ccnet podemos descargar el Cctray el cual es una aplicación de monitoreo local de los proyectos de ccnet:

CctrayEjemplo

Para agregar nuestro proyecto vamos a File – Settings y luego agregamos nuestro servidor y proyecto:

ConfigCctray

Para terminar podemos ir agregando nuevos plugins a la aplicación web de ccnet, para esto nos vamos a la opción Administer Dashboard desde la raíz de la aplicación web donde nos pedirá una clave, esta clave se define en el archivo que se encuentra en:

C:\Program Files\CruiseControl.NET\webdashboard\dashboard.config

En este archivo debemos modificar la siguiente línea donde pondremos la clave que usaremos como administrador:

<administrationPlugin password="ccnet" />

Una vez que logremos ingresar al administrador de la aplicación web de ccnet podremos administrar los plugins que aparecen en la lista de Packages, si queremos agregar algún plugin primero debemos darle permisos de escritura al usuario AspNet, en mi caso le tuve que dar permisos al usuario de IIS (IIS_IUSRS) al siguiente archivo:

C:\Program Files\CruiseControl.NET\webdashboard\packages\packages.xml

Bueno, eso es todo por ahora, como les comenté estos son los pasos que en mi caso particular tuve que seguir para montar un servidor de integración continua en un ambiente de pruebas, faltan muchas pruebas por hacer y muchas cosas que agregar pero esto es lo básico para partir.

Les recomiendo las siguientes lecturas para ir viendo más en detalle los parámetros a usar y cómo mejorar nuestro server de integración continua:

La documentación de ccnet

Tutorial de CruiseControl.Net

Eso sería por ahora, espero que no se me olvide nada, como siempre si tienen dudas o consultas las mandan por acá o a mi correo.

Saludos.

De vuelta a las pistas

Hola de nuevo, bastante tiempo ha pasado desde las últimas entradas pero esta vez espero volver con varias novedades, resumidamente he estado trabajando con varias cosillas como:
  • Visual Studio 2010
  • Framework .net 4.0
  • nHibernate 3 (y muy poco de Entity Framework 4)
  • jQuery
  • Sql Server 2008
  • Integración continua (con CruiseControl .Net alias CCNet)
  • MVC para .Net (versiones 2 y 3 con Razor)
  • Subversion (svn) con Tortoise, AnkhSvn y SlikSvn

Este año se viene cargado con hartas novedades y hartas cosas interesantes para testear y estudiar así que pronto iré escribiendo sobre el uso e instalación de varias de estas herramientas, mientras tanto les aprovecho de comentar que ya tengo en mis manos el libro para sacar la certificación 70-515 (TS: Web Applications Development with Microsoft .NET Framework 4) y pronto también iré comentando como me va con el estudio.


miércoles, 17 de marzo de 2010

Libro de introducción a XNA con C#

Hola de nuevo, les dejo este link a este libro que dicen que es muy bueno para aquellos que estén interesados en aprender a usar XNA con C#:

http://www.lulu.com/product/download/a-simple-introduction-to-game-programming-with-c%23-and-xna-31/5438606

También se puede ver en línea:


Saludos.

Cursos de Programación

Hola, tengo muy botado este blog pero luego explicaré los motivos, por ahora vengo a compartir con ustedes una excelente lista de cursos de programación (Web, C#, VB, Azure, Windows 7, Dynamics, Mobile, SilverLight, etc):


Saludos.


viernes, 16 de octubre de 2009

Depeche Mode en Chile

Y al final llegó el día, después de 15 años se volvió a presentar la banda más importante de Electro-Rock del mundo en Chile, con varios años encima pero con una calidad indiscutible que no se ve afectada por el paso de los años.

Para llegar me conseguí un estacionamiento a un par de cuadras del club hípico y partí con mi señora a ver el recital donde además fué toda mi familia (mis viejos, hermanas, cuñado).

En la entrada estaba la mansaka, llegamos tipo 17:00 y habían miles de personas tratando de entrar con un clima que cambiaba a cada rato, la fila era súper larga y se repartía hacia ambos lados de la entrada principal, mucho paco rondando los alrededores y mucho personal de seguridad del evento adentro.

Hubieron en total 5 controles para llegar al lugar que habíamos comprado (tribuna):
1) Pacos en la entrada donde tuvimos que dejar una botella de bebida plástica.
2) Primer control de entrada donde verificaban que fuera original + pacos revisando bolsos.
3) Pacos con esas maquinitas para revisar los bolsos (como las del aeropuerto).
4) Gente de la organización pidiendo las entradas y pegandoles el primer corte.
5) Ya cerca de la tribuna otra gente de la organización pidiendo la entrada para pegar el segundo corte definitivo.

En la tribuna todo bien, se veía bien aunque con el viento estaban todos muertos de frío, la cancha vip al principio estaba con repoca gente y encuentro que el sector era muy grande onda le restaba mucho espacio a la cancha general la cual estaba con mucha gente desde el principio, el palco vip se notaba que era una mierda (siendo los más caros) porque era chico y muy largo (además de no ser con asientos numerados) entonces la gente que iva llegando después iva quedando muy lejos y todos parados igual, al final veían mucho menos que nosotros y pagaron mucho más.

El clima como dije estaba muy cambiante y entremedio se puso a chispear con ganas de llover pero al final no pasó nada, corría harto viento hasta poco antes del recital y estabamos todos muertos de frio (habían algunos con sólo una polera que desde lejos se notaba como tiritaban).

Habían varios compadres curados y volados que iva sacando la gente de seguridad, en total creo que vi unos 10 o 20 al menos que se los llevaron.

Los baños se hicieron pocos, habían las medias colas para entrar especialmente al de mujeres.

Comida no se veía mucha, a lo más unos sandwiches de pan de molde y bebidas, además del típico viejo del maní.

El merchandising estuvo bueno, vendían poleras oficiales (me calenté y me compré una, aunque no eran baratas = $10k), banderas, gorros, colgantes, pulseras, etc. y casi todos andaban con su polerita de DM.

El público en general se portó bien (en total llegaron alrededor de 40.000 personas), casi todos tranquilos y nadie haciendo escándalo, el que se ponía a jugosear (y que se notaba que estaba cocido) lo sacaban los guardias. La gente no paraba de llegar por montones a toda hora, incluso cuando estaba por empezar el recital seguía llegando la pila de gente y al final ya estaba todo prácticamente lleno menos la cancha vip en las esquinas y la cancha general atrás donde de seguro no se veía mucho.

El recital en sí estuvo excelente, buenas canciones, buen desempeño de Gahan y Gore, Fletcher pasó piola no lo pescaron mucho. Buena iluminación y el sonido estuvo realmente excelente, tal vez un poco más cargado a la batería en esta ocasión (antes siempre eran más cargados a los sintetizadores), se nota que Gahan a pesar que se le empiezan a notar los años sigue moviendo las masas como si nada, lo que sí lo noté que estaba muerto de frío, Gore se mandó un par de solos bien emotivos (especialmente Somebody) y estuvo impecable.

El escenario lo encontré chico creo yo y las veces que usaron la extención hacia el centro fueron repocas y por poco tiempo.

En total fueron alrededor de 2 horas con un par de pequeñas pausas entremedio y bueno era imposible tener todas las canciones que uno hubiera querido (yo hubiera cambiado "Fly on The Windscreen" por alguna como "Everything Counts") pero en general estuvo bien bueno el repertorio, obviamente cargado al último álbum.

En fin, ojalá podamos volver a verlos luego por estos lares, en general quedé muy satisfecho y contento con el recital, fué un gustazo.

Saludos.


Pd.: Una buena colección de fotos del recital acá:

Fotos

viernes, 2 de octubre de 2009

Microsoft Security Essentials

Para los que todavía no se han enterado hace poco Microsoft liberó su antivirus gratuito, no lo he instalado pero dicen que anda bastante bien.

Lo pueden descargar acá:

Microsoft Security Essentials



Lo bueno es que se actualiza mediante Windows Update.

Saludos.

miércoles, 8 de julio de 2009

Webcasts de .Net en español

Me aproveché de robar estos links a webcasts sobre .net  en español que están muy buenos:

Silverlight 2 & 3

SQL Server 2008

Windows Azure

Microsoft Office SharePoint Server 2007

Windows Mobile 6.x

Managed Code Development for Windows Mobile 6.x

Desarrollo Web

Arquitectura

Visual Studio Team System

Los links son de:

http://geeks.ms/blogs/ciin/archive/2009/07/05/webcasts-a-tutipl-233-n-y-en-castellano.aspx

Saludos.

martes, 2 de junio de 2009

RegisterStartupScript y RegisterClientScriptBlock

Ayer estuve peleando un rato tratando de hacer que un script de JavaScript se ejecutara al cargar la página y como siempre traté de usar las famosas rutinas que provee Asp.Net para estos casos pero hace tiempo que no las usaba y tuve algunos problemillas que revisaré ahora.

En primer lugar los métodos RegisterStartupScript y RegisterClientScriptBlock ya no pertenecen directamente a la página (fueron desechados de esta ubicación) y deben ser llamados directamente desde una nueva clase encargada de estos scripts llamada ClientScript y que es parte de la misma página (Page.ClientScript).

En segundo lugar ahora podemos preguntar si el script ya ha sido agregado a la página para no estar re-creándolo de nuevo mediante el método IsStartupScriptRegistered.

Finalmente recuerdo haber usado antes casi siempre el método RegisterClientScriptBlock para registrar mis scripts en el lado del servidor y en el caso que estaba probando necesitaba que el script se ejecutara durante la carga de la página pero al usar este método la llamada al script se dibujaba antes que los elementos de la página estuvieran dibujados por lo tanto no hacía nada y me tiraba un error de JavaScript.

Averiguando la otra alternativa siempre era usar RegisterStartupScript pero no tenía clara la diferencia, y en mi caso éste método efectivamente funcionaba como yo quería porque la forma en que se dibuja en la página es distinta a RegisterClientScriptBlock.

Básicamente las diferencias entre ambos métodos radican en la posición en la que se dibujan los scripts solicitados, para ver como funciona aquí tenemos una llamada a ambos métodos en el code behind de una página de ejemplo (Default.aspx.cs):

protected void Page_Load(object sender, EventArgs e)
{
if(!ClientScript.IsClientScriptBlockRegistered("RegisterClientScriptBlock"))
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "RegisterClientScriptBlock", "document.write('RegisterClientScriptBlock');", true);

if (!ClientScript.IsStartupScriptRegistered("StartupScriptRegistered"))
Page.ClientScript.RegisterStartupScript(this.GetType(), "StartupScriptRegistered", "document.write('StartupScriptRegistered');", true);
}

Para el ejemplo usamos la siguiente página (Default.aspx):

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<table>
<tr>
<td>Contenido</td>
</tr>
</table>
</div>
</form>
</body>
</html>

Al ejecutar la página podemos ver el siguiente resultado en el navegador:

RegisterClientScriptBlock
Contenido
StartupScriptRegistered
Si revisamos el código Html generado podemos ver cómo el método RegisterClientScriptBlock dibuja el contenido al principio de la página después del Form y del ViewState, también podemos ver cómo el método RegisterStartupScript dibuja el contenido solicitado al final de la página justo antes de cerrar el Form con lo que nos aseguramos que la página ya ha sido dibujada en el cliente antes de ejecutar el script que deseamos correr.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Untitled Page</title>
</head>
<body>
<form name="form1" method="post" action="Ejemplo.aspx" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJNzgzNDMwNTMzZGT4JJog3qP93QeYemlckRLadGZVuw==" />
</div>
<script type="text/javascript">
//<![CDATA[
document.write('RegisterClientScriptBlock');//]]>
</script>
<div>
<table>
<tr>
<td>Contenido</td>
</tr>
</table>
</div>
<script type="text/javascript">
//<![CDATA[
document.write('StartupScriptRegistered');//]]>
</script>
</form>
</body>
</html>

Saludos.

viernes, 27 de marzo de 2009

Ya soy MCTS en SQL 2005

Así es después de comprar el libro en Noviembre del año pasado y dejarlo botado por las vacaciones y fiestas de fin de año finalmente me puse las pilas durante este último mes y medio (las últimas 2 semanas fueron de repaso como siempre) y hoy me presenté a dar el examen 70-431 (SQL Server 2005 Implementation and Maintenance) y afortunadamente lo aprobé sin mayores problemas.

El examen se divide en 2 partes:

  • La primera consta de un set de 35 preguntas con alternativas y varias son de selección múltiple, el tiempo para responder era poco más de una hora según recuerdo.
  • La segunda consta de 12 simulaciones donde se plantea una situación y luego se presentan ciertas ventanas como si estuviéramos en el PC y debemos realizar algunos cambios para satisfacer la situación planteada, para esta etapa era alrededor de 1 hora y media de tiempo disponible.

Como recomendación puedo decir que el libro cumple con el examen, o sea si leen bien el libro pueden estar tranquilos, tal vez se podría haber profundizado un poco más el tema de los endpoints pero el resto está todo en el libro.

Temas a considerar y repasar bien antes del examen:

  • Manejo de backups.
  • Restauración desde backups.
  • Http Endpoints.
  • Manejo de los componentes de un Service Broker (Queue, Mensaje, Contrato, Servicio).
  • Creación y mantención de índices.
  • Manejo de triggers y mantención de vistas.
  • Manejo de replicación, log shipping y mirroring.
  • Creación de Bases de Datos.
  • Monitoreo de procesos y transacciones.

Creo que eran más o menos esos, como siempre el repaso es fundamental para abarcar todo el examen.

Ahora ya puedo usar el siguiente logo:

MCTS_SQL

Que se viene ahora ? Pues el cambio a tecnologías 2008 y para comenzar ya mandé a pedir los siguientes libros:

MCTS Self-Paced Training Kit (Exam 70-502): Microsoft® .NET Framework 3.5 Windows® Presentation Foundation

Para comenzar a trabajar con WPF y ver que cosas nuevas puedo incorporar al trabajo orientado a la capa presentación.

Pro Silverlight 2 in C# 2008 (Windows.Net)

Para dedicarme a este interesante tema que al parecer dará mucho que hablar en el futuro dado el avance que ha tenido en el último tiempo.

Como vemos me dedicaré por completo al área de interfaces de usuario en los próximos meses, después tal vez siga con Asp .Net 3.5 y cosas así, ya veremos…

Saludos.

viernes, 20 de marzo de 2009

Asp .Net MVC 1.0 versión Release liberada

Para los que se mueven con el Modelo Vista Controladormvc2 (MVC)   en .Net les comento que en el Mix 09 ya ha sido liberada la versión Release 1.0 de este famoso Framework de trabajo.

Requerimientos:

  • Windows XP, Vista, Server 2003 o 2008.
  • Visual Studio 2008 con SP1.
  • Framework .Net 3.5 con SP1.

Este es uno de los temas que tengo pendientes dentro de mi agenda de estudio y cláramente va a ser uno de los que más va a dar que hablar este año y los que vienen por lo tanto es algo que hay que tenerle el ojo encima.

Lo pueden descargar desde aquí.

Pd.: Estoy en el repaso del examen 70-431 esta semana y la próxima, seguramente el viernes que viene daré el examen.