3 đấm cũng mạnh như 1 đạp vậy

Chuyện đánh đấm thì có liên quan gì đến lập trình? Nghĩa đen thì có thể không, nhưng nghĩa bóng thì có. Case mà mình vừa gặp phải là 1 ví dụ.

Ngữ cảnh

Mình bảo trì và phát triển thêm một dịch vụ có sẵn, viết bằng Rails, deploy bằng Capistrano.

Trong khi lượn lờ review source code, mình thấy rằng ruby version chưa được chỉ rõ trong Gemfile, và đó không phải là best practice, nên mình đã thêm ruby version như trong specs ban đầu của dự án, là 2.2.0.

Tuy nhiên, khi mình deploy lên server, thì capistrano báo lỗi không thể compiled assets, và deploy failured.
Tại sao việc chỉ định ruby version ĐÚNG VỚI SPECS lại gây ra lỗi? Hay mở rộng hơn: Tại sao việc làm đúng, giúp source code tốt hơn, lại gây ra lỗi?

Nguyên nhân

Thứ nhất chính là việc không chỉ định ruby version trong Gemfile, làm mồi cho các action tiếp theo như sau:
(Tracking theo các error message thu được, mình phát hiện:)

  1. Trên server đang cài ruby với version 2.2.2 và 2.2.0, nhưng set default cho RVM là 2.2.2, chứ không phải 2.2.0 như trong specs.
    Việc này dẫn tới hậu quả là nếu ssh vào server thì sẽ thu được dòng thông báo:
    RVM used your Gemfile for selecting Ruby, it is all fine - Heroku does that too ...
    Dòng này làm mồi cho action sau đây.

  2. Trước hết, khi compile assets của capistrano, nó có thao tác là tìmbackup manifest đang có sau khi compiled xong.
    Đoạn code tìm ra thư mục chứa assets files như sau:

def detect_manifest_path
  %w(
    .sprockets-manifest*
    manifest*.*
  ).each do |pattern|
    candidate = release_path.join('public', fetch(:assets_prefix), pattern)
    return capture(:ls, candidate).strip if test(:ls, candidate)
  end
  msg = 'Rails assets manifest file not found.'
  warn msg
  fail Capistrano::FileNotFound, msg
end

Cụ thể nó sẽ tìm tới assets files bằng kết quả của lệnh ls.
Do hậu quả của nguyên nhân 1. bên trên, dòng RVM used your Gemfile for ... trở thành đầu vào cho lệnh ls, dẫn tới việc không tìm thấy thư mục cần thiết, nên quá trình deploy thất bại.
Đây là cú đấm thứ 3. Tại sao? Vì việc lấy kết quả của lệnh lsbad practice trong việc get file name. Đoạn code trên cũng bị cho là bad commit, và đã được fix rồi.

Kết luận

Chẳng phải tự nhiên mà có công thức E(rrors) = M(ore) x C(ode)^2.
Đống code đang có như 1 quả bom nổ chậm vậy, nếu ko cẩn thận với từng dòng code viết ra, có khẳng năng là bùm.
Việc dẫm phải kíp nổ của ng khác để lại là việc khó tránh khỏi, và không dễ chịu gì. Vậy cách tốt nhất là hạn chế cài cắm những kíp nổ của chính mình vào.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

ManhDV

21 bài viết.
37 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
43 7
TL; DR Cấu hình mastermaster trên nhiều node EC2 Mỗi node có nhiều database, với schema giống hệt nhau. Thực hiện điều phối việc read/write b...
ManhDV viết gần 2 năm trước
43 7
White
14 0
Background Với những database có lượng read lớn thì tầm quan trọng của việc warmup BP đã được nhắc tới nhiều. Nhưng nó có hiệu quả tới mức như thế...
ManhDV viết gần 2 năm trước
14 0
White
14 3
Background Bạn có nhớ gì về hồi cấp 3 ko? Ý mình ko phải là hình ảnh em gái xinh nhất khối mặc áo trong và ngoài có mã màu lần lượt là 000 và fff ...
ManhDV viết hơn 1 năm trước
14 3
Bài viết liên quan
White
0 2
fCC: Technical Documentation Page note So I have finished the HTML part of this exercise and I want to come here to lament about the lengthy HTML ...
HungHayHo viết 6 tháng trước
0 2
Male avatar
6 4
Nhân tình cờ thấy khoá học này sắp mở trên Udacity 1] và có bạn hỏi mình cần gì để trở thành DevOps thì mình có ghi lại một số suy nghĩ cá nhân bên...
Thang Man viết hơn 2 năm trước
6 4
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
21 bài viết.
37 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!