Bạn đang phân vân không biết code mình viết ra có chất lượng hay không, có tốt hay không? Dựa vào những tiêu chí nào để có thể giúp chúng ta viết code tốt theo chuẩn thế giới? Làm thế nào để nâng cao tay nghề code của mình? Về phần tôi, tôi sử dụng một cái tool có tên là Sonar. Bạn hãy xem chi tiết về sonar trong video dưới đây nhé! Sonarqube là một công cụ thật tuyệt vời, thật không thể tin được. Thôi chết, bị nhiễm quảng cáo Bphone rồi. Thôi quảng cáo công cụ test code tiếp … Show
Hiện nay, các bạn lập trình viên thường được thầy cô dạy về thuật toán nhiều, còn chất lượng code và các quy tắc trong coding để có thể dễ dàng làm việc đội nhóm, dễ dàng bảo trì thì hình như không mấy khi được quan tâm. Nhưng các bạn cũng không nên quá lo lắng vì mấy skill đó mình có thể học sau khi đi làm, nhanh thôi. Sonarqube là công cụ giúp lập trình viên kiểm tra code của mình đã tốt chưa, nếu có bất kì lỗi nào vi phạm hay có nguy cơ vi phạm nguyên tắc (chuẩn chung) thì nó sẽ giúp ta cảnh báo và đưa ra suggest để sửa, dần dần trong quá trình code mình sẽ hình thành thói quen và không mắc lỗi nữa. Các cài đặt cũng khá đơn giản thôi, bài này mình hướng dẫn cho ngôn ngữ PHP nhé. Bước 1: Tải các package hỗ trợ
Giải nén tất cả và copy cả 3 thư mục vào ổ C, nhớ đổi tên các thư mục lại thành sonarqube, sonarqube scanner và sonarqube examples. Bước 2: Tải và cài đặt jdk nếu máy bạn chưa cài sẵn Bước 3: Vào trong thư mục C:\sonarqube\bin\windows-x86-64, tìm và chạy file StartSonar.bat để bật server sonarqube lên. Sau khi chạy thành công thì vẫn để cửa sổ chứ không được tắt nha Lưu ý: nếu hệ điều hành của 32 bit thì vô windows-x86-32 thay vì vô windows-x86-64. Bước 4: Vào thư mục C:\sonar-examples\projects\languages\php\php-sonar-runner copy file sonar-project.properties và bỏ vào thư mục root của dự án đang cần test. Để test được code, cần phải sửa lại file sonar-project.properties tại 2 chỗ, đầu tiên sửa sonar.sources thành đường dẫn đến file cần test, sau đó sửa sonar.language thành ngôn ngữ của dự án (ở đây mình dùng php). Bước 5: Bạn vào trình duyệt gõ localhost:9000, đăng nhập vào với ID/password lần lượt là admin/admin. Chọn Administration, vào mục System và chọn Update Center. Việc tiếp theo cần làm là tìm và cài đặt gói ngôn ngữ mà bạn cần test. Sonarqube đã cài sẵn một số gói tại mục Installed, mình thấy chưa có gói php nên mình qua tab Available tìm và cài đặt php. Sau khi cài đặt xong thì server yêu cầu restart, cứ restart thôi. Nếu như bạn thoát ra rồi đăng nhập lại, vô lại tab Installed thấy có tên gói đó thì đã cài đặt thành công còn nếu không có thì cần cài lại từ đầu, lâu lâu server nó bệnh bệnh nên phải cố gắng (hàng free mà). Bước 6: Ok, tiếp theo mở command line và cd đến thư mục root của dự án (nơi bạn đã paste file sonar-project.properties lúc nãy). Chạy lệnh C:\sonar-scanner\bin\sonar-runner.bat để chương trình test lỗi cho bạn. Nếu trong quá trình chạy không báo lỗi gì thì ta đã thành công việc phân tích lỗi. Sau cùng là vào lại localhost:9000, vào mục Issues chọn Unresoved Isues. Tada, một danh sách các lỗi với các thuộc tính lỗi như Code Smell, Bug hoặc Vulnerability hiện ra. Việc của bạn là xem và fix lại nó thôi. Cái hay của Sonarqube là nó đưa ra cả gợi ý cho ta fix lại mấy lỗi này, tuyệt vời không. ……………………………………. không thì thôi. Cứ làm vài dự án với công cụ này thì kiểu gì skills code cũng lên, khi nào code xong mà test lại không còn lỗi nào thì lúc đó đẳng cấp đã lên nhiều rồi đấy. Chúc các chế coding vui vẻ! Nếu bạn không muốn sếp khiển trách vì sao các dự án chạy chậm thế? tiêu tốn nhiều tài nguyên thế? lỗi bảo mật không đáng thế? Lúc này ông Ops chê ông Dev, code thế này thì gắn tên lửa cũng không nhanh được, gọi service quái gì load mãi không lên. Ông Dev chê ông Ops, do các ông triển khai thế nào chứ ở local của tôi hơi chậm nhưng không đến nỗi thế. Hai ông cãi nhau không hồi kết… Lúc này ông Ops đã làm hết sức mình và đảm bảo hạ tầng tốt, chạy ổn định nhưng vẫn thấy rất tệ, ông Ops mới giới hạn tài nguyên, sax gì mà cấp xxx memory yyy cpu rồi mà service chạy một lúc là cao tải rồi down vậy? Ông Dev mới bắt đầu gãi tai à à thế khả năng code chưa tối ưu bạn đợi tôi nói anh em xem lại… Chất lượng logic code kém khiến cho tiêu tốn tài nguyên cũng như thời gian xử lý ảnh hưởng trực tiếp đến trải nghiệm của người dùng, ai cũng nghĩ rằng code của tôi đã rất tốt rồi vậy thì lỗi này do ai? lúc này dùng Sonarqube là sự lựa chọn tuyệt vời. Bạn có thể hiểu đơn giản dùng Sonarqube tương tự như có một senior rất giỏi với thực lực một đống chứng chỉ thế giới uy tín hiểu biết rõ rất nhiều ngôn ngữ lập trình để giúp bạn đánh giá code về chất lượng, bảo mật, logic, tối ưu,… mà hoàn toàn miễn phí vì thế mà rất nhiều những doanh nghiệp đã tin dùng. Vậy Dev hay Ops hay DevOps dùng Sonarqube như thế nào? cụ thể cho từng vị trí sẽ ra sao? Hơn hết trong bài viết này mình sẽ cung cấp sẵn “mẫu” cấu hình để bạn có thể dùng sonarqube quét chất lượng code mọi dự án, mọi ngôn ngữ thông dụng, nên bạn hoàn toàn có thể sử dụng cho dự án của bạn nhé Tương tự đây là một bài viết dài… dài… rất chi tiết mong rằng sẽ giúp được cho những bạn thực sự cần những thực tế, đầy đủ chúng ta cùng bắt đầu. SonarQube là một nền tảng mã nguồn mở được phát triển bởi SonarSource để thực hiện kiểm tra liên tục về chất lượng mã nguồn thông qua việc thực hiện đánh giá tự động bằng phân tích tĩnh mã nguồn để phát hiện lỗi và các vấn đề về mã nguồn không tốt trên 29 ngôn ngữ lập trình. SonarQube cung cấp báo cáo về mã nguồn trùng lặp, chuẩn mã hóa, kiểm thử đơn vị, độ bao phủ mã nguồn, độ phức tạp của mã, bình luận, lỗi, và gợi ý về bảo mật (Theo Wikipedia) Tài liệu chính thức: sonarsource.com Dùng Sonarqube để làm gì? Ưu điểm gì?
Đến đây chúng ta cũng đã biết rằng dùng Sonarqube sẽ giúp chúng ta rất nhiều trong phát triển dự án và những ứng dụng khác bạn có thể tìm hiểu thêm. Sonarqube architecture (workflow)Bạn không cần suy nghĩ quá phức tạp đơn giản chỉ như sau:
Các công việc này như vòng lặp Dev sẽ sửa code dần dần đến khi đạt tiêu chuẩn triển khai lên production (Cài đặt Sonarqube server và dùng Sonar scan tự động thì chỉ cần cấu hình 1 lần hoặc nhiều lần nếu như cần chỉnh sửa các yêu cầu cao hơn đối với code). Sử dụng Sonarqube (cụ thể)Như ngay ở trên đều thấy đầu tiên chúng ta cần cài đặt Sonarqube server (nơi chứa source code và phân tích code) và sau đó sẽ dùng Sonar Scanner để quét source code và đưa lên Sonarqube server. Chuẩn bịChuẩn bị Ubuntu server đã cài đặt Docker (nếu bạn chưa cài đặt hãy làm theo bước sau) Tạo file script cài đặt Docker $ touch docker-install.sh && chmod +x docker-install.sh && nano docker-install.sh Nội dung trong script như sau #!/bin/bash sudo apt install -y apt-transport-https ca-certificates curl software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb [signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update -y sudo apt install docker-ce -y sudo systemctl start docker sudo systemctl enable docker sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose docker -v docker-compose -v Chạy script lên bằng lệnh Cài đặt SonarqubeTài liệu cài đặt đã rất nhiều trên internet nên bạn có thể cài đặt tùy ý nhé, trong bài viết này mình sử dụng docker đơn giản để chạy lên Sonarqube server như sau:
Sau khi chạy xong bạn truy cập vào IP của server (lệnh ip a nếu như bạn chưa biết địa chỉ IP server) ví dụ: 192.168.17.199:80 (ở đây mình đã đặt hostname nên mới truy cập như vậy) sẽ được kết quả như dưới đây tài khoản mặc định sẽ là admin/admin Đăng nhập thành công và đổi mật khẩu mới Sử dụng user/group trong SonarqubeThiết lập thành công vào Sonarqube đầu tiên bạn chọn vào Administration Chọn vào Security -> Users Chúng ta đang có một user admin nhấn chọn vào group thấy rằng có 2 group cơ bản như dưới đây Tiếp đến chúng ta tạo người dùng mới nhấn chọn Create User Điền những thông tin cá nhân, ở đây thường chúng ta sẽ theo format role-project_name (ex: developer-ecommerce-java) để xác định được rằng account dành cho ai và dự án nào Tạo thành công chúng ta chọn qua phần Groups Chúng ta sẽ tạo group chọn Create group Tương tự bạn cũng cần tạo group cho dự án như sau Tiếp tục chúng ta nhấn chọn vào Member để thêm user vào group hiện tại là 0 Nhấn chọn user chúng ta vừa tạo ở trên vào group Tiếp theo bạn chọn vào Security -> Global Permissions và hãy bỏ tích chọn group sonar-users được quyền tạo project Mình sẽ tạo thêm một user nữa là sonar-scanner đóng vai trò quét code, bạn có nhớ là chúng ta cần Sonarqube server để chứa code và phân tích còn Sonar scanner để quét code từ máy bạn lên không đó là lý do chúng ta cần một user riêng. Và thêm user sonar vào group admin nhé Tương tự nếu cần thiết bạn tạo thêm user cho Tester, BA,… và tương ứng với các dự án Quét dự án trên SonarqubeMình sẽ hướng dẫn sử dụng sonarqube cho những ngôn ngữ phổ biến như Java, C#, Php, React,… thậm chí 1 cấu hình quét mọi ngôn ngữ thông dụng! và mình hoàn toàn sử dụng những projects mã nguồn mở trên Github để trực quan. *Note: Mình sẽ cung cấp mẫu cho những ngôn ngữ trước và sau đó đi sâu hơn vào việc sử dụng chi tiết, tùy chỉnh các đánh giá,… điều này giúp cho bạn sẽ dễ dàng cấu hình quét sonar thành công trước của ngôn ngữ bạn cần và sau đó sẽ đến bước custom theo ý mình. Đầu tiên bạn chọn sang phần Projects và nhấn Create Project Tạo project tương ứng như sau Tạo thành công chúng ta nhấn chọn vào Setting -> Edit Permissions Bạn tiến hành tích chọn như dưới đây để bảo mật dự án chọn đúng group và các quyền (vì mặc định các user tạo trong group Sonar user nên chúng ta phải bỏ tích chọn nếu không các user khác đều có thể xem được project) Các tích chọn cụ thể như sau:
Tạo TokenTiến hành đăng nhập vào tài khoản sonar-scanner và chọn vào My Account Chọn vào Security và tiến hành tạo Token như dưới đây (Name và Expies in tùy bạn nhé nhưng Type là Global Analysis Token) Nhấn tạo thành công và copy Token và lưu lại nhé vì nó sẽ không hiển thị lại đâu Dùng Sonarqube dự án JavaĐầu tiên như các bước trên chúng ta tạo mình sẽ tiến hành làm trên dự án Java trước Link dự án: GitHub: E-Commerce Website Using Java – Spring MVC in Maven Bạn truy cập server và tiến hành clone dự án về $ mkdir /projects && cd /projects && git clone https://github.com/ikismail/ShoppingCart.git Tiếp theo di chuyển vào bên trong dự án Tiếp theo để có thể scan được dự án java chúng ta sẽ cần build dự án bạn chạy lệnh (bạn chỉnh những thông tin:
1,
2,
3,
4,
5)
Sau khi build thành công dự án sẽ có thư mục target Chúng ta sẽ tiếp tục chạy lệnh sau
Giải thích:
Chạy thành công chúng ta được kết quả Truy cập trên Sonarqube server và thấy được thông tin quét code đã có Chúng ta có thể thấy được nhanh luôn:
Và như bạn cũng đã thấy vẫn là Passed vậy chứng tỏ là tiêu chuẩn mặc định của Sonarqube quét cho thấy project trên tuy có những bug cũng vẫn an toàn. Dùng Sonarqube dự án .NETTiếp theo trong dự án .NET bạn hoàn toàn không cần tạo trước project như đã làm với Java ở trên Sonarqube, cụ thể bạn hãy theo dõi Link gthub: GitHub: This project is a E-Commerce Project. ASP.NET Core 6 + Angular + Onion Architecture Bạn truy cập server và tiến hành clone dự án về (thư mục /projects chúng ta vừa tạo phía trên nếu như bạn làm rồi) $ git clone https://github.com/fdeniz07/ETicaretAPI.git Tiếp theo di chuyển vào bên trong dự án Tạo một Dockerfile Tiếp theo bạn tạo một Dockerfile với những thông tin như sau (bạn chỉnh những thông tin:
1,
2,
3,
4,
5)
Sau khi hoàn thành Dockerfile chúng ta tiến hành build Docker image và xóa ngay sau khi Build
Thành công được kết quả build dưới đây Sau đó chúng ta được kết quả trên Sonarqube server tuy nhiên bạn có thể thấy ngay rằng nếu chúng ta không tạo và setup project từ trước thì mặc định chạy sẽ trong trạng thái public Lúc này bạn đã thao tác User và Group ở bước trên rồi làm tương tự để đảm bảo bảo mật nhé. Dùng Sonarqube dự án PhpTiếp theo chúng ta dùng sonar quét dự án Php Link github: GitHub: Example Laravel Ecommerce API Bạn truy cập server và tiến hành clone dự án về $ git clone https://github.com/stanfortonski/laravel-ecommerce-api.git Tiếp theo di chuyển vào bên trong dự án $ cd laravel-ecommerce-api/ Tiếp theo để có thể scan được dự án php chúng ta sẽ cần build dự án bạn chạy lệnh (bạn chỉnh những thông tin:
1,
2,
3,
4,
5)
Chạy thành công dự án như sau Sau đó chúng ta được kết quả trên Sonarqube server tuy nhiên bạn có thể thấy ngay rằng nếu chúng ta không tạo và setup project từ trước thì mặc định chạy sẽ trong trạng thái public Lúc này bạn đã thao tác User và Group ở bước trên rồi làm tương tự để đảm bảo bảo mật nhé. Dùng Sonarqube dự án RubyTiếp theo chúng ta dùng sonar quét dự án ruby Link github: GitHub: Basic Ruby Projects Bạn truy cập server và tiến hành clone dự án về $ git clone https://github.com/mitch3lljones/odin-project-basic-ruby-projects.git Tiếp theo di chuyển vào bên trong dự án $ cd odin-project-basic-ruby-projects/ Tiếp theo để có thể scan được dự án ruby chúng ta sẽ cần build dự án bạn chạy lệnh (bạn chỉnh những thông tin:
1,
2,
3,
4,
5)
Chạy thành công dự án như sau Sau đó chúng ta được kết quả trên Sonarqube server tuy nhiên bạn có thể thấy ngay rằng nếu chúng ta không tạo và setup project từ trước thì mặc định chạy sẽ trong trạng thái public Lúc này bạn đã thao tác User và Group ở bước trên rồi làm tương tự để đảm bảo bảo mật nhé. Dùng Sonarqube dự án PythonTiếp theo chúng ta dùng sonar quét dự án python Link github: GitHub: My Python Examples Bạn truy cập server và tiến hành clone dự án về $ git clone https://github.com/geekcomputers/Python.git Tiếp theo di chuyển vào bên trong dự án Tiếp theo để có thể scan được dự án ruby chúng ta sẽ cần build dự án bạn chạy lệnh (bạn chỉnh những thông tin:
1,
2,
3,
4,
5)
Chạy thành công dự án như sau Sau đó chúng ta được kết quả trên Sonarqube server tuy nhiên bạn có thể thấy ngay rằng nếu chúng ta không tạo và setup project từ trước thì mặc định chạy sẽ trong trạng thái public Lúc này bạn đã thao tác User và Group ở bước trên rồi làm tương tự để đảm bảo bảo mật nhé. Dùng Sonarqube cho các ngôn ngữ còn lại (javascript – “reactjs, angular, vuejs”, swift, golang, c++, Kotlin,…)Đây sẽ là cấu hình mà bạn có thể áp cho hầu hết những ngôn ngữ mà Sonarqube hỗ trợ (bạn chỉnh những thông tin:
1,
2,
3,
4,
5) Bạn đứng tại vị trí của dự án và thực hiện câu lệnh.
Một số source code mà bạn có thể tham khảo thử nghiệm: Swift: GitHub: Data and BIC Validator for German Banks Golang: GitHub: Go library for accessing the GitHub v3 API ReactJS: GitHub: real time chat application C++: GitHub: Nintendo Switch Sử dụng chi tiết SonarqubeMình sẽ chia cụ thể cách sử dụng cho Developer và DevOps (Operator) Sử dụng Sonarqube cho DeveloperMình sẽ lấy dự án Java ở trên và tiến hành đi sâu phân tích, sử dụng. Nếu bạn không sử dụng Java cũng đừng lo lắng nhé mình sẽ sử dụng thành phần chính và kể cả code nào bạn cũng có thể xem và thực hiện tương tự được như xem lỗi code, sửa code, chỉnh cấu hình,… OverviewNhấn chọn vào dự án và xem overview như dưới đây IssuesTiếp theo bạn chọn vào tab Issues với những thông tin tùy chọn cụ thể Chúng ta cũng biết rõ ràng các mức độ của code được chia rõ ràng từng hạng mục dưới đây Với thông tin dưới đây bạn có thể thấy các thuộc tính Mã Sạch là những đặc điểm mà mã của bạn phải có để được xem xét là Mã Sạch Tiếp theo trong mỗi vấn đề bạn có thể Assign cho một ai đó nếu bạn là Lead hoặc cũng có thể tự Assign cho chính mình Tiếp tục đây là trạng thái của vấn đề bạn có thể flow theo Bạn có thể nhấn vào bug cụ thể để xem được nó đang ở đâu Cũng như những giải thích cụ thể tại sao cần fix issue đó Một lưu ý là những issues nào trong trạng thái High (Severity) và Critical thì chưa đạt tiêu chuẩn và rất cần thiết phải sửa (có thể hiểu đơn giản là trạng thái Critical thì hầu hết bắt buộc phải fix) Tiếp theo Developer có thể sử dụng công cụ Sonarlint một extension có thể cài đặt trên các công cụ lập trình như visual studio, intellij,… có thể cover được những lỗi hiển thị như trên Sonarqube giúp các Developer tránh được ngay những lỗi code nguy hiểm. Chi tiết xem tại: Linter IDE Tool & Real-Time Software for Code with SonarLint | Sonar (sonarsource.com) Dùng Sonarqube cho DevOpsTiếp theo không hẳn như Developer phải hiểu rõ về code để fix DevOps cần cấu hình những nguyên tắc để đảm bảo việc scan code được bảo mật, clean hơn trước khi lên production RulesNhư bạn có thể thấy Sonarqube đã cung cấp chúng ta rất nhiều rules xịn xò để quét code thật tối ưu như dưới đây Bạn có thể xem các rules cụ thể như dưới đây Quality profileQuality profile là một tập hợp các quy tắc kiểm tra chất lượng mã nguồn được áp dụng cho một dự án hoặc một module cụ thể. Mỗi quality profile định nghĩa các quy tắc kiểm tra chất lượng cụ thể mà mã nguồn cần tuân thủ để đảm bảo rằng mã đó đáp ứng các tiêu chuẩn chất lượng. Các điểm quan trọng liên quan đến Quality Profile trong SonarQube bao gồm:
Quality GatesQuality Gate trong dùng SonarQube là một cơ chế để đảm bảo chất lượng mã nguồn trong quá trình phát triển phần mềm. Nó là một tập hợp các quy tắc và tiêu chí mà mã nguồn cần tuân thủ để được coi là chất lượng và an toàn. Quality Gate được sử dụng để kiểm tra xem mã nguồn hiện tại có đáp ứng các yêu cầu chất lượng cụ thể hay không. Quality Gate thường bao gồm các yêu cầu về các chỉ số chất lượng mã nguồn như sự xuất hiện của lỗi, cảnh báo, mã lặp, bao phủ kiểm thử, v.v. Nếu mã nguồn không đáp ứng các yêu cầu này, Quality Gate sẽ không được vượt qua và mã nguồn sẽ bị từ chối hoặc gắn mác là không an toàn. Cách sử dụng Quality Gate trong SonarQube thường như sau:
Đây là thông số mặc định Để tạo ra cơ chế mới bạn nhấn chọn vào Copy Nhập tên Quality Gate mới Bạn có thể tùy chỉnh để kiểm tra chất lượng code khắt khe hơn như dưới đây như Coverage 90% và Duplicated Lines lớn hơn 1% Chúng ta sẽ tiến hành sửa thêm một số cơ chế nữa như sau chọn vào Add Condition Giới hạn số Dulicated Blocks Thêm Line Coverage Áp dụng vào dự án cụ thể như dưới đây Chúng ta tiến hành chạy sonar scan lại và đã fail vì những cơ chế khắt khe hơn mà chúng ta đã thiết lập Tích hợp Sonarqube cho Gitlab CI/CDHẳn là những bài CI/CD của mình đã rất chi tiết rồi bạn có thể xem tại CI/CD – elroydevops Nên mình sẽ cung cấp cho bạn file cấu hình .gitlab-ci.yml để bạn có thể tích hợp vào trong dự án của bạn với nội dung sau
0 Những biến bạn sẽ lưu trong Settings -> CI/CD -> Variable nhé Vậy là mình đã hướng dẫn xong cách sử dùng Sonarqube, cũng tiếp tục là bài viết rất tâm huyết, chi tiết của mình mong rằng sẽ giúp ích được nhiều cho những bạn chưa có kinh nghiệm, cũng như đóng góp cho cộng đồng những bài hướng dẫn cụ thể, thực tế. Bạn có thể liên hệ với mình nếu có vấn đề gì nhé. Mình sẽ làm nhiều hướng dẫn hơn về các kỹ năng các tool khác để giúp bạn tối ưu được những tác vụ cũng như tiết kiệm những chi phí khi phát triển phần mềm. Thanks. |