Github Actionsを使用してエックスサーバーのファイルを自動更新(デプロイ)する

続編を書きました。

  1. WSLで開発
  2. GitHubのプライベートリポジトリにpush
  3. エックスサーバーに自動反映

を、できるようにします。必要な作業は以下です。

  1. 「Windows(WSL)」から「GitHub」にSSH接続(開発コードのpush)
  2. 「エックスサーバー」から「GitHub」にSSH接続(開発コードの取得、反映(clone、pull))
  3. 「GitHub」から「エックスサーバー」にSSH接続(任意のイベント(push等)をトリガーに、自動でエックスサーバーにSSH接続し、更新を反映(pull))
  4. Github Actionsの設定(どのイベント駆動で、どうような処理をするかを設定)

なお、GitHubにプライベートリポジトリが作成済みの前提でこの記事を書いています。

WindowsからGitHubにSSH接続する

ローカルの開発コードをGitHubにプッシュするのにSSH接続を用います。具体的には鍵ペアを作成し、自身のGitHubアカウントに公開鍵を登録します。

SSH接続で使用する鍵の作成や使用方法は、以前にまとめているので、解説は省略します。

鍵の作成

PowerShellで鍵を作成します。

> pwd
C:\Users\<name>\.ssh

# 公開鍵 & 秘密鍵 作成
> ssh-keygen -t ed25519 -N 'passphrase' -C '""' -f id_ed25519_github

C:\Users\<name>\.ssh

  • id_ed25519_github (秘密鍵)
  • id_ed25519_github.pub (公開鍵)

が作成されました。

公開鍵をGitHubに登録

GithubのSSH and GPG keysへアクセス、[New SSH Key]をクリックして公開鍵を登録します。

SSH keys / Add newページが開いたら、Titleに鍵識別のための適当な文字列を入力します。今回は「Windows」としました。

続いて、Keyに公開鍵(文字列)を貼り付けます。PowerShellを開き公開鍵をクリップボードにコピーします。

> Get-Content ~/.ssh/id_ed25519_github.pub | Set-Clipboard

コピーができたら、Keyにペーストし、[Add SSH Key]をクリックし、公開鍵の登録を完了させます。

接続の確認

> ssh -T -i ~/.ssh/id_ed25519_github git@github.com

# パスフレーズ入力
Enter passphrase for key 'C:\Users\<name>/.ssh/id_ed25519_github':

# 接続確認
Hi <GitHub username> You've successfully authenticated, but GitHub does not provide shell access.

無事、接続に成功したようです。

鍵の管理

接続に長いコマンドとパスフレーズ入力を毎回するのは面倒なので、それを省略できるようにします。

configファイルの作成

C:\Users\<name>\.sshconfigファイルを作ります。

~/.ssh/config
Host github
    HostName github.com
    User git
    Port 22
    IdentityFile ~/.ssh/id_ed25519_github
    PreferredAuthentications publickey
    IdentitiesOnly yes

接続確認します。

> ssh -T github

# パスフレーズ入力
Enter passphrase for key 'C:\Users\<name>/.ssh/id_ed25519_github':

# 接続確認
Hi <GitHub username> You've successfully authenticated, but GitHub does not provide shell access.

ssh-agentの使用

パスフレーズ入力を省くためにssh-agentを使用します。詳細は以前書いたので省略します。

エックスサーバーからGitHubにSSH接続する

次に、エックスサーバーからGitHubにSSH接続し、cloneとpullができるようにします。エックスサーバーにはGitがインストールされているので、Gitインストール作業は必要ありません。

ローカルからGithubへの接続では、GitHubアカウントに公開鍵を登録しましたが、エックスサーバーからGitHubへのSSH接続では、リポジトリに公開鍵(Deploy keys)を登録します。鍵ペアは新たに作成します。

リポジトリ毎に鍵ペアを用意する必要(他のリポジトリで鍵を使い回せない)がありますが、必要なリポジトリにだけアクセスを許可でき、かつ、読み取り権限のみに制限できるなど、共有サーバでのセキュリティを考えた場合には安心ではあります。

以下、エックスサーバーにSSH接続して行います。
エックスサーバーSSH設定

Git

バージョン確認

$ git --version
git version 1.8.3.1

この記事公開時点のGit最新バージョンは2.35.2なので古めのようです。

config設定

今回、メールアドレスはGitHubで用意されたnoreplyメールアドレスをします。

$ git config --global user.name 'Name'
$ git config --global user.email '12345678+example@users.noreply.github.com'
$ git config --global init.defaultBranch main

鍵ペア

公開鍵、秘密鍵の作成

デプロイキー用の鍵ペアを作成します。今回はパスフレーズを設定していません。

$ pwd
/home/<server_id>/.ssh

$ ssh-keygen -t ed25519 -C '' -f git.key
Generating public/private ed25519 key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in git.key.
Your public key has been saved in git.key.pub.

$ chmod 600 git.key

config作成

~/.ssh/config
Host github
    HostName github.com
    User git
    IdentityFile ~/.ssh/git.key
    PreferredAuthentications publickey
    IdentitiesOnly yes

GitHub

リポジトリに公開鍵(Deploy keys)を登録

リポジトリ > Settings > Deploy keys > Add deploy key
に、先ほど作成した公開鍵をコピーして貼り付けます。

読み取り専用ですので、「Allow write access」にはチェックをしません。

エックスサーバーから接続確認

エックスサーバーのターミナルに戻り接続確認をしてみます。

$ ssh -T github

Hi <GitHub username/repository> You've successfully authenticated, but GitHub does not provide shell access.

無事に接続できたようです。

リポジトリをcloneする

適当なディレクトリに移動しcloneします。

$ git clone github:<username>/<repository>.git <dir>

Cloning into 'dir'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.

以上で、エックスサーバーからGitHubのプライベートリポジトリへのSSH接続設定が完了しました。

GitHubからエックスサーバーにSSH接続する

GitHubからエックスサーバーにSSH接続で使用する鍵ペアを作成します。作成手順は今までと同じなので省略します。既にローカルからエックスサーバーにSSH接続するために公開鍵の登録しているので、そこに新しい公開鍵を追記しました。複数の公開鍵を設定するのに、こちらの記事を参考にさせていただきました。

GitHub Actions

任意のイベントを起点に任意の処理が実行できる「GitHub Actions」を使用します。

どうような処理をするかをYAML形式で記述しますが、処理全てを1から自分で書く必要はなく、GitHub ActionsGitHub Marketplaceにあるものが使用できます。

今回はSSH接続してコマンド実行を簡単に設定できる、SSH Remote Commandsを使用します。

作成したYAMLファイルは後述します。

secrets

GitHub Actionsで安全に環境変数をするために「Actions secrets」の設定をしていきます。

SSH Remote Commandsを参考に、今回、設定した変数は以下になります。

環境変数名 解説
DEPLOY_DIR_PATH サーバーのデプロイディレクトリ ~/example.com/dir
HOST ホスト名 xsample.xsrv.jp
PASSPHRASE パスフレーズ example
PORT 接続ポート 10022
PRIVATE_KEY 秘密鍵 -----BEGIN OPENSSH ...
USERNAME ユーザー名 xsample

workflows

処理を記述したYAMLファイルを作成します。
リポリトリを開き、Actions > set up a workflow yourself をクリックします。ファイル名はdeploy.ymlとしておきました。

ここで作成したファイルは、repository/.github/workflowsに保存されます。

name: CI

on:
  push:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Deploy
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USERNAME }}
          port: ${{ secrets.PORT }}
          key: ${{ secrets.PRIVATE_KEY }}
          passphrase: ${{ secrets.PASSPHRASE }}
          script: |
            cd ${{ secrets.DEPLOY_DIR_PATH }}
            git pull origin main

以上で準備が整いました。最後にmainブランチにプッシュをし、エックスサーバーでPullされていることを確認します。うまくいかない場合は、GitHubのリポジトリ画面のActionsをクリックし、該当のworkflowのエラーメッセージを見て修正します。