このブログではGithubを用いてバージョン管理をしていたものの、サイト更新の際には下記のようなワークフローをとっていました。
① ローカルで記事作成
➁ リモートリポジトリにプッシュ
③ npm run build でビルドしたディレクトリをFTPソフトを用いてエックスサーバーにアップロード
手順③を自動化したいと思い調べたところ、Github Actionsでその作業を自動化する方法を見つけましたので解説します!!
GitHub Actions のワークフロー
リポジトリ内に .github/workflows
ディレクトリを作成し、その中にYAMLファイルを作成します。(私の場合はmain.ymlとしました。)
name: Astro Blog Build & Deploy
on: push: branches: - main
jobs: deploy: runs-on: ubuntu-latest
steps: - uses: actions/checkout@v4 with: ref: main23 collapsed lines
- 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サーバーへの反映が自動化できるようになり、更新作業が楽になりました。
参考リンク:
Github ActionsでConoha WINGにrsyncを使ってデプロイする
【CI/CD的な】GitHub Actionsを使ってビルドからrsyncでデプロイまでを自動化する