Hexoはブログを書くのになかなか便利なツールなのですが、デプロイするのがちょっと面倒です。

bash
1
2
3
4
$ hexo clean
$ hexo server
$ hexo generate
$ hexo deploy

キャッシュを削除して、サーバーを立ち上げて、静的サイトを生成して、最後にデプロイ…。この処理間も結構時間が掛かります。そこで、今回はAutomatorを使って、上記のコマンドを自動化してみました。

Automatorを使ったコマンドの自動化については別の記事で詳しく解説していますので、こちらをご覧ください。

Hexoデプロイを自動化してみる

早速ですが、hexoで自動デプロイするためのAppleScriptを次のように書いて、Automatorで実行してみました。

auto-deploy.jsa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102

var sys = Application("System Events");

function run(input, parameters) {

// Your script goes here
var cdm = "cd \"$HOME/Desktop/web/hexo\"";
var nvm = "nvm use 4.3.0";

var Terminal = Application('Terminal')
Terminal.activate()
var terW1 = Terminal.windows[0]
try{
console.log(terW1.selectedTab.properties())
}catch(e){
Terminal.doScript("echo 'Hi terminal window 1'");
terW1 = Terminal.windows[0]
}
waitDelay(terW1)

Terminal.doScript( cdm , {in: Terminal.windows[0]} )
waitDelay(Terminal.windows[0])
Terminal.doScript( nvm , {in: Terminal.windows[0]} )
waitDelay(Terminal.windows[0])
Terminal.doScript( "hexo clean" , {in: Terminal.windows[0]} )
waitDelay(Terminal.windows[0])
Terminal.doScript( "hexo s" , {in: Terminal.windows[0]} )
//waitDelay(Terminal.windows[0])
delay(600)
press("^c")
delay(120)

Terminal.doScript( "hexo generate" , {in: Terminal.windows[0]} )
waitDelay(Terminal.windows[0])
Terminal.doScript( "hexo d -g" , {in: Terminal.windows[0]} )
waitDelay(Terminal.windows[0])

return input;
}

// 直前のターミナルコマンドが完了するまで待機する
function waitDelay(inTerminalWindow){
delay(1)
while( inTerminalWindow.selectedTab.busy() ){
delay(1)
}
}


var key_codes = {
"→": 124,
"←": 123,
"↑": 126,
"↓": 125,
"⏎": 36
};
var modifiers = {
"⌘": "command down",
"^": "control down",
"⌥": "option down",
"⇧": "shift down"
};


// hot key helpers
// code by https://gist.github.com/jiaaro/c95e89ea5cacc6906040
function press(hotkey) {
var using = [];

while (hotkey.length > 1) {
if (modifiers[hotkey[0]] == undefined) {
throw new Error(hotkey[0] + " is not a recognized modifier key");
}

using.push(modifiers[hotkey[0]]);
hotkey = hotkey.slice(1);
}

if (key_codes[hotkey] != undefined) {
sys.keyCode(key_codes[hotkey], {using: using});
}
else {
sys.keystroke(hotkey.toLowerCase(), {using: using});
}
}
function type(text) {
for (var i=0; i < text.length; i++) {
sys.keystroke(text[i]);
}
}
function menu_item() {
if (!arguments.length) return;

var process = sys.processes.whose({"frontmost": true})[0];
var menu_bar = process.menuBars[0].menuBarItems[arguments[0]];

var menu_item = menu_bar;
for (var i=1; i < arguments.length; i++) {
menu_item = menu_item.menus[0].menuItems[arguments[i]];
}
menu_item.click();
}

このように書いて、最後にiphoneやAndroidへデプロイ完了の通知を送ることもできます。

iphone notification | Sony a7RII + SIGMA 35mm F1.4 DG HSM
 iphone notification | Sony a7RII + SIGMA 35mm F1.4 DG HSM ©

通知方法についてはこちらをご覧ください。