FileZillaを使わず、自動でサーバにアップロードする方法　GitHub Actionsのすすめ

## ドラッグ&ドロップを失敗した
Webサイトをローカルで作ってリモートにアップするとき、操作ミスで目的と違うディレクトリにファイルを入れてしまった。こんな経験ありませんか？自分はFileZillaを初めて利用した日に経験しました笑。そんな悲劇を繰り返さないためにGitHub Actionsを用いてmainブランチへのmerge(厳密にはpush)と同時に実行される自動デプロイ機能を作成しましょう。

## 前提条件
1. GitHubの基本操作ができる
1. 自前サーバか何らかのレンタルサーバと契約している
1. mainブランチ一本での開発ではなく、複数ブランチで開発している

## 概要
- ローカルで開発したWebサイトのソースコードをGitHubにpush
- mianブランチにプルリクエストしてソースコードを反映させる
- このmainブランチへのpushをトリガーにGitHub Actionsを実行し、自動で公開予定サーバへアップロードさせる

## ステップその１　ローカルのdevelopブランチで開発したものをpush
　　
![スクリーンショット 2024-07-07 10.03.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831928/65ceb395-9538-ba37-3834-bf79221069b0.png)

まずは画像のようにmainブランチとdevelopブランチを用意します。現在developブランチの方が開発が1コミット進んでいる状態です。
　　
## ステップその２　FTP情報をGitHubのSecrets and variablesに設定する

あとで自動化プログラムを書くmain.ymlで必要になる変数を先にGitHubに設定しておきます。この部分を飛ばしたり、間違った値を入力するとGitHub Actionsはエラーを起こすので注意しましょう。

![スクリーンショット 2024-07-07 10.17.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831928/79f47fda-5105-a82b-3016-106b9f6b73c3.png)

GitHubのリポジトリページからSettingsを選択し、左サイドバーのSecurityの中にあるSecrets and variablesを選択するとActionsというメニューが出てきます。
　　
![スクリーンショット 2024-07-07 10.21.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831928/b2868f9a-0852-376b-9a98-dfffe0bb8f7e.png)

Actionsを選択すると画像のような画面になります。緑色のNew repository secretボタンをクリックしましょう。
　　
![スクリーンショット 2024-07-07 10.25.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831928/192a7c80-c390-c508-b1bf-4ac22e32ee99.png)

ここに利用しているサーバから取得してきたFTP情報を入力していくことになります。

### FTP情報を取得

続いてFTP情報を取得して順番に入力していきます。取得すべき情報は以下の三つです。

- Name「FTP_SERVER」・・・Secret「ftpサーバのホスト」
- Name「FTP_USERNAME」・・・Secret「ftpサーバのユーザー名」
- Name「FTP_PASSWORD」・・・Secret「ftpサーバのパスワード」

各自利用しているサーバのFTP情報を確認しましょう。これらの値はFileZillaでリモート接続する為に利用する値と同じものです。取得できたら、先ほどのNameとSecretの部分にそれぞれ値を入れていきましょう。
　　
![スクリーンショット 2024-07-07 10.48.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831928/d4e846f7-629f-2c9c-d349-74f7cb9266fd.png)

入力後の画面はこのようになります。三つとも表示されていたら問題なく登録できていることになります。

## ステップその３　GitHub Actionsの設定

いよいよ自動化プログラムを書いていきます。書くといっても後で載せるコードをコピペして、各自の環境に合わせて微調整するだけです。

![スクリーンショット 2024-07-07 10.54.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831928/fcd0d66f-5245-809c-f404-1233e8d08e36.png)

それでは、Actionsを選択し画像のようなページを開いてください。色々と書いてありますが、今回は自作するので青色のset up a workflow yourselfをクリックしてください。
　　
![スクリーンショット 2024-07-07 10.59.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831928/9c19d8d0-86a4-7fff-0b0c-e0a4b6ee6496.png)

コードエディタがでてきますので、ここに以下のコードを貼り付けてください。

```Yaml:main.yml
name: Deploy Themes

on:
  push:
    branches:
      - main

jobs:
  FTP-Deploy-Action:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      
      - name: FTP-Deploy-Action
        uses: SamKirkland/FTP-Deploy-Action@v4.3.5
        with:
          server: ${{ secrets.FTP_SERVER }}
          username: ${{ secrets.FTP_USERNAME }}
          password: ${{ secrets.FTP_PASSWORD }}
          local-dir: /  # GitHubリモートリポジトリの相対パス
          server-dir: //  # サーバーの絶対パス
```

上記のコードはGitHub ActionsのFTP関連でよく使用されているSamKirkland/FTP-Deploy-Action@v4.3.5(2024年7月時点での最新ver)を用いています。

https://github.com/SamKirkland/FTP-Deploy-Action

local-dir:にはアップしたいディレクトリをリモートリポジトリのルートディレクトリからの相対パスで指定してください。末尾に/を入れるのを忘れないでください。おそらくエラーが出ます。少なくとも自分の環境ではエラーが出ました。

server-dir:にはアップ先に指定したいディレクトリの絶対パスを記述してください。こちらは相対ではいけません。FileZillaのリモート側にあるパスがここで指定する絶対パスです。
　　
![スクリーンショット 2024-07-07 11.50.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831928/456d2d92-df25-eeb0-e0eb-571de4e3f292.png)

コードを微調整した後、右上のCommit changesをクリックすると、画像のようなポップアップが出てきますので、こちらのCommit changesもクリックしましょう。Commit messageは任意で良いです。
　　
![スクリーンショット 2024-07-07 12.09.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831928/d3508b45-54bc-34d9-038b-810fb8b41456.png)


以上で設定は完了しました！ここまでの記述に誤りが無ければActionsを選択すると黄色のアイコンがくるくると周り、成功すると緑になってチェックマークが入ります。

## ステップその4　実際にmainブランチにmergeして試す

最後にプルリクエストをして想定通りの動作をするか確認しましょう。

![スクリーンショット 2024-07-07 12.00.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831928/d6f587b1-7f85-5a8d-1058-f7f035b4856e.png)

現在mainブランチとdevelopブランチとの間には1コミットの差分があるのでプルリクエストができます。

![スクリーンショット 2024-07-07 12.03.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831928/5e3a5f1c-3a51-5299-4f5d-90c1b74e6028.png)

developブランチからmainブランチへのセルフプルリクを行いましょう！
設定に問題がなければGitHub Actionsに設定した内容に従い、サーバ上にGitHubリポジトリのコードが反映されている事が確認できます。

以上で作業は終了です！お疲れ様でした！！

## まとめ

今回は「FileZillaを使わず、自動でサーバにアップロードする方法　GitHub Actionsのすすめ」というタイトルでサーバに自動デプロイする方法を紹介させていただきました。これでドラッグ&ドロップによる悲劇は起こらないようになったはずです。

ちなみに、セキュリティのことを考慮すると、本当はFTPではなくSFTPでサーバにアップロードしなければならないのですが、初めての方にはややこしくなるのでFTPでのやり方を紹介しました。

また時間がある時にSFTPや特定のファイルやディレクトリのみデプロイしない方法に関する記事も書こうと思います。ここまでお読みいただきありがとうございました。