Team City y Powershell

Supongamos que necesitamos que Team City realice cierta acción sin tener que poner un script en control de código. En mi caso, necesitaba que Team City creara un archivo si no existía, y borrara otros si existían. No podía resolver esto con MSBuild porque necesitaba que se hiciera antes de compilar cualquier proyecto.

Para no llenar aún más el repositorio, Powershell es una buena opción. Usando la jerga de Team City, podemos agregar un Build Step con un Build Runner de tipo Powershell, y escribir el contenido del script directamente en su configuración. Dicho script será almacenado por Team City, sin tocar nuestro repo.

Si vamos a implementar esto, para empezar necesitamos que Powershell esté instalado en el servidor de integración continua. Típicamente, viene con Visual Studio y SQL Server, así que es casi seguro que ya está. De todas formas, para verificarlo, se puede abrir una consola, escribir powershell y darle a Enter. Si Powershell está instalado, entraremos a su línea de comandos, de la que podemos salir con el clásico exit.

El segundo tema es que, por defecto, Windows (XP y 7, seguro) prohíbe la ejecución de scripts Powershell. Para cambiar esto, basta abrir una consola, entrar a powershell e invocar un comando. Si Team City está configurado para correr en la cuenta SYSTEM (por defecto es así), dicha consola debe ser abierta bajo dicha cuenta. En un post anterior vimos que esto puede hacerse con PsTools. Una vez abierta la consola:

  1. Ingresar a Powershell con el comando powershell
  2. Set-ExecutionPolicy RemoteSigned
  3. exit

Con esta nueva opción, los scripts locales, como los de Team City, pueden correr directamente, pero los que procedan de otras máquinas o Internet deberán tener un certificado de una entidad en la que confiemos.

Una vez resuelto todo esto, pasemos a configurar Team City. Para Powershell, Team City permite ejecutar un script a partir de un archivo .ps1, o ejecutar código directamente. El segundo caso es el que nos interesa. En ese caso, podemos pasar el código con la opción -Command (directo por stdin), o -File (Team City crea un archivo temporario). Mi primer intento fue usar -Command, pero dicha modalidad tiene algunos problemas; en mi caso, no tomaba un if a menos que estuviera todo en una sola línea.

Con este último problema resuelto, la configuración final resultó:

Sobre el script: más allá de la sintaxis de Powrshell, que es bastante sencilla, y puede aprenderse rápidamente aquí, hay que notar lo siguiente: %IconSet% es una referencia a un Build Parameter de Team City de tipo Configuration Parameter. Básicamente, se definen para cada proyecto, y se referencian en la configuración. Cuando TeamCity parsea el script y se encuentra con %IconSet%, lo reemplaza con el valor que le puse en la sección Build Parameters del proyecto. Es así como puedo parametrizar el script sin poner nada en control de código. También podría haber usado una variable de entorno, pero esto es más directo.

Comments

Popular posts from this blog

VB.NET: Raise base class events from a derived class

Apache Kafka - I - High level architecture and concepts

Upgrading Lodash from 3.x to 4.x