Autodeploy from gitlab to aws ec2 instances


Chào mọi người, lại là mình đây, HQ Khánh. Cuối tuần nên mình lên tiktok dạo chơi lúc mà cứ quẹt cái nào là cái đó lại "Gió lung lay, bàn tay nâng cánh hoa tình....". Khá cáu 😑. Cảm thấy hơi lãng phí tiền mạng, mình liền xóa app rồi mò lên đây viết blog, và rồi bài viết này ra đời.

I. CI/CD là gì?
- Continuous Integration ( CI ) : tích hợp liên tục.
- Continuous Delivery ( CD ) : phân phối liên tục.

- Vừa mới đây mình bỗng dưng có thêm một cô giáo ( trẻ bằng mình 😂) nói đại khái là lập trình viên xuất sắc thường lười biếng, thiếu kiên nhẫn và ngạo mạn. Câu trên được nói bởi Larry Wall - Cha đẻ của ngôn ngữ lập trình Perl. Vì lười biếng nên họ viết chương trình tiết kiệm công sức và chuẩn bị tài liệu thật tốt để không phải trả lời các câu hỏi về chương trình. Sự thiếu kiên nhẫn khiến họ muốn viết ra ngay chương trình lường trước được nhu cầu của người sử dụng. Và vì ngạo mạn, họ muốn viết code thật chặt chẽ để không ai có thể phê bình mình. Nghe cũng thấy hợp lý !

Lan man quá nhỉ, nội dung chính đoạn trên là mình khoe có cô giáo mới thôi, haha...

Vào luôn vấn đề chính đây.

- Một team thì thường có nhiều người, mỗi người sẽ code một chức năng ở một branch khác nhau. Khi code xong sẽ commit và push lên, leader hoặc sếp bạn sẽ review code, test code, rồi merge request. Những công việc như vậy sẽ làm bằng sức "cơm". Vậy là người ta đưa CI vào giúp build tự động, test tự động, thay thế sức "cơm". 

Lợi ích của việc sử dụng CI là gì:
+ Giảm thiểu rủi ro nhờ việc phát hiện lỗi và fix sớm, tăng chất lượng phần mềm nhờ vào việc tự động test và inspect ( code được inspect tự động dựa theo config đã cài đặt, đảm bảo coding style ).
+ Giảm thiểu những quy trình thủ công lặp đi lặp lại...

Xong giai đoạn CI sang giai đoạn CD. Giai đoạn này thì có thể hiểu deploy lên server. 

Giờ là phần chính của bài viết nè, trên chém gió hơi nhiều.

II. CI với Gitlab

Quy trình về CI/CD có nhiều, tùy thuộc nhiều thứ như dự án, leader, ....

Ở bài viết này mình sẽ theo follow là mỗi khi commit và push lên ở tất các branch thì sẽ kiểm tra code, nếu pass và ok, thì leader merge code sang master sẽ tự động deploy code lên server ở AWS EC2. ( tương ứng 2 giai đoạn:  lint và deployToAWS ).

Ngoài ra bạn có thể thêm những giai đoạn khác nữa vào như test ( tự động chạy unittest ), build,...

- Đầu tiên mình sẽ khởi tạo một con server nodejs đơn giản dùng express. 


Mình sẽ dùng thằng Airbnb ( coding style guide ). Mình dùng nó vì mình thấy nó khá được ưa chuộng, nhiều project dùng và khá phổ biến, hehe, lên npm thấy gần 3tr lượt tải, thế là quất luôn. Mình cài eslint, và eslint-config-airbnb-base. ( bạn nào không ưa thì dùng của google,...)
        

Config eslint:


File eslintrc.* bạn có thể đặt theo js, json,... tùy theo bạn thích, bạn có thể config các luật áp dụng cho code của team mình, vân vân, mây mây. Lúc mình mới chạy, nó ra ti tỉ cái cảnh báo, thì bạn cứ bình tĩnh, thằng eslint có thể giúp bạn tự động format cho đúng quy tắc của nó với câu lệnh thần thánh: 
npm run lint -- --fix

Code đẩy lên gitlab rồi sau đó cài đặt CI/CD để test và deploy code tự động. Mặc định gitlab không có cơ chế CI cho bạn, bạn phải thêm file .gitlab-ci.yml nằm ở thư mục gốc thì gitlab mới nhận dạng được project của bạn muốn áp dụng gitlab CI.

Các bạn có thể tham khảo cú pháp cấu hình ở đây: https://docs.gitlab.com/ce/ci/yaml


Trên là config file .gitlab-ci.yml của mình, mình đã cmt rõ ở trong code.
Dòng thứ 27 -> 29 mình sẽ giải thích ở phía dưới.

Enable GitLab container to ssh into AWS EC2 instance
- Đầu tiên là cung cấp khóa cho gitlab docker khóa ( key ) để có thể vào được ec2.
- Tắt lời nhắc cho hotKeyChecking.

Cái hotKeyChecking là gì? thì nó là cái mà khi bạn truy cập vào server.
 
ssh -i myPemFile.pem ubuntu@<ip address of the instance>

nó sẽ hỏi là:  are you sure you want to continue connecting (yes/no)?

Với động cơ chạy bằng "cơm" thì đơn giản rồi, nhưng máy nó sẽ bị chặn lại, nên mình sẽ tắt nó đi.

Cung cấp khóa cho gitlab docker khóa ( key ) để có thể vào được ec2

Tạo biến môi trường trong gitlab.

Chọn Setting => CI/CD => Variables



PRIVATE_KEY: là key mà download mà khi tạo ec2 instance.

DEPLOY_SERVERS: các ip máy chủ.

Giờ là các lệnh shell

deploy/deploy.sh


Dòng 3: Bất kì lệnh nào trong tương lai không thành công sẽ thoát khỏi tập lệnh
Dòng 5 -> 6: Cho phép viết khóa công khai của phiên bản aws.
Dòng 10 -> 11: dùng để tắt hostKeyChecking ( nhưng mình dùng thì không được, nên mình dùng dòng 27 -> 29 ở phía trên ).

- Nếu có nhiều địa chỉ ip ( phân tách nhau giống phẩy, nó sẽ for qua hết ), mình chỉ dùng 1 địa chỉ ip, nó sẽ truy cập vào ec2 của mình bằng dòng 21.

Vậy là đã vào được trong ec2 rồi, thì làm gì tiếp theo.
Thông thường mình sẽ pull code trên gitlab về, rồi dùng pm2 restart là ok. Nhưng theo follow này thì khá căng, phải dùng ssh thì không bị check auth, dùng htttps thì khi bạn pull về nó sẽ check username và password, lại thêm một đống config ssh ở server nữa, khóc cạn nước mắt. Mà sợ lúc pull về lỗi này lỗi lọ thì cũng đau đầu.

Theo follow này thì đỡ mệt hơn, là khi bạn deploy thì sẽ xóa luôn file code, git clone về và npm install, deploy lên là xong. Đỡ đau đầu hơn mà cũng chắc cú.

deploy/updateAndRestart 




Các bạn nhớ câu lệnh thần thánh sudo su nhé, những lệnh trên chắc cũng dễ hiểu. Mình mệt quá 😂, chắc thức hơi khuya.

Ok Giờ là cái công đoạn kiểm tra thành quả.

Như code trên api /test trả về Hoang Quoc Khanh, giờ mình sẽ thay đổi thành HQ Khanh ( ở branch khanh ) commit lên và merge vào server nhé.



Lỗi này. 

Dăm ba cái lỗi vớ vẩn, nãy mình chưa format lại code nên nó ko đúng chuẩn quy tắc ==> lỗi và fails
Đó, không pass nó không cho qua ngay.
Giờ dùng npm run lint -- --fix rồi push code lại lên là ok.


Đã pass kiểm tra code ở branch Khánh.
Giờ merge master và xem thành quả thôi


Qua stage test => running stage deploy


Ok deploy success ngay.

Để pass được mình phải kinh qua n cái failed, mới tìm hiểu làm sao một phát ăn ngay được, trải qua đắng cay ngọt bùi, mà cay càng nhiều thì càng ngọt thôi, mỗi lần failed thì lại biết thêm được lỗi, càng học được nhiều, chúc các bạn thành công. 
Làm một con aws ec2 nghịch cũng vui vui, đáng tiền bỏ ra đó...(thu lại kiến thức thôi).



Mảng DevOps này thật sự mình cũng là cưỡi ngựa xem hoa thôi, nên trong bài bài viết có thể có thiếu sót, các bạn có thể cmt phía dưới để cùng trao đổi nhé!

Cảm ơn các bạn đã đọc nhé! Mình ngủ đây. Ặc 2h30 sáng rồi! 


Bài viết tham khảo:
https://viblo.asia/p/ci-cd-va-devops-07LKXYXDZV4
https://codelearn.io/sharing/cicd-voi-github-action-phan-1
https://medium.com/@adhasmana/how-to-deploy-node-js-app-on-aws-with-gitlab-24fabde1088d





Previous Post
Next Post

post written by:

0 Comment: