目次
- はじめに
- 全体構成
- CI/CDとは?
- GitHub Actions とは?
- 事前構成
- ① Raspberry Pi 側の準備
- ② GitHub Secrets の設定
- ③ GitHub Actions workflow の作成
- ④ GitHub リポジトリへ Push
はじめに
先日、自身のポートフォリオサイトを作成しました。
(よかったら見ていってください!)
本Webサイトのコンテンツ制作は動的更新に対応しておらず、
Configファイルを編集してコンテンツを更新しています。
CMSの動的更新を導入したいと思いつつ、静的なコンテンツを弄りたかったりレイアウト変更したかったりする場合を想定して、
自宅のWebサーバー(Raspberry Pi)へ自動デプロイ(CI/CD)を行う環境を構築しました。
全体構成
git push
↓
GitHub Actions
↓(test, build)
dist/
↓(SCP with WireGuard)
Raspberry Pi
↓
/var/www/html
↓
Nginx
今回は自宅ネットワークで既に構築していたVPNを用いてデプロイする構成を採用しています。
Cloudflareのトンネル機能を使ってSCPすることも可能で、よりセキュアそうなので今後変更したいところです(今回の構成はCloudflare Tunnel構築前に作ったものでした)
CI/CDとは?
CI/CD (Continuous Integration / Continuous Deployment) とは、ソフトウェアの変更を自動的にテスト・ビルドし、本番環境へ適用(デプロイ)する仕組みのことです。
-
CI (Integration): 自動でテストやビルドを行うこと
(今回はnpm run lintやnpm run test:ui、npm run build) -
CD (Deployment): テストをパスした成果物を、自動でサーバへアップロードして公開すること
(今回はscpでの転送)
今回のケースでは、ローカルでWebコンテンツを編集しでGitHubにプッシュすると、自動でテスト & 日付更新 & Webサーバーへデプロイする仕組みです。
GitHubへのプッシュ〜Webサーバーデプロイまでを担ってくれるのがGitHub Actionsです。
GitHub Actions とは?
GitHub Actions は、GitHub が標準で提供しているCI/CDプラットフォームです。
リポジトリ内に設定ファイル(YAML)を置くだけで、「リポジトリにプッシュされたら自動でテストしてデプロイする」といった一連の処理を GitHub のサーバ上で実行してくれます。
GitHub Actionsを用いるためのトリガーとしてはpushの他にpull_requestやcronでの実行などがありますが、今回は個人開発のためpushのみで対応することとします。
事前構成
今回の構築を行うにあたっての環境条件は下記となります。
- GitHub リポジトリを作成済み。
- Raspberry Pi に SSH 接続できる環境。
- Nginx が
/var/www/htmlを配信している。 -
distディレクトリの内容を Pi 側の Web ルートに反映させる構成である。
① Raspberry Pi 側の準備
1-1. デプロイ用ユーザの作成
pi ユーザなどを直接使うのはセキュリティ上避けたいため、デプロイ専用ユーザを作成しました。
sudo useradd -m -s /bin/bash deploy
sudo passwd deploy
1-2. SSH 鍵認証の有効化
GitHub Actions から接続するための鍵ペアを作成します。
su - deploy
ssh-keygen -t ed25519 -C "github-actions"
生成された公開鍵を登録します。
sudo mkdir -p /home/deploy/.ssh
sudo touch /home/deploy/.ssh/authorized_keys
sudo chown -R deploy:deploy /home/deploy/.ssh
sudo chmod 700 /home/deploy/.ssh
sudo chmod 600 /home/deploy/.ssh/authorized_keys
sudo vi /home/deploy/.ssh/authorized_keys
# 生成した公開鍵を追加
1-3. Web ディレクトリの権限調整
sudo chown -R root:www-data /var/www/html
sudo chmod -R 755 /var/www/html
sudo setfacl -R -m u:deploy:rwx /var/www/html
② GitHub Secrets の設定
GitHub リポジトリの Settings → Secrets and variables → Actions → New Repository Secret に以下の値を設定します。
基本接続情報
| 名前 | 内容 |
|---|---|
PI_HOST |
接続先ホスト名またはIPアドレス(今回はWireGuard経由のためプライベートIPを設定) |
PI_USER |
deploy (作成したデプロイ用ユーザ) |
PI_SSH_KEY |
秘密鍵(id_ed25519 の中身) |
WireGuard 関連の Secrets と設定
ご説明の通り、今回は自宅ネットワークで既に構築していたVPNを用いてデプロイする構成を採用しています。
GitHub ActionsのランナーからVPN接続する人は限られると思いますが、備忘として残しておきます。
WireGuard 関連の Secrets と設定
WireGuard 設定情報
| 名前 | 内容 |
|---|---|
WG_ADDRESS |
GitHub Actions ランナーに割り当てる静的IPアドレス |
WG_ALLOWED_IPS |
VPN 経由でアクセスを許可するネットワーク帯 |
WG_ENDPOINT |
<VPNサーバのIP>:<VPNサーバのポート番号> |
WG_PRIVATE_KEY |
GitHub Actions(クライアント)側の秘密鍵 |
WG_PUBLIC_KEY |
サーバ側の公開鍵 |
WireGuard サーバ側の設定手順(参考)
VPN サーバ(Pi 側など)でクライアント(GitHub Actions)用の鍵を生成し、設定を追加する手順です。
cd /etc/wireguard
umask 077
wg genkey | tee gactions_client_private.key | wg pubkey > gactions_client_public.key
sudo vi /etc/wireguard/wg0.conf
# /etc/wireguard/wg0.conf への追記例:
[Peer]
PublicKey = <gactions_client_public.keyの中身>
AllowedIPs = 10.0.0.1/32
設定反映のため再起動します。
sudo wg-quick down wg0 && sudo wg-quick up wg0
③ GitHub Actions workflow の作成
GitHubリポジトリ内に.github/workflows/config.yml を作成し、以下の内容を記述します。
name: Deploy React
on:
push:
branches: [ main ]
jobs:
test: # lint, testを行う
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
cache: 'npm'
cache-dependency-path: package-lock.json
- name: Install dependencies
run: |
npm ci
- name: Run Lint
run: |
npm run lint
- name: Run Test
run: |
npm run test:ui
build: # build、Webコンテンツの更新日時を更新、Artifactとして出力
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
cache: 'npm'
cache-dependency-path: package-lock.json
- name: Install dependencies
run: |
npm ci
- name: Update Last Updated Date
run: |
CURRENT_DATE=$(date +'%Y.%m.%d')
sed -i "s/lastUpdated: '.*'/lastUpdated: '$CURRENT_DATE'/" src/app/content/contentConfig.js
grep "lastUpdated" src/app/content/contentConfig.js
- name: Build
run: |
npm run build
- name: Upload Build Artifact
uses: actions/upload-artifact@v4
with:
name: dist-files
path: dist/
deploy: # WireGuard設定、SSH接続を行い、Artifactをサーバに転送
runs-on: ubuntu-latest
needs: [test, build]
steps:
- name: Download Build Artifact
uses: actions/download-artifact@v4
with:
name: dist-files
path: dist
- name: Install and Setup WireGuard
run:
# WireGuard設定を追記
- name: Deploy to server
run: |
mkdir -p ~/.ssh/
echo "${{ secrets.PI_SSH_KEY }}" > ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
- name: Add SSH key to known hosts
run:
ssh-keyscan -H ${{ secrets.PI_HOST }} >> ~/.ssh/known_hosts
- name: Send to server
run:
scp -r -i ~/.ssh/id_ed25519 dist/* ${{ secrets.PI_USER }}@${{ secrets.PI_HOST }}:/var/www/html
※WireGuard設定は省略しました。興味のある方はこちらの記事を参考にしてください。
④ GitHub リポジトリへ Push
すべての設定が完了したら、変更をリポジトリの main ブランチにプッシュします。
プッシュ後、GitHub リポジトリの Actions タブを開くと、ワークフローが自動的に起動していることが確認できます。
以上でCI/CDの設定は完了です。快適な個人開発ライフを送りましょう!

