GitHub CI/CD

GitHub CI/CD(継続的インテグレーション/継続的デリバリー、または継続的デプロイメント)により、コミットが指定のブランチにプッシュされるたびに、Kinstaサイトにコード変更を自動的にデプロイすることができます。この設定により、SSHGitHub Actionsを介してローカル環境からシームレスなコードのデプロイメント、ひいてはサイトへの継続的な更新が可能になります。

以下の手順には、弊社でホスティングする既存のサイトとGitHubアカウントが必要です。

1. サイトのバックアップをダウンロードする

サイトのバックアップをダウンロードし、GitHubリポジトリをセットアップして、ローカルで作業を行うことができます。DevKinstaを使用して弊社サーバーからサイトを取り込むことも可能です。

MyKinstaで「WordPressサイト」>(サイト名)>「バックアップ」に移動し、「ダウンロード」タブを選択して、「ファイルを生成する」をクリックします。

MyKinstaでダウンロード可能なバックアップを作成
MyKinstaでダウンロード可能なバックアップを作成

バックアップファイルの準備ができたら、「ダウンロード」をクリックしてローカルコンピュータに保存し、フォルダに解凍します。

2. GitHubリポジトリを設定する

任意のコードエディターでサイトのファイルを含むフォルダを開きます。不要なWordPressコアファイルやメディア、機密情報などのアップロードを防ぐため、プロジェクトのルートディレクトリに.gitignoreファイルを追加します。WordPress標準の.gitignoreテンプレートを使用し、その内容をコピーして保存することで、必要なファイルだけが追跡されるようになります。

GitHubリポジトリを作成し、サイトのファイルをGitHubにプッシュします。

3. Kinsta用のGitHubのシークレットを設定する

GitHubから弊社へのデプロイを自動化するには、ユーザー名、パスワード、ポート、IPアドレスなどのSSHの認証情報が必要になります。これらは機密情報であるため、GitHubのシークレットとして安全に保存してください。

GitHub内でリポジトリに移動し、「Settings」>「Secrets and variables」>「Actions」>「New repository secret」をクリックします。

MyKinstaのWordPressサイト「情報」画面の「SFTP/SSH」セクションの情報でシークレットを作成します。

シークレット名Secret
KINSTA_SERVER_IPホスト(例:12.34.56.78)
KINSTA_USERNAMEユーザー名(例:kinstahelp)
PASSWORDパスワード
PORTポート番号(例:12345)
GitHubのシークレットに追加するSSH情報
GitHubのシークレットに追加するSSH情報

4. KinstaにGitベアリポジトリを作成する

Gitベアリポジトリは、GitHubがコードをプッシュするリモートリポジトリの役割を果たすものです。このリポジトリには作業ディレクトリがなく、中央リポジトリとしてコードを管理・保存する場所になります。

ターミナルを開いて、MyKinstaのWordPressサイト「情報」画面の「SSHターミナルのコマンド」を使用してSSHで弊社サーバーに接続します。

サイトのSSHターミナルコマンド
サイトのSSHターミナルコマンド

同画面の「環境情報」セクションで「パス」をコピーします。

「環境情報」セクションのパスをコピー
「環境情報」セクションのパスをコピー

publicprivateに、your-siteをサイトのパスにある実際のフォルダ名に置き換えて、サーバー上のprivateフォルダに移動します。

cd /www/your-site/private

privateフォルダが存在しない場合は、以下のコマンドを実行して作成します。

mkdir -p /www/your-site/private

your-repo.gitをGitHubリポジトリ名に置き換えて、以下のコマンドでGitベアリポジトリを作成します。

git init --bare your-repo.git

5. コード受信後のフックを設定する

post-receiveフックは、GitHubのmainブランチに変更がプッシュされた際に自動的にコードを本番サイトにデプロイします。

Gitベアリポジトリのhooksディレクトリに移動して、your-siteをサイトのフォルダ名に、your-repoをGitHubリポジトリ名に置き換えます。

cd /www/your-site/private/your-repo.git/hooks

post-receiveフックを作成して編集します。

nano post-receive

post-receiveファイルに以下のスクリプトを貼り付けます。これで本番サイトのpublicディレクトリに最新のコードが反映されます。

#!/bin/bash
TARGET="/www/your-site/public"
GIT_DIR="/www/your-site/private/your-repo.git"

while read oldrev newrev ref
do
    BRANCH=$(git rev-parse --symbolic --abbrev-ref $ref)

    if [[ $BRANCH == "main" ]];
    then
        echo "Ref $ref を受信しました。 ${BRANCH} ブランチを本番環境にデプロイ中..."
        git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f
    else
        echo "Ref $ref を受信しました。何もしません。このサーバーではmainブランチのみがデプロイ可能です。"
    fi
done

上のスクリプトは、mainブランチのコードのみをデプロイします。TARGET変数は、本番サイトのファイルがあるディレクトリを、GIT_DIR変数はベアリポジトリを指します。

Ctrl + X、次にY、最後にEnterを押してファイルを保存して終了します。

最後にスクリプトを実行可能にして、各プッシュ後に自動的に実行できるようにします。

chmod +x post-receive

6. 個人用アクセストークン(PAT)を生成・追加する

SSH経由でGitHubにコードをプッシュする際は、個人用アクセストークン(PAT)を使用して認証する必要があります。

個人用アクセストークンの作成手順は、以下のとおりです。

  1. GitHubアカウントにアクセスし、プロフィール画像をクリックして「Settings」を選択します。
  2. Developer settings」>「Personal access tokens」>「Tokens (classic)」をクリックします。
  3. Generate new token」>「Generate new token (classic)」をクリックし、「Note」で名前を付けます(「Kinsta Deployment Token」など)。
  4. Select scopes」で「repo」を選択します(プライベートリポジトリを完全に制御するため)。
  5. Generate token」をクリックしてトークンをコピーします。以降トークンは表示されることがないため、必ずコピーしてください。

以下のコマンドを実行して、GitHubリポジトリをリモートとして追加します。your-usernameはGitHubのユーザー名、YOUR_PERSONAL_ACCESS_TOKENは先ほど生成した個人用アクセストークン、your-repoはGitHubリポジトリ名に置き換えてください。

git remote add origin https://your-username:[email protected]/your-username/your-repo.git

7. GitHub Actionsのワークフローを作成する

以下のワークフローは、mainブランチにプッシュするたびに変更を自動的に弊社にデプロイするものです。デプロイを自動化するには、YAMLファイルを使用してデプロイ方法を定義します。

自分のGitHubリポジトリで、このディレクトリ内に.github/workflowsというディレクトリとdeploy.ymlというファイルを作成します。your-siteはKinstaサイト上のパスにあるフォルダ名に、your-repoはGitHubリポジトリ名に置き換えて次の内容を貼り付けます。

name: Deploy to Kinsta

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Deploy to Kinsta via SSH
        uses: appleboy/[email protected]
        with:
          host: ${{ secrets.KINSTA_SERVER_IP }}
          username: ${{ secrets.KINSTA_USERNAME }}
          password: ${{ secrets.PASSWORD }}
          port: ${{ secrets.PORT }}
          script: |
            cd /www/your-site/private/your-repo.git  # KinstaのGitベアリポジトリに移動
            git --work-tree=/www/your-site/public --git-dir=/www/your-site/private/your-repo.git fetch origin main  # GitHubから最新の変更点を取得
            git --work-tree=/www/your-site/public --git-dir=/www/your-site/private/your-repo.git reset --hard origin/main  # 変更を本番サイトにデプロイ

ワークフローの詳細は以下のとおりです。

  • トリガー:GitHubリポジトリのmainブランチにコードがプッシュされるたびに起動します。
  • ジョブdeployというjobがひとつ含まれ、Ubuntuの仮想マシン(ubuntu-latest)上で実行されます。
  • コードの確認actions/checkout@v2アクションを使って、GitHubリポジトリから最新のコードを取り出します。
  • SSH経由でデプロイappleboy/ssh-actionは、設定したシークレット(サーバーIP、ユーザー名、パスワード、ポート)を使用して、SSH経由でKinstaサーバーに安全に接続するために使用されます。このステップでは、次のコマンドが実行されます。
    • cd /www/your-site/private/your-repo.git─Kinstaサーバー上のGitベアリポジトリに移動
    • git fetch origin main─GitHubリポジトリのmainブランチから最新の変更を取得
    • git reset --hard origin/main─WordPressがホスティングされているpublicディレクトリの本番サイトを更新して変更を適用

8.ワークフローをテストする

ワークフローを設定したら、GitHubリポジトリのmainブランチに小さな変更をプッシュしてテストしてみてください。変更をプッシュするたびに、GitHub Actionsが自動的にデプロイをトリガーし、コードの最新バージョンをプルして、Kinsta上の本番サイトにデプロイするようになれば成功です。

デプロイのステータスは、GitHubリポジトリの「Actions」タブで監視可能です。ワークフローでエラーが発生した場合は、トラブルシューティングや問題の修正に役立つログが詳細に表示されます。

この記事は役に立ちましたか?