Github Actionsでサイト更新を自動化する方法
このブログではGithubを用いてバージョン管理をしていたものの、サイト更新の際には下記のようなワークフローをとっていました。
① ローカルで記事作成
➁ リモートリポジトリにプッシュ
③ npm run build でビルドしたディレクトリをFTPソフトを用いてエックスサーバーにアップロード
手順③を自動化したいと思い調べたところ、Github Actionsでその作業を自動化する方法を見つけましたので解説します!!
GitHub Actions のワークフロー
リポジトリ内に .github/workflows
ディレクトリを作成し、その中にYAMLファイルを作成します。(私の場合はmain.ymlとしました。)
# .github/workflows/main.yml
name: Astro Blog Build & Deploy
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
ref: main
- name: Node setup
uses: actions/setup-node@v4
with:
node-version: "20"
cache: npm
- run: npm i && npm run build
- name: prepare .ssh dir
run: mkdir -p .ssh && chmod 700 .ssh
- name: ssh key generate
run: echo "$SSH_SECRET_KEY" > .ssh/id_rsa && chmod 600 .ssh/id_rsa
env:
SSH_SECRET_KEY: ${{ secrets.SSH_SECRET_KEY }}
- name: rsync deploy
run: rsync --checksum -ahv --delete --exclude ".git/" --exclude ".ssh/" -e "ssh -i .ssh/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p ${SSH_PORT}" ./dist/ ${SSH_USER}@${SSH_HOST}:${SSH_DIR}
env:
SSH_PORT: ${{ secrets.SSH_PORT }}
SSH_USER: ${{ secrets.SSH_USER }}
SSH_HOST: ${{ secrets.SSH_HOST }}
SSH_DIR: /var/www/blog/
ここからはmain.ymlについて部分ごとに解説をしていきます。
1. 実行環境の作成
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
on
の設定で指定したブランチ(ここでは”main”)へpush
時に処理を実行し、jobs
(単一の処理ブロック)はUbuntuで実行環境を構築しています。
2. リポジトリのビルド
steps:
- uses: actions/checkout@v4
with:
ref: main
- name: Node setup
uses: actions/setup-node@v4
with:
node-version: "20"
cache: npm
- run: npm i && npm run build
steps
にはjobs
内の個々の処理を記述していきます。まず、actions/checkout@v4
を使用しリポジトリのチェックアウト、ref
でブランチ名を指定します。(こちらの指定がない場合はデフォルトブランチが選択されます)
次にNode setup
ですが、こちらについては私が使用しているAstroフレームワークのバージョンの関係でnpm
のバージョンが18以上である必要があったため記述しています。
バージョン指定後にビルドコマンドを実行しています。(node モジュールをインストールするためにnpm iを実行しています)
3. 秘密鍵の生成
- name: prepare .ssh dir
run: mkdir -p .ssh && chmod 700 .ssh
- name: ssh key generate
run: echo "$SSH_SECRET_KEY" > .ssh/id_rsa && chmod 600 .ssh/id_rsa
env:
SSH_SECRET_KEY: ${{ secrets.SSH_SECRET_KEY }}
まず、.sshというフォルダを作成し、ディレクトリの権限を700に変更します。次に、.sshにid_rsaというファイルを作成し、ファイルの権限を600に変更します。secrets.というプレフィックスがついている変数はGithubの設定ページで設定した環境変数です。こちらはリポジトリの”Settings”ページから”Security->Secrets and variables->Actions”のページで”New repository secret”ボタンを押下することで作成できます。
SSH_SECRET_KEY
にはサーバーで作成した秘密鍵の中身をコピーしたものを環境変数にペーストします。(秘密鍵ファイルの末尾に改行が入っているか確かめてください)
注意点
・使用する秘密鍵(SSH_SECRET_KEY)にパスフレーズを設定するとrsync
の実行でエラーが発生するため、パスフレーズは空白にするとよさそうです。下記コマンドでパスフレーズの変更ができます。
ssh-keygen -p -f /path/to/private_key
4. rsyncによるビルドのデプロイ
- name: rsync deploy
run: rsync --checksum -ahv --delete --exclude ".git/" --exclude ".ssh/" -e "ssh -i .ssh/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p ${SSH_PORT}" ./dist/ ${SSH_USER}@${SSH_HOST}:${SSH_DIR}
env:
SSH_PORT: ${{ secrets.SSH_PORT }}
SSH_USER: ${{ secrets.SSH_USER }}
SSH_HOST: ${{ secrets.SSH_HOST }}
SSH_DIR: /var/www/blog/
rsync
を実行します。上述したようにsecrets.変数についてはGitHubの環境変数設定で追加したものになります。
同期させたくないファイル、ディレクトリは—exclude
で除外します。
-e
でリモートシェルを指定します。作成した秘密鍵をssh
の-i
オプションで指定します。
rsync
最後のオプションで同期元ファイル(ここでは./dist/
)と同期先ファイル(ここでは${SSH_USER}@${SSH_HOST}:${SSH_DIR}
)をしており、ディレクトリを指定する場合は末尾に/
をつけます。
おわりに
これにて解説は終了です。以上の手順が成功すれば、サイト更新する際にpushするだけでバージョン管理に加えてwebサーバーへの反映が自動化できるようになり、更新作業が楽になりました。
参考リンク: