Gitlab CI: Detección de cambios en carpetas

Cuando el número de archivos y carpetas crece en nuestro proyecto y además de esto creamos varios contenedores, necesitamos que no se ejecuten todos los procesos cuando se hace un push, por esto se hace necesario poder detectar las diferencias entre los pipelines desplegados anteriormente y solamente ejecutar los procesos correspondientes.

Debemos realizar el siguiente proceso para detectar estas diferencias:

  1. Capturar los commits entre el penúltimo pipeline ejecutado en ese branch y el commit del pipeline actual.
  2. Con estos dos commits podemos encontrar la diferencia y asi mismo los archivos que se han modificado.

En nuestro archivo .gitlab-ci debemos agregar:

before_script:
    - >
      export LAST_COMMIT=$(curl --header "PRIVATE-TOKEN: $GITLAB_API_TOKEN" "https://gitlab.com/api/v4/projects/<namespace>%2Fproject>/pipelines?ref=$CI_COMMIT_REF_NAME" | jq -r .[].sha | awk -v COMMIT=$CI_COMMIT_SHA '$0 ~ COMMIT { getline; print $0 }')

Desglosando un poco los comandos tenemos:

  • curl --header "PRIVATE-TOKEN: $GITLAB_API_TOKEN" "https://gitlab.com/api/v4/projects/<namespace>%2Fproject>/pipelines?ref=$CI_COMMIT_REF_NAME" Se obtienen todos los pipelines desde el API de Gitlab
  • jq -r .[].sha Del Json de respuesta se seleccionan todos los pipelines y se extrae el SHA de los commits (ID)
  • awk -v COMMIT=$CI_COMMIT_SHA '$0 ~ COMMIT { getline; print $0 }') Se realiza una busqueda en la lista de commits, tomando como base nuestro commit actual para obtener el commit anteriormente desplegado

Teniendo esto claro, posteriormente podemos utilizar este commit de la siguiente forma:

Runner Build:
  stage: Runner-Building
  only: [runner-build]
  script:
    - >
      if git diff $CI_COMMIT_SHA $LAST_COMMIT --name-only | grep -e requirements -e runner2; then
        docker-compose build runner
      else
        echo "No changes detected for builder image"
      fi;

Al ejecutar if git diff $CI_COMMIT_SHA $LAST_COMMIT --name-only | grep -e requirements -e runner2 nos aseguramos que se retornen todas las carpetas y archivos que han cambiado entre estos dos commits y con el grep encontramos si han cambiado las carpetas o archivos de nuestro interes. Con base a esto podemos indicarle a nuestro Job si debe ejecutar ciertas tareas u otras.

Juan Pablo Arias

I constantly discover new technologies and ways to improve IT processes. I'm a fan of automation. I like programming, but my passion is cloud computing.