{"meta":{"title":"Переход с CircleCI на GitHub Actions","intro":"GitHub Actions и CircleCI имеют несколько сходств в конфигурации, что делает миграцию на GitHub Actions относительно простой.","product":"GitHub Actions","breadcrumbs":[{"href":"/ru/actions","title":"GitHub Actions"},{"href":"/ru/actions/tutorials","title":"Учебники"},{"href":"/ru/actions/tutorials/migrate-to-github-actions","title":"Миграция на GitHub Actions"},{"href":"/ru/actions/tutorials/migrate-to-github-actions/manual-migrations","title":"Миграция вручную"},{"href":"/ru/actions/tutorials/migrate-to-github-actions/manual-migrations/migrate-from-circleci","title":"Миграция из CircleCI"}],"documentType":"article"},"body":"# Переход с CircleCI на GitHub Actions\n\nGitHub Actions и CircleCI имеют несколько сходств в конфигурации, что делает миграцию на GitHub Actions относительно простой.\n\n## Введение\n\nCircleCI и GitHub Actions оба позволяют создавать рабочие процессы, которые автоматически создают, тестируют, публикуют, выпуска и развертывают код. CircleCI и GitHub Actions совместное использование некоторых сходств в конфигурации рабочего процесса:\n\n* Файлы конфигурации рабочего процесса записываются в YAML и хранятся в репозитории.\n* В рабочем процессе может быть одно или несколько заданий.\n* Задания включают один или несколько шагов или отдельных команд.\n* Шаги или задачи можно повторно использовать и предоставлять сообществу.\n\nДополнительные сведения см. в разделе [Понимание GitHub Actions](/ru/actions/get-started/understand-github-actions).\n\n## Основные отличия\n\nПри миграции с CircleCI необходимо учитывать следующие различия.\n\n* Автоматический параллелизм тестов в CircleCI автоматически группирует тесты в соответствии с заданными пользователем правилами или историческими сведениями о времени. Эта функция не встроена GitHub Actionsв .\n* Действия, выполняемые в контейнерах Docker, чувствительны к проблемам с разрешениями, так как в контейнерах используется другое сопоставление пользователей. Многих из этих проблем можно избежать, не используя инструкцию `USER` в *Dockerfile*. Дополнительные сведения о файловой системе Docker в размещенных запусках см. в GitHubразделе [Справочник по запускам с размещением в GitHub](/ru/actions/reference/runners/github-hosted-runners#docker-container-filesystem).\n\n## Миграция рабочих процессов и заданий\n\nCircleCI определяет `workflows` в файле *config.yml*, что позволяет настроить несколько рабочих процессов.\nGitHub требуется один файл рабочего процесса для каждого рабочего процесса и, как следствие, не требует объявления `workflows`. Вам нужно будет создать по новому файлу рабочего процесса для каждого рабочего процесса, настроенного в файле *config.yml*.\n\nКак CircleCI, так и GitHub Actions настройте `jobs` в файле конфигурации с помощью аналогичного синтаксиса. При настройке зависимостей между заданиями в `requires` рабочем процессе CircleCI можно использовать эквивалентный GitHub Actions`needs` синтаксис. Дополнительные сведения см. в разделе [Синтаксис рабочего процесса для GitHub Actions](/ru/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idneeds).\n\n## Перенос orbs в действия\n\nКак CircleCI, так и GitHub Actions предоставляет механизм повторного использования и совместного использования задач в рабочем процессе. CircleCI использует концепцию с именем orbs, написанную в YAML, для предоставления задач, которые пользователи могут повторно использовать в рабочем процессе.\nGitHub Actions имеет мощные и гибкие многократно используемые компоненты, называемые действиями, которые создаются с помощью файлов JavaScript или образов Docker. Вы можете создавать действия, написав пользовательский код, взаимодействующий с репозиторием любым способом, который вы хотите, включая интеграцию с GitHubAPI-интерфейсами и любым общедоступным сторонним API. Например, действие может публиковать модули NPM, отправлять SMS-оповещения при возникновении неотложных проблем или развертывать готовый код. Дополнительные сведения см. в разделе [Повторное выполнение автоматизации](/ru/actions/how-tos/reuse-automations).\n\nCircleCI может повторно использовать фрагменты рабочих процессов с привязками и псевдонимами YAML.\nGitHub Actions поддерживает привязки и псевдонимы YAML для повторного использования, а также предоставляет матрицы для выполнения заданий с различными конфигурациями. Дополнительные сведения о матрицах см. в разделе [Выполнение вариантов заданий в рабочем процессе](/ru/actions/how-tos/write-workflows/choose-what-workflows-do/run-job-variations).\n\n## Использование образов Docker\n\nКак CircleCI, так и GitHub Actions поддерживают выполнение шагов внутри образа Docker.\n\nCircleCI предоставляет набор предварительно созданных образов с общими зависимостями. Эти образы имеют `USER` значение , `circleci`что приводит к конфликту GitHub Actionsс разрешениями.\n\nРекомендуется перейти от предварительно созданных образов CircleCI при переходе на GitHub Actions. Во многих случаях вы можете использовать действия для установки необходимых дополнительных зависимостей.\n\nДополнительные сведения о файловой системе Docker см. в разделе [Справочник по запускам с размещением в GitHub](/ru/actions/reference/runners/github-hosted-runners#docker-container-filesystem).\n\nДополнительные сведения о средствах и пакетах, доступных в образах запуска с размещением, см. в GitHubразделе [Средства выполнения тестов, размещенные в GitHub](/ru/actions/concepts/runners/github-hosted-runners#preinstalled-software-for-github-owned-images).\n\n## Использование переменных и секретов\n\nCircleCI и GitHub Actions поддержка переменных параметров в файле конфигурации и создание секретов с помощью CircleCI или GitHub пользовательского интерфейса.\n\nДополнительные сведения см. в разделе \\[AUTOTITLE и [Справочник по переменным](/ru/actions/reference/workflows-and-actions/variables#default-environment-variables)]\\(/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets).\n\n## Кэширование\n\nCircleCI и GitHub Actions предоставьте метод для ручного кэширования файлов в файле конфигурации.\n\nНиже приведен пример синтаксиса для каждой системы.\n\n### Синтаксис CircleCI для кэширования\n\n```yaml\n- restore_cache:\n    keys:\n      - v1-npm-deps-{{ checksum \"package-lock.json\" }}\n      - v1-npm-deps-\n```\n\n### Синтаксис GitHub Actions для кэширования\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 Не имеет эквивалента кэширования уровня Docker в CircleCI (или DLC).\n\n## Сохранение данных между заданиями\n\nКак CircleCI, так и GitHub Actions обеспечивают механизмы сохранения данных между заданиями.\n\nНиже приведен пример синтаксиса CircleCI и GitHub Actions конфигурации.\n\n### Синтаксис CircleCI для сохранения данных между заданиями\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### Синтаксис GitHub Actions для сохранения данных между работами\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\nДополнительные сведения см. в разделе [Хранение и предоставление общего доступа к данным с артефактами рабочего процесса](/ru/actions/tutorials/store-and-share-data).\n\n## Использование баз данных и контейнеров служб\n\nОбе системы позволяют включать дополнительные контейнеры для баз данных, кэширования или других зависимостей.\n\nВ CircleCI первый образ, указанный в файле *config.yaml*, является основным образом, используемым для выполнения команд.\nGitHub Actions использует явные разделы: используется `container` для основного контейнера и перечисляет дополнительные контейнеры в `services`.\n\nНиже приведен пример синтаксиса CircleCI и GitHub Actions конфигурации.\n\n### Синтаксис CircleCI для использования баз данных и контейнеров служб\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### Синтаксис GitHub Actions для использования баз данных и сервисных контейнеров\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\nДополнительные сведения см. в разделе [Взаимодействие с контейнерами служб Docker](/ru/actions/tutorials/use-containerized-services/use-docker-service-containers).\n\n## Полный пример\n\nНиже приведен пример из практики. В левой части показан фактический файл *config.yml* CircleCI для репозитория[thoughtbot/administrator](https://github.com/thoughtbot/administrate). Справа показан GitHub Actions эквивалент.\n\n### Полный пример для 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### Полный пример GitHub Actions\n\n```yaml\n# Этот рабочий процесс использует действия, которые не сертифицированы GitHub.\n# Они предоставляются сторонним поставщиком, и на них распространяются\n# отдельные условия обслуживания, политика конфиденциальности и поддержка\n# документации.\n\n# GitHub рекомендует закрепить действия в фиксации SHA.\n# Чтобы получить более новую версию, потребуется обновить SHA.\n# Вы также можете ссылаться на тег или ветвь, однако действие может измениться без предупреждения.\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```"}