デプロイの自動化
自動化の重要性と具体的な方法
ここまでで何回か、サーバーのアップロードは自動化することを勧めていますが、つまりデプロイを自動化する重要性と、具体的な方法について少し触れていきます。
手作業は失敗する
まず、大前提として、手作業を失敗しないようにすることは、不可能であると肝に据えることが大切です。
人の手作業に100%はあり得ません。何%かで失敗をします。
自動化したとしても、トリガーが人である以上、もちろん失敗はあり得るわけですが、議論はそのパーセンテージの数字でするべきです。
「マニュアルを守ってやる」よりも、「自動化する」が失敗の確率をより下げるということは、言うまでもありません。
デプロイそのものをシンプルなものにする
自動化するにあたって、まず重要なことは、デプロイ作業そのものをシンプルな仕様にしておく。ということが挙げられます。
その一つの解が、ステージングはそのままプロダクションになる という運用なのです。
GitHub Actions を使った自動化
GitHubには、ブランチのプッシュやコミット、マージのタイミングで設定した処理を走らせる、「GitHub Actions」という機能があります。
FTPのアップロードをGitHub Actionsを使って自動化することが出来ます。
GitHub Actions の設定ファイルを作る
GitHubのリポジトリ画面から、「Actions」 のタブを選択し、「set up a workflow yourself」をクリックして、ワークフローの作成を開始します。
main.yml
というファイルを作る画面になりますので、staging.yml
という名前に変更して、
以下の内容をコピペします。
name: Staging FTP Upload
on: # トリガーの設定
push: # プッシュ時に実行
branches: [develop] # ブランチの指定
jobs:
FTP-Deploy-Action:
name: FTP-Deploy-Action # 分かりやすいジョブの名前
runs-on: ubuntu-latest # 実行環境
steps:
- name: Checkout repository
uses: actions/checkout@v4.0.0 # チェックアウトアクション(https://github.com/actions/checkout)
- name: FTP-Deploy-Action
uses: SamKirkland/FTP-Deploy-Action@v4.3.4 # FTPアップロードアクション(https://github.com/SamKirkland/FTP-Deploy-Action)
with:
server: ${{ secrets.STAGING_SERVER }} # FTPのサーバーアドレス
username: ${{ secrets.STAGING_USERNAME }} # FTPのユーザー名
password: ${{ secrets.STAGING_PASSWORD }} # FTPのパスワード
protocol: ftps
local-dir: ./dest/ # アップロードしたいフォルダのパス
server-dir: /public_html/staging/ # アップロード先のフォルダのパス
ステージングサーバーにアップロードすることを想定しています。
local-dir: ./dest/
及び server-dir: /public_html/staging/
は、環境に合わせて書き換えてください。
「Commit changes」をクリックして、保存します。
コミットメッセージを求められるので、適宜書き込んでください。(そもままコミットでもOK)
.github/workflow
フォルダ内にymlは保存され、その中のymlファイルがワークフローとして認識されます。
つまり、この設定ファイルは、ローカルリポジトリで編集することもできます。
GitHub Secrets に、パスワードなどを登録
パスワードなどを、ymlに直接書いてしまうと、機密情報の漏洩になってしまいます。
ymlの中の${{ secrets.STAGING_SERVER }}
などの記述は、GitHub Secrets に登録された値を持ってくるという意味ですので、必要なキーと値を登録していきます。
「Setting」タブの「Secrets and variables」→「Actions」の「New repository secret」ボタンをクリックしてください。
ここで、キー名と設定値を一つずつ登録します。
以下が全部登録し終わったところです。
機密情報なので、値は表示されません。
GitHub Actions を動作させてみる
今回は、develop ブランチに変更があった場合、FTPアップロードが走るワークフローを登録しましたので、develop ブランチにfeatureブランチをプルリクでマージしてみます。
成功すると、Actionsのページに、緑色のアイコンのついた実行結果が出現します。
赤は失敗です。下のスクリーンショットはymlの設定を試行錯誤したので、エラーの実行結果が映り込んでいます(^^;
日本国内のサーバーは、デフォルトの設定では、海外からのFTP接続を遮断している場合があります。
GitHubのサーバーは海外にあるので、拒否されてしまう可能性があるので、注意しましょう。
FTPソフトでアップロード結果を覗いてみます。
アップロードできているようです!
.ftp-deploy-sync-state.json
は、今回使用したアクションが出してくれるアップロード結果のログファイルです。
GitHub Actions をデバッグする
実行結果の詳細画面では、ログを確認出来るので、参考にします。
また、再プッシュせずとも再実行が可能です(マルをつけた箇所をクリック)
ワークフローの整備に関してだけ特別に、GitHub上で直接コードを編集し、developにコミットをしてもOKという運用でも問題ないと思います。
develop
-> main
STAGING
-> PRODUCTION
と、キーワードを書き換えて、server-dir
を変えるだけです。
今回使った GitHub Actions
アクションの実態は、Nodeで書かれていますが、先人が作ってくれた便利なアクションがマーケットプレイスで公開されています。
今回は以下のアクションを使用しました。
もちろん、アクションをNodeで自分で書くことも出来ます。
ビルドによる成果物(例えばscss->cssのcssファイルのような)をGitで管理しない場合は、ビルドをGitHub Actionsに任せると良いでしょう。
その際には、トリガーを「プルリクエスト時」に設定し、ビルドエラーのあるコードをdevelopブランチにマージされてしまうことを防ぐというようなことも出来ます。
クラウドサービスによっては、このあたりを自動で構築してくれたり、専用のアクションを用意してくれたりしていることがあるので、承知しておきましょう。