4 puntos por GN⁺ 2025-04-09 | 2 comentarios | Compartir por WhatsApp
  • En GitHub Actions, se puede especificar con la palabra clave shell el shell que se usa al ejecutar un bloque run:
  • En los workflows es opcional, pero en la definición de acciones individuales es obligatorio
  • El valor predeterminado se asigna automáticamente según el sistema operativo: en Linux/macOS es bash, y en Windows pwsh
  • Si se configura explícitamente shell: bash, también se incluyen estos flags predeterminados: --noprofile --norc -eo pipefail

Se puede asignar cualquier ejecutable como shell

  • Es fácil pensar que los valores que se pueden usar en shell están limitados
  • En realidad, cualquier ejecutable que esté en $PATH puede usarse como shell
  • Si el comando ejecutado no acepta entrada por archivo, hay que pasar el argumento especial {0}
  • GitHub reemplaza automáticamente {0} por la ruta de un archivo temporal

Ejemplos experimentales

  • Incluso es posible usar un compilador de C (tcc) como si fuera un shell para ejecutar directamente
  • También es posible manipular $PATH para crear y usar un shell bash falso
  • A GitHub no le importa qué ejecutable real corresponda al valor indicado en el campo shell

Implicaciones de seguridad

  • En GitHub Actions, el límite entre escribir archivos y ejecutar se vuelve difuso (también existe la posibilidad de ejecución mediante GITHUB_ENV, $GITHUB_PATH, etc.)
  • Incluso valores conocidos como shell: bash se resuelven a través de $PATH, y no usan una ruta fija de ejecución (/bin/bash)
  • Contra lo que podría esperarse, valores como python tampoco son solo referencias al toolcache, sino ejecuciones basadas en rutas reales

2 comentarios

 
tujuc 2025-04-09

Con solo ver el repositorio github/runner-image, ya se nota que vienen instalados bastantes paquetes que se pueden usar tal cual....

Si armas la imagen, fácilmente se va a 1 GB....

 
GN⁺ 2025-04-09
Comentarios de Hacker News
  • En el pasado usé la bandera -x de bash para forzar que se imprimieran todos los comandos ejecutados en un flujo de trabajo de Actions. Eso es muy útil para depurar
  • Un truco genial no oficial de GitHub Actions que descubrí en el trabajo es hacer coincidir nombres de eventos repository_dispatch usando comodines
    • Esa es la única forma de hacer cumplir flujos de trabajo reutilizables definidos mediante un pipeline de lanzamientos centralizado
    • Al despachar el evento, es fácil identificar el producto y la versión
  • Por experiencia, mientras menos se haga en GitHub Actions, mejor
    • Prefiero codificar la lógica en un sistema de build (por ejemplo, Make) y llamarlo desde GitHub Actions, o
    • escribir un programa CLI pequeño y llamarlo desde GitHub Actions
    • Depurar localmente es muchísimo más fácil que depurar en CI
  • Hubo una generación que sentía miedo cuando le pedían convertir hojas de cálculo en código
    • Esa generación sentirá miedo cuando le pidan imponer disciplina a despliegues construidos con GitHub Actions
  • El código del Runner de GitHub Actions es fácil de leer
    • Hay un lugar específico donde se definen los argumentos predeterminados para shells/binarios populares
    • ScriptHandler.cs contiene todo el código que prepara el entorno del proceso, los argumentos, etc.
    • En general, me sorprendió positivamente la simplicidad de este código
  • Puedes engañar al shell predeterminado bash para ejecutar prácticamente cualquier programa
    • Mientras quien lea la acción sepa qué está pasando, esto es muy útil
    • Me ha pasado que un script de shell empieza con unas pocas líneas y termina creciendo hasta convertirse en un monstruo de más de cien líneas
    • Quería funciones de la stdlib de Python, incluidos arreglos y tipos
  • Esto me da esperanza de que se pueda ejecutar fácilmente código Go que corra directamente tareas de CI desde un archivo YAML de workflow de GitHub
    • goeval todavía no admite directamente entrada desde archivos
    • Se necesita un truco con el shell
    • Hace falta un poco de boilerplate
    • Soy el autor de goeval
  • Me pregunto cuál es la ventaja del yaml de GitHub CI
  • Ahora ya se puede escribir C en CI/CD y llamarlo trabajo de sistemas de bajo nivel
    • Supongo que también se podría escribir ensamblador