[GIT] Git Flow - GitHub Flow


A la hora de trabajar con git, existen varios formas de lograr con éxito una buena organización. Existen 2 métodos que proponen una forma de trabajar bajo ciertas normas, ninguna resulta ser perfecta, ninguna cubre todos los casos y es posible que necesitemos nuestra forma de realizar un flujo de trabajo y conocer estos métodos nos brindará una idea como hacerlo.


GitFlow



Gitflow o flujo de git es una manera de trabajar ordenando el repositorio en varias ramas que se corresponden con cada fase del desarrollo de la aplicacion.


La propuesta de este flujo de trabajo cuenta con 5 ramas:

  • master
  • hot-fix
  • release
  • develop
  • feature

Master

Este modo de trabajo nos propone dejar master donde se encuentren las versiones finales, similar a los tags.

Desde master de desprende hot-fix, para tratar incidentes urgentes generalmente rapidos y cortitos.


Develop

Desde master nace la rama de develop, una especie de borrador de master. Desde aqui cada desarrollador crearia su propia rama de trabajo feature-xxx.

Desde ahi uno es libre de seguir creando tantos branch locales como se necesite. Lo importante es, un vez finalizado el trabajo, mergear a develop.

En este punto, nace release, para corregir los ultimos detalles y adecuar al entorno del cliente. Una vez lograda cerrar las caracteristicas del nuevo desarrollo, se integra en develop y desde esta ultima se devolveria a master. Para finalizar se crea el tag.



GitHubFlow



Githubflow o flujo de github, es una manera de trabajar mas minimalista, con solo una rama principal(master) y la rama de turno para generar cambios.


Las caracteristicas principales son:


Todo en master es deployable(desplegable a nivel productivo), esto es ideal a la hora de trabajar con integracion continua y delivery continuo.


Cada nueva caracteristica requiere hacer un branch desde master, y pusheando al remoto hasta lograr una version de pruebas.


Podria haber tantas ramas como caracteristicas simulteneas se requieran.


Si un compañero finalizo su trabajo e integro en master, al crear la nuestra desde la misma instancia, se puede traer sus cambios y sumarlos a los propios.



Los pasos a seguir en flujo de trabajo son:

  • Crea tu propia rama, desde master
  • Trabajar de manera local pusheando los commits a la rama remota
  • Cuando la rama este lista para el merge con master se abre un pull request.
  • Se conversa y revisa el codigo con el grupo de trabajo
  • Deploy y testing en produccion, los arreglos y adecuaciones de configuracion se realizan en este punto
  • Merge a master, luego tag.

[GIT] Operadores - Pull, Push y Fecth

Operadores en GIT

Colaborando: (ver también: git --help workflows)

       
    • Fetch
    • Descarga objetos y referencias de otro repositorio, pero no realiza ningun cambio, es como preguntar ¿Qué hay de nuevo?
  •    
    • Pull
    • Recupera e integra con otro repositorio o un branch local. Hace el fetch y actualiza el branch actual.
  •    
    • Push
    • Actualiza referencias remotas junto con objetos asociados, envia la serie de commits al repositorio remoto.

Actualizando referencias remotas >fetch<

Desde la documentacion local git-fetch

Syntaxis

git fetch [] [ […​]]
git fetch []
git fetch --multiple [] [( | )…​]
git fetch --all []
--all

Permite buscar en todos los branches remotos

--verbose ó -v

Vuelve la salida verbosa, o esa detalla en como han ido el procesamiento del comando

--tags ó -t

Fetchea todos todos los tags remotos dentro de los tags local con el mimsmo nombre

<repository>

Nombre o direccion del repositorio remoto donde se realizará el fetch


Fetch y Merge en una sola operacion: >pull<

Desde la documentacion local git-pull

Syntaxis

git pull [options] [ […​]]

Es la combinación de hacer git fetch && git merge FETCH_HEAD

Opciones de fetch

Son validas todas las opciones de fetch como --all --verbose, etc y las estrategias de merge --ignore-all-space

--rebase

Ejecuta fetch pero en lugar de hacer 'merge' realizará un 'rebase'


Commits
master A -- B -- C
feature  \ -- D -- E

Merge
master A -- B -- C -- F
feature  \ -- D -- E -- /

Rebase
master A -- B -- C
feature                \ -- D -- E
--commit y --no-commit

Realiza el merge y genera un auntocommit, caso contrario da la chance al usuario de tomar acciones

--squash y --no-squash

Realiza el mergue de los commits que se trae como uno solo, caso contrario actualiza cada commit en forma individual


Commiteando en el repositorio remoto: >push<

Desde la documentacion local git-push

Syntaxis

git push [--all | --mirror | --tags] [--follow-tags] [--atomic] [-n | --dry-run] [--receive-pack=]
[--repo=] [-f | --force] [-d | --delete] [--prune] [-v | --verbose]
[-u | --set-upstream] [--push-option=]
[--[no-]signed|--sign=(true|false|if-asked)]
[--force-with-lease[=[:]]]
[--no-verify] [ […​]]
--all

Pushea todos los cambios en todos los branches locales

--tags

Pushea todos los tags, por defecto no se envian

-u ó --set-upstream

Agrega una referencia remota(tracking) al corriente branch

--verbose ó -v

Se ejecuta verbosamente

[Métodos] Crear un ejecutable (.exe) a partir de nuestro .jar de java con Launch4J


Launch4j es una herramienta para envolver aplicaciones Java distribuidas como jars in ejecutables nativos de Windows (es posible tambien envolverlos para Linux y Mac OS X)

Permite personalizar el icono de la app, crear un splash screen nativo al sistema, embeber una jre o redirigir a la pagina de descarga de Java en caso que no se encuentre disponible.

Se puede realizar con la tarea con el ejecutable como comandos de linea de consola, como tarea ant y construir con un plugin en maven.

Creando un ejecutable

Para la elaboracion del ejecutable con Launch4j necesitaremos



Principal.java

public class Principal {
    public static void main(String[] args) {
        String titulo = "Saludos con Launch4j";
        String message = "Hola juli =)";
        int messageType = JOptionPane.INFORMATION_MESSAGE;
        JOptionPane.showMessageDialog(null, message, titulo, messageType);
    }
}

Se le agrega la definicion de la clase main al plugin que genera el jar ejecutable

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.github.dariozubaray</groupId>
 <artifactId>saludo-joptionpane</artifactId>
 <version>1.0.0-SNAPSHOT</version>
 <name>saludosJOptionPane</name>
 <description>simple saludo desde joptionpane</description>
 <build>
  <plugins>
   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
     <archive>
      <manifest>
       <mainClass>com.github.dariozubaray.Principal</mainClass>
      </manifest>
     </archive>
    </configuration>
   </plugin>
  </plugins>
 </build>
</project>

Cuando ejecutamos el goal mvn package, obtendremos nuestro jar ejecutable.




Una vez dentro de launch4j, en la solapa de basic debemos configurar

  • OutputFile: es el archivo de salida con la extension .exe
  • Jar: el jar que queremos envolver

Luego bajo JRE debemos especificar al menos la version minima de java

  • El esquema soportado por launch4j es el versionado tradicional que consta de 2 números mayor.menor(en inglés: major.minor) EJ: 1.5
  • También es válido el versionado de 3 números mayor.menor.micro, como la fase de desarrollo. EJ: 1.8.0
  • Se admite también la fase de construccion EJ: 1.7.0_51
  • A partir de java 9 es válido indicar solo el número de version. EJ: 10

Construir el envoltorio desde el icono de engranaje, lo que nos preguntará de guardar la configuración como xml

Y eso es todo, en el panel inferior debe aparecer el mensaje de 'Successfully created + la ruta completa'



Utilizando Maven plugin

Para dejar en manos de maven la creacion del ejecutable con launch4j, debemos agregar en el pom el siguiente plugin

pom.xml

<plugin>
 <groupId>com.akathist.maven.plugins.launch4j</groupId>
 <artifactId>launch4j-maven-plugin</artifactId>
 <executions>
  <execution>
   <id>l4j-clui</id>
   <phase>package</phase>
   <goals>
    <goal>launch4j</goal>
   </goals>
   <configuration>
    <headerType>gui</headerType>
    <jar>target/saludo-joptionpane-1.0.0-SNAPSHOT.jar</jar>
    <outfile>target/archivoSalidaEjecutable.exe</outfile>
    <downloadUrl>http://java.com/download</downloadUrl>
    <classPath>
     <mainClass>com.github.dariozubaray.Principal</mainClass>
    </classPath>
    <jre>
     <bundledJre64Bit>false</bundledJre64Bit>
     <bundledJreAsFallback>false</bundledJreAsFallback>
     <minVersion>1.5</minVersion>
     <jdkPreference>preferJre</jdkPreference>
     <runtimeBits>64/32</runtimeBits>
    </jre>
   </configuration>
  </execution>
 </executions>
</plugin>

Posteriormente al guardado, podemos ejecutar la fase a partir de package, aunque con maven install hace mas de lo que se necesita es más rápido. El resultado será:



Personalizandolo

Para poersonalizar al menos un poco el ejecutable podemos incluir un icono y un screensplash que es la imagen mientras se carga el programa, para ello debemos modificar la clase main para que se tarde unos segundos antes de arrancar.



Principal.java

public class Principal {
    public static void main(String[] args) {
        try {
            Thread.sleep(5000);
        } catch(InterruptedException ie) {
            ie.printStackTrace();
        }
        String titulo = "Saludos con Launch4j";
        String message = "Hola juli =)";
        int messageType = JOptionPane.INFORMATION_MESSAGE;
        JOptionPane.showMessageDialog(null, message, titulo, messageType);
    }
}

En la pestaña de basic podemos incluir la 'icon' y en la propia de 'splash', luego de habilitarla, la imagen bmp para mostrar mientras se carga la app.