{"meta":{"title":"CircleCI から GitHub Actions への移行","intro":"GitHub Actionsと CircleCI では、構成のいくつかの類似点が共有されるため、GitHub Actionsへの移行は比較的簡単です。","product":"GitHub Actions","breadcrumbs":[{"href":"/ja/actions","title":"GitHub Actions"},{"href":"/ja/actions/tutorials","title":"チュートリアル"},{"href":"/ja/actions/tutorials/migrate-to-github-actions","title":"GitHub Actions に移行する"},{"href":"/ja/actions/tutorials/migrate-to-github-actions/manual-migrations","title":"手動移行"},{"href":"/ja/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* ワークフローには1つ以上のジョブが含まれます。\n* ジョブには1つ以上のステップもしくは個別のコマンドが含まれます。\n* ステップもしくはタスクは、再利用とコミュニティとの共有が可能です。\n\n詳しくは、「[GitHub Actionsについて](/ja/actions/get-started/understand-github-actions)」をご覧ください。\n\n## 主要な相違点\n\nCircleCIから移行する際には、以下の差異を考慮してください。\n\n* CircleCIの自動テストの並列性は、ユーザが指定したルールもしくは過去のタイミングの情報に基づいて、自動的にテストをグループ化します。 この機能は、 GitHub Actionsに組み込まれていません。\n* コンテナはユーザのマッピングが異なるので、Dockerコンテナ内で実行されるアクションは、権限の問題に敏感です。\n  `USER` 命令を *Dockerfile* で使用しないことにより、これらの問題の多くを回避できます。\n  GitHubホストランナー上の Docker ファイルシステムの詳細については、[GitHub ホステッド ランナー リファレンス](/ja/actions/reference/runners/github-hosted-runners#docker-container-filesystem) を参照してください。\n\n## ワークフローとジョブの移行\n\nCircleCI によって、`workflows` ファイルに \\_\\_ が定義されます。これにより、1 つ以上のワークフローを構成できるようになります。\nGitHub にはワークフローごとに 1 つのワークフロー ファイルが必要です。その結果、 `workflows`を宣言する必要はありません。\n*config.yml* に構成されている各ワークフローに対して、新しいワークフロー ファイルを作成する必要があります。\n\nCircleCI と GitHub Actions の両方で、同様の構文を使用して構成ファイル内の `jobs` を構成します。 CircleCI ワークフローで `requires` を使用してジョブ間の依存関係を構成する場合は、同等の GitHub Actions`needs` 構文を使用できます。 詳しくは、「[GitHub Actions　のワークフロー構文](/ja/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idneeds)」をご覧ください。\n\n## orbsからアクションへの移行\n\nCircleCI と GitHub Actions の両方に、ワークフロー内のタスクを再利用して共有するためのメカニズムが用意されています。 CircleCIはorbsという概念を利用します。これはYAMLで書かれ、ワークフロー中で再利用できるタスクを提供します。\nGitHub Actions には、JavaScript ファイルまたは Docker イメージを使用してビルドするアクションと呼ばれる、強力で柔軟な再利用可能なコンポーネントがあります。\nGitHubの API や公開されているサードパーティ API との統合など、任意の方法でリポジトリと対話するカスタム コードを記述することで、アクションを作成できます。 たとえば、アクションで npm モジュールを公開したり、緊急の問題が発生したときに SMS アラートを送信したり、実稼働可能なコードをデプロイしたりできます。 詳しくは、「[自動化の再利用](/ja/actions/how-tos/reuse-automations)」をご覧ください。\n\nCircleCIは、YAMLのアンカーとエイリアスでワークフローの部分を再利用できます。\nGitHub Actions では、再利用可能な YAML アンカーとエイリアスがサポートされ、さまざまな構成でジョブを実行するためのマトリックスも提供されます。 マトリックスの詳細については、「[ワークフローでのジョブのバリエーションの実行](/ja/actions/how-tos/write-workflows/choose-what-workflows-do/run-job-variations)」を参照してください。\n\n## Dockerイメージの利用\n\nCircleCI と GitHub Actions の両方で、Docker イメージ内でのステップの実行がサポートされます。\n\nCircleCIは、共通の依存関係を持つ一連のビルド済みのイメージを提供します。 これらのイメージには `USER` が `circleci` に設定されており、アクセス許可が GitHub Actionsと競合します。\n\nGitHub Actionsに移行するときは、CircleCI の事前構築済みイメージから離れて移動することをお勧めします。 多くの場合、必要な追加の依存関係のインストールにアクションを使うことができます。\n\nDocker ファイルシステムの詳細については、「[GitHub ホステッド ランナー リファレンス](/ja/actions/reference/runners/github-hosted-runners#docker-container-filesystem)」を参照してください。\n\nGitHubホストランナーイメージで使用できるツールとパッケージの詳細については、「[GitHub ホステッド ランナー](/ja/actions/concepts/runners/github-hosted-runners#preinstalled-software-for-github-owned-images)」を参照してください。\n\n## 変数とシークレットの利用\n\nCircleCI と GitHub Actions では、構成ファイルで変数を設定し、CircleCI または GitHub UI を使用してシークレットを作成できます。\n\n詳細については、「[変数リファレンス](/ja/actions/reference/workflows-and-actions/variables#default-environment-variables)」および「[GitHub Actions でのシークレットの使用](/ja/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 には、CircleCI の Docker レイヤー キャッシュ (または DLC) に相当するものがありません。\n\n## ジョブ間でのデータの永続化\n\nCircleCI と GitHub Actions の両方に、ジョブ間でデータを保持するメカニズムが用意されています。\n\nCircleCI と 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詳しくは、「[ワークフロー成果物を使ったデータの格納と共有](/ja/actions/tutorials/store-and-share-data)」をご覧ください。\n\n## データベースとサービスコンテナの利用\n\nどちらのシステムでも、データベース、キャッシング、あるいはその他の依存関係のための追加コンテナを含めることができます。\n\nCircleCI では、*config.yaml* で最初に示されているイメージが、コマンドの実行で主に使用されているイメージです。\nGitHub Actions は明示的なセクションを使用します。プライマリ コンテナーの `container` を使用し、 `services`に追加のコンテナーを一覧表示します。\n\nCircleCI と 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 サービス コンテナーとの通信](/ja/actions/tutorials/use-containerized-services/use-docker-service-containers)」をご覧ください。\n\n## 完全な例\n\n以下は実際の例です。 左側には、*thoughtbot/administrator* リポジトリの実際の CircleCI [config.yml](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```"}