Hacer una Build en TFS 2010 para SharePoint Server 2010

Habrá casos en que dispongamos de un TFS 2010 como repositorio del código que estamos desarrollando. En estos casos, podemos sacarle partido a las Build automáticas, para preparar paquetes que estén listos para desplegar en cualquier momento.
De forma estandar, TFS nos va a dejar compilar la solución o los proyectos que la forman, incluso generando la salida de los paquetes WSP, pero cuando tengamos por ejemplo ficheros de script, ya sean Bat o PowerShell, tendremos que modificar el workflow de la plantilla de la Build, con el fin de poder volcar en una carpeta únicamente los ficheros necesarios para el despliegue de la solución, que en caso de ejemplo serán los paquetes WSP junto con sus script de PowerShell.
La idea es la siguiente: Teniendo una solución con n proyectos de SharePoint 2010, vamos a modificar la plantilla genérica de Build para añadir un proceso que se encargue de crear una carpeta llamada Deploy en la que vamos a dejar únicamente los paquetes WSP y los scripts de PowerShell. Veamos cómo sería el proceso:
Lo primero sería tener una estructura de proyecto en la que tengamos localizados nuestros scripts. Para el ejemplo usaremos la siguiente:
image_thumb1
Ahora vamos a hacer una copia de la plantilla por defecto, que es DefaultTemplate, para ello, localizamos la carpeta donde están las plantillas y hacemos una copia de ella:
image_thumb72
La renombramos para tenerla bien localizada, por ejemplo SPTemplate, y la añadimos al control de código, y posteriormente protegemos todos los cambios (check in):
image_thumb73
Ahora creamos una nueva definición de build, que use nuestra plantilla, desde la ventana del Team Explorer:
image_thumb14
En la pestaña de Process, en el apartado de Build process template vamos a añadir la plantilla que acabamos de copiar. Para ello, hacemos clic en el botón “New” y seleccionamos la plantilla existente:
image_thumb5
A continuación seleccionamos la solución que vamos a compilar en el proceso de build:
image_thumb74
En el apartado de Advanced es muy importante indicar como argumento del MSBuild Arguments la generación de paquete a true. De esta forma en la salida se generarán los WSP pertinentes:
image_thumb75
Hasta aquí la generación de la build, sin la modificación del Workflow. Podemos generar una para ver cómo queda la salida:
image_thumb76
El paquete WSP se ha generado, pero de los scripts ni rastro. Sin modificar aún el Workflow, existe la posibilidad de indicar que queremos que un script aparezca en la salida de la build, desde las propiedades del elemento:
image_thumb15
A mi esta solución no me gusta, porque en la salida va a generar la misma estructura que la que hay en el proyecto, y cuando se trata de proyectos complejos con muchos elementos y una estructura de árbol más compleja, la salida de la build no es muy limpia. Lo ideal es tener una carpeta adicional en la salida, que llamaremos Deploy, y en ella forzaremos al proceso de build a que deje en ella tanto los paquetes como los scripts.
Para ello, vamos a modificar la plantilla que anteriormente copiamos, la SPTemplate. Desde la ventana de Souce Control Explorer abrimos la plantilla haciendo doble clic sobre ella. Se abrirá el Workflow, que es bastante grande, así que lo siguiente será contraer todos los procesos para que quede de la siguiente manera:
image_thumb17
A continuación vamos a entrar en el proceso de “Run On Agent”, que es donde vamos a crear nuestra “ampliación“ del workflow, al final del todo:
image_thumb19
Para ello, desde la Toolbox, vamos a añadir un control de Secuencia, justo al final y lo llamaremos Deploy Package:
image_thumb21
Ahora entramos en el proceso que hemos creado. El proceso lo vamos a dividir en tres partes, una parte en la que vamos a crear la carpeta en donde vamos a dejar los ficheros necesarios para un despliegue (WSP y PowerShell), otra parte en la que vamos a copiar a esa carpeta los ficheros WSP que se generan en la salida, y otra parte en la que vamos a copiar en esa carpeta los scripts de PowerShell. Crearíamos por lo tanto otras tres secuencias dentro de nuestro nuevo proceso:
image_thumb23
Vamos a empezar por el primero, el Create Folder, así que hacemos doble clic sobre él, y a continuación vamos a crear una Variable que va a servir para almacenar la ruta a la carpeta que vamos a crear después:
image_thumb25
image_thumb77
En la expresión introducimos lo siguiente:

String.Format("{0}\{1}", BuildDetail.DropLocation, "Deploy")


image_thumb78

Y en el ámbito (Scope) de la variable, indicamos “Run On Agent”, para poder usarla posteriormente en otra secuencia:

image_thumb79

Ahora metemos un proceso de creación de directorio:

image_thumb80

Y en sus propiedades indicamos que el directorio a crear es nuestra variable:

image_thumb81

Siempre podréis ir haciendo check in a los cambios para ir validando que el funcionamiento es el esperado.

Ahora vamos con el siguiente proceso, el que copia los paquetes WSP. Para ello, lo que haremos será hacer una búsqueda de los WSP que la build a generado, y copiarlos a nuestra carpeta de Deploy. Lo primero será crear una variable para almacenar los WSP que el proceso de búsqueda encuentre:

image_thumb82

Y ahora vamos a crear un proceso para buscar esos ficheros, usando el control de FindMatchingFiles:

image_thumb39

image_thumb83


En la propiedad Result indicamos la variable que acabamos de crear, y en la propiedad MatchPattern, introducimos lo siguiente:



String.Format("{0}\*.wsp", BuildDetail.DropLocation)


Eso hará que el proceso busque todos los ficheros WSP que hay en la salida de la build. Ahora con un control foreach, vamos a copiar cada paquete que ha encontrado (en este caso sólo habrá uno) a la carpeta de Deploy, que tenemos guardada en otra variable ya creada:

image_thumb45

Y las propiedades de este foreach serían las siguientes:

image_thumb47

Si ahora entramos en el proceso foreach, haciendo doble clic sobre él, veremos que tenemos una parte “body” vacía. Ahí vamos a meter un control de InvokeProcess, en donde vamos a invocar al programa xcopy para que realice la copia del fichero, que lo recogemos en la variable “item”:

image_thumb50

image_thumb52

Quedaría así:

image_thumb55

Y en las propiedades del proceso, en Arguments introducimos lo siguiente:



String.Format("""{0}"" ""{1}""", item, FolderPath)







y en FileName: “xcopy.exe”. El resto lo dejamos como está:

image_thumb57

Recordad que en este punto podéis probar la build haciendo check in de la plantilla, para ver si el paquete ha sido copiado a la carpeta deseada.

Por último, vamos a copiar los scripts de PowerShell.El proceso es similar al anterior, con la diferencia de que aquí vamos a indicar la ruta donde se encuentran los scripts. Para ello, ahora vamos a entrar en el proceso de Copia de ficheros de script, y como en el caso anterior, primero vamos a crear una variable donde se guarden los ficheros que vamos a copiar:

image_thumb84

Lo siguiente es insertar un control de FindMatchingFiles, para buscar los scripts en la ubicación que indiquemos, y en las propiedades MatchPattern indicar la ruta de los scripts de la siguiente forma:





String.Format
("{0}\Main\src\SPBuildTest\SPProjectOne\Deploy\Scripts\*.ps1",
 SourcesDirectory)


y en Result indicamos la variable PSFiles que acabamos de crear:

image_thumb85

Igual que con los paquetes WSP, ahora habrá que crear un proceso foreach para copiar cada script que ha encontrado:

image_thumb86

Y dentro del body del foreach, el InvokeProcess que se encargará de realizar la copia. En este caso, el proceso de copia es exactamente igual que el anterior:

image_thumb87

Hacemos Check in a los cambios, y generamos una nueva build para comprobar el resultado obtenido:

image_thumb88

Podemos ver que se ha generado tal y como deseábamos, un paquete de solución de SharePoint y los scripts necesarios para su despliegue.

Este caso es el más simple, pero la idea se puede aplicar a proyectos que generan más paquetes en su salida o que tienen más scripts, distinguiendo entre scripts de producción y desarrollo por ejemplo.

Las DLL de SharePoint, dónde encontrarlas

En algunas ocasiones, he necesitado para algunos proyectos de SharePoint meter ciertas DLL a la carpeta de librerías del proyecto. Eso seguro que lo hemos hecho todos…sobre todo hay DLL que son muy comunes de ser incluidas en el proyecto, como por ejemplo la de publicación.

Hay algunos casos más excepcionales en los que las DLL que necesitamos son más complicadas de conseguir, y no están el la ubicación más común, como por ejemplo la de IdentityModel.

A modo de referencia, las DLL más comunes las podemos localizar en el directorio de SharePoint, bajo la ruta:

C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\ISAPI

y son las siguientes:

image

Sin embargo, las otras que tenemos en la máquina pero no están en ese directorio es muy común encontrarlas en la GAC, y podemos sacarlas abriendo la ruta de una manera especial. Por ejemplo, para conseguir la DLL física del IdentityModel del SharePoint, lo primero sería asegurarse de que está en el assembly:

image

Y una vez localizada, abrimos la ventana de ejecución para lanzar el siguiente comando:

%windir%\assembly\GAC_MSIL

image

De esta forma, podremos visualizar el assembly como una estructura de carpetas y ficheros, y buscaremos la DLL en cuestión:

image

image

Y ahora ya podremos copiarla e incluirla en nuestros proyectos.

Cumulative Update de Febrero de 2012

El grupo de producto de SharePoint 2010 ha sacado una nueva actualización de producto para los productos de SharePoint 2010, el CU de Febrero de 2012

Igual que con el de Diciembre, sigue tiendo necesario tener previamente instalado el SP1

Como notas de esta versión, recordad:

  • Después de instalar el CU de Febrero, es necesario reiniciar el servicio de User Profile Synchronization.
  • Una vez que finaliza la instalación hay que lanzar el Wizard de configuración.

 

Aquí tenéis un enlace a los artículos:

  • KB 2597150 - SharePoint Server 2010
  • KB 2597132 - SharePoint Foundation 2010
  • KB 2597152 - SharePoint Server 2010 with Project Server

Y los correspondientes enlaces a las descargas:

Como primera entrada del blog, voy a aprovechar para contaros cómo llevo trabajando con SharePoint y las máquinas virtuales desde hace tiempo, porque desde mi punto de vista creo que es un método bastante productivo, cómodo, y que en algunos casos se acerca más a cómo es una infraestructura de cliente final. Por supuesto, existen otras muchas formas, y dependiendo de la potencia del equipo de desarrollo, podemos incluso mejorar este método.

Muchas veces debemos realizar un desarrollo que al final se implantará sobra una infraestructura que no se asemeja a la infraestructura que montamos para el desarrollo en nuestras máquinas virtuales. En la gran mayoría de esos casos, esa infraestructura final contará con un número determinado de servidores de SharePoint ejecutando los roles correspondientes, y todos ellos estarán conectados a un Domain Controller (DC a partir de ahora) o Controlador de Dominio, donde se gestionan las cuentas de usuario.

No en todos los casos, pero a mi particularmente me ha ocurrido de tener que realizar un desarrollo que no he podido validar o realizar por no tener mi servidor de SharePoint conectado a un DC. Sobre todo cuando hay temas de sincronización de perfiles, se requiere el uso de Kerberos, etc.

Si bien es verdad que en una misma máquina de SharePoint para desarrollo se puede habilitar la característica de Domain Controller, yo en su día opté por tener una máquina de DC por un lado, y la máquina de SharePoint por otro, y que estuvieran conectados. Desde entonces estoy bastante contento con el resultado, ya que tengo un solo DC para todas las máquinas SharePoint de desarrollo. Ese DC hace las funciones de DC, servidor DNS, y servidor SMTP y POP3 entre otras cosas, por lo tanto cuando monto una nueva máquina de SharePoint, no me tengo que preocupar de esa parte, ya que la tengo montada siempre. Además a nivel de gestión de usuarios, puedo crear diferentes OU en función de las máquinas o de las necesidades del desarrollo. Desde mi punto de vista creo que es bastante útil y productivo, y además Virtual Box es muy sencillo de configurar para funcionar de esta forma.

Como a mi este método me ha servido de gran ayuda, os voy a contar cómo lo tengo montado, por si el día de mañana os puede ayudar, u os hace la tarea de desarrollo más cómoda.

Lo primero de todo es crear la máquina que hará de DC. Yo opté por ejecutarla bajo Windows Server 2003 SP1, que es mucho más ligero que la versión 2008, y que para lo que la vamos a dedicar es suficiente. Además, esta máquina se puede levantar con muy poca memoria RAM.

La configuración que tengo en cuanto a Sistema, es la siguiente:

  • 412 MB de RAM
  • 1 Core de CPU

clip_image002

El siguiente aspecto, y el más importante es en cuanto a la configuración de la Red. Hay que crear una "Red interna" en uno de los adaptadores de Red, con un nombre, para posteriormente en la otra máquina de SharePoint poner la misma Red interna. Al final es simular que esas dos máquinas están conectadas de alguna forma. Si además se quiere que tenga salida a Internet, basta con habilitar otro Adaptador y configurarlo como NAT por ejemplo. Mi red interna está de la siguiente forma:

clip_image004

Adicionalmente podemos configurar Carpetas compartidas o lo que necesitemos.

Una vez arrancada la máquina, hay que configurar manualmente su IP, para que cuando vayamos añadiendo máquinas de SharePoint, tener controlado el rango de direcciones. Yo por ejemplo le asigné la 10.0.0.1 al DC de esta forma:

clip_image006

Por supuesto hay que habilitar el servidor como Controlador de Dominio. En mi caso, ya dije, también hace de DNS, servidor SMTP, etc.

Una vez configurado, se arranca la máquina de SharePoint, que hemos creado previamente, y a la que le hemos habilitado también la Red Interna con el mismo nombre que la máquina de DC. Adicionalmente, también la he habilitado otro adaptador, para tener salida a Internet.

Una vez que la arranquemos, lo primero es configurar su IP, para que esté dentro del mismo rango que la del DC, por ejemplo, 10.0.0.9:

clip_image008

Si probamos a hacer un "ping" a nuestro DC, deberíamos poder alcanzarlo:

clip_image010

El siguiente paso sería cambiar el nombre de la máquina si es necesario, y añadirla al Dominio:

clip_image012

Al intentar conectar con el DC, os pedirá un usuario administrador del dominio para validar la entrada de la máquina de SharePoint. Si todo ha ido bien, debería salir un mensaje como el siguiente:

clip_image014

Ahora, nos pedirá reiniciar, pero antes de ello, yo suelo crear en el DC un usuario de dominio que será luego administrador de la máquina de SharePoint, para evitar usar usuarios locales. Por lo tanto, antes de reiniciar, creo en el DC ese usuario administrador, y antes de reiniciar la máquina de SharePoint, se lo agrego al grupo de administradores. Sería algo así:

clip_image016

De esa forma, cuando reiniciemos, ya iniciaremos sesión con ese usuario de dominio, y evitaremos usar usuarios locales, puesto que en un entorno real, no son usados. Podemos validar todo ese proceso verificando que el nombre de la máquina aparece de una forma similar a esta:

clip_image018

Podemos comprobar que la máquina pertenece al domino que hemos creado.

Si además al servidor DC le habilitamos otras características como por ejemplo SMTP, ya tendríamos montado la parte de envió de correo de SharePoint.

La ventaja de tener este sistema, es que podemos tener un solo DC para todas las máquinas de SharePoint, ya sean laboratorios, o entornos de desarrollo. Hasta día de hoy, estoy muy satisfecho de trabajar de esta forma, y la recomiendo.

Estreno Blog!

SharePoint Between Racks!! (O, SharePoint entre bastidores)

Me presento, soy Eduardo Marcos, y os doy la bienvenida a este blog al que pretendo ir dando forma. Os pido paciencia, porque aunque si bien es cierto que he consultado mucha información en blogs de otros compañeros, nunca he realizado uno propio. Por lo tanto, cualquier comentario o crítica siempre será más que bienvenida.

Bueno, de mi y mi relación con SharePoint puedo decir que llevo los últimos tres años de mi vida trabajando con esta plataforma, los dos últimos con la versión 2010, y a día de hoy hay muchas características del producto que me faltan por conocer. De la misma forma, conozco otras muchas, y con vuestras peticiones o cuando pueda, pretendo transmitir aquellas cosas que creo que son más curiosas, y que pueden ayudaros.

Personalmente, puedo decir que es un producto que me gusta, y muchas veces lo he defendido frente a personas o compañeros que no comparten la misma opinión. Es verdad que una cosa es usar SharePoint desde el punto de vista de usuario, y otra desde el punto de vista del desarrollador, ya que esta ultima puede presentar en ocasiones importantes quebraderos de cabeza. Pero creo que lo bonito de la profesión es enfrentarse a los retos que se nos presentan, y este producto, al igual que da muchas cosas hechas, no deja de plantear retos en cada proyecto que se realiza.
SharePoint Server 2010
Así que os animo a que le perdáis el miedo, y a aquellos que ya lo han perdido, espero que podáis encontrar este blog como fuente de conocimiento y consulta de problemas técnicos que muchas veces se nos plantean.

De nuevo, bienvenidos!!!

SharePoint Between Racks © 2012
. Con la tecnología de Blogger.

¡Compártelo!


Estoy en LinkedIn!


Ve mi perfil en LinkedIn!