{"meta":{"title":"Migración de CircleCI a Acciones de GitHub","intro":"Acciones de GitHub y CircleCI comparten varias similitudes en la configuración, lo que hace que la migración a Acciones de GitHub relativamente sencilla.","product":"GitHub Actions","breadcrumbs":[{"href":"/es/actions","title":"GitHub Actions"},{"href":"/es/actions/tutorials","title":"Tutoriales"},{"href":"/es/actions/tutorials/migrate-to-github-actions","title":"Migrar a GitHub Actions"},{"href":"/es/actions/tutorials/migrate-to-github-actions/manual-migrations","title":"Migraciones manuales"},{"href":"/es/actions/tutorials/migrate-to-github-actions/manual-migrations/migrate-from-circleci","title":"Migrar desde CircleCI"}],"documentType":"article"},"body":"# Migración de CircleCI a Acciones de GitHub\n\nAcciones de GitHub y CircleCI comparten varias similitudes en la configuración, lo que hace que la migración a Acciones de GitHub relativamente sencilla.\n\n## Introducción\n\nCircleCI y GitHub Actions ambos permiten crear flujos de trabajo que compilen, prueben, publiquen, publiquen e implementen código automáticamente. CircleCI y GitHub Actions comparten algunas similitudes en la configuración del flujo de trabajo:\n\n* Los archivos de configuración de flujo de trabajo están escritos en YAML y se almacenan en el repositorio.\n* Los flujos de trabajo incluyen una o más tareas.\n* Los trabajos incluyen uno o más pasos o comandos individuales.\n* Los pasos o tareas pueden reutilizarse y compartirse con la comunidad.\n\nPara más información, consulta [Descripción de Acciones de GitHub](/es/actions/get-started/understand-github-actions).\n\n## Diferencias clave\n\nCuando migres desde CircleCI, considera las siguientes diferencias:\n\n* El paralelismo automático de pruebas de CircleCI agrupa las pruebas automáticamente de acuerdo con las reglas que el usuario haya especificado o el historial de información de tiempos. Esta funcionalidad no está integrada en GitHub Actions.\n* Las acciones que se ejecutan en los contenedores de Docker son sensibles a problemas de permisos, ya que los contenedores tienen una asignación de usuarios diferente. Puede evitar muchos de estos problemas si no usa la instrucción `USER` en el *Dockerfile*. Para obtener más información sobre el sistema de archivos de Docker en ejecutores alojados en GitHub, consulte [Referencia de ejecutores hospedados en GitHub](/es/actions/reference/runners/github-hosted-runners#docker-container-filesystem).\n\n## Migrar flujos de trabajo y tareas\n\nCircleCI define `workflows` en el archivo *config.yml*, que permite configurar más de un flujo de trabajo.\nGitHub requiere un archivo de flujo de trabajo por flujo de trabajo y, como consecuencia, no requiere que declare `workflows`. Tendrá que crear un archivo de flujo de trabajo para cada flujo de trabajo configurado en *config.yml*.\n\nCircleCI y GitHub Actions configuran `jobs` en el archivo de configuración mediante una sintaxis similar. Si configura dependencias entre trabajos mediante `requires` en el flujo de trabajo de CircleCI, puede usar la sintaxis equivalente GitHub Actions`needs` . Para más información, consulta [Sintaxis del flujo de trabajo para Acciones de GitHub](/es/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idneeds).\n\n## Migrar orbes a acciones\n\nCircleCI y GitHub Actions proporcionan un mecanismo para reutilizar y compartir tareas en un flujo de trabajo. CircleCi utiliza un concepto llamado orbes (orbs), escrito en YAML, que proporciona tareas que las personas pueden reutilizar en un flujo de trabajo.\nGitHub Actions tiene componentes reutilizables eficaces y flexibles denominados acciones, que se compilan con archivos javaScript o imágenes de Docker. Puede crear acciones escribiendo código personalizado que interactúe con el repositorio de cualquier manera que quiera, incluida la integración con GitHublas API de y cualquier API de terceros disponible públicamente. Por ejemplo, una acción puede publicar módulos npm, enviar alertas por SMS cuando se crean problemas urgentes o implementar código listo para producción. Para más información, consulta [Reutilización de automatizaciones](/es/actions/how-tos/reuse-automations).\n\nCircleCI puede reutilizar partes de los flujos de trabajo mediante anclas y alias de YAML.\nGitHub Actions admite anclajes y alias de YAML para la reutilización, y también proporciona matrices para ejecutar trabajos con distintas configuraciones. Para obtener más información sobre las matrices, consulta [Ejecución de variaciones de trabajos en un flujo de trabajo](/es/actions/how-tos/write-workflows/choose-what-workflows-do/run-job-variations).\n\n## Utilizar imágenes de Docker\n\nCircleCI y GitHub Actions admiten la ejecución de pasos dentro de una imagen de Docker.\n\nCircleCi proporciona un conjunto de imágenes pre-compiladas con dependencias comunes. Estas imágenes tienen `USER` configurado en `circleci`, lo que provoca conflictos de permisos con GitHub Actions.\n\nSe recomienda alejarse de las imágenes precompiladas de CircleCI al migrar a GitHub Actions. En muchos casos, puedes utilizar acciones para instalar dependencias adicionales que necesites.\n\nPara más información sobre el sistema de archivos de Docker, consulta [Referencia de ejecutores hospedados en GitHub](/es/actions/reference/runners/github-hosted-runners#docker-container-filesystem).\n\nPara obtener más información sobre las herramientas y los paquetes disponibles en las imágenes del ejecutor hospedado de GitHub, consulte [Ejecutores hospedados en GitHub](/es/actions/concepts/runners/github-hosted-runners#preinstalled-software-for-github-owned-images).\n\n## Utilizar variables y secretos\n\nCircleCI y GitHub Actions admiten la configuración de variables en el archivo de configuración y la creación de secretos mediante CircleCI o GitHub la interfaz de usuario.\n\nPara más información, consulta [Referencia de variables](/es/actions/reference/workflows-and-actions/variables#default-environment-variables) y [Uso de secretos en Acciones de GitHub](/es/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets).\n\n## Almacenamiento en memoria caché\n\nCircleCI y GitHub Actions proporcionan un método para almacenar en caché manualmente los archivos en el archivo de configuración.\n\nA continuación encontrarás un ejemplo de la sintaxis para cada sistema.\n\n### Sintaxis de CircleCI para el almacenamiento en caché\n\n```yaml\n- restore_cache:\n    keys:\n      - v1-npm-deps-{{ checksum \"package-lock.json\" }}\n      - v1-npm-deps-\n```\n\n### sintaxis de Acciones de GitHub para el almacenamiento en caché\n\n```yaml\n- name: Cache node modules\n  uses: actions/cache@v4\n  with:\n    path: ~/.npm\n    key: v1-npm-deps-${{ hashFiles('**/package-lock.json') }}\n    restore-keys: v1-npm-deps-\n```\n\nGitHub Actions no tiene un equivalente al almacenamiento en caché por capas de Docker de CircleCI (o DLC).\n\n## Datos persistentes entre jobs\n\nCircleCI y GitHub Actions proporcionan mecanismos para conservar los datos entre trabajos.\n\nA continuación se muestra un ejemplo en CircleCI y en la sintaxis de configuración GitHub Actions.\n\n### Sintaxis de CircleCI para conservar datos entre trabajos\n\n```yaml\n- persist_to_workspace:\n    root: workspace\n    paths:\n      - math-homework.txt\n\n...\n\n- attach_workspace:\n    at: /tmp/workspace\n```\n\n### Sintaxis de Acciones de GitHub para conservar datos entre trabajos\n\n```yaml\n- name: Upload math result for job 1\n  uses: actions/upload-artifact@v4\n  with:\n    name: homework\n    path: math-homework.txt\n\n...\n\n- name: Download math result for job 1\n  uses: actions/download-artifact@v5\n  with:\n    name: homework\n```\n\nPara más información, consulta [Almacenamiento y uso compartido de datos con artefactos de flujo de trabajo](/es/actions/tutorials/store-and-share-data).\n\n## Usar bases de datos y contenedores de servicio\n\nAmbos sistemas te permiten incluir contenedores adicionales para bases de datos, almacenamiento en caché, u otras dependencias.\n\nEn CircleCI, la primera imagen enumerada en *config.yaml* es la imagen primaria que se usa para ejecutar comandos.\nGitHub Actions usa secciones explícitas: use `container` para el contenedor principal y enumere contenedores adicionales en `services`.\n\nA continuación se muestra un ejemplo en CircleCI y en la sintaxis de configuración GitHub Actions.\n\n### Sintaxis de CircleCI para usar bases de datos y contenedores de servicios\n\n```yaml\n---\nversion: 2.1\n\njobs:\n\n  ruby-26:\n    docker:\n      - image: circleci/ruby:2.6.3-node-browsers-legacy\n        environment:\n          PGHOST: localhost\n          PGUSER: administrate\n          RAILS_ENV: test\n      - image: postgres:10.1-alpine\n        environment:\n          POSTGRES_USER: administrate\n          POSTGRES_DB: ruby26\n          POSTGRES_PASSWORD: \"\"\n\n    working_directory: ~/administrate\n\n    steps:\n      - checkout\n\n      # Bundle install dependencies\n      - run: bundle install --path vendor/bundle\n\n      # Wait for DB\n      - run: dockerize -wait tcp://localhost:5432 -timeout 1m\n\n      # Setup the environment\n      - run: cp .sample.env .env\n\n      # Setup the database\n      - run: bundle exec rake db:setup\n\n      # Run the tests\n      - run: bundle exec rake\n\nworkflows:\n  version: 2\n  build:\n    jobs:\n      - ruby-26\n...\n\n- attach_workspace:\n    at: /tmp/workspace\n```\n\n### Sintaxis de Acciones de GitHub para usar bases de datos y contenedores de servicios\n\n<!-- markdownlint-disable search-replace -->\n\n```yaml\nname: Containers\n\non: [push]\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n    container: circleci/ruby:2.6.3-node-browsers-legacy\n\n    env:\n      PGHOST: postgres\n      PGUSER: administrate\n      RAILS_ENV: test\n\n    services:\n      postgres:\n        image: postgres:10.1-alpine\n        env:\n          POSTGRES_USER: administrate\n          POSTGRES_DB: ruby25\n          POSTGRES_PASSWORD: \"\"\n        ports:\n          - 5432:5432\n        # Add a health check\n        options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5\n\n    steps:\n      # This Docker file changes sets USER to circleci instead of using the default user, so we need to update file permissions for this image to work on GH Actions.\n      # See https://docs.github.com/actions/using-github-hosted-runners/about-github-hosted-runners#docker-container-filesystem\n\n      - name: Setup file system permissions\n        run: sudo chmod -R 777 $GITHUB_WORKSPACE /github /__w/_temp\n      - uses: actions/checkout@v6\n      - name: Install dependencies\n        run: bundle install --path vendor/bundle\n      - name: Setup environment configuration\n        run: cp .sample.env .env\n      - name: Setup database\n        run: bundle exec rake db:setup\n      - name: Run tests\n        run: bundle exec rake\n```\n\n<!-- markdownlint-enable search-replace -->\n\nPara más información, consulta [Comunicación con contenedores de servicios de Docker](/es/actions/tutorials/use-containerized-services/use-docker-service-containers).\n\n## Ejemplo completo\n\nA continuación encontrarás un ejemplo real. A la izquierda se muestra el archivo *config.yml* real de CircleCI para el repositorio [thoughtbot/administrator](https://github.com/thoughtbot/administrate). A la derecha se muestra el GitHub Actions equivalente.\n\n### Ejemplo completo de CircleCI\n\n```yaml\n---\nversion: 2.1\n\ncommands:\n  shared_steps:\n    steps:\n      - checkout\n\n      # Restore Cached Dependencies\n      - restore_cache:\n          name: Restore bundle cache\n          key: administrate-{{ checksum \"Gemfile.lock\" }}\n\n      # Bundle install dependencies\n      - run: bundle install --path vendor/bundle\n\n      # Cache Dependencies\n      - save_cache:\n          name: Store bundle cache\n          key: administrate-{{ checksum \"Gemfile.lock\" }}\n          paths:\n            - vendor/bundle\n\n      # Wait for DB\n      - run: dockerize -wait tcp://localhost:5432 -timeout 1m\n\n      # Setup the environment\n      - run: cp .sample.env .env\n\n      # Setup the database\n      - run: bundle exec rake db:setup\n\n      # Run the tests\n      - run: bundle exec rake\n\ndefault_job: &default_job\n  working_directory: ~/administrate\n  steps:\n    - shared_steps\n    # Run the tests against multiple versions of Rails\n    - run: bundle exec appraisal install\n    - run: bundle exec appraisal rake\n\njobs:\n  ruby-25:\n    <<: *default_job\n    docker:\n      - image: circleci/ruby:2.5.0-node-browsers\n        environment:\n          PGHOST: localhost\n          PGUSER: administrate\n          RAILS_ENV: test\n      - image: postgres:10.1-alpine\n        environment:\n          POSTGRES_USER: administrate\n          POSTGRES_DB: ruby25\n          POSTGRES_PASSWORD: \"\"\n\n  ruby-26:\n    <<: *default_job\n    docker:\n      - image: circleci/ruby:2.6.3-node-browsers-legacy\n        environment:\n          PGHOST: localhost\n          PGUSER: administrate\n          RAILS_ENV: test\n      - image: postgres:10.1-alpine\n        environment:\n          POSTGRES_USER: administrate\n          POSTGRES_DB: ruby26\n          POSTGRES_PASSWORD: \"\"\n\nworkflows:\n  version: 2\n  multiple-rubies:\n    jobs:\n      - ruby-26\n      - ruby-25\n```\n\n### Ejemplo completo de Acciones de GitHub\n\n```yaml\n# Este flujo de trabajo usa acciones que no GitHub no certifica.\n# Estas las proporcionan entidades terceras y las gobiernan\n# condiciones de servicio, políticas de privacidad y documentación de soporte\n# en línea.\n\n# GitHub recomienda anclar acciones a un SHA de confirmación.\n# Para obtener una versión más reciente, debes actualizar el SHA.\n# También puedes hacer referencia a una etiqueta o rama, pero la acción puede cambiar sin ninguna advertencia.\n\nname: Containers\n\non: [push]\n\njobs:\n  build:\n\n    strategy:\n      matrix:\n        ruby: ['2.5', '2.6.3']\n\n    runs-on: ubuntu-latest\n\n    env:\n      PGHOST: localhost\n      PGUSER: administrate\n      RAILS_ENV: test\n\n    services:\n      postgres:\n        image: postgres:10.1-alpine\n        env:\n          POSTGRES_USER: administrate\n          POSTGRES_DB: ruby25\n          POSTGRES_PASSWORD: \"\"\n        ports:\n          - 5432:5432\n        # Add a health check\n        options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5\n\n    steps:\n      - uses: actions/checkout@v6\n      - name: Setup Ruby\n        uses: eregon/use-ruby-action@ec02537da5712d66d4d50a0f33b7eb52773b5ed1\n        with:\n          ruby-version: ${{ matrix.ruby }}\n      - name: Cache dependencies\n        uses: actions/cache@v4\n        with:\n          path: vendor/bundle\n          key: administrate-${{ matrix.image }}-${{ hashFiles('Gemfile.lock') }}\n      - name: Install postgres headers\n        run: |\n          sudo apt-get update\n          sudo apt-get install libpq-dev\n      - name: Install dependencies\n        run: bundle install --path vendor/bundle\n      - name: Setup environment configuration\n        run: cp .sample.env .env\n      - name: Setup database\n        run: bundle exec rake db:setup\n      - name: Run tests\n        run: bundle exec rake\n      - name: Install appraisal\n        run: bundle exec appraisal install\n      - name: Run appraisal\n        run: bundle exec appraisal rake\n```"}