ペンギンが技術ブログを書いています

node-sshを導入してNuxtのデプロイ作業を自動化する

初回投稿: 2021年05月23日 / 最終更新: 2021年06月07日

経緯

このブログはNuxtで作成しているので、いつもはnpm run generateで静的ファイルを出力させたあとに、sshでサーバーに手動でファイルをアップロードしています。


これらの作業が面倒くさいので、node-sshを使って自動化することにしました。


npm run deployを実行したら、①npm run generateと②サーバーのアップロードを行うことがゴールです。

node-sshとは?

node-sshssh2の軽量なラッパーです。すなわち、Node.js用のSSHを通信するためのnpmのパッケージです。

node-sshを使って自動化する

1. node-sshのインストール

まずは、次のコマンドを実行してnode-sshをインストールします。

npm install node-ssh --save-dev

2. アップロードする処理の記述

node-sshのドキュメントを読みつつ、サーバーに接続してアップロードする処理を記述しました。

src/ssh/upload.js
const {NodeSSH} = require('node-ssh')
const ssh = new NodeSSH()

const main = async () => {
  console.log('サーバーに接続しています')

  // sshの接続に必要な情報を記述
  await ssh.connect({
    host: 'host',
    port: 22,
    username: 'username',
    passphrase: 'password',
    privateKey: 'path'
  })

  // サーバーに送信する元のディレクトリ、アップロード先のディレクトリ
  const localDirectory = './dist'
  const serverDirectory = './****.com/public_html/blog'

  console.log('サーバーにアップロードしています')
  
  // アップロード(置き換え)
  await ssh.putDirectory(localDirectory, serverDirectory)
  console.log('アップロードに成功しました')
}

main()

エラー処理などもしっかり行いたいところですが、今回はこの程度にします。


これをnodeコマンドで実行します。

$ node ./src/ssh/upload.js

// 実行結果
サーバーに接続しています...
サーバーにアップロードしています...
アップロードに成功しました

サーバー側のディレクトリを見ると、distディレクトリの中身がアップロードされていたので成功です。

3. package.jsonにコマンドを登録

今回は、nuxt generateをしてからサーバーのアップロードをしたいので次のように記述します。

package.json
  "scripts": {
    ...
    "deploy": "nuxt generate && node ./src/ssh/upload.js"
    ...
  },

4. 実行

最後に実行して終わりです。

$ npm run deploy

まとめ

これからブログの記事を書いた時に、npm run deployとコマンドを入力しただけで反映されるようになりました。

非常にサーバーのアップロードが楽になったので、ブログの更新のモチベが上がりました。