¿Cómo usar el módulo Características en un entorno de 3 desarrolladores?

19

Trabajando en un proyecto, haciendo un uso intensivo de las características , a veces hay 3 desarrolladores para esta aplicación.

Hemos intentado algunos enfoques, pero cuando fusionamos nuestras ramas git parece que a menudo 'sobrescribimos' los cambios de características de los demás. Parece que abundan los conflictos, lo que rompe el módulo de funciones, lo que hace que sea doloroso de usar.

Las características son realmente un ahorro de tiempo impresionante para la configuración de uno en proyectos, y estoy bastante seguro de que hay una manera de abordar esto.

¿Existe un flujo de trabajo o procedimiento que reduzca los riesgos de conflictos y sobrescribe?

Cualquier pista sobre las características es bienvenida.

Stefgosselin
fuente

Respuestas:

20

Bienvenido a la tierra de F sticasoperativas C onfiguration M GESTIÓN, también conocido como FCM ! No se trata solo de características y no de gestión de configuración (como se presentó en Drupal versión 8). En cambio, es un caso especial de S oftware C onfiguration M GESTIÓN , también conocido como SMC . Principalmente porque las características se pueden considerar como un generador de código, mientras que el código generado debe migrarse a través de múltiples entornos. Sigue leyendo para más detalles.

1 - Pros y contras del uso de características

Ventajas de usar características

  • Automatice la implementación de los cambios aplicados a un sitio de desarrollo de Drupal en uno o más sitios de (pre) producción de Drupal (en lugar de la implementación manual).
  • Facilita el intercambio (envío) del desarrollo continuo de Drupal entre los desarrolladores / creadores de sitios de Drupal (por ejemplo, hacer que algunas Vistas creadas por un experto en vistas estén disponibles para un Drupal Themer que trabaje en otro sitio de desarrollo para crear un tema para esa vista).
  • Gran integración con GIT y Drush para enviar una copia del código generado por las características (en el sitio de desarrollo) a los sitios seleccionados (pre) de producción.

Desventajas de usar características

  • ¡Evitar conflictos de características y / o gestionar dependencias de características puede ser un desafío!
  • No es fácil comenzar a usar Características en un sitio (de producción) existente.
  • Instalar / habilitar el módulo Características es fácil (solo un módulo), pero aprender a usar las características correctamente es un desafío importante.

2 - Técnicas para el embalaje de características

El uso de características depende de su propia imaginación cómo empaquetar (componer) el contenido de una característica. Aquí hay algunas técnicas que pueden usarse para ello.

Una súper característica única

Esta es una técnica de empaque bastante simple: todo está empaquetado en una sola característica (algunos lo llaman la característica "Dios" ...). Parece fácil, bastante avanzado, etc. Pero esta técnica también lleva a "conflictos" (como se explica a continuación) más o menos de inmediato ...

Un buen caso para esto parece ser cuando se crea una "distribución de Drupal", donde se supone que todos los usuarios usan el mismo conjunto de módulos, configuración, etc. Sin embargo, dicha distribución consiste en múltiples funcionalidades del sitio web (para no usar la palabra "características" ...), parece más apropiado dividir dichas características en múltiples características, como se explica a continuación.

Basado en la funcionalidad del sitio web

Esta técnica de empaquetado crea una característica separada para cada funcionalidad de un sitio web, como:

  • Característica A = implementar una " * Galería ".
  • Característica B = implementar un " * Blog ".
  • Característica C = implementar un " * Calendario de eventos ".

Basado en las secciones de administración de Drupal

Esta técnica de empaquetado crea características separadas para cada una de las secciones de administrador (principales) de un sitio web de Drupal que se utiliza para crear el sitio, tales como:

  • Todos los módulos requeridos están contenidos en la característica A,
  • Todas las definiciones de campo base están contenidas en la característica B,
  • Todos los tipos de contenido están contenidos en la función C,
  • Todos los permisos están contenidos en la función D,
  • Todos los roles están contenidos en la función E,
  • Todas las variables están contenidas en la característica F,
  • Todas las vistas (personalizadas) están contenidas en la función G,
  • Todas las reglas (personalizadas) están contenidas en la función H,
  • Etc.

La lista anterior es prácticamente ilimitada: al final, incluso podría pensar en ella como una característica para cada opción del menú de administración de Drupal ... si desea llegar tan lejos.

En mi opinión, también es el enfoque más recomendado para las características del paquete.

3 - Reducción de la probabilidad de conflictos en Características y / o GIT

No reutilizar campos

Muchos conflictos parecen ser causados ​​por la reutilización de campos entre múltiples tipos de contenido. Por ejemplo, en el tipo de contenido A, tiene un campo con el nombre de la máquina field_somefield, que también se utiliza como campo en el tipo de contenido B con el mismo nombre de máquina, field_somefieldpero que como otro tipo de campo y / o alguna otra configuración de campo que es diferente.

Al no reutilizar campos entre tipos de contenido, evita ejecutar este problema. Eche un vistazo a una convención de nomenclatura interesante para el nombre de máquina de sus tipos de contenido y campos, como se muestra en la tabla de Arquitectura y documentación de información de envoltura , que forma parte de los artículos sobre " Modelo de relatividad para Drupal ". Para obtener más detalles al respecto, consulte mi respuesta a " ¿Cómo modelo contenido (tipos) desde un punto de vista centrado en la base de datos? ".

Funciones divididas dependiendo de quién trabaja en qué

Si varias personas están trabajando en un solo sitio, la cantidad de conflictos se puede reducir organizando (= creando características separadas) en función de quién está trabajando en qué. Una ilustración de esto podría ser como en este ejemplo:

4 - Entornos Drupal recomendados

Todo lo anterior debería ayudar de alguna manera a facilitar el uso de las Funciones . Sin embargo, para garantizar que las cosas funcionen como se espera (diseñado), también debe tener un conjunto adecuado de entornos (sitios web de Drupal relacionados lógicamente) básicamente por estos motivos:

  • fusionar la funcionalidad proporcionada por múltiples funciones.
  • predecir y resolver conflictos.
  • prueba de usuario final de todas las funciones fusionadas que están certificadas para no tener conflictos.

En el mundo ideal, estos sitios web de Drupal relacionados lógicamente deben configurarse y usarse de la siguiente manera:

  1. Sitio de desarrollo personal : cada desarrollador de sitios web tiene un sitio de desarrollo separado. Cuando una parte del desarrollo está lista para ser compartida con otra persona, se crea una característica apropiada, que se envía al entorno de preparación.
  2. Sitio de Sandbox : este es un entorno de Drupal que solo contiene el núcleo de Drupal, utilizado para probar la integridad de una sola característica. Si una característica, accidentalmente, tiene algunas dependencias inesperadas (p. Ej., Algún módulo del que depende la característica, que no está habilitado en el Sandbox), aquí es donde esa dependencia quedará clara.
  3. Sitio de ensayo : aquí es donde se entregan una o más funciones (creadas en un sitio de desarrollo). Podría ser solo una revisión para algún problema de producción, o podría ser donde se consolida todo el desarrollo de una nueva versión del sitio web. Si existen conflictos entre varias funciones, entonces este es el entorno en el que aparecerán primero ... y deben resolverse de alguna manera.
  4. Sitio de control de calidad : después de que el entorno de ensayo se considere estable, es hora de seguir adelante con las funciones relevantes y ponerlas a disposición también en algún nivel superior donde se puedan usar para pruebas de control de calidad, pruebas de aceptación, pruebas de volumen, etc. En este nivel usted debe tener mucho cuidado al permitir cambios adicionales (si los hay). Debido a que cualquier cambio de este tipo puede invalidar todos los esfuerzos de prueba anteriores ya realizados en este entorno.
  5. Sitio de producción en la sombra : para preparar la activación en la producción real, es posible que primero desee promover aún más las características relevantes en un entorno que se considera una copia (sombra) de su entorno de producción real. Si en este punto durante el proceso de migración todavía se rompe algo, entonces eso es una señal de alerta para revertir algunos de sus pasos anteriores. Arregle e intente nuevamente, hasta que todas las partes involucradas aprueben los cambios.
  6. Sitio (s) de producción : si completó todos los pasos anteriores, este paso debería explicarse por sí mismo y ser bastante fácil. Dependiendo de sus necesidades, este podría ser un sitio único, o algo equivalente a los sitios múltiples de Drupal, mientras que todos los sitios involucrados ejecutan las mismas versiones de todas las características.
  7. Sitio de referencia : en mi experiencia, no hay muchas (si es que hay alguna) implementaciones de Drupal donde se usa este tipo de sitio (también). Es simplemente una copia de los sitios de producción, pero está disponible para los desarrolladores, probadores, etc. de Drupal que se puede usar para verificar cómo son los sitios de producción, o para realizar capacitación de usuarios, etc. Y en cualquier momento un nuevo desarrollo se inicia el ciclo, los componentes de un sitio que se verán afectados (deben cambiarse) deben "copiarse de alguna manera" utilizando este sitio de referencia como entrada, con el objetivo de un sitio de desarrollo personal .

Obviamente, el inventario anterior de tipos de sitios de Drupal es como el mundo ideal. Dependiendo del tamaño de su equipo de desarrollo y / o los presupuestos disponibles para crearlos y mantenerlos, no todos pueden usarse (o ser asequibles). Este inventario se basa en las mejores prácticas en el área de SCM, utilizado en su mayoría en todas las grandes corporaciones globales (bancos, aerolíneas, etc.).

5 - Módulos relacionados

Brazo fuerte

El módulo Strongarm permite exportar variables (de módulos que almacenan su configuración en variables) con el módulo Características.

Exportación de nodos

La exportación de nodo módulo permite a los nodos de exportación y luego importarlos a otro instalación de Drupal.

Exportación de roles

El módulo de exportación de roles permite que los roles tengan nombres de máquina y genera una identificación de rol única (rid) basada en el nombre de máquina. Los roles se pueden exportar con Características y obtener exactamente la misma eliminación si se importan en otros sitios.

Características desterrar

El módulo Features Banish permite excluir completamente los componentes de características individuales de la interfaz de usuario de características y las exportaciones de características. Aquí hay una cita al respecto de su página de proyecto:

 Este módulo es útil cuando hay componentes de características que desea asegurarse de que NUNCA se exporten. Si está utilizando características para la construcción o implementación de sitios, entonces probablemente se haya encontrado con el problema de que alguien exportó accidentalmente variables de marca de tiempo como cron_last o update_last_check. También es posible que desee desterrar los permisos para los módulos de desarrollador para que no queden atrapados con el resto de los permisos del sitio que desea exportar. Los elementos desterrados no aparecerán en su módulo de funciones O CUALQUIER OTRO MÓDULO DE CARACTERÍSTICAS, así que úselo con precaución. Para obtener una lista central de características que nunca deben exportarse, consulte https://www.drupal.org/node/2400531

FRIJOL

El módulo Bean hace que sus bloques sean exportables. Aquí hay una cita al respecto de su página de proyecto:

Piense en un Bean como un método para proporcionar nuevos tipos (en comparación con el nodo, este sería un tipo de contenido) que luego proporciona una interfaz de agregar contenido para crear tantos bloques como necesite (vea la captura de pantalla a continuación). El contenido del bean se puede colocar alrededor del sitio como cualquier otro bloque.

Este módulo también funciona muy bien en combinación con los módulos de integración de características UUID y UUID . Este módulo solo comenzó a partir de D7, pero ya se ha incluido con Drupal 8 core. El video tutorial Tutorial del módulo Drupal Bean: el uso de la interfaz de usuario de administración de Bean proporciona una excelente introducción para comprender realmente el poder de este módulo y el tipo de cosas que puede hacer con él (al usar solo técnicas de creación de sitios, sin necesidad de codificación personalizada).

Habitat

El módulo Habitat tiene más sentido en un flujo de trabajo basado en características . Aquí hay una cita al respecto de su página de proyecto:

En una configuración de múltiples entornos (por ejemplo, prod, test, dev, local), hay algunos módulos que le gustaría habilitar o deshabilitar siempre en ciertos entornos. Cada vez que sincroniza una base de datos, debe volver a habilitar / deshabilitar los mismos módulos. Peor aún, te vuelves perezoso y mantienes los módulos de desarrollo habilitados en producción.

Hábitat proporciona configuraciones para habilitar o deshabilitar ciertos módulos en cada entorno (hábitat). Simplemente configure una variable con, por ejemplo, $ conf ['habitat'] = 'local'; en su archivo settings.php (la variable real para usar allí es configurable para su flujo de trabajo actual). Los módulos de desactivación / habilitación se realizan en hook_init.

6 - Recursos recomendados:

7 - Posibles alternativas al uso de características

Si no puede, o no está dispuesto (todavía), a usar las Características , entonces puede verificar hasta qué punto los siguientes enfoques / módulos pueden proporcionar algún tipo de alternativa.

Exportación / Importación manual

Estas son las instalaciones comúnmente conocidas (para evitar las características de la palabra ...) disponibles a través de la interfaz de usuario de administración, para módulos como Reglas , Vistas , etc. (¡lista incompleta!).

Copia del paquete

Algunas personas consideran el módulo de copia Bundle como una posible alternativa. Tiene soporte de exportación / importación para:

  • Tipos de nodos
  • Taxonomía
  • Usuario.
  • Campos de campo API.
  • Grupos de campo.
Pierre.Vriens
fuente
1
La mejor respuesta que he visto.
No Sssweat
@NoSssweat Merci por las felicitaciones ... pero sé que todavía lo considero bastante incompleto. Por ejemplo, casi no incluye nada sobre el "ciclo de vida" de las funciones de procesamiento, y aún no dice mucho sobre cosas como análisis de impacto, auditoría, gestión de lanzamientos, autorizaciones, y, y (y otra docena de temas más o menos).
Pierre.Vriens
1
@ Pierre.Vriens - ¡Gracias! Supongo que llegué a la misma conclusión que tu excelente respuesta por las malas. Había intentado el enfoque de dividir por componentes (vistas_vistas, dependencia, etc.) pero estaba teniendo conflictos al intentar generar la característica. Me di cuenta -> después -> de que probablemente necesitaba configurar la función para no verificar las dependencias e ignorar los conflictos.
stefgosselin
7

Los conflictos de fusión probablemente se darán cuando varios desarrolladores estén integrando su configuración en una Característica. Escribí varias pautas para revisar el código de función, pero creo que la más importante es esta:

Solo confirma los cambios de código previstos.

¿Qué significa esto? Esto significa que cada desarrollador debe revisar el código antes de comprometerse. No hay "magia" para evitar cambios de código no intencionados sin que un desarrollador sea cauteloso.

  • Revise los cambios de código con git diff.
  • Realice un parche de diferencia rápida utilizando git diff > blah.patchy modifique manualmente el parche para incluir solo los cambios de configuración previstos.
    • Cosas como "mtime", comentarios en vista de exportaciones en el archivo de información no necesitan ser incluidos en el commit.
    • Me he vuelto bastante experto en revisar bloques de diferencias de código de configuración con el tiempo. Ahora es más fácil detectar cambios superfluos en vistas o paneles, y un rápido 10dden vim elimina el cambio en un parche (por ejemplo).
    • Pienso "Oh, oye, no cambié nada que ver con los campos, así que no me comprometeré featurename.features.field_base.inc".
  • Nunca lo use git commit -a. Esta es una práctica terrible que debe ser eliminada del uso. ¡Siempre agregue y comprométase explícitamente!
  • Úselo git rebaseen las sucursales locales de git para asegurarse de que la función esté más actualizada.
  • Una estrategia de fusión de git también puede ayudar cuando realmente se hace una fusión:
    • git merge -s recursive -X patience (requiere git 1.7+ iirc).

Finalmente, considere agregar restricciones sociales a los desarrolladores para que un desarrollador deba revisar su código antes de fusionarse en troncal / estable, ya sea con revisión de parche o solicitud de extracción. Las personas se enojarán por las restricciones sociales, pero deberían enojarse consigo mismas por no revisar su código.

mradcliffe
fuente
Es mejor que generar un archivo de parche git add -ppara confirmar solo fragmentos específicos.
donquixote