node-sshを導入してNuxtのデプロイ作業を自動化する
経緯
このブログはNuxtで作成しているので、いつもはnpm run generate
で静的ファイルを出力させたあとに、sshでサーバーに手動でファイルをアップロードしています。
これらの作業が面倒くさいので、node-ssh
を使って自動化することにしました。
npm run deploy
を実行したら、①npm run generate
と②サーバーのアップロードを行うことがゴールです。
node-sshとは?
node-sshはssh2の軽量なラッパーです。すなわち、Node.js用のSSHを通信するためのnpmのパッケージです。
node-sshを使って自動化する
1. node-sshのインストール
まずは、次のコマンドを実行してnode-sshをインストールします。
npm install node-ssh --save-dev
2. アップロードする処理の記述
node-sshのドキュメントを読みつつ、サーバーに接続してアップロードする処理を記述しました。
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
をしてからサーバーのアップロードをしたいので次のように記述します。
"scripts": {
...
"deploy": "nuxt generate && node ./src/ssh/upload.js"
...
},
4. 実行
最後に実行して終わりです。
$ npm run deploy
まとめ
これからブログの記事を書いた時に、npm run deploy
とコマンドを入力しただけで反映されるようになりました。
非常にサーバーのアップロードが楽になったので、ブログの更新のモチベが上がりました。