Tabla de contenidos maxLevel
2 indent 20px
Sugerencia |
---|
|
|
|
Advertencia |
---|
Las normas expuestas son de obligado cumplimiento. La STIC DGSIC podrá estudiar los casos excepcionales los cuales serán gestionados a través de los responsables del proyecto correspondiente y autorizados por el Área de Gobernanza de la STICDGSIC. Asimismo cualquier aspecto no recogido en estas normas deberá regirse en primera instancia por las guías técnicas correspondientes al esquema nacional de seguridad y esquema nacional de interoperabilidad según correspondencia y en su defecto a los marcos normativos y de desarrollo software establecidos por la Junta de Andalucía, debiendo ser puesto de manifiesto ante la STICDGSIC. La STIC DGSIC se reserva el derecho a la modificación de la norma sin previo aviso, tras lo cual, notificará del cambio a los actores implicados para su adopción inmediata según la planificación de cada proyecto. En el caso de que algún actor considere conveniente y/o necesario el incumplimiento de alguna de las normas y/o recomendaciones, deberá aportar previamente la correspondiente justificación fehaciente documentada de la solución alternativa propuesta, así como toda aquella documentación que le sea requerida por la STIC DGSIC para proceder a su validación técnica. Contacto Arquitectura: l-arquitectura.stic@juntadeandalucia.es |
Los cambios en la normativa vendrán acompañados de un registro de las modificaciones. De este modo se podrá realizar un seguimiento y consultar su evolución. Ordenándose de mas recientes a menos recientes, prestando especial cuidado a las cabezeras cabeceras de la tablas dónde se indican las fechas de entrada en vigor y versión.
Expandir | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||
|
En el SAS el ciclo de trabajo está basada en Gitflow, aunque se definen algunos puntos para facilitar la integración con el Jira corporativo.
Prerequisitos:
El flujo para realizar las entregas en el repositorio del SAS es el siguiente:
Se adjunta un script que permite realizar todos estos pasos automaticamente, indicando el repositorio de origen y el de destino, o desde un repositorio local existente solo indicando el destino.
Cuando se realice la entrega de una nueva versión en GIT, los criterios que deberá cumplir la entrega por parte del proveedor deberán ser:
Git for Windows: https://git-scm.com/download/win
Git for Windows ya incluye todos los comandos necesarios para trabajar con el workflow de GitFlow desde la versión 2.5.3.
Establecer la opción feature.finish.no-ff a true, lo que permitirá que gitflow cree un commit nuevo cada vez que se realice un merge independientemente de si se puede o no aplicar fast-forward. Esto facilita la revisión del histórico, y agiliza tareas de mantenimiento que requieran excluir features completas.
Para activar el parámetro no-ff basta con ejecutar el siguiente comando por consola y se aplicaría a todos los proyectos:
git config --global gitflow.feature.finish.no-ff TRUE
Si se trabaja con proxys será necesario realizar configuración adicional creando las variables de entorno "HTTP_PROXY" y "HTTPS_PROXY", también se podrán excluir direcciones con la variable global NO_PROXY
Git fue creado pensando en la eficiencia y la confiabilidad del mantenimiento de versiones de aplicaciones cuando éstas tienen un gran número de archivos de código fuente, es decir Git nos proporciona las herramientas para desarrollar un trabajo en equipo de manera inteligente y rápida.
Algunas de las características más importantes de Git son:
Iniciar un repositorio vacío en la carpeta actual.
|
Añadir un archivo especifico.
|
Añadir todos los archivos del directorio act
|
Confirmar los cambios realizados. El "mensaje" generalmente se usa para asociar al commit una breve descripción de los cambios realizados.
|
Revertir el commit identificado por un hash.
|
Subir una rama(branch) al servidor remoto.
git push origin
"nombre rama"
Mostrar el estado actual de la rama(branch).
git status
La principal diferencia con Subversion es que éste es un Sistema Centralizado mientras que GIT es un sistema Distribuido:
En estos sistemas hay un servidor que mantiene el repositorio y en el que cada programador mantiene en local únicamente aquellos archivos con los que está trabajando en un momento dado. Se necesita conectarse al servidor para poder enviar los cambios realizados. Es un sistema donde todo el código del proyecto esta en el servidor únicamente.
En este tipo de sistemas cada uno de los integrantes del equipo mantiene una copia local del repositorio completo. Al disponer de un repositorio local, se pueden hacer commit (enviar cambios al sistema de control de versiones) en local, sin necesidad de estar conectado a Internet o cualquier otra red. En el momento que lo quieras compartir con los demás integrantes del equipo se realiza el registro a nivel de servidor.
La migración de los repositorios actuales que se encuentran en el SVN se realizara de forma progresiva e individualizada por producto a lo largo del tiempo.
En el día a día, el desarrollador trabaja sobre la copia de trabajo en un ciclo de editar ficheros, actualizar la copia con las modificaciones realizadas por otros desarrolladores, y enviar sus modificaciones al repositorio.
En subversion, esto se realiza con los comandos:
|
El flujo de información y los comandos asociados en svn se pueden representar como:
Los comandos equivalentes en git son:
|
y su representación gráfica es:
Como vemos, en el ordenador local existen tres elementos: los ficheros con los que se está trabajando, una "staging area" y un repositorio local, mientras que en svn sólo existen dos, los ficheros con los que se está trabajando, y la "working copy".
Por otra parte, en git lo normal es que existan varios repositorios remotos, y habitualmente uno de ellos es el repositorio compartido en el que se consolidan los cambios realizados por un grupo de desarrolladores. Por lo tanto, para enviar unas modificaciones realizadas localmente al repositorio compartido, en git hay que realizar más pasos que en svn: llevar la modificación a la "staging area" (con un comando add, mv o rm), desde allí al repositorio local (con un comando commit), y desde el repositorio local al repositorio remoto. (con un comando push). Por comodidad, los dos primeros pasos se pueden ejecutar con un sólo comando "commit -a".
Para actualizar la copia local con los cambios realizados en el repositorio remoto, en svn se ejecuta el comando "update". En git, primero hay que actualizar el repositorio local con un comando "fetch", y después actualizar la staging area y los ficheros de trabajo con el comando "merge". Por comodidad, los dos pasos se pueden ejecutar con un único comando "pull".
En ocasiones, se deben añadir ficheros para que queden bajo el sistema de control de versiones, o bien eliminar ficheros que ya no son necesarios. Esto se realiza de una manera muy similar en ambos casos.
En svn:
$ svn add fichero1
$ svn delete fichero2
$ svn move fichero3 fichero4
En git:
|
Para deshacer las modificaciones realizadas en un fichero, basta con ejecutar el comando revert:
|
En git, el equivalente a "svn revert fichero" es:
|
En git, para crear un repositorio basta con ejecutar el comando "git init" en el directorio en donde va a estar la copia de trabajo:
$ mkdir git_repo
$ cd git_repo
$ git init
Initialized empty Git repository in /home/usuario/git_repo/.git/
Esto crea e inicializa el subdirectorio ".git". A continuación, se pueden comenzar a ejecutar comandos "git add", "git commit -a", etc.¿
En git, cada commit se guarda junto con el nombre y el email del usuario que lo realizó. Para establecer un valor de estos parámetros para todos los repositorios, se utilizan los comandos:
|
Para comprobar el valor asignado, se utilizan los mismos comandos sin especificar un nuevo valor. Ejemplo:
|
Para cada repositorio, se puede configurar un valor distinto para estos parámetros, utilizando los comandos sin el modificador "¿global" Crear una copia local de un repositorio remoto En svn, se obtiene una copia de un repositorio en el área de trabajo mediante un "checkout":
svn checkout svn+ssh:
//usuario@servidor:/ruta/al/repositorio
En git, se realiza una copia del repositorio con el comando "git clone":
$ git clone ssh:
//usuario@servidor/ruta/al/repositorio
Gitflow es uno de los muchos workflows que existen para trabajar con GIT. En el SAS se debe de usar este workflow por parte de los proveedores.
Gitflow utiliza un repositorio central como centro de comunicación para los diferentes desarrolladores. Su punto fuerte es la estructura de ramas (branches) que posee para controlar la evolución del proyecto.
Gitflow se caracteriza por el uso de cuatro tipos de ramas diferentes:
CheatSheet: https://danielkummer.github.io/git-flow-cheatsheet/index.es_ES.html
En lugar de trabajar todo desde la rama master, aquí se utilizan dos ramas para registrar el historial de proyecto:
Es recomendable etiquetar todos los commits en la rama master con un número de versión.
En resumen en la rama master no se desarrolla, solamente se registran los diferentes lanzamientos. Todas las integraciones se realizan desde la rama de Develop.
El resto de ramas trabajan alrededor de estas dos.
Cada nueva funcionalidad debe residir en su propia rama, de esta forma en caso de existir problemas es muy rápido volver a versiones anteriores.
Las ramas de nuevas funcionalidades, features, siempre se crean a partir de la rama de develop. Una vez finalizado el desarrollo sobre la feature, se fusiona con la rama de develop , nunca con la rama master.
Una vez el evolutivo se ha finalizado y se acerca la fecha de lanzamiento se crea una rama para éste, release. Las ramas releases son utilizadas para marcar o etiquetar lanzamientos de producto, (evolutivos) y poder tener identificados de forma rápida los cambios de las diferentes releases.
A la rama release no se le pueden añadir nuevos evolutivos de ningún tipo, solamente la documentación asociada al lanzamiento de la release o errores puntuales.
Una vez se finalizan la rama release se tiene que fusionar tanto la rama master como la rama develop. Estas dos, siempre que realicemos una publicación, tienen que estar sincronizadas con el mismo contenido.
La rama maintenance se utiliza cuando se detectan errores críticos de la aplicación.
La forma de trabajar sería crear una rama proveniente de la master, solventar el correctivo y fusionar con la rama master.
Maintenance es la única rama que interactúa directamente con la rama master, todas las demás siempre se trabaja desde la rama de desarrollo.
Una vez se ha solventado el correctivo se tiene también que fusionar con la rama develop, para que el correctivo se mantenga en los diferentes evolutivos.
A continuación se describe el procedimiento de subida a GIT haciendo uso de GIT FLOW tal y como está indicado en la presente normativa. Para ello, el procedimiento será el siguiente:
git flow init
git flow feature start "MYFEATURE"
git flow feature finish "MYFEATURE"
git flow release start "RELEASE"
git flow release finish "RELEASE"
Como interfaz gráfica de Git, en la que apoyarse para gestionar los repositorios, disponemos de Gitlab en su versión Community Edition.
Desde el SAS se aplica una política de seguridad sobre los repositorios de GIT, con el objetivo de mantener su privacidad y que únicamente los miembros del equipo de proyecto tengan acceso al código fuente.
Los permisos sobre GIT tienen la siguiente configuración:
Los permisos más usados serán los de Master y Guest, ya que el repositorio ubicado en el SAS no será usado directamente por los desarrolladores.
La solicitud de permisos se realizara por petición CGES a la OCA, de la misma manera que se realiza actualmente para el SVN
La plataforma Gitlab nos proporciona una integración sencilla para poder enlazar incidencias (Jira) y nuestro repositorio (Gitlab).
Gitlab puede detectar automáticamente enlaces a issues de JIRA. Para ello, sólo tendremos que añadir en los commits, los identificadores de las issues JIRA que deseemos.
De esta forma podremos acceder rápidamente a la issue para ver el detalle.
Ejemplo de comentario: "CHKI-1 Solventado el problema".
https://www.atlassian.com/git/tutorials/comparing-workflows#gitflow-workflow
http://nvie.com/posts/a-successful-git-branching-model/
https://about.gitlab.com/2014/09/29/gitlab-flow/
|
El objeto de esta normativa, es la definición de las pautas necesarias a seguir para la entrega de código fuente y la correcta ejecución de los procesos de integración continua. Basándose en las mejores prácticas actualmente aplicadas en la industria, se definen pautas de obligado cumplimiento con el objeto de garantizar la homogeneidad, trazabilidad y correcto funcionamiento de todos los procesos previos a la liberación del software en entornos previos y productos.
La normativa se ha organizado en pautas que describen las reglas de verificación necesarias a cumplir en la entrega de código fuente.
Para más detalles sobre el modo de articular todas las pautas a continuación expuestas puede consultar la guía de ayuda a las entregas en la STIC.
Esta normativa afecta a aquellos desarrollos corporativos que estén bajo el marco de gestión centralizada de la Dirección General de Sistemas de Información y Comunicaciones del SAS.
Ámbito: Commits | |||||||
---|---|---|---|---|---|---|---|
Pauta | Descripción | ||||||
P1 | No se permitirá por norma general hacer commits en master, develop o ramas support directamente, para ello se deberán de usar las demás ramas (release, feature,hu) dentro del flujo de Gitflow. | ||||||
P2 | Cada commit, incluido en una feature, debe incluir en su comentario el código Jira de la issue que corresponda, en caso de no disponer de dicha traza se referenciará el código de solicitud CGES que desencadena el cambio. | ||||||
P3 | Cada commit, incluido en una release, debe incluir la referencia a la issue de tipo versión especificada en Jira a la cual afecta. | ||||||
C1 | Cada commit, incluido, debe ser atómico y pequeño, incluyendo solo cambios que están relacionados entre sí. | ||||||
C2 | Cada commit, incluirá un mensaje claro y descriptivo conteniendo una primera linea con un máximo de 70 caractéres dónde se da un resumen claro y conciso del cambio. Posteriomente se agregará una descripción resumida con caracter imperativo dónde se aclara "qué" a cambiado y "porqué" |
Ámbito: Trazabilidad | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Pauta | Descripción | |||||||||||
P4 | Se ha de seguir el flujo adaptado de Gitflow para la STIC, dónde cada rama de mejora conlleva la entrega de una rama de tipo feature ( definida en git-flow) con nombre en el formato [feature/{Codigo_Jira_Mejora}_{Descripcion}]. Dónde:
| |||||||||||
P5 |
Se ha de seguir el flujo adaptado de Gitflow para la STIC, donde cada rama de historia de usuario, conlleva la entrega de una rama de tipo feature ( definida en git-flow) con nombre en el formato [feature/{Codigo_Jira_Mejora}/{Codigo_Jira_HistoriaUsuario}_{Descripcion}]. Dónde:
| |||||||||||
P6 | Se ha de seguir el flujo adaptado de Gitflow para la STIC, dónde cada rama de Release cumplirá con la siguiente nomenclatura: [ Release/{Version} ]. Dónde:
| |||||||||||
P7 | Se ha de seguir el flujo adaptado de Gitflow para la STIC, donde cada rama de Hotfix cumplirá con la siguiente nomenclatura: [ Hotfix/{Version} ]. Dónde:
| |||||||||||
P8 | Se ha de seguir el flujo adaptado de Gitflow para la STIC, donde cada rama de soporte cumplirá con la siguiente nomenclatura: [ Support/{Version} ]. Dónde:
|
Ámbito: Gestión de ramas en proyectos basados en metodologías ágiles | |||||||
---|---|---|---|---|---|---|---|
Pauta | Descripción | ||||||
P9 | Se ha de seguir el flujo adaptado de Gitflow para la STIC cuando genere una rama para una mejora. El formato del nombre está definido en P4. | ||||||
P10 | Se ha de seguir el flujo adaptado de Gitflow para la STIC cuando genere una rama para una historia de usuario. El formato del nombre está definido en P5. | ||||||
P11 | Las ramas de historia de usuario se generan y cierran sobre las ramas de mejora en la que están contenidas, con la aceptación de los siguientes criterios al cierre:
| ||||||
P12 | Las ramas de Mejora permanecerán abiertas siempre, se cerrarán sobre la rama develop tras la aceptación de los siguientes criterios:
| ||||||
P13 | Las ramas de soporte, permanecerán siempre abiertas, en paralelo a la rama develop, y se comportará como tal, permitiendo la apertura sobre ella de ramas de mejora, historia de usuario. | ||||||
P14 | Manejo de la rama support en escenarios que requieren versiones en paralelo (por ejemplo, evolución de la aplicación y evolución tecnológica ejecutadas en paralelo) a. La rama de soporte se crea desde la rama master. Concretamente desde el tag del que se desea mantener una versión en paralelo. b. La evolución del producto que vaya a mantenerse viva, estará contenida en las ramas develop y master. La de soporte se utilizará para aquel mantenimiento y/o evolución que tenga una fecha de finalización. c. La rama de soporte realizará funciones de "develop" y "master" para la evolución funcional de la aplicación. d. La rama support se crea siguiendo la nomenclatura support/version, teniendo versión como máximo 2 dígitos W.X. , donde W: Identifica el dígito mayor de la versión. X: Identifica el dígito medio de la versión. Será el jefe de proyecto quien decida el nombre de la rama y los dígitos de la misma. e. Los tags en la rama support continuarán siendo de 4 dígitos. Sonarqube trabaja con tags, por lo que el análisis de código no se verá afectado. f. Cuando se finalice la evolución tecnológica, si es necesario, habrá que "volcar" en develop, la rama soporte. Para hacerlo, se crearán previamente una rama de mejora en develop y una rama de mejora en support, haciendo el merge de dichas ramas y resolviendo los conflictos u adaptaciones que sean necesarios. g. Las ramas de soporte, nunca se cerrarán directamente sobre la rama develop. | ||||||
P15 | Las ramas hotfix o release se regirán por las nomenclaturas P8, P7 y P6 respectivamente. | ||||||
P16 | Está permitido entregar ramas internas sobre hotfix con la nomenclatura definida en el P5 para mejoras e historias de usuario, sólo en casos excepcionales cuando el desarrollo se considera urgente. Más info |
Ámbito: Gestión de ramas en proyectos basados en metodologías tradicionales (no ágil) | |||||||
---|---|---|---|---|---|---|---|
Pauta | Descripción | ||||||
P17 | Vease P9. | ||||||
P18 | Vease P12. | ||||||
P19 | Vease P13. | ||||||
P20 | Vease P14. | ||||||
P21 | Vease P15. |
Ámbito: Gestión de tags | |||||||
---|---|---|---|---|---|---|---|
Pauta | Descripción | ||||||
P22 | Nunca se nombrarán tags con el sufijo "-Snapshot" o variantes en las ramas master, support. | ||||||
P23 | El formato permitido para un tag siempre será del tipo W.X.Y.Z, dónde: w. Identifica el dígito mayor de la versión. X. Identifica el dígito medio de la versión. Y. Identifica el dígito menor de la versión. Z. Identifica el dígito de entrega de la versión. | ||||||
P24 | Excepcionalmente y bajo acuerdo previo entre el área de gobernanza y el proyecto se permitirán versiones de sprint identificadas con el sufijo SP"n", dónde n identifica el número secuencial del sprint al que representa. | ||||||
P25 | Excepcionalmente y bajo acuerdo previo entre el área de gobernanza y el proyecto se permitirán versiones candidatas a release, identificadas por el sufijo RC"n", dónde "n" identifica un secuencial exclusivo para las candidatas a release. | ||||||
P26 | Las ramas de soporte, tagearán sobre la misma rama de soporte la versión prevista, sin hacer uso de ramas release. | ||||||
P27 | En proyectos que empaquetan haciendo uso de Maven, al tagear sobre el repositorio de código fuente la versión identificada en los artefactos generados ha de ser coincidente con la versión tageada, siguiendo el formato de versión indicado en P23. | ||||||
P28 | En proyectos que empaquetan haciendo uso de node.js, al tagear sobre el repositorio de código fuente, la versión identificada en los artefactos generados ha de ser coincidente con la versión tageada, siguiendo un formato de 3 dígitos similar al de P23 y prescindiendo del dígito Z. |
Ámbito: Gestión de la entrega de código | |||||||
---|---|---|---|---|---|---|---|
Pauta | Descripción | ||||||
P29 | Las entregas al repositorio de la STIC sólo soportarán como ramas abiertas aquellas que sean del tipo, soporte, develop o master. | ||||||
P30 | Las ramas de tipo hotfix o release, así como cualquier otra rama que haya sido de uso interno en su repositorio empresarial, deben haberse cerrado correctamente sobre las ramas de soporte o develop, previamente a su entrega al repositorio de la STIC. | ||||||
P31 | Al entregar, la rama MASTER estará como máximo al mismo nivel que la rama DEVELOP, nunca la rama MASTER podrá estar por encima de la rama DEVELOP. En todo caso la rama DEVELOP sí que podrá estar por encima de la rama MASTER, dado su carácter de rama de trabajo. | ||||||
P32 | Cuando se realice una entrega de una nueva versión, deberá existir el TAG (desde la rama MASTER) correspondiente a dicha versión. | ||||||
P33 | Nunca se entregarán tags al repositorio de la stic que no cumplan escrupulosamente con las reglas definidas en P22. |
Para un correcto uso de GIT recomendamos: