Jenkins Pipeline: Sử dụng condition, option và interactive
Jenkins Pipeline là một tập hợp các plugin cho Jenkins, cho phép chúng ta mô tả một pipeline như một tập các bước thực hiện bằng một tập tin văn bản (thường là Groovy). Các cấu trúc điều khiển như condition
, options
và interactive
giúp chúng ta kiểm soát luồng thực hiện của pipeline, tùy biến các bước và tương tác với người dùng.
Condition (Điều kiện)
condition
cho phép chúng ta thực thi một bước chỉ khi một điều kiện nào đó được đáp ứng. Điều kiện có thể là kết quả của một lệnh, một biến môi trường, hoặc một phép so sánh.
Trong Jenkins Pipeline, điều kiện when
được sử dụng để kiểm soát việc thực hiện các bước trong pipeline dựa trên một số điều kiện nhất định. Điều này giúp cho pipeline trở nên linh hoạt hơn, chỉ chạy các bước cần thiết trong các tình huống cụ thể.
Đây là một số cách sử dụng điều kiện when
trong Jenkins Pipeline:
Branch: Chạy bước nếu pipeline đang chạy trên một nhánh cụ thể.
when { branch 'main' }
Environment: Chạy bước nếu một biến môi trường có giá trị cụ thể.
when { environment name: 'ENV', value: 'production' }
Expression: Chạy bước nếu một biểu thức Groovy trả về giá trị
true
.when { expression { return env.BRANCH_NAME == 'main' } }
Not: Chạy bước nếu điều kiện bên trong
not
không đúng.when { not { branch 'development' } }
AnyOf: Chạy bước nếu bất kỳ điều kiện nào trong danh sách là đúng.
when { anyOf { branch 'main' branch 'release' } }
AllOf: Chạy bước nếu tất cả điều kiện trong danh sách đều đúng.
when { allOf { branch 'main' environment name: 'ENV', value: 'production' } }
Options (Tùy chọn)
options
cho phép chúng ta cấu hình các tùy chọn cho một bước hoặc một giai đoạn. Một số tùy chọn phổ biến bao gồm:
timeout
: Thiết lập thời gian tối đa cho một bước.retry
: Cấu hình số lần thử lại nếu một bước thất bại.buildDiscarder
: Xóa các bản build cũ.
Trong Jenkins Pipeline, từ khóa options
được sử dụng để cấu hình các thiết lập khác nhau của toàn bộ pipeline hoặc từng giai đoạn (stage) cụ thể. Các tùy chọn này giúp kiểm soát hành vi của pipeline, tối ưu hóa quá trình build, quản lý thời gian chờ, số lần retry, và nhiều hơn nữa.
Dưới đây là một số tùy chọn phổ biến trong Jenkins Pipeline:
buildDiscarder: Đặt quy tắc để xóa các build cũ nhằm tiết kiệm không gian lưu trữ.
options { buildDiscarder(logRotator(numToKeepStr: '5')) }
timeout: Đặt thời gian chờ tối đa cho pipeline hoặc một stage cụ thể.
options { timeout(time: 1, unit: 'HOURS') }
retry: Tự động retry lại một số lần nếu bước hoặc stage bị thất bại.
options { retry(3) }
timestamps: Bật timestamp cho log đầu ra để dễ dàng theo dõi thời gian.
options { timestamps() }
ansiColor: Bật hỗ trợ màu sắc ANSI trong log đầu ra.
options { ansiColor('xterm') }
disableConcurrentBuilds: Ngăn chặn các build đồng thời của cùng một pipeline.
options { disableConcurrentBuilds() }
checkoutToSubdirectory: Checkout mã nguồn vào một thư mục con cụ thể.
options { checkoutToSubdirectory('subdir') }
skipDefaultCheckout: Bỏ qua bước checkout mặc định.
options { skipDefaultCheckout() }
preserveStashes: Giữ lại các stash qua một số build nhất định.
options { preserveStashes(buildCount: 5) }
Ví dụ đầy đủ của một Jenkins Pipeline với các tùy chọn options
:
pipeline {
agent any
options {
buildDiscarder(logRotator(numToKeepStr: '10'))
timeout(time: 1, unit: 'HOURS')
timestamps()
ansiColor('xterm')
}
stages {
stage('Build') {
options {
retry(3)
timeout(time: 30, unit: 'MINUTES')
}
steps {
echo 'Building...'
}
}
stage('Test') {
steps {
echo 'Testing...'
}
}
stage('Deploy') {
options {
disableConcurrentBuilds()
}
steps {
echo 'Deploying...'
}
}
}
}
Trong ví dụ này:
options
của pipeline thiết lập quy tắc xóa build cũ, thời gian chờ tối đa cho toàn bộ pipeline, bật timestamp, và hỗ trợ màu sắc ANSI.options
của stage "Build" thiết lập số lần retry, và thời gian chờ riêng cho stage này.options
của stage "Deploy" ngăn chặn các build đồng thời.
Trong Jenkins Pipeline, tùy chọn interactive
không phải là một từ khóa có sẵn. Tuy nhiên, có thể bạn đang nhắc đến các tính năng liên quan đến việc tương tác với người dùng trong quá trình thực hiện pipeline. Jenkins Pipeline hỗ trợ một số phương thức để thực hiện tương tác với người dùng, chẳng hạn như sử dụng input
step để yêu cầu xác nhận hoặc cung cấp dữ liệu trước khi tiếp tục.
Dưới đây là một số cách để thêm tính năng tương tác trong Jenkins Pipeline:
Sử dụng
input
step: Yêu cầu người dùng nhập thông tin hoặc xác nhận trước khi tiếp tục pipeline.pipeline { agent any stages { stage('Build') { steps { echo 'Building...' } } stage('Approval') { steps { script { def userInput = input id: 'Approval', message: 'Do you approve?', parameters: [choice(name: 'Approve', choices: 'Yes\nNo', description: 'Approve or not')] if (userInput == 'Yes') { echo 'User approved' } else { error 'User did not approve' } } } } stage('Deploy') { steps { echo 'Deploying...' } } } }
Trong ví dụ này, pipeline yêu cầu người dùng xác nhận tiếp tục sau khi hoàn thành bước "Build". Nếu người dùng chọn "Yes", pipeline sẽ tiếp tục đến bước "Deploy". Nếu chọn "No", pipeline sẽ dừng và thông báo lỗi.
Sử dụng nhiều
input
step: Yêu cầu nhiều dữ liệu từ người dùng.pipeline { agent any stages { stage('Build') { steps { echo 'Building...' } } stage('Get User Input') { steps { script { def userInput = input( id: 'UserInput', message: 'Provide the following details', parameters: [ string(name: 'Branch', defaultValue: 'main', description: 'Which branch to deploy?'), booleanParam(name: 'Proceed', defaultValue: true, description: 'Proceed with deployment?') ] ) echo "Branch: ${userInput.Branch}" echo "Proceed: ${userInput.Proceed}" } } } stage('Deploy') { steps { echo 'Deploying...' } } } }
Trong ví dụ này, pipeline yêu cầu người dùng cung cấp tên nhánh để deploy và xác nhận liệu có tiếp tục hay không. Thông tin này sau đó được sử dụng trong các bước tiếp theo của pipeline.
Sử dụng
input
vớicredentials
: Yêu cầu người dùng cung cấp thông tin đăng nhập.pipeline { agent any stages { stage('Build') { steps { echo 'Building...' } } stage('Get Credentials') { steps { script { def userInput = input( id: 'CredentialsInput', message: 'Provide your credentials', parameters: [ credentials(name: 'USER_CREDENTIALS', description: 'Your credentials') ] ) echo "Credentials ID: ${userInput.USER_CREDENTIALS}" } } } stage('Deploy') { steps { echo 'Deploying...' } } } }
Trong ví dụ này, pipeline yêu cầu người dùng cung cấp thông tin đăng nhập và lưu trữ giá trị này để sử dụng trong các bước tiếp theo.
Các bước input
giúp pipeline trở nên linh hoạt hơn bằng cách cho phép tương tác với người dùng trong quá trình thực thi. Điều này rất hữu ích trong các kịch bản cần xác nhận của người dùng trước khi thực hiện các hành động quan trọng như triển khai mã nguồn, chạy test hoặc thực hiện các thao tác quản trị hệ thống.
Kết hợp condition, option và interactive
Chúng ta có thể kết hợp condition
, options
và interactive
để tạo ra các pipeline phức tạp và linh hoạt hơn.
Ví dụ:
pipeline {
agent any
stages {
stage('Deploy to Staging') {
when {
expression { return env.BRANCH_NAME == 'develop' }
}
options {
timeout(time: 10, unit: 'MINUTES')
}
steps {
sh 'kubectl apply -f deployment.yaml'
}
}
stage('Deploy to Production') {
when {
expression { return env.BRANCH_NAME == 'master' }
}
steps {
input 'Are you sure you want to deploy to production?'
sh 'kubectl apply -f deployment.yaml'
}
}
}
}