# Migración de Jenkins a GitHub Actions

GitHub Actions y Jenkins comparten varias similaridades, lo cual hace que migrar a GitHub Actions sea relativamente sencillo.

## Introducción

Tanto Jenkins como GitHub Actions te permiten crear flujos de trabajo que compilan, prueban, publican, lanzan y despliegan código automáticamente. Jenkins y GitHub Actions comparten algunas similaridades en la configuración del flujo de trabajo:

* Jenkins crea los flujos de trabajo mediante *Canalizaciones Declarativas*, que son similares a los archivos de flujo de trabajo de GitHub Actions.
* Jenkins usa *fases* para ejecutar un conjunto de pasos, mientras que GitHub Actions utiliza trabajos para agrupar uno o mas pasos, o comandos individuales.
* Jenkins y GitHub Actions son compatibles con compilaciones basadas en el contenedor. Para más información, consulta [Creación de una acción de contenedor de Docker](/es/actions/creating-actions/creating-a-docker-container-action).
* Los pasos o tareas pueden reutilizarse y compartirse con la comunidad.

Para más información, consulta [Descripción de GitHub Actions](/es/actions/learn-github-actions/understanding-github-actions).

## Diferencias clave

* Jenkins tiene dos tipos de sintaxis para crear mapas: Mapa Declarativo y Mapa de Script. GitHub Actions utiliza YAML para crear flujos de trabajo y archivos de configuración. Para más información, consulta [Sintaxis del flujo de trabajo para GitHub Actions](/es/actions/using-workflows/workflow-syntax-for-github-actions).
* Los despliegues de jenkins son típicamente auto-hospedados y los usuarios mantienen los servidores en sus propios centros de datos. GitHub Actions ofrece un acercamiento híbrido en la nube, hospedando sus propios ejecutores que puedes utilizar para ejecutar jobs, mientras que también son compatibles con ejecutores auto-hospedados. Para más información, consulta [Ejecutores autohospedados](/es/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners).

## Comparación de capacidades

### Distribuir tus compilaciones

Jenkis te permite enviar compilaciones a un agente de compilación sencilla, o puedes distribuirlas a través de varios agentes. También puedes clasificar estos agentes de acuerdo con diversos atributos, tales como los tipos de sistema operativo.

De forma similar, las GitHub Actions pueden enviar jobs a los ejecutores auto-hospedados u hospedados en GitHub, y puedes utilizar etiquetas para clasificar los ejecutores de acuerdo con diversos atributos. Para más información, consulta [Descripción de GitHub Actions](/es/actions/learn-github-actions/understanding-github-actions#runners) y [Ejecutores autohospedados](/es/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners).

### Utilizar secciones para organizar tuberías

Jenkins divide sus Pipelines Declarativos en varias secciones. De forma similar, las GitHub Actions organizan sus flujos de trabajo en secciones separadas. En esta tabla se comparan las secciones de Jenkins con el flujo de trabajo de GitHub Actions.

| Directivas de Jenkins                                           | GitHub Actions                                                                                                                                                                                                                   |
| --------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`agent`](https://jenkins.io/doc/book/pipeline/syntax/#agent)   | [`jobs.<job_id>.runs-on`](/es/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idruns-on) <br> [`jobs.<job_id>.container`](/es/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idcontainer) |
| [`post`](https://jenkins.io/doc/book/pipeline/syntax/#post)     | Ninguno                                                                                                                                                                                                                          |
| [`stages`](https://jenkins.io/doc/book/pipeline/syntax/#stages) | [`jobs`](/es/actions/using-workflows/workflow-syntax-for-github-actions#jobs)                                                                                                                                                    |
| [`steps`](https://jenkins.io/doc/book/pipeline/syntax/#steps)   | [`jobs.<job_id>.steps`](/es/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idsteps)                                                                                                                          |

## Directivas de Uso

Jenkins usa directivas para administrar *Canalizaciones declarativas*. Estas directivas definen las características de tu flujo de trabajo y la manera en que se ejecuta. La tabla siguiente demuestra cómo dichas directivas mapean los conceptos en GitHub Actions.

| Directivas de Jenkins                                                                      | GitHub Actions                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`environment`](https://jenkins.io/doc/book/pipeline/syntax/#environment)                  | [`jobs.<job_id>.env`](/es/actions/using-workflows/workflow-syntax-for-github-actions#env) <br> [`jobs.<job_id>.steps[*].env`](/es/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsenv)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| [`options`](https://jenkins.io/doc/book/pipeline/syntax/#options)                          | [`jobs.<job_id>.strategy`](/es/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstrategy) <br> [`jobs.<job_id>.strategy.fail-fast`](/es/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstrategyfail-fast) <br> [`jobs.<job_id>.timeout-minutes`](/es/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idtimeout-minutes)                                                                                                                                                                                                                                                                                                                                                                                                                    |
| [`parameters`](https://jenkins.io/doc/book/pipeline/syntax/#options)                       | [`inputs`](/es/actions/creating-actions/metadata-syntax-for-github-actions#inputs) <br> [`outputs`](/es/actions/creating-actions/metadata-syntax-for-github-actions#outputs-for-docker-container-and-javascript-actions)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| [`triggers`](https://jenkins.io/doc/book/pipeline/syntax/#triggers)                        | [`on`](/es/actions/using-workflows/workflow-syntax-for-github-actions#on) <br> [`on.<event_name>.types`](/es/actions/using-workflows/workflow-syntax-for-github-actions#onevent_nametypes) <br> [<code>on.\<push>.\<branches\|tags></code>](/es/actions/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions#onpushbranchestagsbranches-ignoretags-ignore) <br> [<code>on.\<pull\_request>.\<branches></code>](/es/actions/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions#onpull_requestpull_request_targetbranchesbranches-ignore) <br> [<code>on.\<push\|pull\_request>.paths</code>](/es/actions/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions#onpushpull_requestpull_request_targetpathspaths-ignore) |
| [`triggers { upstreamprojects() }`](https://jenkins.io/doc/book/pipeline/syntax/#triggers) | [`jobs.<job_id>.needs`](/es/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idneeds)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| [Sintaxis cron de Jenkins](https://jenkins.io/doc/book/pipeline/syntax/#cron-syntax)       | [`on.schedule`](/es/actions/using-workflows/workflow-syntax-for-github-actions#onschedule)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| [`stage`](https://jenkins.io/doc/book/pipeline/syntax/#stage)                              | [`jobs.<job_id>`](/es/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_id) <br> [`jobs.<job_id>.name`](/es/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idname)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| [`tools`](https://jenkins.io/doc/book/pipeline/syntax/#tools)                              |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |

```
          [Especificaciones para ejecutores hospedados en GitHub](/actions/using-github-hosted-runners/about-github-hosted-runners#supported-software) |
```

\| [`input`](https://jenkins.io/doc/book/pipeline/syntax/#input)                              | [`inputs`](/es/actions/creating-actions/metadata-syntax-for-github-actions#inputs) |
\| [`when`](https://jenkins.io/doc/book/pipeline/syntax/#when)                                | [`jobs.<job_id>.if`](/es/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idif) |

## Utilizar etapas secuenciales

### Procesamiento paralelo de tareas

Jenkins puede ejecutar `stages` y `steps` en paralelo, mientras que GitHub Actions actualmente solo ejecuta trabajos en paralelo.

| Jenkins en Paralelo                                                 | GitHub Actions                                                                                                                         |
| ------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| [`parallel`](https://jenkins.io/doc/book/pipeline/syntax/#parallel) | [`jobs.<job_id>.strategy.max-parallel`](/es/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstrategymax-parallel) |

### Matriz

Tanto GitHub Actions como Jenkins te permiten utilizar una matriz para definir diversas combinaciones de sistema.

| Jenkins                                                                  | GitHub Actions                                                                                                                                    |
| ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`axis`](https://jenkins.io/doc/book/pipeline/syntax/#matrix-axes)       | [`strategy/matrix`](/es/actions/using-workflows/about-workflows#using-a-build-matrix) <br> [`context`](/es/actions/learn-github-actions/contexts) |
| [`stages`](https://jenkins.io/doc/book/pipeline/syntax/#matrix-stages)   | [`steps-context`](/es/actions/learn-github-actions/contexts#steps-context)                                                                        |
| [`excludes`](https://jenkins.io/doc/book/pipeline/syntax/#matrix-stages) | Ninguno                                                                                                                                           |

### Utilizar pasos para ejecutar tareas

Jenkins agrupa `steps` en `stages`. Cada uno de estos pasos puede ser un script, función, o comando, entre otros. De forma similar, GitHub Actions usa `jobs` para ejecutar grupos específicos de `steps`.

| Jenkins                                                       | GitHub Actions                                                                                          |
| ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| [`steps`](https://jenkins.io/doc/book/pipeline/syntax/#steps) | [`jobs.<job_id>.steps`](/es/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idsteps) |

## Ejemplos de tareas comunes

### Programación de una canalización para ejecutar con `cron`

#### Canalización de Jenkins con `cron`

```yaml
pipeline {
  agent any
  triggers {
    cron('H/15 * * * 1-5')
  }
}
```

#### Flujo de trabajo de GitHub Actions con `cron`

```yaml
on:
  schedule:
    - cron: '*/15 * * * 1-5'
```

Para más información sobre los eventos `schedule`y la sintaxis de cron aceptada, consulta [Eventos que desencadenan flujos de trabajo](/es/actions/reference/workflows-and-actions/events-that-trigger-workflows#schedule).

### Configurar variables de entorno en una canalización

#### Canalización de Jenkins con una variable de entorno

```yaml
pipeline {
  agent any
  environment {
    MAVEN_PATH = '/usr/local/maven'
  }
}
```

#### Flujo de trabajo de GitHub Actions con una variable de entorno

```yaml
jobs:
  maven-build:
    env:
      MAVEN_PATH: '/usr/local/maven'
```

### Compilar desde proyectos ascendentes

#### Canalización de Jenkins que se compila a partir de un proyecto ascendente

```yaml
pipeline {
  triggers {
    upstream(
      upstreamProjects: 'job1,job2',
      threshold: hudson.model.Result.SUCCESS
    )
  }
}
```

#### Flujo de trabajo de GitHub Actions que se compila a partir de un proyecto ascendente

```yaml
jobs:
  job1:
  job2:
    needs: job1
  job3:
    needs: [job1, job2]
```

### Construir con múltiples sistemas operativos

#### Canalización de Jenkins que se compila con varios sistemas operativos

```yaml
pipeline {
  agent none
  stages {
    stage('Run Tests') {
      matrix {
        axes {
          axis {
            name: 'PLATFORM'
            values: 'macos', 'linux'
          }
        }
        agent { label "${PLATFORM}" }
        stages {
          stage('test') {
            tools { nodejs "node-20" }
            steps {
              dir("scripts/myapp") {
                sh(script: "npm install -g bats")
                sh(script: "bats tests")
              }
            }
          }
        }
      }
    }
  }
}
```

#### Flujo de trabajo de GitHub Actions que se compila con varios sistemas operativos

```yaml
name: demo-workflow
on:
  push:
jobs:
  test:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [macos-latest, ubuntu-latest]
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-node@v4
        with:
          node-version: 20
      - run: npm install -g bats
      - run: bats tests
        working-directory: ./scripts/myapp
```