DrupalプロジェクトでAquiaを利用しつつも、このままではいろいろとリスクがあると感じたので、GitHubをホスティングサービスを利用する方法について、調べてみました_φ(・_・
Acquiaを利用しつつ、GitHubまたはGitLabを「主要な開発リポジトリ」として併用する具体的な手順について
このアプローチは、チーム開発の効率性、コード品質、レビュープロセスの透明性を大幅に向上させます。少し複雑に感じるかもしれませんが、一度構築すれば強力な開発基盤となります。
GitHub/GitLabを主要リポジトリとする開発ワークフロー
この手順では、GitHubを例に進めますが、GitLabでも同様の概念と機能で実現可能です。
1. プロジェクトのリポジトリ構成
まず、Gitリポジトリの構成を明確にします。
- GitHub/GitLab (主要開発リポジトリ):
- あなたのチームが日常的にコードをプッシュ、プル、ブランチ、プルリクエスト/マージリクエスト(PR/MR)を作成する場所です。
main
、develop
、feature/xxx
、bugfix/xxx
などの開発ブランチがここに存在します。- CI/CD(GitHub Actionsなど) もここで設定し、テストやLintチェックを実行します。
- Acquia Git (デプロイ用リポジトリ):
- Acquiaのデプロイメントパイプラインが監視しているGitリポジトリです。
- 通常、
master
(本番)、develop
(ステージング/開発)、test
(テスト)などの環境ブランチがあります。 - このリポジトリには直接プッシュしないことを原則とします。外部Gitホスティングからの自動同期または手動同期でのみ更新します。
2. GitHub (またはGitLab) でプロジェクトをセットアップする
-
新しいプライベートリポジトリの作成:
- GitHub.com にログインし、「New repository」を作成します。
- リポジトリ名を決定し、必ず「Private」を選択します。
Add a README file
、.gitignore
(PHP用またはDrupal用)、Choose a license
は任意で追加しても構いませんが、既存のプロジェクトを移行する場合は後で調整できます。
-
既存のDrupalプロジェクトを新しいGitHubリポジトリにプッシュ:
- ローカルのDrupalプロジェクトディレクトリに移動します。
- もし既にローカルでGit管理されているなら、新しいGitHubリポジトリをリモートに追加し、プッシュします。
123456<span class="hljs-built_in">cd</span> /path/to/your/my-drupal-projectgit remote set-url origin https://github.com/your-username/your-repo-name.git <span class="hljs-comment"># 既存のリモートを新しいGitHub URLに設定</span><span class="hljs-comment"># あるいは、既存のリモート名がacquiaなど特定のもので、新しいものを追加する場合</span><span class="hljs-comment"># git remote add github https://github.com/your-username/your-repo-name.git</span>git push -u origin main <span class="hljs-comment"># mainブランチをGitHubにプッシュし、追跡設定</span>- もしローカルでまだGit管理されていないなら、以下の手順で初期化します。
12345678<span class="hljs-built_in">cd</span> /path/to/your/my-drupal-projectgit initgit add .git commit -m <span class="hljs-string">"Initial commit of Drupal project"</span>git branch -M main <span class="hljs-comment"># メインブランチ名を 'main' に設定</span>git remote add origin https://github.com/your-username/your-repo-name.gitgit push -u origin main- 重要: この時点で、
.gitignore
ファイルが適切に設定されていることを再確認してください。vendor/
、web/core/
、web/modules/contrib/
、web/themes/contrib/
、web/sites/*/files/
など、Composerで管理されるものやユーザーアップロードファイルはGitリポジトリに含まれないようにします。
3. Gitワークフローの確立 (GitHub/GitLab上)
少人数チームでも、一貫したワークフローは必須です。
-
ブランチ戦略の採用:
- GitHub Flow: 最もシンプルで、迅速なデプロイに適しています。
main
ブランチのみが存在し、機能開発はすべてフィーチャーブランチで行い、main
に直接PR/MRでマージします。 - Gitflow: より厳格なリリースサイクルを持つ場合に適しています。
main
とdevelop
の2つの主要ブランチがあり、フィーチャーブランチはdevelop
から派生します。 - 推奨: 少人数チームなら、まずはシンプルな GitHub Flow またはそれに近い形から始めるのが良いでしょう。
- GitHub Flow: 最もシンプルで、迅速なデプロイに適しています。
-
プルリクエスト (Pull Request: PR) / マージリクエスト (Merge Request: MR) の活用:
- 「フィーチャーブランチ」の作成: 新しい機能開発やバグ修正を行う際は、必ず
main
(またはdevelop
)から新しいブランチ(例:feature/add-contact-form
)を作成します。1234git checkout maingit pull origin main <span class="hljs-comment"># 最新の状態に更新</span>git checkout -b feature/add-contact-form - コードの変更とコミット: 必要なコード変更を行い、ローカルでコミットします。
- プッシュ: 自分のフィーチャーブランチをGitHubにプッシュします。
12git push origin feature/add-contact-form
- プルリクエストの作成: GitHubのWeb UIから、プッシュしたフィーチャーブランチから
main
(またはdevelop
)ブランチへのプルリクエストを作成します。- PRのタイトルや説明に、何を変更したのか、その目的、関連するイシュー番号などを明確に記述します。
- レビュー担当者(チームメンバー)をアサインします。
- コードレビュー:
- レビュー担当者はPRの内容(コード差分)を確認し、コメントや質問、変更要求を行います。
- 必要に応じて、CI/CDが自動テストを実行し、その結果もPRに表示されます。
- 議論を重ね、コードが合意に至ったら、レビュー担当者が承認 (Approve) します。
- マージ: 承認されたら、PRを
main
(またはdevelop
)ブランチにマージします。GitHubのWeb UIから「Merge pull request」ボタンをクリックするのが一般的です。
- 「フィーチャーブランチ」の作成: 新しい機能開発やバグ修正を行う際は、必ず
4. CI/CD (継続的インテグレーション/継続的デリバリー) の設定
これが、GitHub/GitLabとAcquiaを連携させる肝となる部分です。
-
GitHub Actions (またはGitLab CI/CD) の設定:
- GitHubリポジトリのルートに
.github/workflows
ディレクトリを作成し、その中にYAMLファイル(例:deploy-to-acquia.yml
)を作成します。 - このYAMLファイルにCI/CDパイプラインの定義を記述します。
- GitHubリポジトリのルートに
-
パイプラインで自動化すること(例):
- トリガー:
main
またはdevelop
ブランチへのプッシュ(またはPRのマージ)をトリガーとする。 - 環境セットアップ: Node.js, PHP, Composer などの環境を準備。
- Composer依存関係のインストール:
composer install
を実行。 - コード品質チェック: PHPStan, PHP_CodeSniffer, ESLint などでコードの品質を自動チェック。
- 自動テスト: PHPUnit、Behat などでユニットテスト、機能テストを実行。
- Acquiaへのプッシュ:
- すべてのテストがパスしたら、AcquiaのGitリポジトリにコードをプッシュします。
- これには、Acquia GitリポジトリへのSSHキー(デプロイキー)またはトークンをGitHubのSecretsに安全に保存し、CI/CDワークフローから利用します。
- 例:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546<span class="hljs-attr">name:</span> <span class="hljs-string">Deploy</span> <span class="hljs-string">to</span> <span class="hljs-string">Acquia</span><span class="hljs-attr">on:</span><span class="hljs-attr">push:</span><span class="hljs-attr">branches:</span><span class="hljs-bullet">-</span> <span class="hljs-string">main</span> <span class="hljs-comment"># mainブランチへのプッシュをトリガー</span><span class="hljs-attr">jobs:</span><span class="hljs-attr">deploy:</span><span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span><span class="hljs-attr">steps:</span><span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Checkout</span> <span class="hljs-string">code</span><span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v4</span><span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Set</span> <span class="hljs-string">up</span> <span class="hljs-string">PHP</span><span class="hljs-attr">uses:</span> <span class="hljs-string">shivammathur/setup-php@v2</span><span class="hljs-attr">with:</span><span class="hljs-attr">php-version:</span> <span class="hljs-string">'8.2'</span> <span class="hljs-comment"># 使用するPHPバージョン</span><span class="hljs-attr">tools:</span> <span class="hljs-string">composer</span><span class="hljs-attr">coverage:</span> <span class="hljs-string">none</span><span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Install</span> <span class="hljs-string">Composer</span> <span class="hljs-string">dependencies</span><span class="hljs-attr">run:</span> <span class="hljs-string">composer</span> <span class="hljs-string">install</span> <span class="hljs-string">--no-dev</span> <span class="hljs-string">--prefer-dist</span><span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Add</span> <span class="hljs-string">Acquia</span> <span class="hljs-string">SSH</span> <span class="hljs-string">Key</span><span class="hljs-attr">uses:</span> <span class="hljs-string">webfactory/ssh-agent@v0.8.0</span><span class="hljs-attr">with:</span><span class="hljs-attr">ssh-private-key:</span> <span class="hljs-string">${{</span> <span class="hljs-string">secrets.ACQUIA_SSH_PRIVATE_KEY</span> <span class="hljs-string">}}</span><span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Configure</span> <span class="hljs-string">Git</span> <span class="hljs-string">for</span> <span class="hljs-string">Acquia</span><span class="hljs-attr">run:</span> <span class="hljs-string">|git config --global user.email "github-actions@example.com"git config --global user.name "GitHub Actions"</span><span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Add</span> <span class="hljs-string">Acquia</span> <span class="hljs-string">Git</span> <span class="hljs-string">remote</span><span class="hljs-attr">run:</span> <span class="hljs-string">git</span> <span class="hljs-string">remote</span> <span class="hljs-string">add</span> <span class="hljs-string">acquia</span> <span class="hljs-string">ssh://<your_acquia_username>@<your_acquia_repo_url>/<your_acquia_repo_name>.git</span><span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Push</span> <span class="hljs-string">to</span> <span class="hljs-string">Acquia</span> <span class="hljs-string">Git</span> <span class="hljs-string">(Main</span> <span class="hljs-string">branch</span> <span class="hljs-string">to</span> <span class="hljs-string">master)</span><span class="hljs-attr">run:</span> <span class="hljs-string">|git fetch acquia master:master # Acquiaのmasterブランチをローカルにフェッチgit push acquia main:master --force # 強制プッシュでAcquiaのmasterを更新# --forceは注意して使うべきですが、CI/CDでの自動同期では使われることがあります。# もしAcquiaのmasterブランチに直接コミットする人がいない場合のみ安全です。# 理想的には、git push acquia HEAD:master とし、競合がないことを確認します。</span>
注意: 上記の例はあくまで雛形です。実際のAcquiaのGit URL、SSHキーの設定、デプロイブランチの指定(例: GitHubの
main
をAcquiaのmaster
へ、GitHubのdevelop
をAcquiaのdevelop
へなど)は、あなたのAcquiaプロジェクトの構成に合わせて調整してください。--force
オプションの使用は慎重に検討し、チーム内で合意を取ってください。
- トリガー:
5. 環境とデプロイメント
-
DDEV / Lando を活用:
- 開発者はローカル環境でDDEVまたはLandoを使用し、GitHub/GitLabからクローンしたコードで開発を行います。
- データベースダンプはAcquiaから取得し、DDEV/Landoにインポートします。
ddev drush updb
やddev drush cim
は、ローカル環境でコード変更と設定変更を適用するために頻繁に利用します。
-
Acquiaの役割:
- 環境管理: 開発、ステージング、本番などの環境を提供します。
- デプロイメント: AcquiaのGitリポジトリへのプッシュを検知し、設定されたブランチに基づいて自動的にデプロイを実行します。
- データベース同期: AcquiaのGUIやDrushコマンドを使って、環境間のデータベースのコピーや同期を行います。
まとめ
このアプローチは、GitHub/GitLabの優れたコラボレーション機能を活用しつつ、AcquiaのDrupalに最適化されたホスティングとデプロイメントパイプラインを利用するという、Drupalエンタープライズ開発における一般的な「分業体制」 です。
初期設定は少し手間がかかりますが、一度構築してしまえば、
- コードレビューと品質管理が格段に向上する
- チームメンバー間のコラボレーションがスムーズになる
- デプロイプロセスが自動化され、ミスが減る
といった大きなメリットを享受できます。
ぜひ、このアプローチを検討してみてください。