Introducing sra: a Capistrano like deploy tool
April 29, 2016

前言

过去一年都在使用 ARS 做发布工具:SVN 提交、打开 ARS、找到上次的单子、选好自己要发的文件、问同事你的提交要不要发布…… 手动选择文件容易有失误,而且发布过程也有点久……

写过 Ruby on Rails 的同学都知道 Capistrano,很是怀念这种无脑发布(敲一个 cap deploy 就行),当然鹅厂的网络情况不允许我们这样干,于是春节在家用 Pyhton 造了这个轮子,原理很简单,就是在服务器上运行一个 Web Server,Client 发起部署与回滚的命令。

在造的时候考虑了以下几点:

  • 首先要考虑的是安全,必须只能监听内网地址,每次发布都需要输入密码
  • 安装方便,所以用了 Python + pip 来分发包
  • 学习成本要低:服务器和客户端都在同一个 pip 包,分别用 srad 和 sra 来代表服务器端和客户端
  • 因为服务器的网络环境可能很复杂,所以代码要从本地上传(比服务器访问 SVN 和 Git 要容易)
  • 理由同上,构建过程也要放在本地

所以,用一句话描述: sra 就是在服务器上运行一个常驻的 Web Server,客户端将项目构建好,然后打包上传给服务器,解压、软链、切换目录

使用示例

  • 部署: sra deploy
  • 回滚 :sra rollback
  • 指定环境部署, 例如生产环境部署 sra deploy production
  • 指定环境回滚, 例如生产环境回滚 sra rollback production

截个图

sra-deploy

Getting Started

服务器 srad

  1. 在服务器安装 pip install sra
  2. 启动 srad --host=内网ip --port=8080 --secret=YOURSECRET --daemon
  3. 创建目录(需要和 deploy.json 中的 deploy_to 相同)
  4. 在 deploy_to 中创建以下子目录: shared, releases, tmp

srad 启动参数说明

  • --host 监听地址,建议为内网IP
  • --port 监听端口,建议为8080
  • --secret 密钥,客户端在执行 sra deploy 与 sra rollback 需要输入该密钥
  • --daemon 进程会以守护进程启动, pid 会写入 /tmp/srad.pid,方便其他进程管理
  • --help 查看帮助

客户端 sra

  1. 客户端当然也要安装 pip install sra
  2. 在项目的根目录执行初始化 sra init, 生成 deploy.json
  3. 修改 deploy.json 以适合服务器与项目
  4. 部署 sra deploy
  5. 回滚 sra rollback
  6. 指定环境部署与回滚 sra deploy production

配置文件 deploy.json

在本地执行 sra init 后,会在根目录生成一个 deploy.json 内容如下:

{
  # 默认环境
  "default_stage": "staging",

  # 目标环境,可以有多组
  "stages": {

    # 环境名称,可自定义
    "staging": {
      "host": "127.0.0.1",
      "port": "8080"
    },
    "production": {
      "host": "127.0.0.1",
      "port": "8080"
    }
  },

  # 需要软链接的文件与目录
  "shared_paths": [
    ".env",
    "public/data",
    "data",
    "application/logs",
    "application/cache"
  ],

  # 部署目录
  "deploy_to": "/data/www/support.qq.com/",

  # 构建命令,可以为 git archive -o latest.zip HEAD 或者直接写一个 build.sh
  # 执行 sra deploy 时会执行该命令
  "build_command": "git archive -o latest.zip HEAD",

  # build_command 构建的文件名(建议将该文件加进 .gitignore 忽略)
  "package_filename": "latest.zip"
}

服务器目录结构

其实看懂目录结构

/data/www/example.com/     # 项目在服务器上的根目录
 |-  releases/             # 发布记录,每次发布就新建一个新的文件夹
 |   |- 1/
 |   |- 2/
 |   |- 3/
 |   '- ...
 |-  shared/                # 需要软链接的文件
 |   |- logs/               # 例如日志文件
 |   `- ...
 '-  current/               # 这是一个软链接, 链接到 releases 目录下的某个版本

总结

目前还只是一个很原始的小工具,很多方面可能都没有做到或者考虑到,未来也许还可以实现:

  • 更安全,将所有数据加密
  • 支持在服务器中写前置和后置脚本(例如重启 App Server)
  • 依赖更少,将没必要的依赖去除(目前用了 Tornado)
  • 服务器最好只要有一个 .py 文件就行,连 pip 都不需要(不过升级的时候怎么才能方便升级呢?)
  • 客户端支持 Windows(理论上是支持的,不过我没试过)
  • 单个环境支持多台机器

总的来讲,SRA 目前比较规模适合较小的 Web 应用(吐舌头)

欢迎大家试用 :D