Scripting con GitHub CLI

Ha pasado un año desde que lanzamos la primera versión pública de GitHub CLI.

Desde entonces, hemos agregado funcionalidad para administrar repositorios, comentar problemas, habilitar la fusión automática para solicitudes de extracción, configurar de forma segura valores secretos para acciones de GitHub y más.

Sin embargo, donde las herramientas de línea de comandos realmente brillan es en su capacidad para combinarse con otras utilidades e integrarse en scripts para capturar flujos de trabajo que pueden ser específicos para usted o su equipo.

Entonces, para celebrar un año con GitHub CLI, exploremos cómo podemos personalizar y construir sobre el COMANDO gh.

Los emuladores de terminal, los shells y las herramientas de línea de comandos están omnipresentes porque se basan en la idea de que el texto sin formato es la interfaz universal, que se pasa fácilmente entre procesos a través de flujos de entrada / salida.

En los siguientes ejemplos, usaremos GitHub CLI 1.7+ para capturar diferentes flujos de trabajo de GitHub aprovechando estos conceptos.

Haz tuyo el gh

La forma más básica de comenzar a extender las herramientas de línea de comandos es explorar sus opciones de personalización. Por ejemplo, para evitar escribir nombres de comandos largos y sus banderas en su totalidad, podemos definir alias para ellos:

# before:
$ gh issue view --comments https://github.com/cli/cli/issues/1055

# configure an alias:
$ gh alias set iv 'issue view --comments'

# after:
$ gh iv https://github.com/cli/cli/issues/1055

Otra opción que puedes configurar es definir un localizador de terminal. Si ejecutas el comando issue view, puede notar que, debido al tamaño del hilo de conversación, la salida del comando llena varias pantallas y que para comenzar a leer desde la parte superior, primero debemos desplazarte hacia atrás.

Para ayudarte a evitar tener que hacer esto cada vez para una salida larga, debes hacer que gh respete la configuración de la variable de entorno PAGER pasando toda la salida a través de la utilidad de búsqueda especificada:

$ PAGER=less gh issue view -c https://github.com/cli/cli/issues/1055

El less permite moverse hacia arriba / abajo con las teclas del teclado y buscar dentro de la salida escribiendo “/”. Para salir, presiona “q”.

Nota de compatibilidad para usuarios de Windows: si desea seguir estos ejemplos, ingrese los comandos desde el Git Bash que viene incluido con Git para Windows.

Además de los buscadores comunes como less, también hay otros para propósitos específicos. Por ejemplo, delta es una utilidad para formatear la salida de git diff. Después de instalarlo con Homebrew u otro administrador de paquetes, podemos usarlo para ver los cambios en una solicitud de extracción como una consola dividida:

$ brew install git-delta
$ PAGER='delta -s' gh pr diff https://github.com/cli/cli/pull/3023

Finalmente, para definir un buscador para todos los comandos gh de forma predeterminada, puedes establecer una opción en la configuración:

$ gh config set pager 'delta -s'

Después de esto, la salida larga de los comandos gh ya no debería ser un problema.

Combinar gh con otras herramientas

El comando gh pr list imprime solicitudes de extracción abiertas para el repositorio actual.

Sin embargo, para buscar un elemento específico y actuar en consecuencia, es posible que deba examinar toda la lista.

Seleccionar un elemento específico de la lista podría ser más fácil con la ayuda de herramientas de búsqueda como fzf:

$ brew install fzf
$ gh pr list | fzf
#=> [selected item]

La utilidad fzf permite filtrar interactivamente el flujo de entrada e imprimir la línea seleccionada como salida.

Después de eso, puedes aislar solo el número de solicitud de extracción de la salida usando cut y reenviarlo como un argumento a otro comando gh.

Por ejemplo, aquí hay un alias para poder verificar rápidamente una solicitud de extracción de la lista de solicitudes abiertas:

$ gh alias set co --shell 'id="$(gh pr list -L100 | fzf | cut -f1)"; [ -n "$id" ] && gh pr checkout "$id"'
$ gh co
#=> [checkout the selected PR]

En general, cuando gh detecta que la salida se canaliza a un script en lugar de imprimirse en el terminal, tiende a formatear la salida en un formato más legible por la máquina: Los campos están delimitados por tabulaciones y no hay secuencias de escape para el color en la salida.

Esto permite que los scripts reciban y tengan un control total sobre los datos sin procesar de gh.

Usar gh junto a las Acciones de Github

La CLI de GitHub viene preinstalada en los entornos virtuales de Acciones de GitHub. Si no existe ninguna acción en la Marketplace para realizar una tarea específica, es posible que puedas crear un script de flujo de trabajo mediante la CLI de GitHub.

Por ejemplo, este paso del flujo de trabajo marcará cada nueva solicitud de extracción para que se combine automáticamente cuando se cumplan todos los requisitos:

steps:
  - name: Enable auto-merge for new PRs
    run: gh pr merge --auto --merge "$PR_URL"
    env:
      PR_URL: ${{github.event.pull_request.html_url}}
      GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}

Este enfoque podría ampliarse para marcar solo algunas solicitudes de extracción para que se fusionen automáticamente; por ejemplo, los abiertos por miembros del equipo central en un proyecto de código abierto.

Otro flujo de trabajo crea automáticamente una versión de GitHub para cada etiqueta de git y carga los activos de compilación en ella:

- name: Create a release and attach files
  run: |
    tagname="${GITHUB_REF#refs/tags/}"
    gh release create "$tagname" dist/*.tgz
  env:
    GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}

Puede ver la configuración completa del flujo de trabajo para estos ejemplos aquí. Siempre que GITHUB_TOKENse establezca en el entorno de Acciones de Github, y se habilite gh puede ser habilitado convenientemente.

Además, si tus script necesitan escribirse en repositorios distintos al actual, puedes generar un token de acceso personal y agregarlos al repositorio usando gh secret set.

Accede a cualquier cosa con gh api

Para las operaciones en las que la CLI de GitHub actualmente no tiene sus propios comandos dedicados, siempre existe la API de GitHub.

Inspirado en curl el comando gh api puede realizar cualquier operación REST o GraphQL y manejar tareas como autenticación, serialización de parámetros y decodificación JSON.

Por ejemplo, digamos que queremos responder a la pregunta: ¿Cuál de los problemas en un repositorio propiedad de una organización involucra a miembros de un equipo específico?

En los términos de búsqueda de GitHub, la participación en un problema significa que un miembro comentó, fue mencionado o fue asignado a uno.

Una consulta de búsqueda para responder a esta pregunta sería algo como:, is:issue is:open involves:user1 involves:user2 pero dado que los equipos pueden cambiar con el tiempo, necesitaríamos construir esa consulta de forma dinámica.

Comencemos por enumerar a todos los miembros de un equipo de organización. Con curl, la solicitud sería algo como:

$ curl https://api.github.com/orgs/MYORG/teams/TEAM/members

Con gh api obtenemos el almacenamiento en caché de paginación y la respuesta de forma gratuita:

$ gh api -X GET 'orgs/MYORG/teams/TEAM/members' -F per_page=100 --paginate --cache 1h
[
  {
    "login": "user1",
    "id": 1234,
    ...
  },
  ...
]

La salida JSON sin formato puede ser difícil de manejar desde los scripts de shell. Al agregar una expresión de filtro jq, podemos seleccionar solo los campos que queremos, por ejemplo, todos los identificadores de inicio de sesión del usuario:

$ gh api ... --jq '.[].login'
#=> "user1"
#=> "user2"
#=> ...

Al modificar ligeramente la expresión, podemos obtener todos los miembros listados en un formato que se asemeja a la consulta de búsqueda que queremos:

$ gh api ... --jq '[.[].login] | map("involves:\(.)") | join(" ")'
#=> "involves:user1 involves:user2"

En el paso final, podemos pasar eso a una consulta final de la que enumeramos los resultados de:

team-involves() {
  gh api -X GET "orgs/$1/teams/$2/members" \
    -F per_page=100 --paginate --cache 1h \
    --jq '[.[].login] | map("involves:\(.)") | join(" ")'
}

gh api -X GET search/issues -F per_page=100 --paginate \
  -f q="repo:MYORG/REPO is:issue is:open $(team-involves MYORG TEAM)" \
   --jq '.items[] | [.number, .title] | @tsv'

#=> "456  Issue title"
#=> "123  Another issue"
#=> ...

El resultado final enumera el número y el título de cada tema coincidente, uno por línea. Por supuesto, se pueden imprimir más propiedades expandiendo la expresión jq.

Para obtener la lista de todas las propiedades disponibles sobre un problema, consulte la documentación de la API.

¿Cómo instalar la CLI de Github?

GitHub CLI es una herramienta versátil con la que crear sus flujos de trabajo.

? INSTALAR LA CLI DE GITHUB

Fuente: Blog Oficial de Github

Relacionado

21 Nuevos Cursos Gratuitos: Python, Google Cloud, CSS y Más (25 de Febrero 2021)

Como de costumbre, vamos con los cursos gratis, tenemos 3 cursos en español: Computación, Google Cloud y aplicaciones web; y 18 cursos gratuitos en inglés: Python, Flask, Ionic, PHP, Android, Github, CSS, Flexbox, Illustrator, Photoshop, Scrum y minado de Sugar. Recuerda, que puedes si quieres, puedes acceder a las Mejores Ofertas de Udemy ¡Alé, aprendamos gratis un ratico! Cursos en Español Computación ? Curso Gratuito de ¡SEGUIR LEYENDO!

4 Cosas que no sabías que podías hacer con las Acciones de GitHub

GitHub Actions es una plataforma poderosa que permite a un equipo pasar el código a la nube, todo desde la comodidad de los repositorios git. A continuación se analizan algunos ejemplos de cómo se pueden usar las acciones de GitHub para automatizar y orquestar un canal para DevOps a través de las acciones de Github. 1. Comprimir las imágenes para la web GitHub Marketplace es un ¡SEGUIR LEYENDO!

Conociendo las acciones de Github: Colección de Enlaces Awesome

Las acciones de GitHub facilitan la automatización de todos tus flujos de trabajo de software. Las acciones de Github permiten construir, probar e implementar el código directamente desde GitHub. Bien si deseas construir un contenedor, implementar un servicio web o automatizar la bienvenida de un nuevo usuario en tu proyecto de código abierto, es muy posible que exista una acción automatizada para ello. La forma más ¡SEGUIR LEYENDO!

Agrippa: Nueva CLI para desarrolladores de React

Agrippa es una CLI humilde cuyo propósito es ayudar a los desarrolladores de React a crear componentes sin el modelo estándar. Vas a poder generar fácilmente plantillas para componentes de React de diferentes composiciones (soluciones de estilo, validaciones de accesorios, etc.) y en diferentes entornos. Características de Agrippa Extremadamente fácil de aprender y usar tanto en proyectos nuevos como en proyectos existentes. Flexible: Agrippa se esfuerza ¡SEGUIR LEYENDO!

Aprender a programar en Android con Google, desde principiantes hasta avanzado

El equipo de capacitación de desarrolladores de Google publicó recientemente una versión actualizada del curso Fundamentos de desarrollo para Android como una serie continua de tutoriales a través de Google Codelabs. Codelabs hizo su debut como sitio de tutoriales en Google I/O en 2015, y se ha disparado en popularidad como una de las mejores plataformas del mundo para aprender y estudiar absolutamente todo sobre Android. ¡SEGUIR LEYENDO!

Mejores Libros PDF de Programación y Tecnología GRATIS

Los Mejores Libros PDF Gratuitos de Informática. EL sitio perfecto para aprender a programar desde cero para principiantes con las mejores guías gratis. Esta es la mejor lista de libros de programación en PDF en español del mundo. Una completa biblioteca recopilada de cientos y cientos de libros en PDF que no encontrarás en ninguna parte más. Aquí, vas a encontrar libros enfocados hacía programadores. Sobre ¡SEGUIR LEYENDO!

Visual Studio integrado en Github: Codespaces, nuevo editor beta integrado en tus repositorios

Contribuir con código a una comunidad puede ser difícil. Cada repositorio tiene su propia forma de configurar un entorno de desarrollo, que a menudo requiere docenas de pasos antes de poder escribir cualquier código. Peor aún, a veces el entorno de dos proyectos en los que está trabajando entra en conflicto entre sí. Codespaces te brinda un entorno de desarrollo con todas las funciones alojado en ¡SEGUIR LEYENDO!

Salir de la versión móvil