免SSH登录的jekyll发布部署

首先得感谢bandwagon提供了有趣的KiwiVM作为后台管理,更厉害的是提供了基于REST API的远程操作接口(虽然如果泄漏了私有token后果不堪设想)。

前置条件:

  • 硬件
    • Bandwagon的全自助主机
    • jekyll(版本3.3.1,ruby 2.4.0rc1 (2016-12-12 trunk 57064) [i686-linux])
    • SSH登录
  • 技能
    • 基本linux
    • 会用google(其实并不简单)
    • 一点点网页前端知识

bandwagon提供的API可以在KiwiVM的面板看到,这里不多赘述。不过API的使用说明给的极其简单,搜遍全网也没有一个系统的带案例讲解。主要有几点:

  1. VEID应该是每个人的主机实例编号,或者是主机编号,应该可以公开;
  2. API Key是每个人自己主机的token,万万不可公开,不然就和root密码被盗一个后果
  3. $request = "https://api.64clouds.com/v1/getServiceInfo?veid=462000&api_key=YOUR_API_KEY_HERE";

中的getServiceInfo代表需要执行的命令,比如basicShell/cd或者shellScript/exec等等,其中斜杠/不需要转义;

  1. 如果是带参数的命令,比如basicShell/cd这种有两个参数currentDirnewDir,则在$request的问号后增加currentDir=/home&newDir=/home/sandbox

e.g. https://api.64clouds.com/v1/basicShell/cd?currentDir=/&newDir=/home/sandbox&veid=462000&api_key=private_xxxxxxxxxxxxxxxxxxxxxxxx

  1. 如果要测试,可以用诸如http://coolaf.com/tool/gp打包测试POST/GET的网站,或者直接把$request后面的网址敲到浏览器里(Chrome测试通过);
  2. 经过发ticket确认使用API无法记录状态,也就是basicShell/cd只能用来查看目录是否存在而无法真实进入该目录,这将限制使用basicShell/exec运行ls等命令的效果;
  3. 于是,目前的策略是,使用shellScript/exec才有实际意义。

基于以上慢慢趟雷得出的成果,我们可以发一条POST或者用浏览器浏览一个网址就编译jekyll的文章啦!

#!/bin/sh
myname="wellsleep"
echo $myname

echo "entering /blog folder"
cd ../home/blog

jkpath="/usr/local/rvm/gems/ruby-2.4.0-rc1/wrappers/jekyll"
echo "jekyll rebuild:"
$jkpath build --destination /usr/share/nginx/html

需要注意的是,直接使用ssh端的命令并不好使。默认的jekyll命令是一个“快捷方式”,在安装jekyll的时候自动设置。而用API方式执行的时候没有执行该“快捷方式”的用户设置,所以需要到其二进制本身的目录去执行。根据这里的解释jekyll命令运行时会调用ruby_executable_hooks等一系列其他二进制文件,所以用type jekyllwhich jekyll得出的路径并不能保证编译成功。按文中所述把bin改成wrappers后,一举拿下。

把shell脚本命名jkbuild.sh存在usr/bin/目录下,需要编译jekyll的时候,在浏览器运行https://api.64clouds.com/v1/shellScript/exec?script=jkbuild.sh&veid=462000&api_key=private_xxxxxxxxxxxxxxxxxx即可。

每次远程运行API都会在~/.kiwivm-task/taskfile-result-xxxxxxxxxx-xxxx.log留下log,可以前去查看是否成功运行。

至此,jekyll部署上的坑,应该是都趟完了,可以安心开始慢慢写文章,了吧。

Comments
Write a Comment
'