Thứ Hai, 24 tháng 5, 2021

Áp dụng Github Action với ứng dụng Java Web

Trương Trần Tiến

-         Mục đích:  Bài viết cung cấp một cái nhìn tổng quan cơ bản CI/CD. Bên cạnh đó, bài viết sẽ hướng dẫn việc áp dụng các nội dung về CI/CD sử dụng Github Action trên ứng dụng sử dụng Java Web.

-         Yêu cầu kiến thức cơ bản:

o   Nắm rõ cách hoạt động và các command của build tool Maven. Địa chỉ tham khảo http://www.kieutrongkhanh.net/2021/02/xay-dung-ung-dung-java-web-voi-maven.html

o   Nắm cơ bản các nguyên lý cơ bản của Git và Github.

-          Tool sử dụng:

o   Maven 3.6.3

o   Netbeans 8.x

o   JDK 8 update 66

o   Git/Github

I.        Giới thiệu

-         Trong quy trình phát triển một phần mềm thông thường, người developer thường sẽ code chức năng tại máy local, pull code từ git remote reposistory, giải quyết conflict, test code tại máy local, rồi push lên branch chính. Chúng ta sẽ không thể đảm bảo được rằng trong cùng một nhóm dev thì mọi người đã pass toàn bộ test trước khi push code, không biết rõ liệu mọi người có dung phiên bản mới nhất của code chưa, và rất nhiều trường hợp khác có thể xảy ra. Vì thế khái niệm CI/CD ra đời để đảm bảo rằng việc tự động test code, tự động build và deploy ứng dụng. Điều này giúp cho chất lượng của phần mềm được cải thiện do giảm được thời gian test và phát hiện lỗi sớm hơn, việc release sản phẩm sẽ ổn định hơn,….

II.      Giới thiệu khái niệm CI/CD

-         CI/CD là một phương pháp phát triển phần mềm, là cầu nối giữa việc code chức năng và vận hành sản phẩm. CI viết tắt là Continuous Integration và CD viết tắt cho Continuous Delivery hoặc Continuous Deployment.

1.      Continuous Integration (CI)

-         Continuous Integration là một phương pháp phát triển phần mềm khuyến khích các developer phải tích hợp các thay đổi nhỏ trong phần mềm càng sớm càng tốt (nhiều hơn một lần trong ngày). Tích hợp (Integration) có nghĩa rằng sẽ commit code, build và test code. Việc làm này giúp cho code sẽ được đảm bảo được tính đồng bộ giữa các thành viên với nhau, giúp phát hiện lỗi sớm nhất có thể.

-         Mục đích của CI là thiết lập một quy trình nhất quán và tự động để build, đóng gói và test phần mềm.

-         Quy trình của CI có thể diển ra như sau:

o   Developer thực hiện test code tại máy local

o   Developer commit code lên repository

o   CI server sẽ phát hiện có commit và bắt đầu quá trình build, package

o   CI server thực hiện việc test phần mềm và thông báo về cho member của project. Cấp độ test thường là unit test hoặc integration test.

2.      Continuous Delivery (CD)

-         Continuous Delivery sẽ là bước tiếp sau của Continuous Integration.

o    Sau quá trình CI code đã được build và test, CD sẽ tự động triển khai package code đến môi trường testing, môi trường staging

§  Môi trường staging là bản sao của môi trường thực tế, đây có thể là nơi để tiến hành kiểm thử lần cuối cùng trước khi chắc chắn release ra môi trường thực tế.

o   CD đảm bảo được project của chúng ta có thể được release tại bất kỳ thời điểm nào với sự ổn định cao nhất.

o   CD được thể hiện thông qua Deployment Pipeline.

§  Deployment Pipeline chia quy trình chuyển giao sản phẩm thành nhiều giai đoạn. Mỗi giai đoạn bao gồm các mục tiêu chất lượng khác nhau và do đó sẽ test các chức ở các cấp độ khác nhau.

o   Mục đích của CD là đảm bảo rằng phần mềm của chúng ta có thể ổn định cho việc release tại bất kì lúc nào.

3.      Continuous Deployment

-         Continuous Deployment là bước cuối cùng trong mô hình CI/CD.

-         Tại bước này, sản phẩm của chúng ta từ bản release sẽ được tự động deploy đến môi trường production mà không có bất kỳ sự can thiệp nào của con người.

III.    Giới thiệu Github Actions

1.      Github Actions

-         Để giúp chúng ta thực hiện công việc CI/CD, các tools hỗ trợ như Jenkins, GitLab CI/CD, Travis CI, CirclerCi hay Azure DevOps, …

-         Trong bài viết này, chúng tôi muốn giới thiệu về GihubActions – công cụ được giới thiệu từ năm 2018 để hỗ trợ việc CI/CD ngay trên nền tảng Github mà không cần phải thông qua bên thứ 3.

Workflow overview

2.      Github Actions Workflow

-         Github Actions hoạt động dựa trên quy tắc event-driven.

o   Điều này có nghĩa mỗi khi có một sự kiện xảy ra trên code repository của chúng ta, Github Actions sẽ thực thi các câu lệnh command tương ứng với sự kiện đó.

o   Sự kiện này có thể là một lần push code, hay yêu cầu pull request.

-         Github Actions bao gồm nhiều component tương tác với nhau để đạt được mục tiêu CI/CD

o   Runner

§  Là một server được cài đặt GitHub Actions runner application để có thể thực thi các Workflow.

§  Server này có thể là server do Github cung cấp hoặc chúng ta có thể tự tạo và cấu hình riêng.

o   Workflows

§  Là một quy trình tự động mà sẽ được kích hoạt khi có một event hoặc kích hoạt trong khoản thời gian nhất định nào đó.

§  Một Workflow bao gồm một hoặc nhiều Job.

o   Job

§  Là tập hợp các Step sẽ được thực thi khi workflow được kích hoạt.

§  Mặc định, nếu có nhiều Job trong 1 Workflow thì các Job này sẽ được thực hiện song song với nhau (Tuy nhiên, chúng ta có thể config để cho các Job chạy tuần tự.)

§  Ví dụ

·        Chúng ta có 2 job là build và test thì Job test sẽ phụ thuộc vào kết quả của job build. Do đó, chúng ta cần 2 Job này thực thi tuần tự build trước rồi test sau.

o   Step

§  Cho phép chúng ta thực thi được một câu lệnh và đồng thời cho phép cấu hình các thông tin cần thiết cho việc thực thi câu lệnh đó (ví dụ như điều kiện tiên quyết, tên của step,…)

§  Câu lệnh trong Step có thể là Action hoặc là shell command.

o   Action

§  Là tập hợp các shell command được tích hợp sẵn.

§  Các Action được tạo ra bởi cộng đồng người dùng hoặc chúng ta có thể tự tạo ra các Action cho riêng mình.

§  Chúng ta có thể tìm kiếm các actions có sẵn tại địa chỉ https://github.com/marketplace?type=actions

3.      Giới thiệu về YAML

-         Chúng ta cấu hình Github Action Workflow thông qua 1 file YAML. Do vậy, chúng ta sẽ tìm hiểu sơ qua các kiến thức cơ bản của file YAML trong nội dung tiếp theo.

-         YAML là  một ngôn ngữ lưu trữ data, tượng tự như JSON. Điểm mạnh của YAML là tính dễ đọc đối với người dùng.

-         File YAML lưu trữ dữ liệu dưới dạng key: value. Đồng thời YAML hỗ trợ nhiều loại data type như  String, float, array,....

-         Để thể hiện level của các dữ liệu, file YAML bắt buộc chúng ta sử dụng tab.

o   Với ví dụ trong hình trên, chúng ta nhìn thấy firstname thuộc dưới tầng person.

-         Một điểm lưu ý khác là khi sử dụng array, chúng ta có thể sử dụng “[ ]” hoặc chúng ta có thể sử dụng “-” để xác định phần tử của 1 array.

o   Sử dụng “-” cho phép các phần tử trong array là các object dữ liệu phức tạp như ví dụ trong hình bên trên.

4.      Phân tích nội dung cấu hình Github Action

-         Chúng ta cấu hình Gihub Action thông qua một file YAML được đặt ở đường dẫn .github/workflows.

o   Ví dụ của file YAML đó như hình dưới.

-         Để hiểu rõ hơn về các khái niệm component của Github Action và cách khai báo, chúng ta phân tích các thành phần trong hình YAML mô tả bên trên.

o   name: tên của workflow (optional)

o   on.push.branches: - main : xác định khi code được push lên nhánh main thì work flow sẽ được kích hoạt

o   on.workflow_dispatch: cho phép chúng ta có thể kích hoạt workflow thông qua UI trên trang web Github

o   jobs.build-and-deploy: chúng ta khai báo jobs bên trong workflow với id là “build-and-deploy”

o   runs-on: window-latest: đây là máy ảo mà Github sẽ sử dụng để chạy các jobs của chúng ta.

§  Github cung cấp một số máy ảo như sau: window-latest (windows server 2019), windows-2016 (window server 2016), ubuntu-lastest (ubuntu-20.04), macos-11.0 (macOS 11),...

o   jobs.build-and-deploy.steps: định nghĩa các steps trong job của chúng ta.

§  Mỗi steps được tách biệt bởi “-”  

o   steps.name: tên của steps (không bắt buộc phải điền thông tin)

o   steps.uses: sử dụng các Action có sẵn trên Github marketplace.

§  Ví dụ

·        actions/checkout@master được dùng để thể hiện việc chuyển Git sang nhánh master

·        actions/setup-java@v1được dùng thể cài Java cho máy ảo

o   steps.run: chạy command line trong máy ảo.

§  Ví dụ: maven clean install dùng để chạy maven goal để build mới ứng dụng sau khi clean các thành phần cũ

-         Chúng ta có thể tổng tổng quát hóa quá trình define trong workflow của nội dung file cấu hình như sau

o   Khi có event push trên branch main, workflow được kích hoạt.

o   Chạy jobs “build-and-deploy” trên windows server 2019.

o   Checkout qua nhánh master của Git, cài Java 8 và chạy maven goal.

-         Lưu ý

o   Đây là phần cơ bản để chúng ta có thể áp dụng Github Action vào project.

o   Tuy nhiên, Github Action cung cấp cho chúng ta rất nhiều phương tiện và syntax giúp việc áp dụng CI/CD cực kỳ linh hoạt.

o   Để tìm hiểu rõ hơn, quí vị có thể tìm hiểu ở trang web document chính của Github Action tại địa chỉ https://docs.github.com/en/actions

IV.   Áp dụng Github Action cho ứng dụng Java Web

1.      Tạo project Java Web với Maven

-         Chúng ta có thể sử dụng lại Project đã được tạo ở bài viết “Xây dựng ứng dụng Java Web với Maven” (địa chỉ tham khảo http://www.kieutrongkhanh.net/2021/02/xay-dung-ung-dung-java-web-voi-maven.html).

2.      Tạo repository trên Github và commit project code

-         Để thực hiện được bước này, chúng ta cần phải có tài khoản Github. Tạo tài khoản Github tại đây.

-         Đầu tiên, chúng ta tiến hành tạo mới repository và điền các thông số cần thiết như tên repository, public access,...

o   Click New hay dấu + và chọn New Repository (nội dung này sẽ khác nhau tùy theo việc sử dụng trình duyệt)

o   Điền tên repository chúng ta muốn tạo vào ô Repository name

o   Chọn việc mong muốn repo được access như thế nào trong như cầu riêng. Trong bài viết này, chúng tôi chọn Private

o   Chọn các thông số cần thiết khác tùy theo nhu cầu và click Create repositry

3.      Thêm file YAML cấu hình Github Action

-         Chúng ta tạo mới thư mục .github/workflows.

o   Chúng ta mở project trong Netbeans.

o   Sau đó mở menu Window, click Files để mở được cửa sổ Files

o   Thực hiện tạo thư mục như hình như hình bên dưới

-         Lưu ý: Chúng ta cần phải đặt tên thư mục đúng quy định nếu không Github sẽ không nhận biết được file YAML của chúng ta.

-         Chúng ta tiếp tục tạo file “github_action.yml” vào trong thư mục workflow

o   Click phải chuột trên thư mục workflows, chọn  New, chọn Other….

o   Trong cửa số New File, chọn categories Other và File Types là YAML File. Click nút Next.

Graphical user interface, text, application, email

Description automatically generated

o   Nhập tên file github_action trong File Name rồi nhấn nút Finish

 

Graphical user interface, text, application, email

Description automatically generated

-         Tiếp theo, chúng ta tiến hành thiết lập cấu hình cho Workflow trên project như sau.

Graphical user interface, text, application, email

Description automatically generated

o   Giống như trong ví dụ phân tích trên, uses: actions/checkout@v2 và uses: actions/setup-java@v1 chính là sử dụng các Action đã được định nghĩa sẵn có trên Github marketplace.

o   “mvn verify”: là câu lệnh chạy test project của chúng ta (có thể là unit test trong project)

o   “mvn install”: là câu lệnh để nén project thành gói WAR và đưa vào local maven repositoty. Chúng ta có thể lấy gói WAR này để deploy lên Cloud server.

-         Lưu ý:

o   Ký hiệu “-” khi sử dụng cần phải có khoảng trắng cách với giá trị name. Giữa các cặp key: value trong cùng “-“, giá trị value cần phải được viết thẳng hàng với giá trị key.

o   “java-version: 1.8” thuộc “with” nên cần phải có tab để xác định rõ level

o   Khi sử dụng netbeans, nếu file YAML của chúng ta đúng định dạng thì key sẽ được tô màu xanh.

-         Câu lệnh “if: ${{success()}}”

o   Được gọi là context and expression syntax.

o   Câu lệnh “if” sẽ giúp chúng ta kiểm tra điều kiện trước khi thực hiện các action của step đó.

o   “success()” mang ý nghĩa status của steps trước thành công thì trả về True. Ngoài success(), chúng ta còn có:

§  always(): luôn trả về True

§  cancelled(): trả về True khi step bị cancel

§  failure(): trả về True khi step trước bị fail.

-         Dựa trên các khái niệm đã phân tích, workflow của chúng ta sẽ được kích hoạt khi nhánh main được push code hoặc được tạo pull request. Khi đó chúng ta tiến hành set up Java 8, chạy Maven verify goal, nếu thành công thì chạy Maven install goal.

4.      Push code lên Github

                                                      a.            Cài đặt Git

-         Để có thể push code lên Github, máy các bạn cần phải được cài Git trước.

o   Chúng ta có thể download tại địa chỉ https://git-scm.com/downloads.

o   Sau khi download thành công, chúng ta cài Git vào máy tính của ta để có thể thao tác được với Github

                                                      b.            Khởi tạo git cho project

-         Mở Command Prompt và chỉ đến đường dẫn thư mục sẽ chứa project.

o   Khi cửa sổ command prompt được mở lên chúng ta sử dụng lệnh cd để chuyển thư mục hiện hành sang thư mục project của chúng ta trên máy tính

o   Chúng ta gõ cd và đường dẫn đến thư mục project (chúng ta có thể nhấn chuột phải trên project netbeans, chọn properties để lấy đường dẫn và copy), click chuột phải vào command prompt sau lệnh cd thì giá trị copy sẽ đưa vào màn hình

o   Để chuyển ổ đĩa, chúng ta gõ tên ổ đĩa: và nhấn enter. Ví dụ ở đây là D:

-         Sau khi chuyển đến thư mục của project, chúng ta gõ lệnh “git init” để khởi tạo git cho project. Thực hiện nhấn enter

o   Khi đó project chúng ta sẽ có thêm thư mục .git

o   Kết quả thực hiện câu lệnh sẽ có kết quả hiển thị như hình bên dưới

o   Chúng ta kiểm tra việc tạo thành công bằng cách mở thư mục project bằng Windows Explorer thì sẽ thấy thư mục .git mới được tạo ra.

o   Bên cạnh đó, chúng ta mở lại project trong Netbeans chúng ta sẽ thấy các tín hiệu như sau

                                                      c.            Thêm toàn bộ file vào staging của git

-         Chúng ta tiếp tục gõ lệnh “git add *” để thêm toàn bộ file trong project vào staging của git.

o   Tại đây, git của có thể thông báo warning: LF will be replaced by CRLF”.

§  Warning này xảy ra khi Window xài CRLF để xuống hàng so với LF của các file.

§  Warning này không ảnh hưởng đến quá trình push code của chúng ta.

§  Chúng ta có thể config để Git tự động chuyển đổi LF sang CRLF mà không phải warning bằng cách gõ lệnh “git config --global core.autocrlf false”.

                                                      d.            Thực hiện commit lần đầu tiên

-         Chúng ta thực hiện gõ lệnh “git commit -m “first commit”” để commit các file trong staging.

o   Tham số “-m <message>”: mỗi một commit của Git bắt buộc phải có 1 message tương ứng để mô tả những thay đổi trong commit đó.

o   Khi chúng ta gõ lệnh commit, git sẽ so sánh các file vừa commit với lại các file trong nhánh main của chúng ta. Các giá trị như số file thay đổi, số lượng code thêm, số lương code bị xóa, .... sẽ được hiện thị cho chúng ta.

                                                      e.            Tạo nhánh main

-         Để chuẩn bị push code lên trên Github, chúng ta gõ lệnh “git branch -M main” để tạo nhánh main

o   Thành công của bước này là trên dòng lệnh không có bất kỳ thông báo nào

                                                        f.            Thiết lập Github repository cho local git repository

-         Chúng ta thực hiện gõ lệnh “git remote add origin <url>” để đăng ký repo trên github với git local của chúng ta dưới tên origin.

o   Đầu tiên, chúng ta quay lại phần github repository để lấy địa chỉ repository qua url như hình dưới. Thực hiện copy để sử dụng cho các bước tiếp theo.

Graphical user interface, website

Description automatically generated

o   Tiếp theo, chúng ta gõ lệnh và dán địa chỉ url đã copy ở bước trên và nhấn Enter

o   Thành công của bước này là trên dòng lệnh không có bất kỳ thông báo nào

                                                      g.            Đẩy code từ local lên Github

-         Để đẩy code từ local repository lên trên github, chúng ta gõ lệnh “git push -u origin main” để push code nhánh main lên repository origin.

o   Khi command chạy, nếu lần đầu các bạn sử dụng Github, màn hình login sẽ xuất hiện

o   Thực hiện đăng nhập với account github đã có. Nếu login không chính xác thì màn hình console sẽ hiển thị để nhập thông tin account của github

§  Khi gõ password thì màn hình không hiển thị gì cả chỉ nhận bàn phím, chúng ta cứ việc gõ đúng rồi nhấn enter

§  Nếu mọi thông tin account được xác thực thì thông tin sẽ được thực hiện push và có kết quả như màn hình bên dưới

                                                      h.            Kiễm tra lại code trên Github repository

-         Chúng ta kiểm tra công việc thực hiện bằng cách tiến hành mở lại trang Github repository và refresh lại trang (hay có thể nhấn F5).

o   Khi đó, code của chúng ta sẽ được hiện diện trên đó (điều này có nghĩa việc push code lên Github đã thành công).

o   Nếu chúng ta click vào tab Actions, chúng ta có thể thấy workflow đã được xác định và chạy cho lần commit đầu tiên (nếu file yaml của chúng ta cấu hình đúng và không sai cú pháp)

Graphical user interface, application, Teams

Description automatically generated

o   Kết quả của việc commit và run ok

 

o   Nhấp vào build

A picture containing text, screenshot, black

Description automatically generated

o   Kết quả

 

-         Trong trường hợp bị fail

o   Chúng ta vẫn nhấp vào first commit và xem nguyên nhân fail do đâu.

o   Nếu do lỗi file YAML, các bạn cần phải xem lại đúng định dạng của file, đúng cú pháp.

§  Khi code trên Netbeans, file YAML thể hiện chúng ta viết đúng thì nội dung trong file sẽ được hiện màu xanh và cấu trúc phân cấp được hiển thị.

§  Ngoài ra, Github cũng hỗ trợ chúng ta việc thông báo lỗi để chúng ta có thể xem và chỉnh sửa như hình bên dưới

o   Chúng ta có thể nhấn dấu … và chọn “View workflow file” để xem chi tiết

o   Việc hiển thị lỗi rất rõ ràng cho chúng ta để hỗ trợ chúng ta sửa lỗi

-         Khi các thành viên trong nhóm củng làm project hay chính chúng ta commit – push code lên trên github, các workflow sẽ được tự động thực hiện, giúp các thành viên trong nhóm có thể theo dõi status của commit, giúp thành viên trong nhóm giao tiếp dễ dàng với nhau.

 

Chúng ta vừa hoàn tất tìm hiểu cơ bản về CI/CD và đồng thời áp dụng Github Action vào cho ứng dụng Java Web.

Rất mong quí vị góp ý về nội dung bài viết này vì bài viết chúng tôi sẽ cung cấp cho quí vị các nội dung về cách làm và chia sẽ các tình huống lỗi thường xuất hiện trong quá trình phát triển ứng dụng.

Chúng tôi mong muốn quí vị cùng chia sẻ những lỗi và cách khắc phục khi quí vị phát triển ứng dụng hay thực hiện theo các hướng dẫn của bài viết như là một sự chia sẽ chung cho người đọc khác.

Hẹn gặp lại quí vị ở các bài viết sau với nội dung định hướng sử dụng CI/CD deploy ứng dụng lên Azure.

 

Không có nhận xét nào:

Đăng nhận xét