-- Leo's gemini proxy
-- Connecting to gmi.osiux.com:1965...
-- Connected
-- Sending request
-- Meta line: 20 text/gemini;lang=es_AR
AUTHOR: Osiris Alejandro Gomez
EMAIL: osiux@osiux.com
DATE: 2022-08-21 19:49
[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.
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.
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.
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 │ └─────────────┴────────────────────────────────────────────────────────────────┘
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
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` │ └─────────────────┴───────────────────────────────────────────────────────────┘
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.
┌────────────────────────┬────────┬────────────────────────────────────────────┐ │ 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 │ └────────────────────────┴────────┴────────────────────────────────────────────┘
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.
tarea en progreso[9]
git commit timesum[10]
`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
-- Response ended
-- Page fetched on Fri May 17 06:57:42 2024