Estructura de Control de Código Fuente del Servidor Team Foundation


He estado trabajando en la estandarización de la estructura de control de código fuente para nuestro despliegue de Team Foundation Server para el año nuevo. He empezado usando la documentación Microsoft Team Foundation Server Branching Guidance disponible en CodePlex.

Esperaba recibir algunos comentarios y respuestas a algunas de las preguntas específicas que tengo sobre la estructura propuesta. Cuando se trata de estructurar el control de código fuente en TFS, he aprendido que hay muchos " estándares" para elegir entre eso no hay realmente un estándar.

Primero, esbozaré y describiré las decisiones y el uso.

$/                                                
    {Team Project}/                               
        {Subproject}/                             
            Development/                          
                Trunk/                            
                    Source/
                    Tests/
                    Sandcastle/
                    TeamBuildTypes/
                        {Build Name}/
                Branches/
                    {Branch Name}/
                        Source/
                        Tests/
                        Sandcastle/
                        TeamBuildTypes/
                            {Build Name}/

            Integration/
                Source/
                Tests/
                Sandcastle/
                TeamBuildTypes/
                    {Build Name}/
            Production/
                Releases/
                    {Release Version}/
                        Source/
                        Tests/
                        Sandcastle/
                        TeamBuildTypes/
                            {Build Name}/
                Branches/
                    {Branch Name}/
                        Source/
                        Tests/
                        Sandcastle/
                        TeamBuildTypes/
                           {Build Name}/

La lógica general es que un Proyecto de equipo puede contener un solo proyecto lógico (donde no habría una entrada {Subproject}) o varios proyectos relacionados en forma de un producto o conjunto de herramientas. Los tres contenedores principales se llaman Development, Integration, y Production.

Dentro del tronco del contenedor Development, hay disposiciones para ambos proyectos que componga el producto en la carpeta Source, con las pruebas unitarias correspondientes disponibles en la carpeta Tests. La mayoría del desarrollo menor ocurriría en el tronco, con ramificaciones disponibles a través de la carpeta Trunk del hermano Branches, que actúa como un contenedor de ramificaciones. Uno o más archivos de solución vivirían dentro de Trunk, permitiendo que las ramas en ese nivel capturaran la solución, el origen y las pruebas unitarias.

El contenedor Integration, a menudo llamado "principal" en la implementación no-TFS, es se utiliza únicamente para integrar conjuntos de cambios de Development para crear una compilación estable y comprobable. Se crea inicialmente como una rama desde el contenedor Development una vez que se ha logrado un producto comprobable. Las versiones de este contenedor se utilizarán para nuestro entorno de prueba y el entorno de prueba de carga. Elegimos incluir pruebas de carga con compilaciones comprobables para que podamos monitorear los cambios en el rendimiento, pudiendo aislar rápidamente los conjuntos de cambios que pueden haber contribuido a cualquier irregularidad.

Production se utiliza para producir construcciones de calidad de preproducción y producción. Se crea inicialmente como una rama desde el contenedor Integration una vez que se ha recomendado una compilación estable para su lanzamiento. Dentro de la carpeta Releases, se sigue una estructura "branch by release", proporcionando snapshotting y aislamiento en un solo lugar. (Por ejemplo, cuando Release 1.1 está listo para una compilación de preproducción, el contenedor estable Integration se ramifica en una nueva carpeta Release 1.1 en la estructura Production/Releases. Los siguientes RCs y RTWs / rTMS también se promueven en esta carpeta.) Una estructura de ramificación también está presente, como se ve en el contenedor Branches. Esto permite "hotfixes", usualmente un marcador de revisión (Major.Menor.Revision). La rama se crea a partir de la versión actual y se fusiona de nuevo en el nuevo marcador de revisión, como Release 1.1.1. El conjunto de cambios se integraría inversamente al Development contenedor Trunk en el momento de la aceptación.

Creemos que esta estructura es un equilibrio justo entre la robustez y complejidad. Pero hay algunas preguntas persistentes que no puedo encajar lógicamente en el modelo. Son:

Team Build - Los contenedores Development y Integration inicialmente comenzarán como nightly builds, pasando finalmente a la Integración Continua (CI). El contenedor de producción se construirá manualmente.

  • ¿Dónde deberían estar las definiciones de construcción? Edición-Basado en un par de respuestas, la carpeta TeamBuildTypes se ha movido al tronco y ramificado a los contenedores apropiados. Esto, sin embargo, conduce a una nueva pregunta (sigue).

  • Al tener la carpeta TeamBuildTypes en sus contenedores apropiados, ¿significa eso que todas las definiciones de compilación se reproducirán entre las carpetas apropiadas? Por ejemplo, tener una definición de construcción para compilaciones de calidad de desarrollo, así como compilaciones comprobables, etc. todos viviendo en todas las carpetas TeamBuildType a lo largo de la estructura.

Generación de documentación - Utilizamos Sandcastle para generar documentación. Específicamente, también usamos Sandcastle Help File Builder para administrar la salida. Esto produce un archivo de proyecto en un formato específico para SFHB.

  • ¿Debería almacenarse la documentación generada en la estructura de control de código fuente?

  • En caso de que se genere documentación para cada contenedor, o solo posea valor para preproducción y la calidad de la producción construye?

  • Para preservar tiempos de compilación locales rápidos, ¿debería la creación de documentación ser propiedad de una definición de compilación?

  • ¿Dónde deberían estar los archivos específicos de SHFB? Mi idea inicial es ponerlo como un par a las carpetas Source y Tests. Estoy de acuerdo con las recomendaciones de que sea igual a Source y Tests. Diagrama cambiado para reflejar este cambio.

Terceros Binarios

  • Binarios (controles, bibliotecas, etc.).) ser almacenado en el control de código fuente?

  • Si es así, ¿debería ser su propio Proyecto de Equipo?

Documentación general - Documentación no generada, como requisitos, documentos de diseño, planes de prueba, etc. no van a ser reflejados por una carpeta en la estructura de control de código fuente. Después de un poco de investigación y discusión con mis desarrolladores y compañeros, utilizando los documentos incorporados la carpeta en Team Explorer proporciona más beneficios, ya que refleja la estructura dentro del Portal del Proyecto del Equipo y algunos usuarios (empresariales) no necesitan la complejidad adicional de aprender el aspecto de control de código fuente de TFS.


Actualizaré la estructura a medida que obtenga respuestas a las preguntas para proporcionar una imagen más clara. También acojo con beneplácito cualquier otra observación relacionada con posibles cambios. Si tengo alguna otra pregunta, me aseguraré de modificar esto post.

Ediciones:

  • Aclaración. Las carpetas Source y Tests también viven debajo del contenedor Integration.

  • Tanto Micah como Josh plantearon grandes puntos con respecto a los binarios de terceros. Pregunta añadida con respecto al tema.

  • La generación de documentación puede ser lenta. Se agregó una pregunta sobre si la creación de documentación debe ser propiedad de un equipo específico Tipo.

  • Resolución añadida relacionada con la documentación no generada, como requisitos, documentos de diseño, planes de prueba, etc.

  • Se agregó resolución relacionada con la carpeta TeamBuildTypes para las definiciones de compilación.

  • Basado en varios comentarios, movió la carpeta TeamBuildTypes a los niveles trunk / branch.

Author: joseph.ferris, 2008-12-19

5 answers

Me gusta su idea de poner los archivos de castillo de arena como un par en el código fuente y las pruebas, agregaría una carpeta de documentación, que luego contendría los archivos de castillo de arena, y opcionalmente la documentación real.

Definitivamente hay diferencias de opiniones y estoy seguro de que seré rechazado por esto (ya que lo he sido antes). Yo pondría la documentación generada en TFS por un par de razones:

  1. Va a querer su documentación con cada versión, y usar TFS es un enfoque fácil para garantizar que su documentación permanezca en el lugar correcto.
  2. Usar TFS para almacenarlo significa que todos sabrán dónde obtener la documentación.

Una cosa que no veo con la que siempre lucho es dónde están las dependencias de terceros, puede ser que pertenezcan debajo de la fuente, por lo que están con cada proyecto, aunque si desea compartirlos entre proyectos, podría agregar un nuevo nodo de nivel superior.

Editar

Para mis binarios normalmente terminar con

$/ThirdParty/Company/Product/Version / Src(opcional)

Así que por ejemplo tengo

$ / Tercera parte/ Microsoft/ EntLib/ 3.1 4.0 ComponentArt/ WebUI/ 2008.1/ Src

Me gusta agregar el código fuente, he tenido que parchear el código fuente de CA, lo que odio hacer, pero cuando un tercero no corrige el error, tienes que recurrir a esto.

 6
Author: JoshBerke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-19 14:38:57

Gran diseño y explicación. He luchado con los mismos problemas. He terminado con una estructura muy similar. El mío varía ligeramente.

Development/
   Trunk/
      Binaries/  -- Shared libraries
      Source/
      Test/
      Docs/      -- Documentation
TeamBuildTypes/  -- Build definitions
  • Agregar la carpeta binarios le permite tener una ubicación en la rama donde todos sus proyectos pueden hacer referencia a bibliotecas compartidas
  • Ponemos la documentación aquí para que pueda viajar junto con su rama específica.
  • Nuestras definiciones de construcción están en el nivel de desarrollo, ya que podemos calcularlas en una ubicación para todas las ramas, pero definitivamente podría estar en el nivel de rama que puede tener más sentido.

Debería binarios (controles, bibliotecas, sucesivamente.) ser almacenado en el control de código fuente? Si es así, debe ser su propio Equipo Proyecto?

Creo que definitivamente deberían estar controlados por el código fuente, pero no veo ninguna razón para ponerlos en su propio proyecto de equipo. Un problema con el que hay que tener cuidado es que TFS, por alguna razón, trata los archivos binarios ligeramente diferentes. He tenido problemas donde he se actualizaron los binarios en el control de código fuente, pero "Obtener la última" en otras máquinas no causa la actualización de los archivos. A veces es necesario hacer " Obtener una versión específica "y comprobar el" Sobrescribir archivos sin cambios " opción para ese archivo en particular.

 4
Author: Micah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-12 10:45:59

Debes poner tu carpeta TeamBuilds debajo del tronco. Esto era imposible en TFS2005, pero Microsoft lo arregló para 2008...

La razón de esto es que su compilación puede cambiar con una versión más reciente (por ejemplo: nuevos esquemas de empaquetado, pruebas diferentes, etc.).) lo que puede hacerlo incompatible con versiones de mantenimiento anteriores. Es por eso que debes combinar la compilación de equipo con la versión del código.

De esta manera, digamos que sueltas una versión 1.0 y la pones bajo la carpeta Releases. Podrás compilar y emitir parches mientras trabajas en la v2. 0 en tu tronco de desarrollo (lo que puede requerir modificar la compilación)

 3
Author: Eran Kampf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-27 08:39:55

Para sus binarios - obviamente los únicos binarios que deberían estar bajo control de versiones son ensamblados de "terceros" que no está "construyendo" como parte de ninguna compilación automatizada. Si usted tiene sus propias bibliotecas que tiene su fuente bajo control de versiones, etc., debe mirar varias estrategias para construir y sincronizar, etc.

Luego los organizo como Josh - y luego uso la ramificación para "copiar" los binarios a una carpeta _ExternalReferences que es un par a. NET Carpetas de proyecto dentro del árbol de soluciones. Esta es una forma muy eficiente del lado del servidor, ya que el control de versiones TFS solo almacena "Deltas", por lo que esencialmente cada" duplicación "de esos binarios en muchos proyectos es esencialmente como un"puntero".

 3
Author: fuzzbone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-28 17:24:30

Una cosa que recomendaría es no usar la ubicación predeterminada para las compilaciones de equipo e incluirla en el nivel 'ramificable' porque a medida que se ramifica por varias razones (por ejemplo, promociones de código), querrá que sus scripts de compilación se ramifiquen y sincronicen con ella.

También se acaba de publicar una nueva y más específica guía de escenarios en http://www.codeplex.com/TFSBranchingGuideII

 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-24 10:31:49