Gem 使用又拍云的 API 将 Assets Pipeline 发布到 upyun

layerssss · 发布于 2014年4月16日 · 最后由 kgen 回复于 2014年5月20日 · 4266 次阅读
96
本帖已被设为精华帖!

这个 gem 是又拍云这个开发者大赛的作品,在这里投票啊小伙伴们 >_>: http://upyun.gitcafe.com/projects?category=plugin

故事是这样的:

以前,我一直用 lftp 来自动上传我们的静态资源到又拍云上去

直到有一天我看到这个家伙做了一个很骚的东西

看着这玩意儿我瞬间感到一股共鸣感,于是豪气一发,从我们公司的 ci 里随便拉出了一段日志,直接在 GitHub 的界面上帖给了这货

贴完之后我站起来伸了个懒腰,淫荡的一天又过去了 XD ……突然我虎躯一震,赶紧会过头去看我贴的那段日志:

我们的 UpYun 操作员密码俨然以明文留在里面

而且我们发布用的操作员密码和主账户的密码是一样的,于是我赶紧把这俩密码都给改了,然后就是各种小伙伴被惊醒:

经过这件事,我学到了一个道理:不要随便把自己的日志贡献给别人……

哈哈哈哈哈好吧,不过用明文的 ftp 来做事情也确实不安全(也不快,还要经常求防火墙放行我们可怜楚楚的数据连接),既然 UpYun 有提供一个带摘要授权又是基于 HTTP REST 的 API,咱就从了呗,大家来看看俺的作品吧:

rails-assets-for-upyun

把预编译好的静态资源发布到又拍云上(用rake

用法

  1. Gemfile 里引用我: gem 'rails-assets-for-upyun', '>= 0.0.3'
  2. 首先设置好在生产环境中调用 UpYun 上的资源
# .. config/environments/production.rb
..
# Enable serving of images, stylesheets, and JavaScripts from an asset server.
config.action_controller.asset_host = "awesome-bucket.b0.upaiyun.com"
..
  1. Rakefile 里添加一个任务(起一个最酷的名字!)
namespace :assets do
  task :publish_my_holy_shinning_precompiled_miraculous_assets_to_the_almighty_upyun do
    RailsAssetsForUpyun.publish 'awesome-bucket', 'notjustausername', 'thencomesthepassword'
  end
end
  1. 然后你就可以在每次发布前(rake assets:precompile之后)运行一遍这个 rake 任务把他们同步到又拍云上去了。

卖点

  • 调用 UpYun 提供的 API 进行增量发布,通过 HTTP 通讯,比 FTP 更加稳定、快速
  • 使用 UpYun API 提供的签名授权,不明文传送密码,更加安全!

详解

RailsAssetsForUpyun.publish(bucket, username, password, bucket_path="/", localpath='public', upyun_ap="http://v0.api.upyun.com")
共收到 45 条回复
818
ichord · #1 · 2014年4月16日 1 个赞

投票地址应该是这个吧: http://upyun.gitcafe.com/projects?category=plugin

96
layerssss · #2 · 2014年4月16日

#1楼 @ichord 是的~ 感谢小伙伴支持~ *{*

96
layerssss · #3 · 2014年4月16日

#1楼 @ichord 其实我刚刚才发现我选错分类了,应该是sdk 类才对

818
ichord · #4 · 2014年4月16日

@layerssss 有空也写篇 ansible + jenkins + rails 整套自动化东西的分享. 这套东西很 cool 的.

96
layerssss · #5 · 2014年4月16日

#4楼 @ichord 😢 自动化做得再好,还是撞上那堵大墙。 桑感~~

818
ichord · #6 · 2014年4月16日
2019
neverlandxy_naix · #7 · 2014年4月16日

哈哈, 从那个很骚的东西中发现 turingou 是个很有趣的人

370
kgen · #8 · 2014年4月16日

不知道 upYun 的资源现在支持 https 访问没,之前放弃他家资源就是因为不支持 https

5255
allenfantasy · #9 · 2014年4月17日

turingou非常好玩,那个豆瓣FM命令行版就是他折腾出来的~

162
quakewang · #10 · 2014年4月17日

又拍现在不是已经支持镜像空间了吗?直接用本机做asset源,又拍做CDN就好了,不需要额外上传。

2
huacnlee · #11 · 2014年4月17日

#10楼 @quakewang 镜像空间?连接发来看看,没找到

2
huacnlee · #12 · 2014年4月17日

#8楼 @kgen 有 SSL 了

162
quakewang · #13 · 2014年4月17日

#11楼 @huacnlee 创建空间的时候选择CDN类型,后续就可以配置源的域名和IP了

2
huacnlee · #14 · 2014年4月17日

#13楼 @quakewang 搞一个试试,每次发布的时候 FTP 过去累死了

96
layerssss · #15 · 2014年4月17日

@quakewang 又拍 cdn 是挺好的,不过要求源服务器延迟<100, 放在国外服务器上的小站基本上通不过验证

96
layerssss · #16 · 2014年4月17日

@quakewang 又拍 cdn 是挺好的,不过要求源服务器延迟<100, 放在国外服务器上的小站基本上通不过验证

96
layerssss · #17 · 2014年4月17日

#8楼 @kgen 现在有 ssl 了,

162
quakewang · #18 · 2014年4月17日

#16楼 @layerssss 原来如此...

btw, 这个比赛好像参加人不多呢,在想要不要去试试手气,混个奖什么的,可是看了一下他的选题,没什么好玩的idea

96
layerssss · #19 · 2014年4月17日

#18楼 @quakewang 😄 是啊,僧少粥多啥的,, 嘿嘿嘿嘿嘿

9800
pynix · #20 · 2014年4月17日 1 个赞

不错的样子。。。

2
huacnlee · #21 · 2014年4月17日

测试结果不达标,绑定失败!

1394
upyun · #22 · 2014年4月17日

#18楼 @quakewang 参赛选题包括但不限于我们提供的选择,欢迎参加!

其实目前已经有几百人报名了,比赛开始才第四天,已经提交了35个作品了,人气也不算太差,也欢迎大家指出不足的地方,便于我们及时改正。

谢谢大家的关注!

96
perrywky · #23 · 2014年4月17日

我使用的时候会报错 uninitialized constant RailsAssetsForUpyun

require "rails-assets-for-upyun" 则会报 cannot load such file -- rails-assets-for-upyun

1394
upyun · #24 · 2014年4月17日

#21楼 @huacnlee 华顺,一般如果测试不达标,可能存在以下几个问题:

  1. 源站的带宽太小,检测不合格:如果有测速结果显示,比如50KB/s之类的,会是这种情况
  2. 测试文件访问不到:测试结果会一直显示”Loading“,然后错误提示,一般是测试文件无法访问:1)测试文件没有上传 2)不是放在根目录下 3)服务器端口限制,默认路径无法访问

你看下是否存在以上问题。谢啦。

96
layerssss · #25 · 2014年4月17日

#23楼 @perrywky 😱 sorry, 我打包时还没 git add, 所以发了个不完整的 gem, 现在可以了, 用gem '......', '>= 0.0.2'

2
huacnlee · #26 · 2014年4月17日

#24楼 @upyun 120K

162
quakewang · #27 · 2014年4月17日

#26楼 @huacnlee 我记得文档上有说不能小于150K/S还是200K/S来的...

2
huacnlee · #28 · 2014年4月17日

#27楼 @quakewang 是 150K,应该是又拍到 Ucloud 慢,我试过那个下载,速度都有 300K 以上

370
kgen · #29 · 2014年4月17日
8326
hlt · #30 · 2014年4月18日

问题是,upyun cdn分发的要求。。。5MB 北京BGP 全国都20-30PING,还通过不了。。。

96
perrywky · #31 · 2014年4月20日

的确,刚问了客服,一般要求有6M带宽

96
perrywky · #32 · 2014年4月20日

#25楼 @layerssss 还有两个问题

  1. 增量传递貌似不起作用,每次都会上传所有文件
  2. 链接中有中文字符会报错,我已在gitcafe上提交了合并请求
96
ruohanc · #33 · 2014年4月20日

#32楼 @perrywky

上传所有文件的原因是文件名也改变了吧(因为 Rails 生成的 assets 文件名里面带 checksum)

96
perrywky · #34 · 2014年4月20日

#33楼 @ruohanc 没带checksum的也上传了

96
layerssss · #35 · 2014年4月20日

sorry, 是我犯的一个错误,现在已经在 0.0.3 里修正了 https://github.com/layerssss/rails-assets-for-upyun/commit/318b43858c28806b01a8c1db2335664d64aa293c @ruohanc @perrywky 感谢试用, bundle update rails-assets-for-upyun 把它升级一下再试试吧

96
ruohanc · #36 · 2014年4月20日

#35楼 @layerssss -,-...其实没试用,,就是看了下你的代码....你的有个花括号写的我快觉得我在看 js 代码了.

另外是否考虑下用 ETAG 啊, upyun 应该支持 etag 方式的吧, 用 size 比较非主流. 简单说就是 header 里面加上 "If-None-Match: ", 返回 304 就不用更新了. 参考

96
layerssss · #37 · 2014年4月20日

@ruohanc 是的,用 size 也没办法保证里面内容是一样的(很可能尺寸一样但是内容不一样),但是又拍云的 HEAD 请求没有返回 etag,估计也是为了性能而省去它了;不过 assets pipeline 文件名里有 hashtag 所以倒不怕。

如果又拍云 API 的HEAD请求结果头中能加上类似于 etag 的文件哈希值的话,就能做出和 rsync 效率一样的通用同步工具了 @upyun

96
ruohanc · #38 · 2014年4月20日

#37楼 @layerssss 我现在遍历一遍 oss 上的 gems 列表(44W个)要十分钟.....

我的意思是作出 rsync 效率一样的通用同步工具是个笑话........ rsync 岂是一般工具能胜任的咩哈哈..

96
perrywky · #39 · 2014年4月21日

#35楼 @layerssss 我是在gitcafe上提交的合并,竟然在github上也有记录,数据互通了?

96
layerssss · #40 · 2014年4月21日

@perrywky 俺 push 过去了~ 😄

9800
pynix · #41 · 2014年4月23日

上传了以后怎样优雅的使用。。。

96
layerssss · #42 · 2014年4月26日

#41楼 @pynix 怎么调用吗? 设置 config.action_controller.asset_host = "awesome-bucket.b0.upaiyun.com" 便是告诉 rails 去这个域名上调用静态资源了~

9800
pynix · #43 · 2014年4月26日

#42楼 @layerssss 原来如此。

10274
mario_33 · #44 · 2014年5月20日

#8楼 @kgen 目前是已经支持https的,单个空间使用免费,多个空间需要购买服务~

370
kgen · #45 · 2014年5月20日

#44楼 @mario_33 谢谢 😄

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册