{"meta":{"title":"Migrando do CircleCI para o GitHub Actions","intro":"GitHub Actions e CircleCI compartilham várias semelhanças na configuração, o que torna a migração para GitHub Actions relativamente simples.","product":"GitHub Actions","breadcrumbs":[{"href":"/pt/actions","title":"GitHub Actions"},{"href":"/pt/actions/tutorials","title":"Tutoriais"},{"href":"/pt/actions/tutorials/migrate-to-github-actions","title":"Migrar para o GitHub Actions"},{"href":"/pt/actions/tutorials/migrate-to-github-actions/manual-migrations","title":"Migrações manuais"},{"href":"/pt/actions/tutorials/migrate-to-github-actions/manual-migrations/migrate-from-circleci","title":"Fazer a migração do CircleCI"}],"documentType":"article"},"body":"# Migrando do CircleCI para o GitHub Actions\n\nGitHub Actions e CircleCI compartilham várias semelhanças na configuração, o que torna a migração para GitHub Actions relativamente simples.\n\n## Introdução\n\nO CircleCI e GitHub Actions permitem criar fluxos de trabalho que criam, testam, publicam, lançam e implementam código automaticamente. O CircleCI e o GitHub Actions compartilham algumas semelhanças em termos de configuração do fluxo de trabalho:\n\n* Os arquivos de configuração do fluxo de trabalho são gravados no YAML e armazenados no repositório.\n* Os fluxos de trabalho incluem um ou mais trabalhos.\n* Os trabalhos incluem uma ou mais etapas ou comandos individuais.\n* É possível reutilizar e compartilhar novamente etapas ou tarefas com a comunidade.\n\nPara saber mais, confira [Noções básicas sobre GitHub Actions](/pt/actions/learn-github-actions/understanding-github-actions).\n\n## Principais diferenças\n\nAo fazer a migração do CircleCI, considere as seguintes diferenças:\n\n* O paralelismo do teste automático do CircleCI agrupa automaticamente os testes de acordo com regras especificadas pelo usuário ou com informações históricas de temporização. Esta funcionalidade não foi criada em GitHub Actions.\n* As ações que são executadas em contêineres Docker são sensíveis a problemas de permissões, uma vez que os contêineres têm um mapeamento diferente de usuários. Você pode evitar muitos desses problemas não usando a instrução `USER` no *Dockerfile*. Para obter mais informações sobre o sistema de arquivos do Docker em executores hospedados pelo GitHub, consulte [Executores hospedados no GitHub](/pt/actions/using-github-hosted-runners/about-github-hosted-runners#docker-container-filesystem).\n\n## Migrar fluxos de trabalho e tarefas\n\nO CircleCI define `workflows` no arquivo *config.yml*, que permite configurar mais de um fluxo de trabalho. GitHub requer um arquivo de fluxo de trabalho por fluxo de trabalho e, consequentemente, não exige que você declare `workflows`. Será necessário criar um arquivo de fluxo de trabalho para cada fluxo de trabalho configurado em *config.yml*.\n\nTanto o CircleCI quanto o GitHub Actions configuram `jobs` no arquivo de configuração usando uma sintaxe similar. Se você configurar qualquer dependência entre trabalhos usando `requires` no seu fluxo de trabalho do CircleCI, poderá usar a sintaxe `needs` equivalente do GitHub Actions. Para saber mais, confira [Sintaxe de fluxo de trabalho para o GitHub Actions](/pt/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idneeds).\n\n## Migrar orbes para ações\n\nTanto o CircleCI quanto o GitHub Actions fornecem um mecanismo para reutilizar e compartilhar tarefas em um fluxo de trabalho. O CircleCI usa um conceito chamado orbs, escrito em YAML, para fornecer tarefas que as pessoas podem reutilizar em um fluxo de trabalho. O GitHub Actions tem componentes potentes, reutilizáveis e flexíveis denominados ações, que você cria com arquivos JavaScript ou imagens Docker. Você pode criar ações gravando códigos personalizados que interajam com o seu repositório da maneira que você quiser, inclusive fazendo integrações com as APIs do GitHub e qualquer API de terceiros disponível publicamente. Por exemplo, uma ação pode publicar módulos npm, enviar alertas de SMS quando problemas urgentes surgirem ou implantar o código pronto para produção. Para saber mais, confira [Reutilização de automações](/pt/actions/creating-actions).\n\nO CircleCI pode reutilizar partes dos fluxos de trabalho com âncoras e aliases YAML. O GitHub Actions dá suporte a âncoras e aliases YAML para reutilização e também fornece matrizes para executar trabalhos com configurações diferentes. Para obter mais informações sobre matrizes, confira [Executando variações de tarefas em um workflow](/pt/actions/using-jobs/using-a-matrix-for-your-jobs).\n\n## Usar imagens do Docker\n\nTanto o CircleCI quanto o GitHub Actions suportam executar etapas dentro de uma imagem do Docker.\n\nO CircleCI fornece um conjunto de imagens pré-construídas com dependências comuns. Essas imagens têm o `USER` definido como `circleci`, o que faz com que as permissões entrem em conflito com o GitHub Actions.\n\nRecomendamos que você se afaste das imagens pré-criadas do CircleCI, ao migrar para GitHub Actions. Em muitos casos, você pode usar ações para instalar as dependências adicionais de que você precisa.\n\nPara saber mais sobre o sistema de arquivos do Docker, confira [Executores hospedados no GitHub](/pt/actions/using-github-hosted-runners/about-github-hosted-runners#docker-container-filesystem).\n\nPara obter mais informações sobre as ferramentas e pacotes disponíveis nas imagens de executor hospedadas em GitHub, consulte [Executores hospedados no GitHub](/pt/actions/using-github-hosted-runners/about-github-hosted-runners#supported-software).\n\n## Usar variáveis e segredos\n\nO CircleCI e GitHub Actions dão suporte à definição de variáveis no arquivo de configuração e à criação de segredos usando o CircleCI ou a interface de usuário do GitHub.\n\nPara saber mais, confira [Referência de variáveis](/pt/actions/reference/variables-reference#default-environment-variables) e [Usar segredos em ações do GitHub](/pt/actions/security-guides/using-secrets-in-github-actions).\n\n## Armazenamento em cache\n\nO CircleCI e o GitHub Actions fornecem um método para armazenar arquivos de cache no arquivo de configuração manualmente.\n\nAbaixo, há um exemplo da sintaxe para cada sistema.\n\n### Sintaxe do CircleCI para cache\n\n```yaml\n- restore_cache:\n    keys:\n      - v1-npm-deps-{{ checksum \"package-lock.json\" }}\n      - v1-npm-deps-\n```\n\n### A sintaxe do GitHub Actions para cache\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 não tem o equivalente ao Docker Layer Caching (DLC) do CircleCI.\n\n## Persistência de dados entre tarefas\n\nTanto a CircleCI quanto a GitHub Actions fornecem mecanismos para persistir dados entre trabalhos.\n\nAbaixo está um exemplo na sintaxe de configuração do CircleCI e do GitHub Actions.\n\n### Sintaxe do CircleCI para persistir dados entre trabalhos\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### Sintaxe do GitHub Actions para persistir dados entre trabalhos\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 saber mais, confira [Armazenar e compartilhar dados com artefatos de fluxo de trabalho](/pt/actions/using-workflows/storing-workflow-data-as-artifacts).\n\n## Usar bancos de dados e contêineres de serviço\n\nAmbos os sistemas permitem que você inclua contêineres adicionais para bases de dados, memorização ou outras dependências.\n\nNo CircleCI, a primeira imagem listada no *config.yaml* é a imagem principal primária usada para executar comandos. O GitHub Actions usa seções explícitas: use `container` para o contêiner primário e liste os contêineres adicionais em `services`.\n\nAbaixo está um exemplo na sintaxe de configuração do CircleCI e do GitHub Actions.\n\n### Sintaxe do CircleCI para usar bancos de dados e contêineres de serviço\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### Sintaxe do GitHub Actions para o uso de bancos de dados e contêineres de serviço\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 saber mais, confira [Comunicar-se com os contêineres de serviço do Docker](/pt/actions/using-containerized-services/about-service-containers).\n\n## Exemplo completo\n\nAbaixo, há um exemplo concreto. No lado esquerdo, é mostrado o *config.yml* real do CircleCI para o repositório [thoughtbot/administrator](https://github.com/thoughtbot/administrate). O lado direito mostra o equivalente de GitHub Actions.\n\n### Exemplo completo do 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### Exemplo completo para GitHub Actions\n\n```yaml\n# Esse fluxo de trabalho usa ações que não são certificadas pelo GitHub.\n# São fornecidas por terceiros e regidas por\n# termos de serviço, política de privacidade e suporte separados\n# online.\n\n# O GitHub recomenda fixar ações em um SHA de commit.\n# Para obter uma versão mais recente, você precisará atualizar o SHA.\n# Você também pode fazer referência a uma marca ou branch, mas a ação pode ser alterada sem aviso.\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```"}