
trabajo cron para ejecutar GitHub CLI (gh) La ejecución de un comando cada pocos minutos puede volverse lenta, solicitar información o alcanzar el límite de velocidad de API de GitHub. A continuación se explica cómo utilizar GH_TOKEN, GH_REPO para la optimización. --json, --cachey procesamiento por lotes GraphQL.
Muchos de nosotros agregaríamos gh Comando para monitorear scripts Bash en busca de solicitudes de extracción abiertas o ejecuciones fallidas de flujo de trabajo. Inicialmente, estos scripts funcionan bien, pero a medida que se ejecutan repetidamente, las solicitudes de API innecesarias y la sobrecarga de comandos pueden ralentizarlos o provocar errores de límite de velocidad de API excedido.
El problema es gh Diseñado para uso final interactivo y automatización. Dependiendo del comando y la configuración, puede analizar las credenciales almacenadas, detectar el repositorio actual, buscar actualizaciones o recuperar más datos de los requeridos por el script. Estas operaciones adicionales se agregan cuando el trabajo cron se ejecuta cada cinco minutos.
Los siguientes siete consejos muestran cómo hacer que los scripts CLI de GitHub sean más rápidos, más predecibles y reducir el desperdicio en las solicitudes de API. distribución de linux. Utilice la última versión de GitHub CLI y verifique que --slurp Marcar antes de la aplicación Consejo 6.
1. Utilice GH_TOKEN para omitir el inicio de sesión interactivo en los scripts
La autenticación es el primer paso ya que todas las demás optimizaciones dependen de gh Operación desatendida. Guardián de credenciales gh auth login Puede depender de un conjunto de claves del sistema u otro almacén de credenciales que el trabajo cron no puede utilizar.
ambiente GH_TOKEN Proporcione un método de autenticación explícito para el script. La CLI de GitHub registra esta variable de entorno con preferencia a las credenciales almacenadas y evita solicitudes de inicio de sesión interactivas.
Crea perfiles en Ubuntu y Debian usando nano:
sudo mkdir -p /etc/gh-automation sudo nano /etc/gh-automation/env
existir LokiLinux, AlmaLinuxy RHELla instalación mínima usa vi en lugar de nano, así que usa vi allí:
sudo mkdir -p /etc/gh-automation sudo vi /etc/gh-automation/env
Agregue la siguiente configuración:
# /etc/gh-automation/env GH_TOKEN=github_pat_xxxxxxxxxxxxxxxxxxxx GH_PROMPT_DISABLED=1 GH_NO_UPDATE_NOTIFIER=1 GH_NO_EXTENSION_UPDATE_NOTIFIER=1 GH_TELEMETRY=false GH_REPO=tecmint/web-config
Esto es lo que hace cada variable:
GH_TOKENProporcione un token de autenticación para las solicitudes de API de GitHub. Reemplace el marcador de posición con un token que solo tenga los permisos requeridos por el script.GH_PROMPT_DISABLEDEvite las indicaciones interactivas para que los comandos que requieren la entrada del usuario fallen en lugar de esperar indefinidamente.GH_NO_UPDATE_NOTIFIERDeshabilite las notificaciones de actualización de la versión CLI.<./>GH_NO_EXTENSION_UPDATE_NOTIFIERDeshabilite las notificaciones de actualización extendidas.GH_TELEMETRYNo existe una variable de entorno CLI de GitHub documentada para deshabilitar la telemetría, así que elimínela en lugar de depender de ella.GH_REPOEstablecer repositorio predeterminadoOWNER/REPOformato que permite ejecutar comandos sin especificar repetidamente un repositorio. reemplazartecmint/web-configUtilice su propio repositorio.
Guarde archivos y restrinja el acceso a la cuenta que ejecuta el trabajo cron. Por ejemplo, si el trabajo se ejecuta como tecmint:
sudo chown tecmint:tecmint /etc/gh-automation/env sudo chmod 600 /etc/gh-automation/env
En la parte superior del script, use set para cargar el archivo -aque exporta cada variable gh Puedes verlo:
set -a source /etc/gh-automation/env set +a
traje -a El comando exporta automáticamente las variables asignadas al recuperar el archivo y establece +a Luego apaga el comportamiento.
importante: trate el token como una contraseña. No envíe este archivo a Git ni imprima su contenido en el registro. Si el script se ejecuta con una cuenta diferente, asegúrese de que esa cuenta pueda leer el archivo de forma segura.
2. Utilice GH_NO_UPDATE_NOTIFIER para desactivar las notificaciones de actualización
Después de encargarnos de la verificación de identidad, el siguiente paso es eliminar verificaciones de antecedentes innecesarias. GitHub CLI Puede buscar versiones actualizadas periódicamente y recibir notificaciones cuando haya actualizaciones disponibles. Las notificaciones de actualización aumentadas pueden agregar un ruido similar cuando el script se ejecuta repetidamente.
Para trabajos cron, estas notificaciones proporcionan poco valor y pueden saturar la salida de error o los mensajes cron. Variables de entorno configuradas Consejo 1 Se han deshabilitado por lo que no es necesario configurarlos nuevamente en cada secuencia de comandos.
GH_NO_UPDATE_NOTIFIER=1 GH_NO_EXTENSION_UPDATE_NOTIFIER=1
Mantener GitHub CLI Actualice individualmente a través del administrador de paquetes de su distribución u otro proceso de actualización controlado. Esto le permite probar nuevas versiones antes de implementarlas en la automatización de producción.
notas: Desactive las notificaciones de actualización y no actualice gh o desactivar GitHub API Limitación de velocidad. Simplemente evita que aparezcan las notificaciones de actualización correspondientes durante la ejecución de rutina.
Si esto te ayuda a correr gh Limpiador de cron, compártelo con personas que todavía tienen tokens de GitHub codificados directamente en scripts.
3. Utilice GH_REPO para omitir la detección del repositorio
ahora que gh Al ejecutarse sin indicaciones interactivas, el siguiente paso es asegurarse de que sepa qué repositorio consultar. Comandos como gh pr list Normalmente detecta el repositorio de forma remota desde el directorio Git del directorio actual.
Sin embargo, las tareas cron normalmente se inician en el directorio de inicio del usuario, que puede no ser el repositorio de Git. El comando puede entonces fallar con un error como fatal: no es un repositorio de git.
este GH_REPO Las variables se configuran en Consejo 1 Este problema se resuelve especificando explícitamente el repositorio predeterminado. Sus scripts se pueden ejecutar desde cualquier directorio de trabajo sin depender de la detección del repositorio de Git.
Cuando un script necesita consultar varios repositorios, utilice -R o --repo Las banderas anulan los valores predeterminados para un solo comando:
gh run list -R tecmint/ansible-roles --status failure --limit 5
Este comando enumera hasta cinco ejecuciones de flujo de trabajo fallidas tecmint/ansible-rolesindependientemente del directorio de trabajo actual o del valor GH_REPO.
4. Utilice –json y –jq para obtener solo los campos que necesita
una vez gh Saber qué repositorio consultar reduce la cantidad de datos procesados por el script. Sin una salida estructurada, el comando list muestra una tabla legible por humanos; los scripts suelen utilizar algo como awk o cut.
Estos métodos pueden fallar cuando el título contiene espacios o cuando cambia el formato de salida.
este --json flag solicita campos específicos y devuelve JSON estructurado, mientras que --jq Filtro generado directamente GitHub CLI. Esto evita el análisis frágil de la tabla y elimina la necesidad de iniciar un proceso jq separado para un filtrado simple.
Por ejemplo, para recuperar solicitudes de extracción abiertas junto con su número, título y autor:
gh pr list --state open --limit 100 --json number,title,author \ --jq '.[] | "\(.number) \(.author.login) \(.title)"'
Ejemplo de salida:
412 ravisaive Add fail2ban jail for nginx 409 tecmint Rotate journald logs weekly
Esta consulta extrae solo los campos requeridos por el script y formatea cada solicitud de extracción en una sola línea. Ajuste la lista de campos y los filtros para que coincidan con sus requisitos de informes.
Además, establezca --limit Deliberadamente. El límite predeterminado es gh pr list Sí 30 resultados, así que especifique un límite más alto cuando su informe requiera más entradas y un límite más bajo cuando solo requiera las últimas entradas.
Atención – Recuerde --json El manejo de salida mejorado puede reducir la recuperación innecesaria de campos, pero no se garantiza que reduzca las solicitudes de API en todos los casos.
5. Utilice gh api –cache para almacenar en caché las respuestas API duplicadas
El consejo anterior hizo que el resultado fuera más fácil de procesar y este consejo ayuda a evitar llamadas API duplicadas. Cierta información, como la lista de repositorios de una organización, rara vez cambia, pero una tarea cron que se ejecuta cada cinco minutos puede solicitarla cada vez.
GitHub CLI Soporte de almacenamiento en caché de respuesta --cache inscribirse GH API. Especifique la duración, p. 1 hora Mientras tanto, las respuestas almacenadas en caché se reutilizan en lugar de contactar a GitHub para cada solicitud idéntica.
Por ejemplo, para recuperar el nombre del repositorio de una organización y almacenar en caché la respuesta:
gh api orgs/tecmint/repos --paginate --cache 1h --jq '.[].full_name'
este --paginate bandera para recuperar páginas adicionales, mientras --jq Extraiga el nombre completo de cada repositorio. El almacenamiento en caché es útil cuando no es necesario actualizar completamente el inventario del repositorio de una organización.
Utilice esta opción sólo si los datos obsoletos son aceptables. Es posible que las respuestas de la caché no reflejen los repositorios que se agregaron o eliminaron durante la ventana de caché. Si necesita datos nuevos, borre el caché usando el siguiente comando:
gh config clear-cache
Tenga en cuenta que borrar el caché afectará las respuestas almacenadas en caché más allá de este punto final específico, así que hágalo con precaución en los scripts de producción.
6. Utilice gh api graphql para agrupar varias búsquedas en una sola solicitud.
El almacenamiento en caché ayuda con los datos que cambian con poca frecuencia, pero los scripts de monitoreo a menudo requieren información nueva de múltiples repositorios. bucle de ejecución gh pr list Se pueden generar 10 solicitudes de API para 10 repositorios respectivamente.
GraphQL Le permite consultar varios repositorios en una sola solicitud. Puede utilizar alias para dar a cada repositorio un nombre diferente en la respuesta, lo que facilita el procesamiento de los resultados.
Por ejemplo, para recuperar la cantidad de solicitudes de extracción abiertas en dos repositorios:
gh api graphql -f query='
{
web: repository(owner: "tecmint", name: "web-config") {
pullRequests(states: OPEN) { totalCount }
}
ansible: repository(owner: "tecmint", name: "ansible-roles") {
pullRequests(states: OPEN) { totalCount }
}
}' --jq '.data | to_entries[] | "\(.key): \(.value.pullRequests.totalCount)"'
Producción:
web: 3 ansible: 0
Fusionar cuando una colección abarca varias páginas --paginate y --slurpque toma cada página y las envuelve en una matriz JSON, de modo que su filtro se ejecuta una vez en los resultados completos.
si estas corriendo gh En bucles en varios repositorios, compártalo con su equipo, ya que una consulta GraphQL puede reemplazar todo el bucle.
7. Utilice GH_DEBUG y gh apirate_limit para medir el uso de API
Después de aplicar los consejos anteriores, vale la pena comprobar que realmente reducen el trabajo realizado por el guión. ambiente GH_DEBUG=api Hace que gh registre cada solicitud HTTP en un error estándar, por lo que puede contar las solicitudes realizadas con un solo comando:
GH_DEBUG=api gh pr list --limit 5 2>&1 >/dev/null | grep -c '^\* Request to'
Debido a que el formato de salida de depuración puede variar según la versión de CLI, verifique que el patrón coincida con la versión que ha instalado. Si devuelve cero, verifique el resultado de depuración directamente y concluya que no se realizó ninguna solicitud:
GH_DEBUG=api gh pr list --limit 5 >/dev/null
Para ver cuánto queda del límite de API por hora, consulte el punto final del límite de velocidad, que no cuenta para el límite en sí:
gh api rate_limit --jq '.resources | {core, graphql}'
Lista de salida limit, used, remainingy un reset Marca de tiempo para cada depósito; el resto es el número a observar.
este core El depósito cubre llamadas REST de gh apia pesar de graphql cubre la mayor parte gh pr y gh issue Orden. si corres gh paralelo a xargs -Pmantenga el número de trabajos pequeño porque GitHub aplica un límite de velocidad secundario a la ráfaga de solicitudes simultáneas, incluso si el número restante sigue siendo alto.
Si alguna vez se perdió un informe nocturno que excedió el límite de tasa de API, comparta este informe con un colega que ejecutó el siguiente comando: gh de cron.
en conclusión
Con estos siete consejos, tu gh Los scripts se autentican sin solicitudes, omiten las comprobaciones de actualización y la detección de repositorios, solicitan solo los datos que necesitan y envían menos llamadas API mediante almacenamiento en caché y lotes GraphQL. El resultado es una automatización que se ejecuta más rápido, registra con menos ruido y se mantiene muy por debajo de los límites de velocidad de GitHub.
Nos encantaría saber cómo utiliza gh en sus propias automatizaciones. ¿Guarda el token en un archivo de entorno, credenciales de systemd o administrador secreto? ¿Ha alcanzado un límite de tasa menor? ¿Cómo resolviste este problema? No dude en compartir sus scripts o errores en los comentarios.









