Pipeline CI/CD là gì?
Hoạt động CI/CD tự động hóa các quá trình Build, Test (Unit Test, Intergration Test, Smoke Test, Security Test, Performance Test…), Deploy, Delivery trong phát triển phần mềm, mỗi khi source code có thay đổi thì ngay lập tức thay đổi đó được chạy qua các quá trình liệt kê ở trên
Thay vì mọi thứ phải làm một cách thủ công, thì với Pipeline, nó sẻ sâu chuổi các hành động này và thực thi một cách tự động.
Jenkins pipeline
Jenkins Pipeline là một bộ plugin hỗ trợ việc triển khai và tích hợp theo kiểu pipeline (bao gồm tập hợp quy trình với các tác vụ liên quan với nhau và được thực hiện một cách tuần tự theo thứ tự đã quy định). Jenkins Pipeline được khai báo trên một tập tin được gọi là Jenkinsfile.
Jekinsfile là gì ?
Jenkinsfile là một file text chứa cấu hình của toàn bộ quy trình workflow jenkins pipeline dưới dạng code. Lợi thế của file text này giúp cho các lập trình viên hoặc quản trị viên dễ dàng truy cập, thay đổi nội dung code tuỳ biến ở mọi thời điểm.
Các loại Jenkins pipeline
Jenkinsfile có quy chuẩn viết bằng ngôn ngữ Groovy DSL. Bạn có thể tạo ra Jenkinsfile thông qua trình text editor cơ bản hoặc qua giao diện cấu hình trên Jenkins website. Đối với Jenkinsfile sẽ có hai hình thức kĩ thuật khai báo cú pháp Jenkinsfile:
Declarative pipeline
Sử dụng những syntax đơn giản. Dựa trên các methods / functions dựng sẵn, việc của chúng ta sử dụng và tuân thủ theo các rule và syntax được định nghĩa sẵn theo các steps và funtions như vậy để implement theo các stages (từng đoạn trong pipeline). Nhìn chung là sẽ giúp người dùng dễ sử dụng như dễ viết/đọc các nội dung pipeline mà bạn khai báo.
pipeline { agent any stages { stage('Build') { steps { // } } stage('Test') { steps { // } } stage('Deploy') { steps { // } } } }
Scripted pipeline
về cơ bản là dựa trên ngôn ngữ lập trình Groovy có thể sử dụng các lệnh cụ thể của Jenkins và sau đó được thực thi để chạy pipeline. Các pipeline sử dụng kĩ thuật ‘scripted' rất linh hoạt ở chỗ về cơ bản chúng chỉ bị hạn chế bởi các khả năng sử dụng ngôn ngữ Groovy của người dùng. Tuy nhiên, điều này có nghĩa là bạn cần có tư duy lập trình và khả năng học ngôn ngữ Groovy để tạo ra một pipeline phức tạp và tuỳ biến mạnh mẽ.
node { stage('Build') { echo 'Building....' } stage('Test') { echo 'Building....' } stage('Deploy') { echo 'Deploying....' } }
Trong bài viết này chỉ tập trung vào Declaractive Pipeline
Giải thích các khái niệm trong pipeline
Pipeline
Tất cả pipeline được viết dưới dạng Declaractive Pipeline phải được đặt trong một khối pipeline.
pipeline { /* khai báo các công việc tại đây */ }
Agent
Được khai báo ở phần đầu của pipeline script. Agent là máy node/agent được sử dụng để thực thi các giai đoạn (stage) trong pipeline. Node/Agent có thể được khai báo bằng nhiều cách khác nhau. Ngoài ra Agent có thể là docker contianer, pod của K8S, EC2, vâng vâng.
label
thực thi pipeline trên agent có lable được gán. Ví dụ bạ có một máy win và một máy mac, máy mac dùng để build IOS, khi build IOS bạn sẻ kết nối máy mac đến Jenkins và chỉ định máy mac thông qua label.
pipeline { agent { label `may-mac` } }
Environment
Bạn có thể khai báo, định nghĩa các thông tin phục vụ cho tạo môi trường để có thể biên dịch cũng như triển khai ứng dụng. Ví dụ bạn đặt một biến là VAR_NAME_1='hello devopsify'.
pipeline { agent { label 'mac-pro-16' } environment { VAR_NAME_1 = "hello devopsify" } }
stages
Là nơi chứa phần lớn các “công việc” được mô tả trong pipeline. Một pipeline có thể có nhiều stage. Mỗi stage này được định nghĩa phục vụ cho một công việc nhất định. Dưới đây là cách khai báo stage.
pipeline { agent any stages { stage ("stage name 1") { // Khai báo các step tại đây } stage ("stage name 2") { // Khai báo các step tại đây } stage ("stage name ...") { // Khai báo các step tại đây } stage ("stage name n") { // Khai báo các step tại đây } } }
Steps
Steps là phần định nghĩa các bước sẽ làm trong stage, các bước này có thể là thực thi một câu lệnh trên máy agent/node, ví dụ
pipeline { agent { label 'mac-pro-16' } environment { VAR_NAME_1 = "hello devopsify" } stages { stage ("stage name 1") { // Khai báo các step tại đây steps { echo ${VAR_NAME_1} } } } }
bạn có thể chạy các câu lệnh trên máy agent/node trong steps. Với mỗi hệ điều hành sẽ có cú pháp riêng, Jenkins định nghĩa sẵn các cú pháp cho việc chạy lệnh từ pipeline:
Windows
bat shell: để chạy được bat shell bạn cần định nghĩa từ khoá bat trước câu lệnh cần chạy.
powershell: để chạy được bat shell bạn cần định nghĩa từ khoá powershell trước câu lệnh cần chạy.
Linux/Unix
bash/sh shell: Để chạy được bash shell hay sh shell trên Linux/Unix bạn chỉ cần khai báo từ khoá sh trước câu lệnh cần chạy
// đối với windows bat pipeline { agent { label 'windows-agent-label' } stages { steps { bat 'ECHO Hello world!' } } } // đối với windows powershell pipeline { agent { label 'windows-agent-label' } stages { steps { powershell 'ECHO Hello world!' } } }
//đối với linux pipeline { agent { label 'linux/unix-agent-label' } stages { steps { sh 'echo "Hello world!"' } } }
Trigger
Là nơi liệt kê các hành động sử dụng để kích hoạt pipeline hoạt động. Các hành động này có thể bao gồm từ:
Hệ thống quản lý source code (git, svn) khi có thay đổi về source code hoặc hành động với đối tượng.
Đặt lịch hẹn giờ
Kích hoạt từ hệ thống khác thông qua: email, messenger (Slack, Microsoft Team, Workchat, …)
Dưới đây là một số loại trigger (kích hoạt) thường được sử dụng
Kích hoạt pipeline thông qua hẹn giờ:
// Kích hoạt pipeline thông qua hẹn giờ pipeline { agent { label 'agent-label' } triggers { pollSCM('H/10 * * * *') // Đặt lịch 10 giờ sáng hàng ngày tải source code về cron('H 23 * * *') // Đặt lịch 11 giờ tối hàng ngày chạy các stage bên dưới } stages { steps { sh 'echo "Hello world!"' } } }
//Kích hoạt pipeline thông qua hệ thống quản lý source code. pipeline { agent { label 'agent-label' } triggers { gitlab( // Kích hoạt pipeline khi triggerOnPush: true, // có một commit được đẩy lên git server triggerOnMergeRequest: true, /// kích hoạt pipeline khi có một merge request được khởi tạo branchFilterType: 'All' // Chạy các hành động trigger với tất cả các branch ) } stages { steps { sh 'echo "Hello world!"' } } }
Post
Là những hành động thực hiện sau khi pipeline hoàn thành, ví dụ: cập nhật trạng thái của pipeline hoặc các bước của pipeline sau khi hoàn thành, xoá thư mục workspace. Dưới đây là một số cách cập nhật trạng thái của pipeline mà người dùng không cần truy cập vào Jenkins: Email, GitLab, Microsoft Team.
Gửi trạng thái pipeline đến email sau khi pipeline hoàn thành. Trong đó, email được khai báo ở trong pipeline. Dưới đây là 2 trạng thái sẽ được gửi phụ thuộc vào kết quả của pipeline:
success : pipeline chạy thành công các giai đoạn và bước
failure : pipeline bị fail ở bước hoặc giai đoạn nào đó dẫn đến cả pipeline không hoàn thành
def email = 'qu**@op****.dev'
pipeline {
agent {
label 'mac-pro-i9'
}
post {
always {
deleteDir() // Xoá workspace sau khi pipeline hoàn thành
}
success {
emailext (attachLog: false,
body: 'Please check it out, link : $BUILD_URL',
subject: "SUCCESS :Job ${env.JOB_NAME} - Build# ${env.BUILD_NUMBER}" ,
to:"${email}")
}
failure {
emailext (attachLog: true,
body: 'Please check it out , link : $BUILD_URL',
subject: "FAILED :Job ${env.JOB_NAME} - Build# ${env.BUILD_NUMBER}",
to:"${email}")
}
}
}