Viblo Learning
+2

Note về lỗi liên quan đến zip timestamp khi deploy code dùng AWS CodeDeploy

Hôm nay, trong quá trình push code để deploy cho khách hàng, mình có gặp một lỗi như sau :

Cảm xúc lúc mới đọc lỗi lần đầu là wtf, code deploy thì liên quan m* gì đến zip file mà lại tòi ra cái lỗi này. Phản ứng trước hết là nghĩ xem lỗi đó là do đâu:

  1. CI config có vấn đề.
  2. Code vừa đẩy lên có vấn đề.

Do lỗi này chỉ xảy ra khi merge code vào master để đẩy lên server test, nên mình chỉ khoanh vùng vào 2 nguyên nhân này. Lúc đầu mình nghiêng về nguyên nhân là do CI có vấn đề hơn, vì trước đó code đã pass CI khi tạo Pull Request rồi.

Lúc đầu trẻ trâu, định pass luôn việc điều tra cho bên config CI, tuy nhiên sau đó đã chạy lại CI 1 lần trước rồi mới định thông báo, tự nhủ là : Biết đâu do CI config lởm, khiến lỗi thỉnh thoảng bắn ra cho vui 😃) Tuy nhiên lần thứ 2 thì cũng y như lần 1, lần này thì tự tin báo với KH giúp kiểm tra cấu hình CircleCI xem có vấn đề gì không.

Đang định vứt đó để đi làm việc khác, thì bỗng tự nhiên máu tò mò nổi lên, thế là lại quay vào phụ kiểm tra. Trước hết check về cấu hình CircleCI: Việc chạy deploy vẫn bình thường cho đến khi PR vừa merge bị lỗi => chắc chắn lỗi nằm ở đoạn code vừa đẩy lên.

Search thử theo nội dung lỗi thì ra ngay bài này : https://github.com/aws/aws-cli/issues/2639 , vậy là rất nhiều người cũng gặp vấn đề chứ không phải mỗi mình.

Trang đấy thì rõ dài, liệt kê rất nhiều thứ, tuy nhiên tập trung vào JS thôi nào, và tìm thấy cái này:

Xem ra nguyên nhân có thể là do uglify-js có các file bị lỗi timestamp trong thư mục node_modules khiến việc zip file bị lỗi thật.

Thử bắt tay vào điều tra bug trên dự án:

  • Tìm xem có file nào có timestamp từ 30 năm trở về trước không (trước năm 1980) trong thư mục node_modules:

Một đống file luôn :v Để ý cái uglify-js này nằm trong thư mục node_modules của istanbul-reports, nhưng istanbul-reports lại ko nằm trong package.json. Đành dùng yarn why để track vậy:

yarn why istanbul-reports

Đây rồi : This module exists because "karma-coverage-istanbul-reporter#istanbul-api" depends on it.

Vậy là do cái karma-coverage-istanbul-reporter. Nhìn vào package.json thấy đang ở version ^0.2.0, remove rồi cài bản mới xem nào 😄

yarn remove karma-coverage-istanbul-reporter
yarn add karma-coverage-istanbul-reporter -D

Check kết quả :

find ./node_modules/* -mtime +10950
not found
git diff yarn.lock

Yeah Uglify-js đã được update bản mới, deploy thôi nào 😄

Tổng kết

  • Lỗi lạ thì đã có Google, cần kiểm tra kĩ để biết nguyên nhân
  • Nên dùng yarn để có thể track dependencies dễ dàng hơn, và có lock file (npm5 đã bắt đầu có nhưng chưa xác nhận khả năng có ok ko). Yarn why RẤT HỮU ÍCH
  • Ở bước remove và add lại dependencies, có thể làm cách cục súc hơn là xoá thư mục node_modules lẫn file yarn.lock rồi tạo lại, nhưng mà như thế thì các package ko liên quan cũng sẽ được update, có thể gây ảnh hưởng ko đáng có.
  • Nếu chỉ nâng version và chạy yarn để update package chính thì các package phụ sẽ vẫn dùng yarn lock do đó version ko được update, cần remove bằng yarn remove và add lại để lock file cập nhật được toàn bộ.

All Rights Reserved