Skip to main content

Migrar de Azure Pipelines a GitHub Actions

GitHub Actions y Azure Pipelines comparten varias configuraciones similares, lo cual hace que migrar a GitHub Actions sea relativamente sencillo.

Nota: Actualmente los ejecutores hospedados en GitHub no se admiten en GitHub Enterprise Server. Puede ver más información sobre la compatibilidad futura planeada en GitHub public roadmap.

Introducción

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

  • Los archivos de configuración de flujo de trabajo están escritas en YAML y se almacenan en el repositorio del código.
  • Los flujos de trabajo incluyen uno o más jobs.
  • Los jobs incluyen uno o más pasos o comandos individuales.
  • Los pasos o tareas pueden reutilizarse y compartirse con la comunidad.

Para más información, vea "Conceptos básicos de GitHub Actions".

Diferencias clave

Cuando migres desde Azure Pipelines, considera las siguientes diferencias:

  • Azure Pipelines admite un editor clásico heredado, que le permite definir la configuración de CI en un editor de GUI en lugar de crear la definición de canalización en un archivo YAML. GitHub Actions utiliza archivos YAML para definir flujos de trabajo y no es compatible con un editor gráfico.
  • Azure Pipelines te permite omitir parte de la estructura en las definiciones de jobs. Por ejemplo, si solo tienes un job, no necesitas definirlo y solo necesitas definir sus pasos. GitHub Actions requiere una configuración específica y no se puede omitir la estructura de YAML.
  • Azure Pipelines admite etapas definidas en el archivo YAML, que se pueden usar para crear flujos de trabajo de implementación. GitHub Actions necesita que separes las etapas en archivos de flujo de trabajo de YAML diferentes.
  • Azure Pipelines instalado localmente compila agentes que pueden seleccionarse con capacidades. Los ejecutores auto-hospedados de GitHub Actions pueden seleccionarse con etiquetas.

Migrar jobs y pasos

Los jobs y los pasos en Azure Pipelines son muy similares a aquellos en GitHub Actions. En ambos sistemas, los jobs tienen las siguientes características:

  • Los jobs contienen una serie de pasos que se ejecutan en secuencia.
  • Los jobs se ejecutan en máquinas virtuales separadas o en contenedores separados.
  • Los jobs se ejecutan en paralelo predeterminadamente, pero pueden configurarse para ejecutarse en secuencia.

Migrar los pasos de un script

Puedes ejecutar un script o comando de shell como un paso en un flujo de trabajo. En Azure Pipelines, se pueden especificar pasos de script mediante la clave script, o bien con las claves bash, powershell o pwsh. Los scripts también se pueden especificar como entrada para la tarea de Bash o la tarea de PowerShell.

En GitHub Actions, todos los scripts se especifican con la clave run. Para seleccionar un shell determinado, puede especificar la clave shell al proporcionar el script. Para más información, vea "Sintaxis de flujo de trabajo para GitHub Actions".

Aquí se muestra un ejemplo de la sintaxis para cada sistema:

Azure Pipelines GitHub Actions
jobs:
  - job: scripts
    pool:
      vmImage: 'windows-latest'
    steps:
      - script: echo "This step runs in the default shell"
      - bash: echo "This step runs in bash"
      - pwsh: Write-Host "This step runs in PowerShell Core"
      - task: PowerShell@2
        inputs:
          script: Write-Host "This step runs in PowerShell"
jobs:
  scripts:
    runs-on: windows-latest
    steps:
      - run: echo "This step runs in the default shell"
      - run: echo "This step runs in bash"
        shell: bash
      - run: Write-Host "This step runs in PowerShell Core"
        shell: pwsh
      - run: Write-Host "This step runs in PowerShell"
        shell: powershell

Diferencias en el manejo de errores de los scripts

En Azure Pipelines, los scripts se pueden configurar para generar un error si la salida se envía a stderr. GitHub Actions no es compatible con esta configuración.

GitHub Actions configura shells para que "fallen rápidamente" cuando sea posible, lo cual detiene el script inmediatamente si alguno de los comandos en éste sale con un código de error. En contraste, Azure Pipelines requiere de una configuración explícita para salir inmediatamente en caso de error. Para más información, vea "Sintaxis de flujo de trabajo para GitHub Actions".

Diferencias con el shell predeterminado de Windows

En Azure Pipelines, el shell predeterminado para los scripts en plataformas Windows es el shell de comandos (cmd.exe). En GitHub Actions, el shell predeterminado para los scripts en plataformas Windows es PowerShell. PowerShell tiene varias diferencias en comandos integrados, expansión de variables y control de flujo.

Si estás utilizando un comando simple, es posible que puedas ejecutar un script de Símbolo de Sistema en PowerShell sin tener que realizar cambios. Pero en la mayoría de los casos, tendrás que actualizar tu script con la sintaxis de PowerShell o dar la instrucción a GitHub Actions para ejecutar el script con el Símbolo de Sistema en vez de con PowerShell. Puede hacerlo si especifica shell como cmd.

Aquí se muestra un ejemplo de la sintaxis para cada sistema:

Azure Pipelines GitHub Actions
jobs:
  - job: run_command
    pool:
      vmImage: 'windows-latest'
    steps:
      - script: echo "This step runs in CMD on Windows by default"
jobs:
  run_command:
    runs-on: windows-latest
    steps:
      - run: echo "This step runs in PowerShell on Windows by default"
      - run: echo "This step runs in CMD on Windows explicitly"
        shell: cmd

Para más información, vea "Sintaxis de flujo de trabajo para GitHub Actions".

Migrar la sintaxis de expresión y los condicionales

Tanto Azure Pipelines como GitHub Actions pueden ejecutar pasos condicionalmente. En Azure Pipelines, las expresiones condicionales se especifican mediante la clave condition. En GitHub Actions, las expresiones condicionales se especifican mediante la clave if.

Azure Pipelines utiliza funciones dentro de las expresiones para ejecutar los pasos condicionalmente. En contraste, GitHub Actions utiliza una notación infija. Por ejemplo, debe reemplazar la función eq en Azure Pipelines por el operador == en GitHub Actions.

Aquí se muestra un ejemplo de la sintaxis para cada sistema:

Azure Pipelines GitHub Actions
jobs:
  - job: conditional
    pool:
      vmImage: 'ubuntu-latest'
    steps:
      - script: echo "This step runs with str equals 'ABC' and num equals 123"
        condition: and(eq(variables.str, 'ABC'), eq(variables.num, 123))
jobs:
  conditional:
    runs-on: ubuntu-latest
    steps:
      - run: echo "This step runs with str equals 'ABC' and num equals 123"
        if: ${{ env.str == 'ABC' && env.num == 123 }}

Para más información, vea "Expresiones".

Dependencias entre jobs

Tanto Azure Pipelines como GitHub Actions te permiten configurar dependencias par un job. En ambos sistemas, los jobs se ejecutan en paralelo predeterminadamente, pero las dependencias de estos pueden especificarse explícitamente. En Azure Pipelines, esto se hace con la clave dependsOn. En GitHub Actions, esto se hace con la clave needs.

A continuación encontrarás un ejemplo de la sintaxis para cada sistema. Los flujos de trabajo inician un primer trabajo denominado initial y, cuando se completa, se ejecutarán dos trabajos denominados fanout1 y fanout2. Por último, cuando se completan esos trabajos, se ejecutará el trabajo fanin.

Azure Pipelines GitHub Actions
jobs:
  - job: initial
    pool:
      vmImage: 'ubuntu-latest'
    steps:
      - script: echo "This job will be run first."
  - job: fanout1
    pool:
      vmImage: 'ubuntu-latest'
    dependsOn: initial
    steps:
      - script: echo "This job will run after the initial job, in parallel with fanout2."
  - job: fanout2
    pool:
      vmImage: 'ubuntu-latest'
    dependsOn: initial
    steps:
      - script: echo "This job will run after the initial job, in parallel with fanout1."
  - job: fanin:
    pool:
      vmImage: 'ubuntu-latest'
    dependsOn: [fanout1, fanout2]
    steps:
      - script: echo "This job will run after fanout1 and fanout2 have finished."
jobs:
  initial:
    runs-on: ubuntu-latest
    steps:
      - run: echo "This job will be run first."
  fanout1:
    runs-on: ubuntu-latest
    needs: initial
    steps:
      - run: echo "This job will run after the initial job, in parallel with fanout2."
  fanout2:
    runs-on: ubuntu-latest
    needs: initial
    steps:
      - run: echo "This job will run after the initial job, in parallel with fanout1."
  fanin:
    runs-on: ubuntu-latest
    needs: [fanout1, fanout2]
    steps:
      - run: echo "This job will run after fanout1 and fanout2 have finished."

Para más información, vea "Sintaxis de flujo de trabajo para GitHub Actions".

Migrar las tareas a acciones

Azure Pipelines usa tareas, que son componentes de aplicación que se pueden reutilizar en varios flujos de trabajo. GitHub Actions usa acciones, que se pueden utilizar para realizar tareas y personalizar el flujo de trabajo. En ambos sistemas, puedes especificar el nombre de la tarea o acción a ejecutar junto con cualquier entrada requerida como pares de clave/valor.

Aquí se muestra un ejemplo de la sintaxis para cada sistema:

Azure Pipelines GitHub Actions
jobs:
  - job: run_python
    pool:
      vmImage: 'ubuntu-latest'
    steps:
      - task: UsePythonVersion@0
        inputs:
          versionSpec: '3.7'
          architecture: 'x64'
      - script: python script.py
jobs:
  run_python:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/setup-python@v2
        with:
          python-version: '3.7'
          architecture: 'x64'
      - run: python script.py

Puede buscar acciones para usarlas en el flujo de trabajo en GitHub Marketplace, o bien puede crear acciones propias. Para más información, vea "Creación de acciones".