# Crear una acción compuesta

En este tutorial, aprenderás cómo crear una acción compuesta.

## Introducción

En esta guía, aprenderás acerca de los componentes básicos necesarios para crear y usar una acción compuesta empaquetada. Para centrar esta guía en los componentes necesarios para empaquetar la acción, la funcionalidad del código de la acción es mínima. La acción imprime "Hello World" y, a continuación, "Adiós", o si proporciona un nombre personalizado, imprime "Hello \[who-to-greet]" y luego "Adiós". La acción también asigna un número aleatorio a la variable de salida `random-number` y ejecuta un script denominado `goodbye.sh`.

Una vez que completes este proyecto, deberías comprender cómo crear tu propia acción compuesta y probarla en un flujo de trabajo.

> \[!WARNING]
> Al crear flujos de trabajo y acciones, siempre debe tener en cuenta si el código podría ejecutar una entrada de posibles atacantes que no es de confianza. Se tratará a algunos contextos como una entrada no confiable, ya que un atacante podrían insertar su propio contenido malintencionado. Para más información, consulta [Referencia de uso seguro](/es/actions/security-guides/security-hardening-for-github-actions#understanding-the-risk-of-script-injections).

### Acciones compuestas y flujos de trabajo reutilizables

Las acciones compuestas te permiten recopilar una serie de pasos de trabajo de un flujo de trabajo en una sola acción, que puedes ejecutar como un único paso de trabajo en varios flujos de trabajo. Los flujos de trabajo reutilizables proporcionan otra manera de evitar la duplicación, ya que permiten ejecutar un flujo de trabajo completo desde otros flujos de trabajo. Para más información, consulta [Reutilización de configuraciones de flujo de trabajo](/es/actions/using-workflows/avoiding-duplication).

## Requisitos previos

> \[!NOTE]
> En este ejemplo se explica cómo crear una acción compuesta dentro de un repositorio independiente. Pero es posible crear una acción compuesta dentro del mismo repositorio. Para más información, consulta [Crear una acción compuesta](/es/actions/creating-actions/creating-a-composite-action#creating-a-composite-action-within-the-same-repository).

Antes de empezar, crearás un repositorio en GitHub.

1. Cree un nuevo repositorio público en GitHub. Puede elegir cualquier nombre de repositorio o usar el ejemplo `hello-world-composite-action` siguiente. Puedes agregar estos archivos después de que su proyecto se haya enviado a GitHub. Para más información, consulta [Crear un repositorio nuevo](/es/repositories/creating-and-managing-repositories/creating-a-new-repository).

2. Clona tu repositorio en tu computadora. Para más información, consulta [Clonar un repositorio](/es/repositories/creating-and-managing-repositories/cloning-a-repository).

3. Desde tu terminal, cambia los directorios en tu repositorio nuevo.

   ```shell copy
   cd hello-world-composite-action
   ```

4. En el repositorio `hello-world-composite-action`, cree un archivo denominado `goodbye.sh` con código de ejemplo:

   ```shell copy
   echo "echo Goodbye" > goodbye.sh
   ```

5. Desde el terminal, convierta `goodbye.sh` en ejecutable.

   <div class="ghd-tool linux">

   ```shell copy
   chmod +x goodbye.sh
   ```

   </div>

   <div class="ghd-tool mac">

   ```shell copy
   chmod +x goodbye.sh
   ```

   </div>

   <div class="ghd-tool windows">

   ```shell copy
   git add --chmod=+x -- goodbye.sh
   ```

   </div>

6. Desde el terminal, registre el archivo `goodbye.sh`.

   <div class="ghd-tool linux">

   ```shell copy
   git add goodbye.sh
   git commit -m "Add goodbye script"
   git push
   ```

   </div>

   <div class="ghd-tool mac">

   ```shell copy
   git add goodbye.sh
   git commit -m "Add goodbye script"
   git push
   ```

   </div>

   <div class="ghd-tool windows">

   ```shell copy
   git commit -m "Add goodbye script"
   git push
   ```

   </div>

## Crear un archivo de metadatos de una acción

1. En el repositorio `hello-world-composite-action`, cree un archivo denominado `action.yml` y agregue el código de ejemplo siguiente. Para más información sobre la sintaxis, consulta [Guía de referencia de la sintaxis de metadatos](/es/actions/creating-actions/metadata-syntax-for-github-actions#runs-for-composite-actions).

   ```yaml copy
   name: 'Hello World'
   description: 'Greet someone'
   inputs:
     who-to-greet:  # id of input
       description: 'Who to greet'
       required: true
       default: 'World'
   outputs:
     random-number:
       description: "Random number"
       value: ${{ steps.random-number-generator.outputs.random-number }}
   runs:
     using: "composite"
     steps:
       - name: Set Greeting
         run: echo "Hello $INPUT_WHO_TO_GREET."
         shell: bash
         env:
           INPUT_WHO_TO_GREET: ${{ inputs.who-to-greet }}

       - name: Random Number Generator
         id: random-number-generator
         run: echo "random-number=$(echo $RANDOM)" >> $GITHUB_OUTPUT
         shell: bash

       - name: Set GitHub Path
         run: echo "$GITHUB_ACTION_PATH" >> $GITHUB_PATH
         shell: bash
         env:
           GITHUB_ACTION_PATH: ${{ github.action_path }}

       - name: Run goodbye.sh
         run: goodbye.sh
         shell: bash

   ```

   Este archivo define la entrada `who-to-greet`, asigna el número generado aleatoriamente a la variable de salida `random-number`, agrega la ruta de acceso de la acción a la ruta del sistema del ejecutor (para buscar el script `goodbye.sh` durante la ejecución) y ejecuta el script `goodbye.sh`.

   Para más información sobre la administración de las salidas, consulta [Guía de referencia de la sintaxis de metadatos](/es/actions/creating-actions/metadata-syntax-for-github-actions#outputs-for-composite-actions).

   Para más información sobre cómo usar `github.action_path`, consulta [Contextos de referencia](/es/actions/learn-github-actions/contexts#github-context).

2. Desde el terminal, registre el archivo `action.yml`.

   ```shell copy
   git add action.yml
   git commit -m "Add action"
   git push
   ```

3. Desde tu terminal, agrega una etiqueta. En este ejemplo se usa una etiqueta denominada `v1`. Para más información, consulta [Acerca de las acciones personalizadas](/es/actions/creating-actions/about-custom-actions#using-release-management-for-actions).

   ```shell copy
   git tag -a -m "Description of this release" v1
   git push --follow-tags
   ```

## Probar tu acción en un flujo de trabajo

En el siguiente código de flujo de trabajo se usa la acción "Hola mundo" completada que has creado en [Crear una acción compuesta](/es/actions/creating-actions/creating-a-composite-action#creating-an-action-metadata-file).

Copie el código de flujo de trabajo en un archivo `.github/workflows/main.yml` de otro repositorio, pero reemplace `OWNER` y `SHA` por el propietario del repositorio y el SHA de la confirmación que quiere usar, respectivamente. También puede reemplazar la entrada `who-to-greet` por su nombre.

```yaml copy
on: [push]

jobs:
  hello_world_job:
    runs-on: ubuntu-latest
    name: A job to say hello
    steps:
      - uses: actions/checkout@v6
      - id: foo
        uses: OWNER/hello-world-composite-action@SHA
        with:
          who-to-greet: 'Mona the Octocat'
      - run: echo random-number "$RANDOM_NUMBER"
        shell: bash
        env:
          RANDOM_NUMBER: ${{ steps.foo.outputs.random-number }}
```

En el repositorio, haga clic en la pestaña **Actions** y seleccione la última ejecución de flujo de trabajo. La salida deberá incluir "Hello Mona the Octocat", el resultado del script de "Goodbye" y un número aleatorio.

## Creación de una acción compuesta en el mismo repositorio

1. Crea una subcarpeta denominada `hello-world-composite-action`, que puedes colocar en cualquier subcarpeta del repositorio. Pero se recomienda colocarla en la subcarpeta `.github/actions` para facilitar la organización.

2. En la carpeta `hello-world-composite-action`, sigue los mismos pasos para crear el script `goodbye.sh`

   ```shell copy
   echo "echo Goodbye" > goodbye.sh
   ```

   <div class="ghd-tool linux">

   ```shell copy
   chmod +x goodbye.sh
   ```

   </div>

   <div class="ghd-tool mac">

   ```shell copy
   chmod +x goodbye.sh
   ```

   </div>

   <div class="ghd-tool windows">

   ```shell copy
   git add --chmod=+x -- goodbye.sh
   ```

   </div>

   <div class="ghd-tool linux">

   ```shell copy
   git add goodbye.sh
   git commit -m "Add goodbye script"
   git push
   ```

   </div>

   <div class="ghd-tool mac">

   ```shell copy
   git add goodbye.sh
   git commit -m "Add goodbye script"
   git push
   ```

   </div>

   <div class="ghd-tool windows">

   ```shell copy
   git commit -m "Add goodbye script"
   git push
   ```

   </div>

3. En la carpeta `hello-world-composite-action`, crea el archivo `action.yml` en función de los pasos descritos en [Crear una acción compuesta](/es/actions/creating-actions/creating-a-composite-action#creating-an-action-metadata-file).

4. Al usar la acción, utiliza la ruta de acceso relativa a la carpeta donde el archivo `action.yml` de la acción compuesta se encuentra en la clave `uses`. En el ejemplo siguiente se supone que se encuentra en la carpeta `.github/actions/hello-world-composite-action`.

```yaml copy
on: [push]

jobs:
  hello_world_job:
    runs-on: ubuntu-latest
    name: A job to say hello
    steps:
      - uses: actions/checkout@v6
      - id: foo
        uses: ./.github/actions/hello-world-composite-action
        with:
          who-to-greet: 'Mona the Octocat'
      - run: echo random-number "$RANDOM_NUMBER"
        shell: bash
        env:
          RANDOM_NUMBER: ${{ steps.foo.outputs.random-number }}
```