Descripción técnica Perforce

 

perforce-helix

 

Helix Versioning Engine

Colabore Sin Límites 

Helix es un SCM y una plataforma  de colaboración de contenidos de nivel empresarial, que ayuda a los equipos a construir mejores productos de forma más rápida. Ofrece una aproximación híbrida al control de versiones, utiliza éste como un sistema distribuido de control de versiones (DVCS) o bien puede utilizarse como un sistema centralizado. 

Arquitectura

Funciona en modo cliente/servidor. El servidor gestiona una base de datos central que contiene uno o más repositorios con versiones de los ficheros. Los cliente trabajan con ficheros en modo local previa importación de ellos a su taller de trabajo (workspace), y posteriormente los devuelven modificados agrupados en listas de cambio. La conexión se realiza mediante TCP usando protocolos propietarios de RPC y streaming.

Base de datos

Perforce cuenta con una base de datos propietaria, pre-configurada y pre-instalada que almacena los metadatos de los ficheros almacenados en el repositorio (estado, historia de las ramificaciones y reencuentros, listas de cambios, descripciones de cambios, usuarios, grupos, etiquetas...). En la base de datos se almacena sólo el hash (MD5) del fichero, el cual se almacena en el repositorio, de modo que se puede comprobar su integridad.

Las tablas de la base de datos se almacenan en formato binario. Los puntos de control (checkpoints) y logs se almacenan en formato texto, los cuales pueden ser comprimidos y descargados. De esta manera es posible recuperar una base de datos que se haya corrompido por fallo hardware u otra calamidad. Los administradores pueden preparar la recuperación de desastres programando logs y configurando la periodicidad de los puntos de control.

Repositorio

Los distintos ficheros y sus versiones son almacenados en una estructura de directorios denominada repositorio. Las revisiones de los ficheros de texto se almacenan como deltas RCS, mientras que los binarios se almacenan íntegramente. Los ficheros de texto se codifican bien en ASCII o Unicode, dependiendo de la configuración del servidor. Los ficheros en el repositorio no están cifrados. Las revisiones que son ramificación o copia de otras revisiones se mantienen como copia virtual dentro del repositorio. Se guardan todas las revisiones por defecto, aunque se puede limitar el núacute;mero de versiones que guarda el repositorio.

Versiones obsoletas de los ficheros pueden ser purgadas por el administrador. Se ha de hacer copia de seguridad de los ficheros del repositorio.

Clientes

Los clientes de Perforce se agrupan en estas cuatro categorías: comandos, entorno gráfico, web y plug-ins.

 

  • El interfaz básico de comandos se denomina P4. Puede utilizarse en la ventana de comandos de cualquier sistema operativo o script. Produce siempre salida en modo texto, que puede incluir etiquetas, o bien scripts Python o Ruby. Están disponibles también APIs nativos en C++ y Java, así como Lua, Perl Python, PHP, Objective-C y Rubi, todas ellas implementadas sobre el API C++. Mediante comandos se puede ejecutar toda la funcionalidad del cliente, que se puede usar con la sintaxis de nombres de fichero nativa del sistema operativo o bien con la sintaxis neutra de Perforce.

  • Hay disponibles dos interfaces gráficas, la genérica basada en Qt y llamada P4V, y la de Windows P4WIN. Ambas soportan la mayoría de operaciones administrativas. P4Admin -como P4V- está basada en Gt y se puede portar entre plataformas. P4V y P4Admin pueden extenderse con scripts escritps en JavaScript y HTML.

  • P4Web proporciona interfaz Web, y funciona tanto como un cliente perforce como un servidor HTTP independiente. P4Web puede ejecutarse como un servidor Web compartido para dar acceso a los ficheros del repositorio y a los metadatos. Puede ejecutarse en una máquina cliente, de modo que permite el acceso al Perforce con un navegador.

  • Los plug-ins son programas transparentes al usuario que integran la funcionalidad del cliente Perforce con aplicaciones de terceros. Están disponibles entornos y herramientas de desarrollo, sistemas de revisión de código, trazado de defectos, comandos de compilación, herramientas de automatización de oficina, clientes SQL y FTP.

Caracterísiticas

  • Historia completa de los metadatos y del fichero

  • Historia completa de la historia de revisiones de ficheros ramificados, renombrados, movidos, copiados y borrados

  • fusión de ficheros a tres bandas (three-way text file merging), seguimiento de fusiones y prevención de refusiones; detección de ancestro comúacute;n

  • Presentación gráficas de diferencias, fusiones y herramientas de reconcilia

  • Visión gráfica de históricos y ramificaciones

  • Interfaz administrativo gráfico

  • Soporte para control distribuido de versiones

  • Imágenes icono

  • Listas de cambio: los ficheros modificados pueden agruparse y manejarse como unidades lógicas

  • Modificaciones atómicas: al servidor hace que las listas de cambio se actualicen de manera indivisible

  • Aparcamiento: se puede almacenar temporalmente el trabajo en curso para cambiar de tarea

  • Soporte para ficheros ASCII, Unicode, binario, enlaces simbólicos, específicos de Mac y UTF-16

  • Soporta internacionalización y localización

  • Expansión de palabras clave estilo RCS

  • Compresión de ficheros para transmisión y almacenamiento

  • Un servidor Unix o Windows soporta clientes en cualquier sistema operativo

  • Disparadores de eventos en el servidor

  • SDK para integración con sistemas externos

  • Notificaciones de cambios mediante RSS o e-mail

  • Replicación de ficheros y metadatos

  • Gestor para implementación de políticas locales, restricción de comandos o redirección a servidores alternativos

  • Archivo de ficheros para liberar espacio en disco

Modelo de concurrencia

Perforce ofrece un modelo mixto de concurrencia en cuanto a injerto (merge) y bloqueo de versiones. Al igual que con sistemas similares, los usuarios no han de bloquear los ficheros para trabajar con ellos, pero se les requiere que resuelvan problemas de concurrencia con ficheros confirmados por otros antes de confirmar sus propios cambios. Opcionalmente pueden bloquear ficheros para evitar problemas de concurrencia.

El modelo de Perforce es ligeramente diferente y los usuarios no necesitan informar al sistema acerca de los ficheros que pretenden cambiar, incluso sin bloquearlos. Al notificar intenciones de cambio se ponen los ficheros en una lista de cambios (changelist) pendientes que se envía al servidor. Esto permite a otros usuarios trabajar sobre los mismos ficheros, de modo que permite a los usuarios que otros están trabajando en paralelo coordinarse antes de realizar cambios difíciles de injertar (merge).

Perforce favorece este requisito de notificación avanzada dando permiso de sólo lectura a los ficheros del taller local (workspace) tras extraerlos del repositorio.

Los usuarios pueden saltarse este requisito -voluntariamente o por necesidad (p.e. cuando trabajan sin conexión)- ignorando los permisos y modificando los ficheros a su antojo. Es responsabilidad del usuario, en ese caso, recurrir a Perforce para reconcilar este trabajo realizado en desconexión, poniéndolos en una lista de cambios pendientes de modo que puedan ser cometidos (committed). (Es también responsabilidad de los usuarios dejar los ficheros en estado de escritura tras su modificación. Un fichero de sólo lectura que no figure en una lista de cambios pendientes es considerado por Perforce como candidato a ser repuesto).

Ramificaciones e injertos

Los ficheros se identifican unívocamente por su nombre completo (e.g. //repositorio/principal/src/index.cpp). Cualquier versión de fichero no borrado puede ser ramificado. Perforce usa ramificación inter-fichero, por la que se crea un nuevo fichero con nuevo nombre. Por ejemplo mi/index.php puede ramificarse en tu/index.php, y cada uno puede evolucionar independientemente. Las ramas del repositorio se nombran habitualmente con el nombre del conjunto de ficheros ramificados. Por ejemplo los ficheros en //repositorio/principal pueden ser ramificados dentro del directorio //repositorio/version1.0, con lo que obtendremos dos ramas que pueden evolucionar independientemente, y que eventualmente pueden injertarse.

En Perforce la operación que injerta los cambios de una rama en otra se denomina integración. La integración propaga los cambios entre un conjunto de ficheros donantes y otro correspondiente de receptores; existe la opción de definir ramificaciones opcionales, que pueden asignar correspondencias donante-receptor específicas. Por defecto, la integración propaga todos los cambios pendientes en los donantes, pero también pueden limitarse a listas de cambio, fechas, etiquetas, nombres de fichero o patrón de nombre de fichero escogidos. El sistema registra todas las integraciones, las usa para seleccionar ancestros comunes para injertos, y no hace por defecto integraciones redundantes.

El injerto (merging) es sólo uno de los tres posibles modos de integración. Los otros se denominan desestimación (ignoring) y promoción (promoting). Injerto es usado para mantener actualizado un conjunto de ficheros con otro. Por ejemplo, una ramificación de desarrollo puede mantenerse actualizada con la principal mediante repetidos injertos. La desestimación ignora los cambios en un conjunto de ficheros de cara a futuras integraciones con otro. Se suele utilizar cuando una ramificación de desarrollo se quiere mantener actualizada, y sin embargo diferente, con la principal. La promoción se utiliza típicamente para promocionar al contenido de una ramificación de desarrollo con la principal.

La ramificación también soporta ficheros renombrados (o movidos). El comando move ramifica los ficheros originales a nuevos y borra el original. Un fichero ramificado no se diferencia de un fichero añadido; los ficheros ramificados se consideran iguales a su original, no descendientes. El sistema hace el seguimiento del origen de los ficheros, y hace referencia a ellos cuando se muestra la historia de ficheros que han sido renombrados.

Streams

En la versión 2011.1 Perforce introdujo una agrupación de ficheros en paquetes o grupos correspondientes a una versión. El modelo streams permite crear una nueva rama -y posteriormente injertar cada uno de los ficheros que la componen- en una sola operación, sufriendo cada uno de los ficheros afectados el mismo proceso de ramificaciones e injertos descrito más arriba.

La funcionalidad de streams ofrece una innovadora manera de gestionar el desarrollo concurrente, las dependencias y otras actividads comunes en ramificación y publicación de versiones. Los streams proporcionan a los proyectos un marco en el que se establecen flujos de trabajo basados en las mejores prácticas observadas en años de desarrollo. Los streams son lo suficientemente flexibles para acomodar muchos modelos de ramificación en desarrollo, incluyendo el de línea principal y promociones adecuado a desarrollo de sitios Web.

La migración de un proyecto ya existente a streams requiere alguna planificación. Aunque la mecánica de mover los datos a un depósito con streams es directa, otros puntos han de ser considerados, como el impacto en usuarios y herramientas. El cambio a streams ofrece un productivo flujo de trabajo y resuelve tradicionales cuellos de botella.

Control distribuido de revisiones

Perforce tiene dos mecanismos para conseguir un control distribuido de versiones; estos mecanismos pueden ser utilizados independientemente o combinados. El primero consiste en un servidor proxy que hace cache de las versiones frecuentemente leídas, para reducir el tiempo de acceso de usuarios remotos. Este mecanismo de acomoda a desarrollo en organizaciones cerradas en las que un repositorio controlado centralmente y una base de datos de acceso universal son deseables.

El segundo mecanismo -los llamados repositorios remotos- permite a los usuarios conectados a un servidor acceder a las versiones de ficheros guardadas en otros. Con los repositorios remotos, cada organización controla su propio servidor y hace visible parte de él -o la totalidad- a otros servidores. Este mecanismo puede ser usado por organizaciones de desarrollo dispersas, donde se desea una aproximación peer-to-peer.

Control de acceso y seguridad

El servidor Perforce almacena el contenido de cada fichero en un repositorio maestro al que, cuando se instala adecuadamente, no tienen acceso los usuarios. El acceso de los usuarios a los ficheros se controla por uno o más superusurios Perforce. Se les puede otorgar un amplio rango de derechos e acceso. Se puede establecer protección a nivel de directorio, usuario y dirección IP. El servidor puede auditar el acceso de usuarios para cumplimiento de normativa legal (LOPD, SOX...).

La autenticación de los usuarios es controlada por el administrador del sistema Perforce. Este puede configurar la fortaleza de la clave, de igual modo se puede configurar acceso mediante tickets. Los triggers (programas o scripts de usuario que se disparan segúacute;n eventos predefinidos) pueden asociarse a casi todos los comandos Perforce, y pueden ser empleados para conexión a un sistema externo de autenticación (LDAP, SSO...), para bloquear o permitir determinados comandos, o para restringor o normalizar las modificaciones de ficheros. Los triggers se ejecutan en el servidor y no tienen acceso a las máquinas cliente.

Perforce, como casi todos los sistemas de control de versiones, no cifa el contenido de los ficheros ni en el servidor ni en las máquinas cliente, ni tampoco cifra su transmisión. Es posible utilizar un protocolo de tunel -como VPN o SSH- para asegurar las transferencias. Para asegurar globalmente en contenido de Perforce es necesario implementar adecuadamente la protección de los ficheros, la autenticación y el uso de túacute;neles cifrados para ls comunicación con el servidor.

El cliente Perforce confía plenamente en el servidor. Esto significa que el servidor tiene control total la cuenta del usuario del cliente, incluyendo la lectura y escritura de todos los ficheros del usuario. En entornos en los que el servidor Perforce esté gestionado por un tercero, puede suponer una cierta amenaza a la seguridad y privacidad del cliente.

Disponibilidad y plataformas soportadas

Están disponibles descargas de evaluación del servidor Perforce, del cliente y de los plug-ins en el website de Perforce. Típicamente se lanzan dos versiones nuevas de programas servidor y cliente al año, como ejecutables. Están disponibles para Microsoft Windows, Mac OS X, Linux, Solaris, FreeBSD, y otros sistemas operativos.

Está disponble la integración con los siguientes IDE:

  • Eclipse
  • WebSphere
  • ColdFusion
  • Dreamweaver
  • CodeWright
  • IAR Embedded Workbench
  • Visual Studio
  • Primalscript
  • Zeus
  • Komodo
  • articy:draft
  • BBEdit
  • JBuilder
  • Embarcadero Delphi
  • Delphi
  • IntelliJ IDE
  • LabVIEW
  • PythonWorks
  • SlickEdit

Licencias y condiciones de uso

El uso de servidor Perforce hasta veinte usuarios y veinte talleres de usuario es libre y gratuito, o bien para un núacute;mero ilimitado de usuarios y hasta mil ficheros. Debe adquirirse una licencia para más usuarios o talleres de usuario; las licencias se pueden adquirir a perpetuidad o mediante suscripción. Se suministran licencias gratuitas para desarrollo de software libre, proyectos escolares o académicos y para períodos de evaluación. El uso de los clientes o de los plug-ins es ilimitado, así como a la documentación técnica.

Base instalada

En Junio de 2013, Perforce contaba con una base de unos 400000 usuarios en 5500 organizaciones.