きっかけ
本職でもSESとして働いている私は親の顔よりもGitHubを見ている自信があります。
そんな私は自宅にサーバーPCを置いてDiscord BOTやマイクラサーバーを立てたりしているのですが,基本的にdevブランチで開発をして一通りデバッグ等が終わったらmasterブランチにマージしています。
その後に自宅サーバーからpullし本番環境を更新しています。
しかし昔はherokuを使っていた際にmasterブランチを更新しただけでコードが更新されてとても楽だった覚えがあります。
なので今回はそれを再現してみたいと思います。
え?無料サービスはあるんだからそれ使えば?
まだまだだな...これはねただのロマンなのだよ...
前提
- Ubuntu 20.04.6 LTS(Linuxならこの記事参考にできると思う)
- SSH 8.2p1
- この記事を参考にするには
- あくまで自動デプロイ方法を記載する記事なのでコードを反映する方法などについてはご自身でお調べください
手順
① 秘密鍵と公開鍵を生成
ubuntuサーバーでsshの秘密鍵と公開鍵を生成します。
以下コマンドを実行してください。
ssh-keygen -t ed25519 -C "github-deploy" -f ~/.ssh/github_deploy_key
すると以下のようなファイルが生成されます。
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDuMyk3vF4XkQe3L5ZbKnf0nV8Z8vDummYKEYy+8T3N1 dummy-actions-deploy
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACD7jMyk3vF4XkQe3L5ZbKnf0nV8Z8vDummYKEYy+8T3N1AAAAIwAAAAtzc2
gtZWQyNTUxOQAAACD7jMyk3vF4XkQe3L5ZbKnf0nV8Z8vDummYKEYy+8T3N1AAAAQA0DnU
k8kuyKeZfzvmLzphzBQ+cNVM/er7i+wGjvTAD/AD+4zMpN7xeF5EHty+WWyp39J1fGfLw7
p2JBGMPvE9zdQAAAARmdWNrLWR1bW15
-----END OPENSSH PRIVATE KEY-----
※このキーはchatgptに生成させたものなのでご安心ください
② GitHub上に秘密鍵を登録する
GitHub リポジトリのページ
→ Settings
→ Secrets and variables
→ Actions
→ New repository secret
Name: SSH_PRIVATE_KEY
Value: github_deploy_key の中身(秘密鍵)
③ GitHub Actions ワークフローを書く
name: Deploy to Server via SSH
on:
push:
branches:
- master
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up SSH key
run: |
mkdir -p ~/.ssh
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/github_deploy_key
chmod 600 ~/.ssh/github_deploy_key
ssh-keyscan -H %サーバーのグローバルIP% >> ~/.ssh/known_hosts
- name: Deploy via SSH
run: |
ssh -i ~/.ssh/github_deploy_key %ubuntuのユーザー名%@%サーバーのグローバルIP% "sh /home/%ubuntuのユーザー名%/python/project/bot.sh pull"
- %サーバーのグローバルIP%: サーバーのIPアドレスを記載してください。
基本的にグローバルIPを記載しポート22番を開放しておいてください。 - %ubuntuのユーザー名%: そのコマンドをどのユーザーが使うかで書く内容が変わる
-
"sh /home/%ubuntuのユーザー名%/python/project/bot.sh pull"
部は適宜システムを更新するロジックのコマンドをお書きください。
完成
これにて完成です。
masterブランチにpushしたりmaster merge from devなどを実行し確認してみてください。
改善案
- セキュリティ面を気にするとIPアドレスやユーザー名も変数にした方がいいかもですね!
- デプロイ専用の非特権ユーザーを作っておくのが一番良い
-
.ssh/authorized_keys
ではcommand="..."
制限やno-pty
,no-agent-forwarding
も使うと強固 - ファイアウォールでGitHub ActionsのIPを絞るのも効果的