公開日:
カテゴリー:

GitHub Actionsとrsyncでデプロイを自動化する

目次

手動でのデプロイ作業には誤操作のリスクがあるうえ、時間と手間がかかります。

それを解決できるのがGitHub Actionsとrsyncを組み合わせた自動デプロイです。変更されたファイルのみを自動で転送でき、手作業が不要になります。

本記事では、GitHub Actionsとrsyncを使った自動デプロイの実装方法を解説します。

なお、本記事はエックスサーバーへのデプロイを前提としています。他のレンタルサーバーやホスティングサービスを利用する場合は、該当箇所を適宜読み替えてください。

デプロイワークフローの実装

.github/workflows/deploy.yml
name: Deploy
on:
workflow_dispatch:
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Checkout code
uses: actions/checkout@v5
# SSH接続の準備
- name: Setup SSH
uses: shimataro/ssh-key-action@v2
with:
key: ${{ secrets.SSH_KEY }}
known_hosts: ${{ secrets.KNOWN_HOSTS }}
if_key_exists: replace
# rsyncでファイルをデプロイ
- name: Deploy with rsync
run: |
rsync -avz -e "ssh -p ${{ secrets.SSH_PORT }}" \
index.html \
img \
"${{ secrets.USER }}@${{ secrets.HOST }}:${{ secrets.DEPLOY_PATH }}"

このワークフローはプロジェクトのindex.htmlimgディレクトリを指定したサーバーにrsyncで転送します。

転送対象のファイルやディレクトリは任意のものに変更してください。

使用しているrsyncのオプションは以下の通りです。

  • -a:アーカイブモード(権限やタイムスタンプを保持)で実行する
  • -v:転送情報の詳細を表示する
  • -z:転送時にデータを圧縮する

このワークフローの実行にはリポジトリのシークレット設定とエックスサーバーのSSH設定が必要です。

事前設定

シークレットの設定

リポジトリの「Settings」→「Secrets and variables」→「Actions」から以下のシークレットを設定します。設定方法の詳細は公式ドキュメントを参照してください。

  • SSH_KEY:SSH秘密鍵
  • SSH_PORT:SSHポート番号(例:10022
  • USER:サーバーのユーザー名(例:sv12345
  • HOST:サーバーのホスト名(例:sv12345.xsrv.jp
  • DEPLOY_PATH:デプロイ先のディレクトリパス(例:/home/sv12345/example.com/public_html/
  • KNOWN_HOSTS:サーバーのknown_hosts情報

エックスサーバーのknown_hosts情報は以下のコマンドで取得できます。sv12345.xserver.jpの箇所は実際のホスト名に置き換えてください。

Terminal window
ssh-keyscan -p 10022 sv12345.xserver.jp

エックスサーバーのSSH設定

GitHub ActionsはGitHubのサーバーから実行されるため、エックスサーバーの「SSH設定」で「国外アクセス制限」をOFFに設定します。

続いて、エックスサーバーにSSH公開鍵を登録します。登録方法は以下の記事を参照してください。なお、本記事の用途でSSHキーを作成する場合はキー生成時にパスフレーズを設定しないでください。

エックスサーバーにSSH接続する|greencider(グリーンサイダー)

エックスサーバーにSSHで接続する手順を図解付きでわかりやすく解説。公開鍵の作成や登録方法、接続コマンド、エイリアス設定まで実用的な内容をまとめています。

greencd.jp

実行方法

設定完了後は、リポジトリの「Actions」タブからワークフローを手動実行できます。

実行が完了すると、以下のようなログが表示されます。

Run rsync -avz -e "ssh -p ***" \
rsync -avz -e "ssh -p ***" \
index.html \
img \
"***@***:***"
shell: /usr/bin/bash -e {0}
sending incremental file list
index.html
img/
img/pineapple.jpg
sent 485,746 bytes received 66 bytes 88,329.45 bytes/sec
total size is 495,049 speedup is 1.02

index.htmlimgディレクトリ内の画像ファイルがサーバーに転送されたことがわかります。

なお、2回目以降の実行では前回から変更があったファイルのみが転送されます。

応用:リリースと連携した自動デプロイ

さらに高度な運用として、リリース公開時に自動でデプロイを実行する方法もあります。

onセクションを以下のように変更することで、リリース公開時に自動デプロイされます。

.github/workflows/deploy.yml
on:
release:
types: [published]

この設定とリリースの自動生成を組み合わせることで、リリースの作成からデプロイまで一貫したワークフローを構築できます。

リリースの自動生成については以下の記事も参照してください。

GitHub Actionsで日付ベースのリリースを自動生成する|greencider(グリーンサイダー)

GitHub Actionsで日付ベースのリリースを自動生成する方法を解説。日付+連番形式のタグで一貫したリリース管理が可能になります。

greencd.jp

まとめ

本記事ではGitHub Actionsとrsyncを使った自動デプロイの実装方法を紹介しました。リリースと連携させることで、リリース生成からデプロイまで一貫したワークフローも構築できます。

手動デプロイから脱却し、モダンで効率的な開発フローを実現してみてください。

今回のサンプルコードはGitHubで公開しています。

記事をシェアする
記事がお役に立てたらシェアしていただけると嬉しいです!