Github Actionsを使用してエックスサーバーのファイルを自動更新(デプロイ)する
※続編を書きました。
- WSLで開発
- GitHubのプライベートリポジトリにpush
- エックスサーバーに自動反映
を、できるようにします。必要な作業は以下です。
- 「Windows(WSL)」から「GitHub」にSSH接続(開発コードのpush)
- 「エックスサーバー」から「GitHub」にSSH接続(開発コードの取得、反映(clone、pull))
- 「GitHub」から「エックスサーバー」にSSH接続(任意のイベント(push等)をトリガーに、自動でエックスサーバーにSSH接続し、更新を反映(pull))
- 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>¥.sshにconfigファイルを作ります。
接続確認します。
> 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作成
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 Actions、GitHub 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のエラーメッセージを見て修正します。