-- Leo's gemini proxy

-- Connecting to gmi.osiux.com:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini;lang=es_AR

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


AUTHOR: Osiris Alejandro Gomez

EMAIL: osiux@osiux.com

DATE: 2022-08-21 19:49


[IMG]

[1]


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[2] que es una *CLI* de *GitLab* para usar desde la terminal, y si bien es muy completa ^2[3], 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[4] había resuelto con `redmine-bash-utils` ^4[5] y ahora daría origen a `glab-bash-utils` ^5[6]


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[7] 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[8] por resolver sigo trabajando en mejoras a medida que las voy necesitando.


Seguro te interesará leer


tarea en progreso[9]

git commit timesum[10]


ChangeLog


`2023-06-26 22:03`[11] agregar DESCRIPTION, KEYWORDS y actualizar OpenGraph en *Cómo usar GitLab desde la línea de comandos*

`2022-11-13 20:39`[12] agregar y actualizar tags OpenGraph

`2022-10-11 10:05`[13] agregar cómo usar *GitLab* desde la línea de comandos


1: file:img/gitlab-bash-utils.jpg

2: https://gitlab.com/gitlab-org/cli

3: https://glab.readthedocs.io/en/latest/

4: https://redmine.gmi/

5: https://gitlab.com/osiux/redmine-bash-utils

6: https://gitlab.com/osiux/gitlab-bash-utils

7: https://gitlab.com/osiux/txt-bash-jrnl

8: https://gitlab.com/gcoop-libre/gitlab-bash-utils/-/issues

9: 2021-03-28-tarea-en-progreso.gmi

10: 2021-03-18-git-commit-timesum.gmi

11: https://gitlab.com/osiux/osiux.gitlab.io/-/commit/83c539767da572a2f62c2a127b8b8a0f05f7a5e4

12: https://gitlab.com/osiux/osiux.gitlab.io/-/commit/bf3a61526ad2a73cecb77a18995f1d63494e3664

13: https://gitlab.com/osiux/osiux.gitlab.io/-/commit/0b200766813009e7d95a63f31e8e48930d7baae4

-- Response ended

-- Page fetched on Fri May 17 06:57:42 2024