在小公司的一个不同就是啥活都需要会点,服务部署上线之类的事情也交由开发处理了,因为没有专门的运维同学..

之前上线的步骤如下,

  1. ssh remote server
  2. cd project_folder
  3. svn up
  4. django collectstatic (optional)
  5. django schemamigration (optional)
  6. django migrate (optional)
  7. restart uwsgi

后台服务构建在django之上,所以上面包含了collectstatic、schemamigration、migrate三步。collectstatic在有静态资源变动下才需要执行,schemamigration、migrate则是在django model有变化时需要执行。

正式接手上线操作这活一周多,反复上线多次后就觉得有点繁琐了,特别是上线之后还需要上线备份服务,于是自动化自然而然成了诉求。

fabric是之前在google reader上偶然看到的,花了一两个小时看了下其文档,写了个自动化的部署脚本,可以指定部署测试服务、备份服务、线上服务。

fabric需要实现一个fabfile.py,在其中定义具体的task。task的写法还是它的文档说得详细,几个小时实现的脚本还是很糙的,不过目前也够用了,

  @host(hostname)
  def deploy():
    cd(project_folder):
      svn_up_output = sudo('svn up')
      _do_collect_static(svn_up_output)
      _do_migration(svn_up_output)
      _do_restart_server()

fabfile.py是纯粹的python代码,所以写起来相对顺手。上面的deploy函数就定义了整个流程,具体每一步比如collectstatic是否执行就是通过解析svn up的输出来判定的,具体执行命令则是调用sudo、run函数。

fabric的好处就是能够远程执行对应的命令,同时在有命令行提示时,可以直接在本地console进行交互。

一旦自动化后就再也不想手动一个一个命令敲了,人是何其懒啊。