cómo usar GitLab desde la línea de comandos

index | OSiUX | archive | charlas | docs | links

dot | git | img | plt | tty | uml

gitlab-bash-utils.jpg

Hace varios años que utilizo GitLab, pero recién hace 4 meses que comencé a utilizar los issues y como no podía ser de otra manera, opté por buscar la manera de integrarlo a la consola, porque hasta ahora no era mas que un repositorio git con permisos administrables.

glab vs gl

Encontré glab 1 que es una CLI de GitLab para usar desde la terminal, y si bien es muy completa 2, me topé con una dificultad y es que necesitaba utilizar una instancia de GitLab detrás de una VPN dentro de una red aislada de INET y por ello, en principio no había manera de llegar directamente, o al menos no encontré como configurar a glab.

Se me ocurrió hacer un wrapper llamado gl que esencialmente solo habilitaba el uso de la variable https_proxy y mediante LocalForward de ssh pude redireccionar un puerto local 127.0.0.1:3128 a un Proxy HTTP que puede llegar a la instancia de GitLab

localhost -> vpn -> proxy-http -> gitlab

Con el pasar de los días, fui generando una serie de scripts que simplificaban y/o permitían automatizar a glab extendiendo de cierta manera su funcionalidad con el comando gl, el cual es invocado desde muchos comandos específicos, algunos muy simples, pero que ayudan a usar la misma metodología e integrar GitLab con otras tools propias.

Registrando tiempos

La primer necesidad a cubrir fue el registro de tiempos de cada issue, algo que anteriormente al usar Redmine 3 había resuelto con redmine-bash-utils 4 y ahora daría origen a glab-bash-utils 5

Si bien GitLab utiliza el formato /spend 00h25m, mi script gl-issue-spend espera recibir el formato 00:25 y obviamente lo convierte, el porqué?, es simple, desde el 2008 que a todos mis commits en la última línea del mensaje agrego el tiempo que tardé, de la siguiente manera @ 00:25 hs, entonces puedo usar pipe | para recuperar el tiempo registrado en el commit e enviárselo a GitLab.

Ejemplo:

# git log -1

  commit 6b3f0285abe9847124b17c2f9c4523f6caa01df4
  Author: OSiRiS <osiris@gcoop.coop>
  Date:   Sat Aug 20 11:21:33 2022 -0300

      gl-config: add GL_DEFAULT_REVIEWER: admin as config example

        @ 00:01 hs

# git log -1 | gl-issue-spend 14

  send /spend 01m to 14

Trabajar con formato hh:mm permite fácilmente hacer operaciones de suma y resta de tiempos.

Integrando con jrnl

Desde 2017 que utilizo jrnl 6 para registrar el desarrollo de cada tarea, a veces es un simple paste luego del copy, pero muchas veces, hay un paso a paso muy detallado y ordenado que vale la pena compartirlo en forma de comentario de un issue y como ahí tengo registrado el tiempo invertido, es muy fácil enviarlo a GitLab y en este caso ni siquiera debo indicar el ID del issue porque ya es parte del header del journal, entonces basta con ejecutar

jv | glin

  • jv es un alias de jrnl view
  • glin es un alias de gl-issue-note
jv

2022-08-20 15:40 @gcoop-libre gitlab-bash-utils#14 gl-mr-new: set reviewer with default reviewer or assignee when default is empty

  @ 00:01 hs

Un flujo común de trabajo usando jrnl y gl es el siguiente:

command task
jngi 14 se crea journal desde issue 14 de GitLab
jt se termina de trabajar en el journal y se registra duración
jv ¦ glin se envía comentario y tiempo a GitLab desde el útimo journal
gl ic 14 se cierra el issue 14

Issues

Ahora para crear issues no necesito utilizar Firefox, lo puedo hacer desde BASH invocando a gl-issue-new (o usando el alias gliw) de la siguiente manera:

gl-issue-new 'publish first public version' 'commit actual state of scripts art'

  - Creating issue in gcoop-libre/gitlab-bash-utils
  #1 publish first public version (less than a minute ago)
   https://gitlab.com/gcoop-libre/gitlab-bash-utils/-/issues/1

Un MR por cada Branch

Una gran utilidad de GitLab es crear un MR por cada Branch para poder realizar una revisión de código antes de terminar un feature, hotfix o un nuevo release y utilizando gl-mr-new basta con indicar el ID del issue y el MR se crea con una serie de valores por defecto que aceleran la operatoria:

item value
target_branch develop
source_branch current branch
assignee value defined GL_DEFAULT_ASSIGNEE in ~/.gl-config
lables wip
title value defined in related ISSUE_ID
description checkbox with link of value defined in related ISSUE_ID

alias de glab vs alias de gl

El comando glab permite definir alias en el archivo ~/.config/glab-cli/aliases.yml, y los que definí son los siguientes:

ci: pipeline ci
co: mr checkout
ic: issue close
il: issue list
in: issue note
iu: issue update
iv: issue view
iw: issue new
ma: mr approve
mc: mr close
ml: mr list
mv: mr view
my: mr ready

Entonces si tipeo gl ic 14 voy a cerrar el issue 14.

En cambio para el comando gl, los alias se definen en gl-src-alias y entonces si tipeo glic 14 el resultado es el siguiente:

- [ ] gl-mr-new: set reviewer with default reviewer or assignee when default is empty [gitlab-bash-utils#14](https://gitlab.com/gcoop-libre/gitlab-bash-utils/-/issues/14)

Obtengo un checkbox del issue 14 con su descripción un link en formato Markdown, ésto me resulta muy útil para organizarme al registrar estado de las tareas en una minuta.

Hay un alias para casi todo!

script alias description
gl-ci-lint glcl Validate .gitlab-ci.yml
gl-issue-check glic Get issue URL link in Markdown format with checkbox
gl-issue-jrnl glij Get Issue group and project ID with title for jrnl
gl-issue-link glik Get the issue title with the URL link in Markdown format
gl-issue-list glil Get the issue title with URL link in Markdown as a list item
gl-issue-new gliw Create issue with defaults defined in ~/.gl-config
gl-issue-note glin Insert note in Issue converting hh:mm time format into /spend time
gl-issue-spend glis Insert /spend time in Issue converting from hh:mm time format
gl-issue-title glit Get title of Issue
gl-issue-url gliu Get URL of Issue
gl-mr-check glmc Get MR URL link in Markdown format with checkbox
gl-mr-jrnl glmj Get MR group and project ID with title for jrnl
gl-mr-link glmk Get the MR title with the URL link in Markdown format
gl-mr-new glmw Create MR with default values defined in ~/.gl-config
gl-mr-note glmn Insert note in MR converting hh:mm time format into /spend time
gl-mr-spend glms Insert /spend time in MR converting from hh:mm time format
gl-mr-title glmt Get title of MR
gl-mr-url glmu Get URL of MR
gl-notifications-get glnu Get User notification level defined in GitLab
gl-prj-list glpl List all projects in GitLab for current user
gl-src-check glsk Check syntax using shellcheck and group errors by code
gl-src-help glsh Generate Markdown Help
gl-src-table glst Generate Markdown Table Overview

Releases

El 2022-08-04 liberé la primer versión pública con el tag v0.1.0 y desde entonces, acepto sugerencias y parches, aunque ya registré varios issues 7 por resolver sigo trabajando en mejoras a medida que las voy necesitando.

Seguro te interesará leer

ChangeLog

Nota al pie de página: