Mình đã nói sơ qua về Pipeline trong Jenkins trong bài viết hướng dẫn cài đặt Pipeline plugin trong Jenkins, trong bài viết này, mình sẽ hướng dẫn các bạn các bước cơ bản để sử dụng Pipeline, để build một project bất kỳ trong Jenkins các bạn nhé!
Để làm ví dụ, mình sẽ sử dụng project ví dụ trong bài viết InternalResourceViewResolver trong Spring Boot. Project này đã được push lên huongdanjava.com repository sử dụng tài khoản GitHub của mình tại https://github.com/huongdanjavacom/huongdanjava.com.
Để build project này sử dụng Pipeline, sau khi đã cài đặt Pipeline plugin, các bạn hãy chọn menu New Item trong trang chủ của Jenkins để tạo mới một Jenkins job:
Sau khi điền tên của Jenkins job, các bạn hãy chọn Pipeline:
rồi nhấn nút OK.
Trang cấu hình của Jenkins job này sẽ hiển thị. Các bạn hãy kéo xuống phía dưới, tới section Pipeline:
để bắt đầu cài đặt Pipeline cho Jenkins job này các bạn nhé.
Ở section này, như các bạn thấy, mặc định chúng ta có selection Defintion với lựa chọn là Pipeline script và bên dưới là ô Script. Điều này có nghĩa để sử dụng Pipeline trong Jenkins, chúng ta cần viết các script. Đó là những đoạn code định nghĩa các thao tác chúng ta cần làm để build, chạy test và deploy ứng dụng lên production đấy các bạn.
Chúng ta có thể sử dụng các phương thức, hàm sẵn có của các Jenkins plugin hỗ trợ Pipeline với ngôn ngữ Groovy để hiện thực Pipeline của mình (cách này gọi là Scripted Pipeline, đây là cách cũ, lúc Jenkins mới đưa ra khái niệm Pipeline) hoặc viết các câu lệnh tường minh để làm điều này (cách này còn gọi là Declarative Pipeline được giới thiệu sau này giúp cho việc xây dựng Pipeline đơn giản hơn đó các bạn).
Dù sử dụng cách nào đi nữa, chúng ta cũng phải tuân thủ Pipeline syntax với các code block để hiện thực Pipeline các bạn nhé!
Các code block trong Pipeline mình có thể liệt kê như sau:
– “pipeline” code block định nghĩa toàn bộ build process, được sử dụng trong Declarative Pipeline.
– “agent” code block được sử dụng trong Declarative Pipeline để allocate một executor trong node chạy Jenkins để chạy Pipeline.
– “node” code block cũng định nghĩa toàn bộ build process nhưng được sử dụng với Scripted Pipeline.
– “stages” code block chứa nhiều “stage” code block giúp chúng ta phân loại các tác vụ ra thành từng phần, từng giai đoạn riêng biệt, ví dụ như chúng ta có thể có các stage cho build, test, deploy.
– “steps” code block được sử dụng để định nghĩa các tác vụ trong từng stage.
Một “pipeline” code block hoặc “node” code block sẽ bao gồm một hoặc nhiều “stage” code block đánh dấu từng giai đoạn của quá trình build Jenkins job. Và trong một “stage” code block, chúng ta sẽ có nhiều “steps” code block định nghĩa các tác vụ mà chúng ta cần làm trong một giai đoạn bất kỳ.
Dưới đây là một ví dụ Pipeline script với Declarative Pipeline:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
pipeline { agent any stages { stage('Build') { steps { // } } stage('Test') { steps { // } } stage('Deploy') { steps { // } } } } |
và Pipeline script với Scripted Pipeline:
1 2 3 4 5 6 7 8 9 10 11 |
node { stage('Build') { // } stage('Test') { // } stage('Deploy') { // } } |
Nếu sử dụng Declarative Pipeline cho ví dụ trên của mình để clone code và build, Pipeline script của mình có thể định nghĩa với nội dung như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
pipeline { agent any stages { stage('Clone') { steps { sh 'git clone https://github.com/huongdanjavacom/huongdanjava.com.git' } } stage('Build') { steps { sh 'mvn clean install -f huongdanjava.com/spring-boot-internalresourceviewresolver/pom.xml' } } } } |
Như các bạn thấy, chúng ta chỉ cần sử dụng câu lệnh sh để execute các câu lệnh của các công cụ Git và Maven để thực hiện nhu cầu của mình. Đơn giản, trực quan phải không các bạn? … Đây chỉ là ví dụ thôi, thực tế bài toán sẽ khác hơn nhiều các bạn ạ 🙂
Kết quả khi mình chạy Jenkins job trên như sau:
Như các bạn thấy, từng stage một sẽ được execute theo thứ tự được định nghĩa trong Pipeline script. Các bạn đừng quan tâm đến việc build bị fail, do fail Unit Test thôi các bạn!
Mình có thể viết lại Pipeline script trên sử dụng Scripted Pipeline như sau:
1 2 3 4 5 6 7 8 |
node { stage('Clone') { git url: 'https://github.com/huongdanjavacom/huongdanjava.com.git' } stage('Build') { sh 'mvn clean install -f spring-boot-internalresourceviewresolver/pom.xml' } } |
Với Pipeline script trên, các bạn cần phải cài đặt Git plugin để chạy được nhé! Pipeline script này đang sử dụng hàm có sẵn của Git plugin.
Pipeline script cũng có thể định nghĩa trong một tập tin cấu hình tên là Jenkinsfile trong project code của ứng dụng thay vì chúng ta khai báo nó trong phần cấu hình của Jenkins job đấy các bạn.
Quay trở lại trang cấu hình Jenkins job trong ví dụ của mình, phần Pipeline, nếu các bạn chọn “Pipeline script from SCM” trong ô Definition, các bạn sẽ kết quả như sau:
Ở đây, nó cho phép chúng ta chọn SCM mà chúng ta quản lý code của ứng dụng, ví dụ mình sử dụng Git thì phần cấu hình cho SCM này sẽ như sau:
Để sử dụng option này, như mình đã nói source code của các bạn phải có tập tin Jenkinsfile nhé!