¿Cómo crear un archivo Workflow en GitHub Actions?
GitHub Actions es una herramienta poderosa para la automatización de procesos. Entre estos, está la creación de workflows que permiten ejecutar automáticamente scripts al ocurrir ciertos eventos en el repositorio. En este contenido, te ayudaré a realizar tu primer archivo Workflow en GitHub Actions usando tu lenguaje de programación favorito. Empecemos viendo cómo funcionaría este Workflow y qué pasos debes seguir.
¿Cómo comenzar con un archivo de código simple?
Vamos a crear un archivo de script en Python llamado holamundo.py. Este es simple y tiene la tarea de saludar al usuario obteniéndolo de la variable de entorno username. Aquí te dejo un ejemplo del código:
import os
defmain(): nombre = os.getenv('USERNAME','usuario')print(f"Hola {nombre} desde GitHub")if __name__ =="__main__": main()
Este script importará la librería os, usará la función getenv para obtener el nombre de usuario y luego lo imprimirá con un saludo amigable.
¿Cómo estructurar el archivo YAML para el Workflow?
En la creación del Workflow File, es crucial seguir una estructura específica con ciertas etiquetas clave. El archivo que manejará nuestro Workflow se llamará holamundo.yml. A continuación, veremos cómo puedes configurarlo paso a paso:
Etiquetas importantes del archivo YAML
name: Sirve para identificar el Workflow.
name: Aprendiendo GitHub Actions
Ayuda a diferenciar varios workflows en un mismo repositorio.
run-name: Define un nombre amigable para cada ejecución del Workflow.
run-name: Estoy Aprendiendo GitHub Actions
Esto permite identificar rápidamente ejecuciones específicas.
on: Especifica los eventos que activarán el Workflow.
on:[push]
jobs: Agrupa todos los trabajos que realizarán los steps en el Workflow.
¿Cómo verificar la ejecución del Workflow en GitHub?
Cuando el Workflow file está correctamente configurado, cada vez que se haga push al repositorio, el Workflow se ejecutará. Puedes verificar la ejecución accediendo a la pestaña "Actions" en tu repositorio de GitHub. Ahí encontrarás el workflow Aprendiendo GitHub Actions, y podrás revisar cada uno de los jobs y sus logs correspondientes.
¿Cuándo utilizar ciertas acciones y variables de entorno?
actions/checkout: Se utiliza para clonar el repositorio y todos sus archivos dentro de la máquina virtual donde el Workflow se ejecuta.
Variables de entorno: Permiten compartir información importante entre los steps del mismo job. Por ejemplo, importar el nombre de usuario usando github.actor.
¿Cómo garantizar que GitHub reconozca el Workflow?
Es crucial respetar estrictamente la nomenclatura de los archivos Workflow, incluyendo nombres y extensiones como .yml, sin caracteres o formatos incorrectos. De esta forma, GitHub reconocerá el archivo y habilitará los retos o ejecuciones futuras correctamente.
Con todo esto, tienes las herramientas necesarias para iniciar tu camino con GitHub Actions y la automatización del flujo de trabajo. ¡Es hora de que crees tus propios workflows y saques el máximo provecho de lo que GitHub ofrece, explorando, colaborando y compartiendo tu aprendizaje con otros en la comunidad!
Vamos a indagar línea por línea el archivo hola-mundo.yml para comprender la labor de cada etiqueta.
-*name: Aprendiendo GitHub Actions* → Es el nombre del Workflow que aparecerá en la sección de Actions en Github (opcional pero recomendadisimo).
-*run-name: ¡Estoy aprendiendo GitHub Actions!* → Es el nombre específico del Workflow que aparecerá en la pestaña de Actions en Github (Opcional).
-*on: [push]* → Esta se divide en 2. El “on” será la etiqueta que determine los triggers por los que se activará el Workflow; el [push] será el trigger por el que ha sido activado. Como es una lista, puedes agregar más triggers.
-*jobs* → Agrupará todos los jobs que ocurrirán en el Workflow (no contiene valor).
-*hola-mundo* → Esta es el identificador del job, así se diferenciará del resto (no puede contener espacios).
-*runs-on: ubuntu-latest* → Especificará el tipo de Runner para este job.
-*steps* → Agrupará todos los steps del job. Existen 2 tipos de steps, los que correrán actions del Marketplace o comandos de shell.
-*name: Checkout* → Nombre del step, su identificador. (también es opcional pero es recomendado usarla).
-*uses: actions/checkout@v3* → En este caso se usa la etiqueta uses para importar un action.
-*run: python hola_mundo.py* → En este otro caso se usa la etiqueta run para correr un comando o script.
Excelente resumen 🤌
Recuerden respetar la indentación al momento de los pasos / steps, solamente 2 espacios, yo utilice TAB y lo marcaba como error
Este yaml solo tiene un problema; y es que usa una version de nodejs que se encuentra fuera de uso, actualicen a la version 20 de nodejs:
The following actions uses Node.js version which is deprecated and will be forced to run on node20: actions/checkout@v3, actions/setup-node@v3.
Pregunta: por qué en este caso particular no se agrego un step para instalar python? como set-up python
Esto porque la mayoría de los runners (máquinas virtuales en GitHub Actions) ya cuentan con Python instalado.
Para correr el script de python se necesita tenerlo instalado previamente, por lo que ¿Python viene preinstalado junto con ubuntu?
# This is a basic workflow tohelp you get started withActionsname:Hello-Worldrun-name:I'm learning how towriteGithubActions!# Controls when the workflow will run
on: # Triggers the workflow on push or pull request events but only for the "main" branch
push: branches:["main"] pull_request: branches:["main"]# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs: # This workflow contains a single job called "build" build: # The type of runner that the job will run on
runs-on: ubuntu-latest
# Steps represent a sequence of tasks that will be executed as part of the job
steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
-uses: actions/checkout@v4 # SetupKotlinfor the Environment- name:SetupKotlinuses: fwilhe2/setup-kotlin@0.2.0with: version:1.9.23 # Runs a set of commands using the runners shell
- name:Run a multi-line script
run:| kotlinc main.kt -include-runtime -d main.jar
kotlin main.jar
Este contenido enseña cómo crear tu primer workflow en GitHub Actions para automatizar la ejecución de un script cada vez que ocurra un evento en el repositorio, como un push.
La meta real no es el script de “Hola Mundo”, sino aprender:
cómo funciona un workflow,
cómo se estructura un archivo YAML,
cómo GitHub ejecuta procesos automáticamente,
y cómo conectar scripts con automatizaciones.
Resumen ultra corto para memorizar
GitHub Actions en una frase:
“GitHub ejecuta automáticamente tareas definidas en un archivo YAML cuando ocurre un evento.”
Lo que debes recordar sí o sí
✅ Workflow = archivo .yml
✅ Va en .github/workflows/
✅ on define eventos
✅ jobs contiene trabajos
✅ runs-on define la VM
✅ steps son acciones
✅ checkout descarga el repo
✅ run ejecuta comandos
✅ github.actor = usuario actual
✅ Los logs se ven en Actions
✅ GitHub Actions = automatización + CI/CD
Hola profesor, estoy tratando de hacer el ejercicio con Typescript pero por más que configuro el yml y el repo me manda un error. Mi código:
# .github/workflows/hola-mundo.ymlname: hola-mundo.ts gitHub actions
run-name: ¡Estoy aprendiendo GitHub actions!
on:
[push]
jobs:
hola-mundo:
runs-on: ubuntu-latest
steps:
# 1. Checkout del Repositorio - name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'# 3. Instalar ts-node - name: Install ts-node
run: npminstall# 4. Ejecutar el script TypeScript - name: Execute TypeScript Script
run: npx ts-node index.ts
# incluso tengo configurado bien mi package.json.{"name":"github-actions-ts-runner",
"version":"1.0.0",
"description":"Simple runner for ts-node",
"main":"index.ts",
"scripts":{"start":"ts-node index.ts"},
"dependencies":{"ts-node":"^10.9.2",
"typescript":"^5.3.3"}}# pero me manda el siguiente error que no sé cómo solucionar:Run npminstallnpm error code ENOENT
npm error syscall opennpm error path /home/runner/work/curso-github-actions/curso-github-actions/package.json
npm error errno -2
npm error enoent Could not read package.json: Error: ENOENT: no such file or directory, open'/home/runner/work/curso-github-actions/curso-github-actions/package.json'npm error enoent This is related to npm not being able to find a file.
npm error enoent
npm error A complete log of this run can be found in: /home/runner/.npm/_logs/2025-11-28T00_57_31_079Z-debug-0.log
Error: Process completed with exit code 254.
Solucionado. Para Typescript este ejercicio requiere más trabajo aunque sólo corramos un console.log, requiere:
Algo clave para entender un runner es básicamente indicar en que server va correr
Por que nos cimplicamos con variables de entorno? No es mas facil mandar un print y ya?
Para el ejemplo simple también se podría como un valor quemado.
Acá se usan para demostrar la forma de guardar una variable de entorno en el runner de GitHub y que lo puedan usar en otros casos de uso más complejos donde una variable de entorno tenga más sentido.
Mi proyecto trabaja con kotlin, y esta fue mi solucion
# This is a basic workflow to help you get started withActionsname:Hello-Worldrun-name:I'm learning how to write GithubActions!# Controls when the workflow will run
on: # Triggers the workflow on push or pull request events but only for the "main" branch
push:branches:["github-action"]pull_request:branches:["github-action"]# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs: # This workflow contains a single job called "build"build: # The type of runner that the job will run on
runs-on: ubuntu-latest
# Steps represent a sequence of tasks that will be executed as part of the job
steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- name:Checkout repository
uses: actions/checkout@v4
with: fetch-depth:0 # SetupKotlinfor the Environment- name:SetupKotlinuses: fwilhe2/setup-kotlin@0.2.0with:version:1.9.23 # Runs a setofUSERNAME- name:SetUSERNAME env varrun: echo "USERNAME=${{ github.actor }}">> $GITHUB_ENV # Runs a setof commands using the runners shell
- name:CompileKotlin code
run: kotlinc helloWorld.kt-include-runtime -d helloWorld.jar- name:Run compiled Kotlin code
run: java -jar helloWorld.jar
Yo trabaje con Java este es mi archivo configuracion import java.util.Optional;
public class HolaMundo { public static void main(String[] args) { // Obtiene la variable de entorno "USERNAME" String nombre = System.getenv("USERNAME");
// Si no se encuentra, establece un valor por defecto nombre = Optional.ofNullable(nombre).orElse("Usuario");
// Imprime el mensaje mi primera System.out.println("¡Hola, " + nombre + " desde GitHub!"); }}```js
name: Aprendiendo GitHub Actions
run-name: ¡Estoy aprendiendo GitHub Actions!
on: [push]
jobs:
hola-mundo:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Definir variable
run: echo "USERNAME=${{ github.actor }}" >> $GITHUB_ENV
- name: Correr script
run: java HolaMundo.java
```js
import java.util.Optional;
public class HolaMundo {
public static void main(String[] args) {
// Obtiene la variable de entorno "USERNAME"
String nombre = System.getenv("USERNAME");
// Si no se encuentra, establece un valor por defecto
nombre = Optional.ofNullable(nombre).orElse("Usuario");
// Imprime el mensaje mi primera
System.out.println("¡Hola, " + nombre + " desde GitHub!");
}
}
packagecom.actions.demo;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importio.github.cdimascio.dotenv.Dotenv;@SpringBootApplicationpublicclassDemoApplication{publicstaticvoidmain(String[] args){Dotenv dotenv =Dotenv.load(); dotenv.entries().forEach(entry ->{System.setProperty(entry.getKey(), entry.getValue());});String ACTOR = dotenv.get("ACTOR");System.out.println(ACTOR +" is learning GitHub Actions");SpringApplication.run(DemoApplication.class, args);}}```packagecom.actions.demo;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importio.github.cdimascio.dotenv.Dotenv;@SpringBootApplicationpublicclassDemoApplication{ publicstaticvoidmain(String\[] args){Dotenv dotenv =Dotenv.load(); dotenv.entries().forEach(entry ->{System.setProperty(entry.getKey(), entry.getValue());}); String ACTOR = dotenv.get("ACTOR");System.out.println(ACTOR +" is learning GitHub Actions"); SpringApplication.run(DemoApplication.class, args);}}