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

layerssss · April 16, 2014 · Last by kgen replied at May 20, 2014 · 7268 hits
Topic has been selected as the excellent topic by the admin.

这个 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")

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

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

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

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

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

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

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

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

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

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

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

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

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

#8 楼 @kgen 现在有 ssl 了,

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

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

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

不错的样子。。。

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

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

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

谢谢大家的关注!

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

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

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

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

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

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

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

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

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

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

#25 楼 @layerssss 还有两个问题

  1. 增量传递貌似不起作用,每次都会上传所有文件
  2. 链接中有中文字符会报错,我已在 gitcafe 上提交了合并请求

#32 楼 @perrywky

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

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

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

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

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

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

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

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

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

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

@perrywky 俺 push 过去了~ 😄

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

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

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

You need to Sign in before reply, if you don't have an account, please Sign up first.