背景
自分のポートフォリオの構成ですが、XServer上にデプロイしていて更新があるたびにFTP/SFTPでアップロードを手でやってました。
(ソースはGitHubで管理)
改めてこれをGitHub Actionsで自動化したいなと思い、自動デプロイの仕組みをなるべく今後の開発で活用としたいと思いました。
改めて現状の変更手順とデプロイ完了までの手順を示すと…
- 変更をGitHub上にプッシュ
- ちょっとした文言の修正などはmainへ直接プッシュして、画面要素など大きめの変更はdevelopブランチで対応→mainへマージする感じ
- 変更したソースをまるごとコピー
- FTP上のサーバへFileZillaを使って接続
- コピーしたソースをそのままペースト
- 変更できたかを確認
とまあ、こんな流れですね。
事前調査: 費用について
お金に余裕がないため、なるべく無料で自動デプロイを実現したいと思いましてまずは無料でできるかどうかを調べてみました。
- GitHub Actions自体には無料枠がある
- パブリックリポジトリなら無制限
- プライベートリポジトリで2000分(約33時間分)まで無料
- ただし、2000分を超えた場合、以降は1分ごとに従量課金になる
GitHubあるあるなんでしょうけど、パブリックリポジトリは無料でプライベートリポジトリなら種類によってお金かかるイメージです。そして今回もやはりプライベートリポジトリで運用するとお金かかるンゴ…
事前調査: デプロイにおいての注意点
そもそもXServerでデプロイできない環境も一部あるため、注意です。
特にTomcat環境下で動作するアプリはFTP上では不可だったはず…
(JavaのSpring Bootで作ったアプリをデプロイできないか色々調べた結果、この結論に落ち着いてます)
ちなみに、Renderかなにかでデプロイした記憶です。
もし、どうしてもデプロイしたい場合はXServer VPSかなんかのサービス使えば一応できた気がします。
ちなみにデプロイできないのはセキュリティの脆弱性が起因してます。
GitHub ActionsでXServerにFTPデプロイする方法
XServerのFTP情報を確認
主に確認しておくのは以下の情報
- FTPホスト名(svXXXX.xserver.jp)
- ユーザー名(FTPアカウント名)
- パスワード
- アップロード先のディレクトリ
GitHub ActionsのSecretsにFTP情報を登録
GitHubリポジトリの「Settings」→「Secrets and variables」→「Actions」に、以下のようなSecretsを追加し、FTP情報を記載します。
FTP_HOST: svXXXX.xserver.jp
FTP_USERNAME: your_ftp_user
FTP_PASSWORD: your_ftp_password
※それぞれ別々に設定する必要があります!
実際の画面はこんな感じですので、ご参考程度に…

GitHub Actionsワークフローを作成
カレントディレクトリに.github/workflows/deploy.yml
を作成し、以下の内容を記述します。
name: Deploy to XServer via FTP
on:
push:
branches:
– main # どのブランチにプッシュされたら実行されるかを指定jobs:
deploy:
runs-on: ubuntu-latest
steps:
– name: Checkout repository
uses: actions/checkout@v4– name: Deploy to XServer via FTP
uses: SamKirkland/FTP-Deploy-Action@v4
with:
server: ${{ secrets.FTP_HOST }}
username: ${{ secrets.FTP_USERNAME }}
password: ${{ secrets.FTP_PASSWORD }}
server-dir: /home/yourdomain/public_html/
exclude: |
**/.git*
**/.github*
**/node_modules/*
(確認)GitHubへプッシュして確認
mainへいざ変更をプッシュしてうまくいくか!!
エラー発生しとるやないかい…

調べたところ、ftp-deploy-actionのバージョンを具体的に指定しなきゃいけないらしい。
ちなみにactions/checkoutのバージョンも具体的に指定する必要があるらしいです。
しかし、まともやエラー

サーバー情報あるのでエラー文のみ見せますね。
Error: Error: Input required and not supplied: server
単純にFTPの接続エラーらしい…
原因としてはSecretsで設定している内容が間違っている or yaml内の記載が間違っているのどちらか。
ただ、yamlは正直原因ではないとふみ、改めてSecretsの設定を削除して再度追加してみます。
それでもエラー…ちなみにyamlで指定しているフォルダパス間違えてても同じエラーになるかも…
/home/{自分のドメイン}/public_html/じゃなかったため、再度変更とジョブをリランしてみます。
(homeではなく、XServerを指定してました…素直に設定しとけってことか)
またまたエラー…Secretsの名前とyamlで指定するsecrets.の部分て関係するかなどなど、再度確認してみます。
フォルダパスの確認のため、XServer上へSSH接続する方法
https://hiro8blog.com/connect-to-xserver-by-ssh/
色々とやってみましたが原因わからず…
ただ、改めてymlの設定内容を調査するとデバッグで接続を表示できそう!
echoとpingをそれぞれ利用して以下のようにデバッグ用のプロセスを追加する
– name: Debugging
run: |
echo “FTP_HOST: ${{ secrets.FTP_HOST }}”
echo “FTP_USERNAME: ${{ secrets.FTP_USERNAME }}”
# セキュリティ上の理由からFTP_PASSWORDは表示しない
ping -c 4 ${{ secrets.FTP_HOST }}
デバッグしてみるとそもそもSecretsに設定したリポジトリのバリュー入っていない…
設定方法を間違えていて、Secretsはリポジトリ名に実際の変数名(FTP_HOSTなど)を設定し、中身に実際の値(svXXXX.xserver.jp)を設定する必要があった。
結果、値がマスクされて表示!!
別のエラーが出たため、少し進められた!
別のエラーについてはフォルダ指定の最後のスラッシュがないことが原因でした…
では改めて!

いけたーーーーー!たいしたことしてないのに嬉しい!
実際に簡単な変更のコミット、プッシュ、マージ、デプロイが全て行けるか確認してみます。
結果:フォルダはできてたけどフォルダ指定間違っていて新規ファイル作っていた…
もちろん、実際のサイトも変化なしのため、フォルダ指定変更する必要がありました…
ymlの内容 + 各ソースの場所を変更(これに伴いパス指定の変更)して再度プッシュしてみる!

いけてる!これにて、完全自動化完了です!!
以上、GitHub ActionsでXServerへFTP自動デプロイさせたマンでした。
コメント