DrupalコンテンツをGitHubへ自動エクスポート

Dries and Logo
目次

この記事は Dries Buytaert の公式ブログ「dri.es」の翻訳記事です。Driesブログの記事一覧よりすべての翻訳記事をご覧いただけます。


このページは私のデジタルガーデンの一部です。磨き上げられたブログ記事というよりは、ノートへの書き込みに近いものです。主に自分の参考のために学びを記録する場ですが、他の人の役に立つ可能性もあるため共有しています。ブログ記事とは異なり、これらのページは進行中の作業であり、時間をかけて更新されます。実際の庭の手入れのように、定期的に内容を洗練させています。改善の提案はdries@buytaert.netまでお寄せください。


このメモは主に将来の自分のためのものです。再度設定が必要になった場合に備えています。公開で共有しているのは、一部が他の人にとって役立つ可能性があるからですが、公開していないカスタムDrupalモジュールに依存しているため、完全なチュートリアルではありません。

背景として、私はMarkdownに移行し、その後GitHubにエクスポートすることでブログコンテンツをオープンソース化しました。毎日、私のDrupalサイトはコンテンツをMarkdownファイルとしてエクスポートし、変更をgithub.com/dbuytaert/website-contentにコミットしています。新しい投稿は自動的に表示され、編集や削除も同様に反映されます。

GitHubリポジトリの作成

新しいGitHubリポジトリを作成します。私は`website-content`と名付けました。

サーバーからGitHubへのアクセス設定

サーバーから変更を自動的にGitHubにプッシュするには、SSHキー認証が必要です。

サーバーにSSH接続し、新しいSSHキーペアを生成します。

ssh-keygen -t ed25519 -f ~/.ssh/github -N ""

これにより2つのファイルが作成されます。`~/.ssh/github`(サーバーに保存する秘密鍵)と`~/.ssh/github.pub`(GitHubと共有する公開鍵)です。

`-N ""`はパスフレーズなしでキーを作成します。セキュリティで保護されたサーバー上の自動化スクリプトでは、パスワードなしのキーが標準的な手法です。セキュリティは、パスフレーズではなく、キーができることを制限すること(1つのリポジトリへの書き込みアクセス権を持つデプロイキーなど)によって確保されます。

次に、GitHub接続時にこのキーを使用するようSSHに指示します。

cat >> ~/.ssh/config << 'EOF'
Host github.com
  IdentityFile ~/.ssh/github
  IdentitiesOnly yes
EOF

GitHubのサーバーフィンガープリントをknown hostsファイルに追加します。これにより、スクリプト実行時にSSHが「接続してよろしいですか?」と尋ねるのを防ぎます。

ssh-keyscan github.com >> ~/.ssh/known_hosts

公開鍵を表示してコピーできるようにします。

cat ~/.ssh/github.pub

GitHubでリポジトリの「Settings」に移動し、サイドバーの「Deploy keys」を見つけて「Add deploy key」をクリックします。「Allow write access」のチェックボックスをオンにします。

すべてが機能することをテストします。

ssh -T git@github.com

次のように表示されるはずです。`You've successfully authenticated, but GitHub does not provide shell access.`

エクスポートスクリプト

以下のエクスポートスクリプトを作成しました。

#!/bin/bash
set -e

TEMP=/tmp/dries-export

# 既存のリポジトリをクローン
git clone git@github.com:dbuytaert/website-content.git $TEMP
cd $TEMP

# 移動/削除されたコンテンツを追跡するため、すべてのディレクトリをクリーンアップ
rm -rf */

# 2日以上前のすべてのコンテンツをエクスポート
drush node:export --end-date="2 days ago" --destination=$TEMP

# 変更がある場合、コミットとプッシュ
git config user.email "dries+bot@buytaert.net"
git config user.name "Dries Bot"
git add -A
git diff --staged --quiet || {
    git commit -m "Automatic updates for $(date +%Y-%m-%d)"
    git push
}

rm -rf $TEMP

`drush node:export`コマンドは、私のサイト用に構築したカスタムDrupalモジュールから来ています。このモジュールは私のサイト固有のものであり、そのままでは再利用できないため、Drupal.orgには公開していません。そのようなコードが適応可能なモジュールとして共有する価値がある理由について書きました。Drupal.orgにそのようなモジュールのための場所ができたら、共有したいと思っています。

2日間の遅延(`--end-date="2 days ago"`)により、投稿がGitHubにアーカイブされる前に誤字脱字をキャッチする時間ができます。通常、公開ボタンを押した直後に見つけます。

`git add -A`は削除を含むすべてをステージングするため、サイトから投稿を削除するとGitHubからも消えます(ただしGitの履歴には保存されます)。

エクスポートのスケジュール設定

従来のサーバーでは、このスクリプトをCronに追加して毎日実行します。私のサイトはAcquia Cloud上で動作しています。これはKubernetesベースで、トラフィックに応じて自動的にポッドをスケールアップ/ダウンします。つまり、crontabを配置する単一のサーバーが存在しません。代わりに、Acquia Cloudはインフラストラクチャ全体でジョブを確実に実行するスケジューラーを提供しています。

そしてもちろん、コンテンツを自動的にバックアップすることに関するこのメモ自体も、自動的にバックアップされます。

By Dries Buytaert

この記事は「Automatically exporting my Drupal content to GitHub」(投稿日:2026-01-24)の翻訳記事です。

カテゴリ