タイトル通りですが、本記事では以下の内容をメモしていきます。
Eleventy(11ty)を使用してウェブサイトをビルドし、ビルドされたファイルをサーバーにデプロイする。
- 「main」ブランチにプッシュされたら
- サイトをビルドして(11ty)
- 出力されたサイトのファイル達をサーバー(エックスサーバー)にアップロード
以上を GitHubActions を使用して行ったので、そのメモです!
手順
エックスサーバーで秘密鍵を取得
こちらは SSH 接続を行うために必要です。
秘密鍵の取得や登録は公式でわかりやすく説明されているので、以下をご確認ください。
パスワードが設定されていると、GitHubActions の途中で止まってしまうとのことなので、パスはなし(入力しない)
こちらで取得した鍵の中身をあとで Github のシークレット変数に貼り付けます。
GitHub リポジトリでのワークフロー設定
- GitHub リポジトリにアクセス
- リポジトリ内で、上部メニューの「Actions」をクリック
- ワークフローがまだ設定されていない場合は、「Set up a workflow yourself」を選択。
既存のワークフローがある場合は、「New workflow」ボタンをクリック
- エディタが開いたら、そこに後述する
deployMain.yaml
の内容を貼り付け - エディタでコードを貼り付けたら、「Commit changes...」をクリック
- 適切なコミットメッセージを入力し、「Commit changes」をクリック
これで、GitHub Actions に新しいワークフローが設定されました。
main
ブランチに新しいコミットがプッシュされると、このワークフローが実行されるようになります。
ワークフローでは Eleventy でウェブサイトをビルドし、rsync を使用してリモートサーバーにデプロイします。
GitHub リポジトリでのシークレット変数設定
- GitHub リポジトリにアクセス
- リポジトリ内で、上部メニューの「Settings」をクリック
- 「secrets and variables」>「Actions」を選択
- 「New repository secret」を選択
Name
をSSH_PRIVATE_KEY
と入力
後述するコードの変数名になります。任意の名前にしていただいても問題ありません。Secret
に生成した秘密鍵の中身をコピペします- 「Add secret」を選択してシークレット変数を追加
GitHubActions のコード
ファイル名は任意です。
今回はdeployMain.yaml
にしました
deployMain.yaml
name: deploy to remote
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: "18"
- name: Checkout code
uses: actions/checkout@v4
- name: Generate SSH key
run: |
echo "$SSH_PRIVATE_KEY" > key
chmod 600 key
env:
SSH_PRIVATE_KEY: $
- name: Install dependencies
run: npm install
- name: Build site with Eleventy
run: npx @11ty/eleventy
- name: Deploy via rsync
run: |
rsync -auzrv --update -e "ssh -i key -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p 10022" --delete ./_public/ hogeId@svhoge.xserver.jp:/home/hogege/hoge.com/public_html/
エックスサーバーでサーバー情報を確認
ワークフローのコードでは、サーバーにデータを同期するために必要な情報がいくつかあります。
情報を確認し、コード上のhoge
などを自身のサーバーの ID などに置き換えます
各情報の確認
- エックスサーバーでサーバーパネルにログイン
- サーバー IDが表示されていると思うので、それを確認
コードを書くときにhogeId
と書かれている部分をここで確認できるサーバー ID に置き換え
- 続いて「サーバー情報」をクリック
- サーバー情報のページで、ホスト名とホームディレクトリを確認
それぞれコードの、svhoge
→ ホスト名、/home/hogegege
→ ホームディレクトリを置き換え
置き換え箇所まとめ
hogeId
→ サーバー IDsvhoge
→ ホスト名
今はsvほげほげ
の形式がほとんどのようですが、いつか変わるかもしれませんので、その点はご注意を。/home/hogegege
→ ホームディレクトリ
「home
なんてフォルダはないから home は省略だな!」としばらくなやみました……。
そしてその次はホームディレクトリhogegege
を省いてしまっていて更に悩みました。
どちらも必要です……!
コードの各ステップ詳細
ワークフロー名: deploy to remote
- この名前はワークフロー自体を表します。
- 通常、何を行うかを簡潔に表すことが一般的です。
- 今回は(そのまんまですが)「リモートにデプロイ」するワークフローです。
トリガー条件: on: push: branches: - main
- このワークフローは、GitHub リポジトリで
main
ブランチにコミットがプッシュされたときに実行されます。 - 人によっては
master
ブランチかもしれませんね。
ジョブ
deploy
という名前のジョブが定義されています。- このジョブは
ubuntu-latest
上で実行されます。
ジョブの手順
- Checkout code
GitHub リポジトリのコードをワークフローの実行環境にチェックアウト - Generate SSH key
デプロイ先のサーバーに SSH 接続するための鍵を生成します。
GitHub Actions のシークレットSSH_PRIVATE_KEY
に設定された秘密鍵を使ってkey
ファイルを作成し、権限を設定します。
GitHub 側の設定は後ほど。
上記の通り、ここでは GitHub で設定した値を使用して、key
を作成します。 - Build site with Eleventy
Eleventy を使用してウェブサイトをビルド。
Eleventy のコマンドnpx @11ty/eleventy
を実行し、ウェブサイトのビルドが行われます。
今回は、ビルドしたファイル達は_public
というフォルダに出力されるように、11ty 側で設定を変更してあります。 - Deploy via rsync
rsync コマンドを使用して、ビルドされたファイルをリモートサーバーにデプロイ
_public
フォルダの中身をhogeId@svhoge.xserver.jp
というユーザーのリモートサーバーの/home/hogege/hoge.com/public_html/
に同期
SSH 鍵key
を使用し、ポート番号10022
で接続します。
以上のコードが実行されると、main
ブランチにプッシュされた際に Eleventy を使用してサイトをビルドし、その後 rsync を介してビルドされたファイルを指定されたエックスサーバーにデプロイ、までを GitHubActions が行ってくれます。
あとがき
以上でメモは終了です。
上記を行えるようになったおかげで、サイト公開までのワークフローが変わりました。
旧ワークフロー
- マークダウンで記事作成(作業ブランチにて)
develop
ブランチにプルリクエスト → マージmain
ブランチに develop をマージ- main で 11ty のビルド
- FileZilla(FTP ソフト)起動
- FileZilla でサーバーにログイン
_public
フォルダに出力されたファイルをサーバーにアップロード(この時点でサイトが公開される)- 「アップロードされているけど、不要になったデータ」があれば手動で削除
新ワークフロー
- マークダウンで記事作成(作業ブランチにて)
develop
ブランチにプルリクエスト → マージmain
ブランチに develop をマージ
あとは main のプッシュ(develop からのマージ)を検知した GitHubActions がなんやかんやしてくれます。
旧ワークフローの以降の手順はすべて自動で行ってくれるようになりました。
特に『「アップロードされているけど、不要になったデータ」があれば手動で削除』が面倒だったのとこわかったのもあり……。
rsync
コマンドのオプションの--delete
でファイルの削除も同期されるようになったので大満足です。
rsync
コマンドのオプション
rsync
コマンドは他にもオプションがあるので、調べて取り入れてみてもよいかもしれません。
以下の例えば-a, --archive
は-a
でも--archive
でも同じコマンドとして認識してくれます。
オプション | 説明 |
---|---|
-u, --update |
送信元にある新しいファイルのみを転送します。すでに送信先に同じファイル名が存在していても、更新日時を確認し、新しい場合のみ上書きします。 |
-e, --rsh=COMMAND |
リモートシェルを指定。例えば、SSH でリモートサーバーに接続する際に使用します。 |
--delete |
送信元には存在しないが、送信先にあるファイルを削除します。これにより、送信元から削除されたファイルも送信先からも削除されます。 |
-a, --archive |
ファイルの属性や権限など、基本的な情報を保持しながらデータを転送します。 |
-v, --verbose |
詳細な出力を表示します。実行されるコマンドや転送されるファイルの情報を表示します。 |
-r, --recursive |
再帰的にディレクトリを同期します。ディレクトリ内のファイルやサブディレクトリも含めて同期します。 |
-z, --compress |
データの転送時に圧縮します。転送する際にデータを圧縮し、帯域幅を節約します。 |
-n, --dry-run |
実際には実行せず、試行するモードです。実行されるコマンドや転送されるファイルを確認できますが、実際の転送は行いません。 |
【2024/08/31】エックスサーバーの設定変更が必要
ふと、サイトを更新した際に本記事のワークフローが失敗するようになっていました。
エラーログ:
Connection closed by
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(231) [sender=3.2.7]
Error: Process completed with exit code 255.
特にワークフローを変更していなかったので、エックスサーバー側の SSH 設定を確認してみました。
とはいえ、あんまり詳しくないので表示されていた項目を変更してみただけです。
以下の SSH 設定を「ON[すべてのアクセスを許可] ※非推奨
」に変更してみました。
そして再度ワークフローを実行してみると正常に更新されました!
どうも同画面の以下の説明に該当する状態になってしまっていたようです。
国外アクセス制限について
国内 IP アドレスからのアクセスの場合でも、
稀に国外 IP アドレスからの接続とシステム上誤認され、制限がされる場合がございます。
このような場合は「ON[すべてのアクセスを許可]」を選択のうえ設定をお願いいたします。