产品推广 為什麼要 Bundle Update?

juanito · 2015年10月10日 · 最后由 humiaozuzu 回复于 2015年10月17日 · 6365 次阅读
本帖已被管理员设置为精华贴

為什麼要 Bundle Update?

bundle-update(1) 可以更新所有的 Gem 至兼容的最新版本。

首先先說說...

為什麼要升級?

  • 新版本修復了更多 Bugs
  • 新版本效能更好
  • 維護者通常只對新版本的 Bug 感興趣
  • 預防勝於治療
  • 減少技術負債

為什麼 Rails 4 升級至 Rails 5 這麼難?

因為哥你兩年才升級一次,很多 Gem 都太老了,一次全升級,每個 Gem 不兼容一點點,加起來全敗了。

語義化版本

語義化版本定義了一個版本命名的規範,幾乎所有的 RubyGem 都遵循這個規範。

4.2.4 - MAJOR.MINOR.PATCH

MAJOR 版本更新會壞,,向下不相容。 MINOR 版本通常是發佈新功能,向下相容。 PATCH 版本通常是修復 Bugs,向下相容。

=>

rails 4.2.4 升級至 4.2.5,OK! rails 4.2.4 升級至 4.3.0,Should be OK! rails 4.2.4 升級至 5.0,break!

了解了語義化版本之後...

Gem 作者不採用語義化版本怎麼辦?

堅決拒用或是說服他!

怎麼鎖定版本號?

有三種鎖定方式:

進擊型 >=

>= 2.0 表示 >= 2.0

中庸型 ~>

~> 2.0 表示 >= 2.0, < 3 ~> 2.0.0 表示 >= 2.0.0, < 2.1

防禦型 4.2.4

"4.2.4" gem 版本會固定在 "4.2.4"

鎖定版本號的缺點

當有安全性發佈時,鎖定版本號讓你無法升級至已經修復的版本。

你先前說兼容的最新版本?

Gem 彼此之間有依賴關係,bundle update 會找到你的專案彼此兼容的版本,進行“升級”。

“升級”?

bundle update 不一定會更新到新版...

有可能某個 Gem 會降版,因為 bundle update 要確保所有更新的版本都兼容。

有人說...

Monkey Patch 一下就好了阿

這樣就得自己維護 Gem,時常跟進上游的更新,成本高。

有些東西升級不能壞

鎖定版本號或是升級後,自行檢查並對代碼進行相應的修正。

看你講了這麼多,怎麼 bundle update,能示範下不?

$ cd project
$ git cehckout -b bundle-update-20151006
git: 'cehckout' is not a git command. See 'git --help'.

Did you mean this?
  checkout
$ git checkout -b bundle-update-20151006
$ bundle updaet
Could not find command "updaet".
$ bundle update
$ git add Gemfile.lock
$ git comit -m "Bundle update on 2015.10.06"
git: 'comit' is not a git command. See 'git --help'.

Did you mean this?
  commit
$ git commmit -m "Bundle update on 2015.10.06"
git: 'commmit' is not a git command. See 'git --help'.

Did you mean this?
  commit
$ git commit -m "Bundle update on 2015.10.06"
$ git push origin master
Go to GitHub, click "Create Pull Request"
fill in title
fill in description
click "Create Pull Request"

一次大約十分鐘,以我一個時薪 60 美元的程序員來說,成本大約是 10 美元!

等我有空再 bundle update 好了

那就是永遠不會升級啦!所以我們要自動讓計算機幫我們做這件事,省時省心省錢。

為什麼要自動化

自動由服務提供 bundle update提早發現問題

自動化 bundle 服務

試試看 Gemnasium 現在推出的自動 bundle update 的功能,Pull Request 看起來像是這樣:

Gemnasium-PR-looks-bad

哇!不錯哦,乔布斯你怎麼看?

Steve Jobs hates stylus

...Yikes!

P.S. Gemnasium 這個單字我老是拼不對!

有沒有好一點的服務?

可以試試看這個服務:https://www.deppbot.com

https://www.deppbot.com

deppbot Pull Request example

  • 開源項目永遠免費 🍻私有項目僅收 5 美元!

deppbot pricing

苟日新,日日新,又日新,你今天更新了嗎?

即刻 bundle update ⚡⚡⚡

--

註 1. 有測試再 bundle update

註 2. 任何建議與反饋歡迎留言 ❤ 💛 💙 💚 💜

很多时候其实是无法太确定升级一定没问题,怕回归测试、怕风险,尤其是在重要的生产环境项目。

基本上以前的升级周期都是 Rails 发新版本的时候,顺带一起升级一下其他的 Gem。

所以....还是更新需要的 gem 吧.....比如 bundle update XXX

嗨!恕我冒昧,我也是 deppbot 的其中一位工程师。与其说是要推广 deppbot,其实更是想要推广积极升级的 practice. 😄

#1 楼 @huacnlee

以前的升级周期都是 Rails 发新版本的时候,顺带一起升级一下其他的 Gem

这样子风险不是更大吗? 因为在升级 Rails 的当下,可能也有很多的 Gems 也一起被升级,那如果有任何状况,不是更难找到 root cause 吗? 个人经历这样子是会耗上更多时间。。

再问一个问题:你在升级 Rails 的时候有做哪些检查来降低风险和避免测试回归吗? 是有某些特别的检查会让你觉得 manual update 比较安全吗?


之前,我也写了一篇博文在这里 https://github.com/jollygoodcode/jollygoodcode.github.io/issues/3 供大家参考。

谢谢!😄

好像不错,尝试一下。

我们的做法是必须锁定版本号到 patch version。除非有 bug 或者性能更新的必要才手动调整版本号并且仔细检查,bundle update 是绝对不敢用的。

#3 楼 @winstonyw 对,但那个时候能学到东西,虽然有点麻烦

#5 楼 @billy 曾经我也是这样的做法。不过如果有任何 gem 跳 major version 时(譬如 Rails),还是造成很多困扰。

所以目前为止还是觉得:如果案子是在继续着,最好还是积极升级。 如果升级的 gem 真的有问题,才会在 gemfile 锁定 gem 的 version,再加上 comments。

当然,每一个团队都有不同的做法。感谢大家的讨论!🙇

#5 楼 @billy 这太夸张了,我和你完全相反,每天都做 bundle update,因为应用始终跑在最新版。。

这里的 bundle update 为什么从来不提 test 的事情呢?我个人觉得在生产环境代码需要 update 时,最好有 test 代码去帮助人检查一些曾经检查过的点。

不过话说回来,似乎这里也很少讨论 test 怎么写和维护的问题。

@billy

这边做法是锁定到具体版本号,防御型。每天多次运行 bundle update,暂时没发现问题。

各 gem 版本更新一般发生在:

  1. 引入新的 gem;
  2. 遇到问题或错误,需要更新其 gem 至新版本;
  3. 定期运行 bundle outdate,评估哪些 gem 需要更新;

各 gem 版本变更后,继续锁定到具体版本号。

#9 楼 @bluecoda Test 当然很重要!如果没有任何 tests,我也不建议做任何的 bundle update。

如果已经每天都在做 bundle update,可是试一试 deppbot,让我知道你的反馈。谢谢!

#11 楼 @winstonyw 我就是天天 bundle update,但是,恩,恕我直言,感觉 deppbot 这门生意很难收到钱,因为无法帮助我了解每个 gems 的更改情况,升级了,我肯定还是会第一时间看 gem 的 changelog,然后按照相应指示改代码或者跑测试(实际上是开发时候顺便跑),总之,真的不觉得麻烦,还能顺便刷个论坛呢。。

#12 楼 @ericguo

感觉 deppbot 这门生意很难收到钱

的确。只是个 side business。我的定义是 deppbot 比较像是个 Practice as a Service 而不是 Software as a Service。 真正在“卖”的是”Update Early. Update Often”的 Practice。

如果大家都跟你一样有做 bundle update 的习惯,也就可以让 deppbot 退休了。

因为无法帮助我了解每个 gems 的更改情况,升级了,我肯定还是会第一时间看 gem 的 changelog

不过说真的,deppbot 能够更快速的让你看 changelog,或 GitHub Compare View。 https://github.com/ruby-bench/ruby-bench-web/pull/123

好了,不说了哈哈。像是在卖膏药一样。😄

还在用 3.x 的飘过..

其实还有更惨的,ree -> ruby2, rails3 -> rails4

抛开上下文讨论这些问题都是耍流氓。。。 团队规模有多少,应用对安全的要求高不高,网站的请求有多少,这些才是考虑的嘛

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