Mi grupo y yo somos horrendos a la hora de incrementar los números de versión de ensamblajes y con frecuencia enviamos ensamblajes con versiones 1.0.0.0. Evidentemente, esto provoca muchos dolores de cabeza.
Estamos mejorando mucho con nuestras prácticas a través de nuestra plataforma de CI y realmente me gustaría configurarlo para que aumente automáticamente los valores dentro del assemblyinfo.cs
archivo para que las versiones de nuestros ensamblados se actualicen automáticamente con los cambios de código en ese ensamblado.
Previamente había configurado (antes de encontrar Hudson ) una forma de incrementar el valor a través demsbuild
la línea de comando (no recuerdo), pero con Hudson, eso actualizará el repositorio SVN y activará OTRA compilación. Eso resultaría en un bucle infinito lento ya que Hudson sondea SVN cada hora.
¿Es mala idea que Hudson incremente el número de versión? ¿Cuál sería una forma alternativa de hacerlo?
Idealmente, mi criterio para una solución sería uno que:
- Incrementa el número de compilación
assemblyinfo.cs
antes de una compilación - Solo incrementa el número de compilación en ensamblados que han cambiado. Esto puede no ser posible ya que Hudson borra la carpeta del proyecto cada vez que realiza una compilación.
- Confirma el assemblyinfo.cs modificado en el repositorio de código (actualmente VisualSVN )
- No hace que Hudson active una nueva compilación la próxima vez que busque cambios
Resolviendo esto en mi cabeza, podría encontrar fácilmente una solución para la mayor parte de esto a través de archivos / comandos por lotes, pero todas mis ideas harían que Hudson active una nueva compilación la próxima vez que escanee. No estoy buscando a alguien que haga todo por mí, solo apúntame en la dirección correcta, tal vez una técnica para hacer que Hudson ignore ciertas confirmaciones de SVN, etc.
Todo lo que he encontrado hasta ahora es solo un artículo que explica cómo aumentar el número de versión automáticamente, nada tiene en cuenta una plataforma de CI que podría girar en un bucle infinito.
fuente
Esto es lo que hice para estampar el atributo AssemblyFileVersion.
Se quitó AssemblyFileVersion de AssemblyInfo.cs
Agregue un archivo nuevo y vacío llamado AssemblyFileInfo.cs al proyecto.
Instale el conjunto de herramientas de tareas de la comunidad de MSBuild en la máquina de compilación de hudson o como una dependencia de NuGet en su proyecto.
Edite el archivo del proyecto (csproj), es solo un archivo msbuild y agregue lo siguiente.
En algún lugar habrá una
<PropertyGroup>
indicación de la versión. Cambie eso para que diga, por ejemploHudson proporciona esas variables env que ve allí cuando el proyecto se basa en hudson (suponiendo que se obtenga de Subversion).
En la parte inferior del archivo del proyecto, agregue
Esto usa MSBuildCommunityTasks para generar AssemblyFileVersion.cs para incluir un atributo AssemblyFileVersion antes de que se compile el proyecto. Puede hacer esto para cualquiera o todos los atributos de la versión si lo desea.
El resultado es que, cada vez que emite una compilación de hudson, el ensamblado resultante obtiene una versión de archivo de ensamblaje de 1.0.HUDSON_BUILD_NR.SVN_REVISION, por ejemplo, 1.0.6.2632, lo que significa el número de compilación número 6 en hudson, compilado de la revisión de subversión 2632.
fuente
Esta es una solución elegante que requiere un poco de trabajo por adelantado al agregar un nuevo proyecto, pero maneja el proceso con mucha facilidad.
La idea es que cada proyecto se vincule a un archivo de solución que solo contenga la información de la versión del ensamblado. Por lo tanto, su proceso de compilación solo tiene que actualizar un solo archivo y todas las versiones de ensamblado se extraen de un archivo al compilarse.
Pasos:
Cuando agrega el archivo como un enlace, almacena los datos en el archivo del proyecto y, al compilarlo, extrae la información de la versión del ensamblado de este archivo.
En su control de fuente, agrega un archivo bat o un archivo de secuencia de comandos que simplemente incrementa el archivo SharedAssemblyProperties.cs y todos sus proyectos actualizarán su información de ensamblaje desde ese archivo.
fuente
Hudson se puede configurar para ignorar los cambios en ciertas rutas y archivos para que no solicite una nueva compilación.
En la página de configuración del trabajo, en Administración de código fuente , haga clic en el botón Avanzado . En el cuadro Regiones excluidas , ingrese una o más expresiones regulares para hacer coincidir las exclusiones.
Por ejemplo, para ignorar los cambios en el archivo version.properties , puede usar:
Esto funcionará para idiomas distintos de C # y le permite almacenar la información de su versión dentro de subversion.
fuente
.NET hace esto por ti. En su archivo AssemblyInfo.cs, configure su versión de ensamblado en major.minor. * (Por ejemplo: 1.0. *).
Cuando construyes tu proyecto, la versión se genera automáticamente.
Los números de compilación y revisión se generan en función de la fecha, utilizando la época de Unix, creo. La compilación se basa en el día actual y la revisión se basa en el número de segundos desde la medianoche.
fuente
En realidad, nunca he visto que la característica 1.0. * Funcione en VS2005 o VS2008. ¿Hay algo que deba hacerse para configurar VS para incrementar los valores?
Si AssemblyInfo.cs está codificado con 1.0. *, ¿Dónde se almacena la versión / revisión real?
Después de poner 1.0. * En AssemblyInfo, no podemos usar la siguiente declaración porque ProductVersion ahora tiene un valor no válido: está usando 1.0. * Y no el valor asignado por VS:
Suspiro, esta parece ser una de esas cosas por las que todo el mundo pregunta, pero de alguna manera nunca hay una respuesta sólida. Hace años vi soluciones para generar un número de revisión y guardarlo en AssemblyInfo como parte de un proceso posterior a la compilación. Esperaba que ese tipo de baile no fuera necesario para VS2008. ¿Quizás VS2010?
fuente
Supongo que uno también podría hacer esto con una plantilla de texto en la que crea los atributos de ensamblaje en cuestión sobre la marcha desde el entorno, como lo hace AssemblyVersion.tt a continuación.
fuente
Como continuación de la respuesta de MikeS, quería agregar que VS + Visual Studio Visualization and Modeling SDK debe instalarse para que esto funcione, y también debe modificar el archivo del proyecto. También debería mencionarse que uso Jenkins como servidor de compilación que se ejecuta en una caja de servidor de Windows 2008 R2 con módulo de versión, donde obtengo el BUILD_NUMBER.
Mi archivo de plantilla de texto version.tt se ve así
Tengo lo siguiente en los grupos de propiedades
después de la importación de Microsoft.CSharp.targets, tengo esto (dependiendo de dónde instale VS
En mi servidor de compilación, tengo el siguiente script para ejecutar la transformación de texto antes de la compilación real, para obtener el último número de conjunto de cambios en TFS
De esta manera puedo realizar un seguimiento de las compilaciones Y conjuntos de cambios, por lo que si no he verificado nada desde la última compilación, el último dígito no debería cambiar, sin embargo, podría haber realizado cambios en el proceso de compilación, de ahí la necesidad del penúltimo número . Por supuesto, si realiza varios controles antes de una compilación, solo obtendrá el último cambio reflejado en la versión. Supongo que se puede concatenar eso.
Estoy seguro de que puede hacer algo más elegante y llamar a TFS directamente desde la plantilla tt, sin embargo, esto funciona para mí.
Entonces puedo obtener mi versión en tiempo de ejecución como este
fuente
Mi solución no requiere la adición de herramientas externas o lenguajes de secuencias de comandos; está prácticamente garantizado que funcionará en su máquina de compilación. Resuelvo este problema en varias partes. Primero, he creado un archivo BUILD.BAT que convierte el parámetro BUILD_NUMBER de Jenkins en una variable de entorno. Utilizo la función "Ejecutar comando por lotes de Windows" de Jenkins para ejecutar el archivo por lotes de compilación ingresando la siguiente información para la compilación de Jenkins:
En el entorno de compilación, tengo un archivo build.bat que comienza de la siguiente manera:
Una vez que hice eso, hice clic con el botón derecho en el proyecto que se compilaría en el panel del Explorador de soluciones de Visual Studio y seleccioné Propiedades, seleccioné Eventos de compilación e ingresé la siguiente información como la Línea de comando de evento previo a la compilación, que crea automáticamente un archivo .cs que contiene información sobre el número de compilación basada en la configuración actual de las variables de entorno:
Es posible que deba adaptarse a su gusto de construcción. Construyo el proyecto manualmente una vez para generar un archivo Version.cs inicial en el directorio de Propiedades del proyecto principal. Por último, incluyo manualmente el archivo Version.cs en la solución de Visual Studio arrastrándolo al panel del Explorador de soluciones, debajo de la pestaña Propiedades para ese proyecto. En compilaciones futuras, Visual Studio lee ese archivo .cs en el momento de compilación de Jenkins y obtiene la información correcta del número de compilación.
fuente
Entonces, tenemos un proyecto con una solución que contiene varios proyectos que tienen ensamblajes con diferentes números de versión.
Después de investigar varios de los métodos anteriores, acabo de implementar un paso de compilación para ejecutar un script de Powershell que busca y reemplaza el archivo AssemblyInfo.cs. Sigo usando el número de versión 1.0. * En el control de código fuente, y Jenkins simplemente actualiza manualmente el número de versión antes de que se ejecute msbuild.
Agregué la opción -Encoding "UTF8" porque git comenzó a tratar el archivo .cs como archivos binarios si no lo hacía. De acuerdo, esto no importaba, ya que nunca cometí el resultado; simplemente surgió mientras estaba probando.
Nuestro entorno de CI ya tiene la posibilidad de asociar la compilación de Jenkins con el git commit en particular (¡gracias al complemento Stash!), Así que no me preocupa que no haya git commit con el número de versión adjunto.
fuente
Este es un mecanismo más simple. Simplemente implica la adición de un paso de compilación de la tarea de comando de Windows Batch antes del paso de MSBuild y el uso de un programa simple de buscar y reemplazar (FART).
El paso por lotes
Si está utilizando un control de código fuente distinto de svn, cambie la opción --svn por la adecuada para su entorno scm.
Descarga Fart
fuente
Decidí usar un par de métodos usando un script de Powershell precompilado ( https://gist.github.com/bradjolicoeur/e77c508089aea6614af3 ) para incrementar en cada compilación exitosa y luego en Global.asax voy a algo como esto:
Sigo pensando que todo el proceso es demasiado complicado y voy a buscar un método más eficiente para lograr el mismo resultado. Quería esto principalmente para pasar la versión a SVN y luego a Jenkin sin demasiadas herramientas adicionales.
fuente