3. Fase 2: Control de versiones (Git)

Una vez preparado el entorno de construcción reproducible, es necesario integrar un sistema de control de versiones.

La Integración Continua depende directamente de Git, ya que los pipelines se ejecutan a partir de eventos como commits o push al repositorio remoto.

Por tanto, esta fase es imprescindible antes de automatizar cualquier proceso.

Inicialización del repositorio Git

Durante la creación del proyecto se ha inicializado un repositorio Git local, lo que permite registrar la evolución del código desde el primer momento.

En este punto:

  • el repositorio no contiene aún ningún commit,

  • pero Git ya detecta los archivos del proyecto.

Se comprueba el estado inicial del repositorio con:

git status

En este punto, el repositorio no contiene aún ningún commit, pero ya se encuentran detectados los archivos del proyecto.

Configuración del archivo .gitignore

Antes de realizar el primer commit, se configura el archivo .gitignore para evitar subir al repositorio:

  • archivos generados por el proceso de compilación,

  • configuraciones específicas del IDE,

  • ficheros del sistema operativo.

Un .gitignore que tenemos es algo parecido a esto:

target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
.kotlin

### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr

### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/

### VS Code ###
.vscode/

### Mac OS ###
.DS_Store

Se configura .gitignore para excluir configuraciones del IDE (carpeta .idea/) y artefactos generados (target/).

Un .gitignore mínimo y adecuado para este proyecto es:

# Maven
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/

# IntelliJ IDEA
.idea/
*.iml
*.iws
*.ipr

# macOS
.DS_Store

Revisión del estado del repositorio

Hago el git status y necesito cambiar cosillas:

damiansualdea@Mac-Studio-de-Damian-2 dam-ci-cd-api-001 % git status
On branch main

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   .gitignore
        new file:   .idea/.gitignore
        new file:   .idea/misc.xml
        new file:   .idea/vcs.xml
        new file:   pom.xml
        new file:   src/main/java/com/dam/cicd/Main.java

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   pom.xml

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .mvn/
        mvnw
        mvnw.cmd

Viendo esto necesito quitar .idea del índice

git rm -r --cached .idea

Unificar pom.xml, Para que no esté “new” y “modified” a la vez:

git add pom.xml

Añadir Maven Wrapper (imprescindible para CI)

git add mvnw mvnw.cmd .mvn

Asegurar lo básico

git add .gitignore src

Revisión final 

git status
damiansualdea@Mac-Studio-de-Damian-2 dam-ci-cd-api-001 % git status        
On branch main

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   .gitignore
        new file:   .mvn/wrapper/MavenWrapperDownloader.java
        new file:   .mvn/wrapper/maven-wrapper.jar
        new file:   .mvn/wrapper/maven-wrapper.properties
        new file:   mvnw
        new file:   mvnw.cmd
        new file:   pom.xml
        new file:   src/main/java/com/dam/cicd/Main.java

Este git status es exactamente el estado ideal para el primer commit de un proyecto preparado para CI/CD.

Damos nuestro datos:

git config --global user.name "Damián" 
git config --global user.email "info@damiansu.com"
git config --global --list

Primer commit del proyecto

Se registra el primer commit del proyecto:

git commit -m "Configuración inicial del proyecto para CI/CD"

Se verifica el historial:

git log --oneline

 

Validación final del entorno local

Como última comprobación antes de automatizar, se valida que el proyecto puede construirse y ejecutar su fase de tests usando el Maven Wrapper:

./mvnw test

La ejecución finaliza correctamente con:

  • BUILD SUCCESS

Ejecución de la fase test mediante maven-surefire-plugin

damiansualdea@Mac-Studio-de-Damian-2 dam-ci-cd-api-001 % ./mvnw test
[INFO] Scanning for projects...
[INFO] 
[INFO] -------------------< com.dam.cicd:dam-ci-cd-api-001 >-------------------
[INFO] Building dam-ci-cd-api-001 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ dam-ci-cd-api-001 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ dam-ci-cd-api-001 ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ dam-ci-cd-api-001 ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/damiansualdea/IdeaProjects/dam-ci-cd-api-001/src/test/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ dam-ci-cd-api-001 ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ dam-ci-cd-api-001 ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS

Aunque todavía no existan tests implementados, esta validación garantiza que:

  • el proyecto compila correctamente,

  • Maven funciona mediante wrapper,

  • y el entorno local queda preparado para integrarlo en un pipeline de Integración Continua.

En la siguiente fase se configurará GitHub Actions, donde cada push al repositorio activará automáticamente el proceso de Integración Continua.