Build thử Ruby 2.5 với Docker
Ruby 2.5.0 được ra mắt bản chính thức vào dịp giáng sinh năm ngoái và được phát hành bởi nhiều công cụ quản lý version quen thuộc như -- rvm, rbenv, chruby, homebrew và hôm nay chúng ta sẽ sử dụng một công cụ mới và phổ biến khác đó là Docker. Về Docker chắc hẳn các bạn đã nghe về nó và sự tiện lợi ...
Ruby 2.5.0 được ra mắt bản chính thức vào dịp giáng sinh năm ngoái và được phát hành bởi nhiều công cụ quản lý version quen thuộc như -- rvm, rbenv, chruby, homebrew và hôm nay chúng ta sẽ sử dụng một công cụ mới và phổ biến khác đó là Docker. Về Docker chắc hẳn các bạn đã nghe về nó và sự tiện lợi mà nó mang lại rồi. còn nếu ai chưa biết thì có thể tham khảo thêm google. Docker được sử dụng ở tất cả các khía cạnh sản xuất, thử nghiệm hoặc phát triển sản phẩm. trong bài viết này chúng ta sẽ nghiêng về khía cạch phát triển hơn. khi một phiên bản mới ruby được phát hành để có thể vọc những tính năng mới nhưng lại k muốn mạo hiểm cài đặt quản lý những phiên bản có sẳn thì Docker là một lựa chọn thuận tiện nhất để làm công việc này. Bằng cách sử dụng Docker, chúng ta có thể xóa image khi chúng ta hoàn tất. Không phải ai cũng có thể chuyển sang phiên bản Ruby mới nhất ngay lập tức. Với phương pháp này, chúng ta có thể thử Ruby 2.5.0 mà không cần phải cài đặt vĩnh viễn.
Đầu tiên chúng ta kéo một image ruby từ Docker Hub
docker run -it --rm ruby:2.5
Nếu đây là lần đầu tiên bạn chạy lệnh, Docker sẽ kéo image từ từ trên docker hub về và khi câu lệnh được được thực hiện xong, nó sẽ bắt đầu là một chương trình mặc định. Trong trường hợp này là irb.
Unable to find image 'ruby:2.5' locally 2.5: Pulling from library/ruby 723254a2c089: Pull complete abe15a44e12f: Pull complete 409a28e3cc3d: Pull complete 503166935590: Pull complete 0f46f97746e4: Pull complete 9d641d922d2f: Pull complete 891f591c9621: Pull complete 825fab4554b7: Pull complete Digest: sha256:090577ac73868da6c74a2c5d716e67189e8f6c597b1d4bfbe61e8a68c829c02e Status: Downloaded newer image for ruby:2.5 irb(main):001:0> RUBY_VERSION => "2.5.0"
Đã xong bây giờ bạn có thể thử nhưng tính năng mới trên ruby 2.5 rồi đấy Ví dụ: ví dụ chúng ta có thể thử yield_self . là một method mới của version 2.5 :
irb(main):002:0> 3.yield_self{ |x| x*x } => 9
và bây giờ nếu bạn muốn xem đoạn code này nó hoạt động như thế nào ở phiên bản củ hơn thì chúng ta chỉ cần sử dụng docker và kéo về 1 phiên bản củ hơn. 2.4 chẳng hạn
$ docker run -it --rm ruby:2.4 irb(main):001:0> RUBY_VERSION => "2.4.3" irb(main):002:0> 3.yield_self{ |x| x*x } NoMethodError: undefined method `yield_self' for 3:Integer from (irb):2 from /usr/local/bin/irb:11:in `<main>'
và một chức năng tôi muốn thử nữa là việc kiểm tra xem các Gem cho rails app của tôi có chạy trơn chu trên version ruby mới nhất không ở đây tôi sử dụng ví dụ là Engine Yard's todo app
docker run -it --rm -v /Users/crigor/projects/todo:/todo ruby:2.5 bash
Lênhj này sử dụng -v để tạo ra một volume. nội dung của thư mục Users/crigor/projects/todo sẻ có sẵn bên trong container/todo. sau đó bên trong docker chúng ta run lệnh: bundle install.
root@7c0b216b97c3:/# cd todo root@7c0b216b97c3:/todo# bundle install Fetching gem metadata from https://rubygems.org/.............. . . . An error occurred while installing puma (2.10.2), and Bundler cannot continue. Make sure that `gem install puma -v '2.10.2'` succeeds before bundling.
chúng ta có thể thây rằng puma 2.10.2 không cài đặt được trên Ruby 2.5.0. Nhìn vào các phiên bản puma có sẵn , chúng ta có thể thấy rằng 2.10.2 là một phiên bản cũ nên tôi đã cố gắng cập nhật lên phiên bản mới nhất và nó đã được cài đặt thành công.
root@7c0b216b97c3:/todo# bundle update puma
Trong khi puma 2.10.2 là cũ, lưu ý rằng nó vẫn có thể được cài đặt thành công mà không có vấn đề gì khi ở phiên bản Ruby 2.4.3. Ta thấy đó là những vấn đề như thế mà chúng ta có thể dễ dàng được kiểm tra bằng cách sử dụng Docker. Không phải ai cũng có thể cập nhật phiên bản Ruby mới nhất, đặc biệt là trong production. Hàu hết chúng ta thường muốn ổn định khi đã lên production nên viên nên viện nâng cấp version ruby là việc cần được chuẩn bị kỹ lưỡng. Cám ơn các bạn đã xem.