Skip to main content

Command Palette

Search for a command to run...

使用capistrano部署golang编写的二进制文件

Published
2 min read

前话

最近因为业余写golang(写了一个代理github/molisoft/rkproxy),所以最后部署的时候,难道我应该像以前一样找个(s)ftp(或者scp),然后上传二进制文件,然后ssh控制运行吗。。

1台服务器还好,5台,10台呢……厄运

所以还是考虑用自动化部署吧。

capistrano

cap(简称)是rails程序员们非常中意的自动化部署工具。

因为我工作中经常需要cap来自动化部署项目。

所以就简单介绍一下cap来部署golang部署的二进制吧。

初始化

首先当然是在golang项目下执行 cap install 来初始化

因为cap会将git仓库上传到远程服务器,其实golang是没必要的,golang需要的是将二进制文件丢到服务器上去。

但是目前没找到如何屏蔽git在远程拉取代码……先不管这个了,上传到远程服务器,也无公害。

自动化脚本

最重要的当然是 deploy.rb 的自动化脚本啦。

断断续续写了一周(工作狂,工作忙……)

首先定义各种文件路径,默认的配置等。

set :config_path, "#{shared_path}/config.json" set :pid_path, "#{shared_path}/rkproxy.pid" set :download_url, "http://baidu.com/rkproxy" set :bin_path, "#{shared_path}/rkproxy" set :default_config, ' "http_reproxy": [ { "local_port": 80, "server_host": "127.0.0.1", "server_port": 80, "name": "cdn-node" } ] } '

在创建好link files目录,上传默认的config文件:

namespace :deploy do after 'deploy:check:make_linked_dirs', 'rkproxy:config' end

然后主要的脚本:

namespace :rkproxy do

远程服务器下载最新版的程序

- 关闭rkproxy进程

- 启动rkproxy进程

desc "download rkproxy binfile" task :download do

编译、本地上传、远程下载

Dir.chdir(Dir.pwd) do

如果二进制文件的时间戳小于5分钟,则不进行编译

filepath = "./bin/rkproxy" need_update = true if File.exist?(filepath) need_update = false if (File.atime(filepath) + (60*5) ) < Time.now need_update = true end end

if need_update go build -o bin/rkproxy -ldflags "-s -w" curl -T bin/rkproxy http://v0.api.upyun.com/xxx/xxx -u xxx:xxx -v end end on roles(:app) do execute "wget #{fetch(:download_url)} -O #{fetch(:bin_path)}" execute "chmod +x #{fetch(:bin_path)}" end end

desc "upload config.json file" task :config do on roles(:app) do if test "[ -f #{fetch(:config_path)} ]" warn "config.json 已存在,无法上传覆盖" else upload! StringIO.new(fetch(:default_config)), fetch(:config_path) end end end

desc "delete config.json file" task :delete_config do on roles(:app) do execute "rm #{fetch(:config_path)}" warn "已删除config.json文件" end end

desc "restart rkproxy" task :restart do invoke 'rkproxy:stop' invoke 'rkproxy:start' end

desc "start rkproxy" task :start do on roles(:app) do unless test "[ -f #{fetch(:bin_path)} ]" invoke 'rkproxy:download' end execute "nohup #{fetch(:bin_path)} -c #{fetch(:config_path)} -p #{fetch(:pid_path)} > rkproxy.log 2>&1 &" end end

desc "stop rkproxy" task :stop do on roles(:app) do if test "[ -f #{fetch(:pid_path)} ]" execute "kill -9 cat #{fetch(:pid_path)}" else warn "未找到pid文件(#{fetch(:pid_path)})" end end end end

上面就是主要的一些脚本,当然,因为还没有其他的需求,目前只有这些功能啦。

之后应该还会加入进程监控啥。

因为考虑到机器会比较多的原因,所以这里rkproxy:download任务中,会编译二进制文件到bin目录下,然后上传到upyun,然后控制远程服务器从upyun下载二进制文件。

More from this blog

会有越来的多的side projects出现

什么是side project 可以理解为工作之余开发的产品,通常是收费的服务,可作为工作之外额外收入的产品。 在目前经济下行、公司开源节流(裁员)、失业率上升的大环境下,每一个程序员都应该拥有自己的side projects来对冲未来的不可靠风险。 所以side project 不仅仅是多一种「被动收入」,他也是你未来的「筹码」——工作累了,不想干了、有小孩了、买房了、家人生病了等等这些事情发生的时候,你可以「任性」一下。 而不是一些不可靠的风险出现的时候,再来提高自己的「抗风险」能力。 上面...

Jul 28, 20231 min read61

Xbox Cloud Gaming 游戏加速尝试

Xbox Cloud Gaming 游戏加速 之前有个很老的xbox游戏机,因为性能有点差劲了,所以卖了。 偶尔还是想玩玩游戏,但是老婆不让给买xbox的物理机(怀恋单身),所以含泪玩xbox cloud gaming(以下简称 xcg),xpg会员游戏还是很丰富的。 于是买了uu加速器,坦白说uu加速器不算便宜的,但是xcg在晚上高峰期,一样卡得怀疑人生,那种被马赛克糊满脸的感受,上一次这种体验还是看小姐姐的电影。 其实用uu加速器玩是ok的,就是国内的网络情况大家都知道,dddd(懂得都懂)...

Sep 5, 20221 min read258

github codespaces 在ipad上的最佳浏览器

Github Codespaces github codespaces 是github在被微软收购后,提供的一款在线web IDE,基本与vscode一致,只是运行在浏览器上而已。 而且非常土豪的提供了4核8G内存,微软就是壕。 so,通过ipad来使用codespaces就是一件比较顺其自然的事。 可是其实也没那么简单。。 IPad使用codespaces的快捷键问题 其实最大的问题就是快捷键的问题,不管你是用saferi,还是chrome,他们提供的快捷键或多或少会与你的vscode的快捷键...

Oct 8, 20211 min read59

基于binlog检查数据错误

起因 某个表的 status 「莫名其妙」变成 0 了 其实可以判断出是 status 没有被赋值,通常是结构体的 status 默认是 0 才会被插入数据库。 于是问题看起来就很简单了:只要检查相关的更新操作中的 status 字段有没有被赋值即可。 但是 这个表是用户表。 因为历史原因,源码中的更新函数很多 调用更新函数的地方也很多 无法复现该问题,测试人员也不知道做了什么操作状态变成 0 的 所以同事关注这个问题挺久了,也没看到问题原因(当然我也没看到……) 但是恰好我在做导出 bin...

Aug 5, 20212 min read61
M

Moli'blog

64 posts

曾经的少年还在吗?

使用capistrano部署golang编写的二进制文件