No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso de GitHub Actions

Curso de GitHub Actions

Juan José Torres

Juan José Torres

Expresiones para agregar lógica a un workflow

7/18
Recursos

GitHub Actions permite a los desarrolladores automatizar, personalizar y ejecutar sus flujos de trabajo de software directamente en GitHub.

Uno de los elementos claves para comenzar es la creación de un workflow file, también conocido como .yml file. Por ejemplo, un archivo llamado triggers.yml puede hacer que GitHub Actions reconozca que ha completado un desafío específico.

¿Cómo se crea un workflow file?

Primero, debe asignar un nombre descriptivo a su workflow, por ejemplo, triggers. A esto, a veces se le llama run name. Este término se refiere a lo que aparecerá en la consola o en la sección de acciones de GitHub.

Es importante porque a menudo hay más de un workflow en un repositorio, por lo que un run name claro puede ayudar a diferenciarlos.

¿Cómo se seleccionan los triggers correctos en un workflow file?

Se pueden usar una amplia variedad de triggers para iniciar un workflow. Estos pueden incluir:

  • Push, que ejecuta el workflow cada vez que se realiza un 'push' a la rama maestra.
  • Pull Request, que se activa cada vez que se abre un 'pull request'.
  • Workflow Dispatch, que permite a los usuarios ejecutar workflows manualmente.
  • Schedule, que ejecuta workflows en un horario específico.

¿Cómo se utilizan las expresiones en GitHub Actions?

Las expresiones son elementos indispensables en GitHub Actions. Permiten acceder a valores literales o de variables, comparar diferentes expresiones y utilizar varias funciones.

Existen muchas funciones comunes, como if, contains, toJson y fromJson, que desempeñan roles esenciales en el control de los workflows. Por ejemplo, la función if se puede usar para determinar si se ejecuta un trabajo, mientras que contains puede restringir la ejecución a situaciones específicas.

Por ahora, te animo a jugar con lo que has aprendido y te desafío a crear un archivo workflow llamado 'expresiones.yml' que utilice al menos tres de las expresiones que hemos discutido. Para una guía completa de todas las funciones disponibles de GitHub Actions, consulta la documentación oficial de GitHub.

Aportes 13

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

name: Expression
on:
	workflow_dispatch:
		inputs:
			edad:
				description: 'Edad'
				required: true
				type: integer
			nombre:
				description: 'Tu nombre'
				required: true
				default: 'Juan'
				type: string
jobs:
	mayor:
		if: ${{ inputs.edad >= 18 }}
		runs-on: ubuntu-latest
		steps:
			- name : Correr script
				run: echo ${{ inputs.nombre }} es mayor de edad
	menor:
		if: ${{ inputs.edad < 18 }}
		runs-on: ubuntu-latest
		steps:
			- name : Correr script
				run: echo ${{ inputs.nombre }} es menor de edad

```txt name: Workflow con expresiones run-name: Workflow con expresiones on: push: branches: - main workflow_dispatch: jobs: expressions_demo: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v3 - name: Usar una expresión condicional if: ${{ github.event_name == 'push' }} run: echo "Este workflow se ejecutó debido a un push en la rama main." - name: Operaciones matemáticas run: | echo "Suma: $((1 + 2))" echo "Multiplicación: $((3 * 4))" - name: Expresión con funciones run: | echo "El repositorio es: ${{ github.repository }}" echo "El actor que ejecutó el workflow es: ${{ github.actor }}" echo "Fecha actual: ${{ github.event.head_commit.timestamp || 'No disponible' }}" ```
```txt name: Expresiones on: workflow_dispatch: inputs: posicion: description: Posicion en la empresa required: true type: string antiguedad: description: Años en la empresa required: true type: number jobs: desarrollador: if: ${{ contains(inputs.posicion, 'Desarrollador') }} runs-on: ubuntu-latest steps: - name: Detectar desarrollador run: echo Usted es desarrollador nuevo: if: ${{ inputs.antiguedad <= 2 }} runs-on: ubuntu-latest steps: - name: Detectar persona nueva run: echo Usted no tiene mucho tiempo en la empresa experimentado: if: ${{ inputs.antiguedad > 2 }} runs-on: ubuntu-latest steps: - name: Detectar persona expeimentada run: echo Usted es bastante importante en la empresa ```name: Expresioneson:   workflow\_dispatch:    inputs:      posicion:        description: Posicion en la empresa        required: true        type: string      antiguedad:        description: Años en la empresa        required: true        type: numberjobs:  desarrollador:    if: ${{ contains(inputs.posicion, 'Desarrollador') }}    runs-on: ubuntu-latest    steps:      - name: Detectar desarrollador        run: echo Usted es desarrollador   nuevo:    if: ${{ inputs.antiguedad <= 2 }}    runs-on: ubuntu-latest    steps:      - name: Detectar persona nueva        run: echo Usted no tiene mucho tiempo en la empresa  experimentado:    if: ${{ inputs.antiguedad > 2 }}    runs-on: ubuntu-latest    steps:      - name: Detectar persona expeimentada        run: echo Usted es bastante importante en la empresa
```js name: Expressions run-name: ${{ github.actor }} is learning Expressions on: push: branches: - main pull_request: types: [opened, synchronize] paths: - "**.java" workflow_dispatch: inputs: favorite_food: description: "Favorite food" default: Pizza required: true type: choice options: - Pizza - Tacos sauce: description: "Sauce" required: true default: Hot type: choice options: - Hot - Mild jobs: pizza-job: if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.favorite_food == 'Pizza' }} runs-on: ubuntu-latest steps: - run: echo "Pizza with ${{ github.event.inputs.sauce }} sauce" tacos-job: if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.favorite_food == 'Tacos' }} runs-on: ubuntu-latest steps: - run: echo "Tacos with ${{ github.event.inputs.sauce }} sauce" ```
Algunos datos: * Actualmente el type integer esta deprecated. * Para que el boton Run workflow se visualize para ejecutar manualmente el workflow, hacer un PR de aprendiendo... a main. ```js name: Expresiones run-name: Runner Expresiones on: push: branches: ['aprendiendo-github-actions', 'main'] paths: ['**/*'] workflow_dispatch: inputs: edad: description: 'Edad' required: true type: string nombre: description: 'Nombre' required: true default: 'Jhordan' type: string jobs: ## JOB1 job1: if: ${{ github.event_name == 'workflow_dispatch' }} runs-on: ubuntu-latest steps: - name: run > 18 if: ${{ inputs.edad >= 18 }} run: echo ${{ inputs.nombre }} es mayor de edad. - name: run < 18 if: ${{ inputs.edad < 18 }} run: echo ${{ inputs.nombre }} es menor de edad. ## JOB2 job2: if: ${{ github.event_name != 'workflow_dispatch' }} runs-on: ubuntu-22.04 env: USERNAME: 'jhordan' AGE: '28' steps: - name: Welcome run: echo "Hola ${{ env.USERNAME }} tienes ${{ env.AGE }} de edad." ``` name: Expresionesrun-name: Runner Expresioneson: push: branches: \['aprendiendo-github-actions', 'main'] paths: \['\*\*/\*'] workflow\_dispatch: inputs: edad: description: 'Edad' required: true type: string nombre: description: 'Nombre' required: true default: 'Jhordan' type: stringjobs: ## JOB1 job1: if: ${{ github.event\_name == 'workflow\_dispatch' }} runs-on: ubuntu-latest steps: - name: run > 18 if: ${{ inputs.edad >= 18 }} run: echo ${{ inputs.nombre }} es mayor de edad. - name: run < 18 if: ${{ inputs.edad < 18 }} run: echo ${{ inputs.nombre }} es menor de edad. ## JOB2 job2: if: ${{ github.event\_name != 'workflow\_dispatch' }} runs-on: ubuntu-22.04 env: USERNAME: 'jhordan' AGE: '28' steps: - name: Welcome run: echo "Hola ${{ env.USERNAME }} tienes ${{ env.AGE }} de edad."
El yml para cerrar un PR. En este caso cuando se abra un pr, automaticamente se va a cerrar. Esto no tiene mucho uso más que el didactico ```js name: running-trigger on: pull_request_target: types: [opened, updated, synchronize] branches: - main jobs: close-pr: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v3 - name: Close run: | gh pr close --comment "Auto-closing pull request" --delete-branch ${{ github.event.pull_request.number }} env: GH_TOKEN: ${{ secrets.GH_TOKEN }} ```name: running-trigger on:  pull\_request\_target:    types: \[opened, updated, synchronize]    branches:      - main jobs:  close-pr:    runs-on: ubuntu-latest    steps:      - name: Checkout repository        uses: actions/checkout@v3       - name: Close        run: |          gh pr close --comment "Auto-closing pull request" --delete-branch ${{ github.event.pull\_request.number }}        env:           GH\_TOKEN: ${{ secrets.GH\_TOKEN }}
```js name: Expression on: workflow_dispatch: inputs: nombre: description: 'Nombre' required: true type: string pull_request: types: [opened, synchronize, reopened] paths: - '**.py' jobs: manual: if: ${{ github.event_name == 'workflow_dispatch' }} runs-on: ubuntu_latest steps: - name: Correr manual run: echo ${{ inputs.nombre }} esta aprendiendo de workflows automatico: 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: python main.py - name: Obtener salida run: echo "RESULT=$?" >> $GITHUB_ENV - name: Revisar la salida del script run: | if [[ "$RESULT" == *"iMrJulian"* ]]; then echo "Adios iMrJulian" exit 1 fi revisar_comentarios: runs-on: ubuntu-latest steps: - name: Revisar si el PR body contiene 'iMrJulian' if: ${{ contains(github.event.pull_request.body, 'iMrJulian') }} run: | echo "El cuerpo del PR contiene 'iMrJulian'." exit 1 - name: PR Body no contiene 'iMrJulian' run: echo "El cuerpo del PR no contiene 'iMrJulian'." ```jobs: revisar\_comentarios: runs-on: ubuntu-latest steps: - name: Revisar si el PR body contiene 'iMrJulian' if: ${{ contains(github.event.pull\_request.body, 'iMrJulian') }} run: | echo "El cuerpo del PR contiene 'iMrJulian'." exit 1 - name: PR Body no contiene 'iMrJulian' run: echo "El cuerpo del PR no contiene 'iMrJulian'."
Hola! tengo la siguiente duda: Tengo el siguiente workflow file, con el evento de worflow\_dispatch, pero en la interfaz de GitHub no esta reconociendo este evento por que no me da la opción de lanzarlo manualmente ni ingresar los valores de los inputs, sabe que me puede estar faltando? ![](https://static.platzi.com/media/user_upload/Screenshot%202024-06-28%20at%2015.56.58-68aa0b11-449c-4814-8abf-36a9308f8762.jpg)![](https://static.platzi.com/media/user_upload/Screenshot%202024-06-28%20at%2015.56.48-39e87257-093e-48f1-ba1d-8ee5b07d0610.jpg)
```c# name: Aprendiendo expresiones run-name: ¡Aprendiendo expresiones en github actions! on: workflow_dispatch: inputs: nombre: description: nombre de la persona default: Angel type: string required: true peso: description: peso de la persona required: true type: number altura: description: altura de la persona required: true type: number imprimir_json: description: deseas imprimir a json type: boolean default: true jobs: job-saber-si-es-alto: runs-on: ubuntu-latest name: Job para saber si es alto if: ${{ inputs.altura >= 1.80 }} steps: - name: imprimir si es alto run: echo "Eres alto ${{inputs.nombre}} mides ${{ inputs.altura }} metros" job-saber-si-pesa-mas-de-60-kilos: runs-on: ubuntu-latest name: Job para saber si pesa mas de 60 kilos if: ${{ inputs.peso > 60 }} steps: - name: imprimir peso run: echo "Pesas mas de 60 kilos" job-imprimir-json: runs-on: ubuntu-latest name: Job para imprimir a JSON if: ${{ inputs.imprimir_json }} steps: - name: Imprimir JSON run: echo "${{toJSON(inputs)}}" ```name: Aprendiendo expresionesrun-name: ¡Aprendiendo expresiones en github actions!on:  workflow\_dispatch:    inputs:      nombre:        description: nombre de la persona        default: Angel        type: string        required: true      peso:        description: peso de la persona        required: true        type: number      altura:        description: altura de la persona        required: true        type: number      imprimir\_json:        description: deseas imprimir a json        type: boolean        default: truejobs:  job-saber-si-es-alto:    runs-on: ubuntu-latest    name: Job para saber si es alto    if: ${{ inputs.altura >= 1.80 }}    steps:      - name: imprimir si es alto        run: echo "Eres alto ${{inputs.nombre}} mides ${{ inputs.altura }} metros"   job-saber-si-pesa-mas-de-60-kilos:    runs-on: ubuntu-latest    name: Job para saber si pesa mas de 60 kilos    if: ${{ inputs.peso > 60 }}    steps:      - name: imprimir peso        run: echo "Pesas mas de 60 kilos"   job-imprimir-json:    runs-on: ubuntu-latest    name: Job para imprimir a JSON    if: ${{ inputs.imprimir\_json }}    steps:      - name: Imprimir JSON        run: echo "${{toJSON(inputs)}}"
```jsx name: Aprendiendo a usar triggers en github actions on: push: branches: - main - aprendiendo-github-actions pull_request: branches: - main - aprendiendo-github-actions types: #especifica el tipo de pull request - opened - labeled paths: #especifica si se activa cuando haya cambios en ciertos archivos - "**.py" issues: types: - closed - opened - edited issue_comment: types: - created - edited - deleted jobs: nombre-job-aprendiendo-triggers: name: Ejemplo workflow para aprender triggers runs-on: ubuntu-latest steps: - name: clonar el repositorio con la action checkout uses: actions/checkout@v4 - name: Instalar Python 3.10 uses: actions/setup-python@v3 with: python-version: "3.10" - name: correr el script de python run: python main.py ```
name: Expresiones run-name: ¡Estoy aprendiendo a usar Expresiones! on: workflow\_dispatch: inputs: edad: description: 'Edad' required: true type: integer nombre: description: 'Tu nombre' required: true default: 'Juan' type: string jobs: mayor: if: ${{ inputs.edad >= 18 }} runs-on: ubuntu-latest steps: \- name: Correr script run: echo ${{ inputs.nombre }} es mayor de edad menor: if: ${{ inputs.edad < 18 }} runs-on: ubuntu-latest steps: \- name: Correr script run: echo ${{ inputs.nombre }} es menor de edad
name: Expresiones
on:
  workflow_dispatch:
    inputs:
      edad:
        description: '¿Qué edad tienes?'
        required: true
        type: integer
      nombre:
        description: ¿Cómo te llamas?
        required: true
        default: Agustina
        type: string
      nacionalidad:
        description: ¿Dónde naciste?
        required: true
        type: string
jobs:
  mayor:
    if: ${{ inputs.edad >= 18 }}
    runs-on: ubuntu-latest
    steps:
      - name: correr script
        run: echo ${{ inputs.nombre }} es mayor de edad
  menor: 
    if: ${{ inputs.edad < 18 }}
    runs-on: ubuntu-latest
    steps:
      - name: correr script
        run: echo ${{ inputs.nombre }} es menor de edad
  suscripcion_no:
    if: ${{ inputs.nacionalidad != España }}
    runs-on: ubuntu-latest
    steps: 
      - name: correr script
        run: echo ${{ inputs.nacionalidad}} no es un país apto para la suscripción.
  suscripcion_si:
    if: ${{ inputs.nacionalidad == España }}
    runs-on: ubuntu-latest
    steps: 
      - name: correr script
        run: echo ${{ inputs.nacionalidad}}  es un país apto para la suscripción.       

 

Reto 3

name: Reto 3 - Aprende a usar Expresiones
on:
  push:
    branches:
      - aprendiendo-github-actions

  workflow_dispatch:
    inputs:
      nombre:
        description: 'Nombre'
        required: true
        default: Ingresa tu nombre
        type: string
      edad:
        description: 'Edad'
        required: true
        type: number
      fruta:
        description: 'Lista de Frutas'
        default: Manzana
        required: true
        type: choice
        options:
        - Frutilla
        - Pera
        - Manzana
jobs:
    fruta-favorita:
      runs-on: ubuntu-latest
      steps:
      - name: Fruta Seleccionada
        run: |
          if ${{ inputs.fruta == 'Frutilla' }}; then
            echo ${{ inputs.nombre }} Tu fruta favorita es la Frutilla 
          elif ${{ inputs.fruta == 'Pera' }}; then
            echo ${{ inputs.nombre }} Tu fruta favorita es la Pera
          else 
            echo ${{ inputs.nombre }} Tu fruta favorita es la Manzana
          fi
    mayor:
      if: ${{ inputs.edad >= 18 }} 
      runs-on: ubuntu-latest
      steps:
        - name: Correr script
          run: echo ${{ inputs.nombre }} es mayor de edad
    menor:
      if: ${{ inputs.edad < 18 }} 
      runs-on: ubuntu-latest
      steps:
        - name: Correr script
          run: echo ${{ inputs.nombre }} es menor de edad