简介
记录如何通过使用Alfred来简化自己的工作流。
需求
在公司需要负责维护几个网站的后台,测试服和正式服都是在阿里云,然后还有个SVN服务器。每次修改完代码都需要进行以下操作(在不考虑新增文件或出现冲突的前提下):
1.使用CornerStone更新某个项目代码;
2.使用CornerStone提交修改了的代码;
3.打开iTerm,SSH到服务器;
4.输入服务器密码;
5.cd 项目路径;
6.对服务器进行代码更新(第一次可能需要再次输入密码);
以上操作速度快的话差不多需要30秒,每天至少进行15次以上这样的操作,特别是开发新功能时更是繁琐。浪费时间不说,还及其影响工作心情。可能前一秒思路还在,做完这些操作都不知道怎么继续敲下去了。于是针对这一过程,进行了一点优化。
目标
在Alfred中输入 up 项目名 p(可选,区分测试服和正式服)即可一次性完成所有操作。
Workflow最终效果
初步优化(未使用Alfred)
使用CornerStone快捷键
针对需求中的1、2两条,CornerStone中可以使用Command+U(更新),Command+T(提交)进行操作。但是当从别的程序切换到CornerStone中时会出现失去焦点无法自动选中需要更新的项目,需要手动点击项目后才能使用快捷键;
设置.ssh配置文件
正常情况下ssh到服务器的命令为: $ ssh name@ip,但是通过配置~/.ssh/config文件可以达到使用 $ ssh xxx来连接服务器,配置如下:
使用expect脚本+iTerm实现SSH免密登录
但是这样做还是需要密码,于是继续查找了一下找到了可以让iTerm自动SSH的expect脚本。将该脚本(后面会提到此脚本)放入/usr/local/bin下,配置iTerm即可通过快捷键一键登录对应服务器(此脚本需要四个参数,依次为端口号、用户名、ip、密码)。配置如下:
进一步优化(使用Alfred)
分析
整个更新操作可以分为以下三部分:
1.根据所给项目名以及环境获取对应服务器的ip、账号以及密码 - 使用Alfred进行参数筛选转化;
2.更新、提交本地代码到SVN - 使用bash脚本进行更新、提交;
3.SSH到服务器更新代码 - 修改之前用到的expect脚本进行SSH连接及更新操作;
Step1 - 使用Alfred进行参数筛选转化
a.Alfred配置
首先打开Alfred新建一个空白的Workflow,根据最开始我们的目的(通过关键字来调用对应的Workflow),所以在工作区新建一个Triggers-Hotkey并双击打开新建的Hotkey,设置关键字等信息。
b.编写脚本
我们需要完成的是当在Alfred中输入up name(测试服)或up name p(正式服)时自动SSH到指定项目对应的服务器进行代码更新。这一步我们需要根据所给的参数,也就是name和[p]来生成对应服务器的地址、账号以及密码作为参数传入下一步进行登录及更新的脚本中。流程如下图所示:
Alfred中可以指定PHP,JS,Python,Ruby,AppleScript等脚本语言,我使用的是PHP读取本地JSON文件(将服务器地址,账号,密码事先写成JSON即可)。
以下为脚本代码及JSON文件:
到这里就可以获得SSH登录及更新脚本的路径以及所需参数,例如输入up yg p,此时的输出为:/Users/yanhao/Documents/Coding/Script/Server/update_server.sh root password 192.168.1.1 /var/xxx/xxx/yg。
现在只需要在终端中执行此脚本即可。在PHP脚本后新建Action-Terminal Command,并直接执行刚刚输出的参数。如图:
至此针对第一条的优化已完成。
Step2 - 使用bash脚本进行更新、提交
在这一步中遇到了点麻烦,在不考虑代码冲突或提交新文件的情况下的bash脚本比较简单。但是如果要考虑冲突和提交新文件等情况情况就变得比较复杂了,等有时间再进一步优化此过程,目前暂时还是使用CornerStone快捷键进行操作。
Step3 - 使用expect脚本进行SSH连接及更新操作
Expect is a tool for automating interactive applications such as telnet, ftp, passwd, fsck, rlogin, tip, etc. Expect really makes this stuff trivial. Expect is also useful for testing these same applications. And by adding Tk, you can also wrap interactive applications in X11 GUIs.
引用自:Expect官网
由于之前没有学过bash,zsh等脚本语言,对Expect更是不懂,所以这里也就不敢乱说了,免得误导大众。下面是修改后的Expect的脚本:
这个脚本需要四个参数,依次为username,password,ipaddress以及project path,在Step1中已经拼接好了脚本所在路径以及对应的参数,调用此脚本即可直接ssh到服务器,并且进入对应路径进行更新操作。
总结
1.终端中如何知道某个命令已完成,并且根据完成的状态进行不同的操作。
使用Expect。
2.服务器密码中含有特殊字符$如何处理?
直接使用\$即可,网上查了用\\$或者\\\$测试都是错的。