Jenkins Pipeline dưới dạng Code. Hướng dẫn cho người mới bắt đầu

toannm

Jenkins pipeline dưới dạng code là một khái niệm xác định Jenkins build pipeline theo định dạng Jenkins DSL / Groovy. Bài viết này tập trung vào các khái niệm chính liên quan đến việc viết Jenkins pipeline dưới dạng code bằng cú pháp khai báo.

jenkins-pipeline-as-code-min-1200x385.png


Các bước trong hướng dẫn :

1. Pipeline dưới dạng Code cơ bản

2. Xây dựng một pipeline CI cơ bản dưới dạng code cho ứng dụng java.

3. Xây dựng một job từ pipeline code có trong repo code nguồn.

4. Thực hiện các giai đoạn song song trong một pipeline

5. Tạo tập lệnh & chỉ thị pipeline bằng cách sử dụng các trình tạo sẵn của Jenkins.

Jenkins Pipeline dưới dạng code

Có hai loại code pipeline Jenkins.

1. Declarative Pipeline _Pipeline khai báo

2. Scripted Pipeline_Pipeline kịch bản

Hướng dẫn này sẽ chỉ tập trung vào cú pháp khai báo vì đây là phiên bản nâng cao của Scripted Pipeline với các tính năng mở rộng. Phương pháp declarative pipeline được khuyên dùng cho tất cả các trường hợp sử dụng Jenkins.

Hãy cùng sử dụng một pipeline cho bản dựng ứng dụng Java Spring Boot bằng cách sử dụng declarative pipeline dưới dạng mã.

Điều kiện bắt buộc

1. Jenkins master

2. Jenkins slave node được kết nối với master

3. Truy cập Github.com từ Jenkins server. Nếu thiết lập Jenkins được sử dụng cho công ty, có thể sử dụng repo git riêng của công ty.

Dưới đây là đại diện hình ảnh của một bản dựng pipeline đơn giản

jenkins_pipeline_as_code_architecture.png

Đây là pipeline code cho workflow ở trên. Trước khi thiết lập pipeline, hãy cùng tìm hiểu ý nghĩa của từng block.

Lưu ý: Đừng lo lắng về DSL được sử dụng trong pipeline code. Bài viết có đưa ra các hướng dẫn đầy đủ để tạo DSL một cách dễ dàng

Mã:
pipeline {
 
    agent {
        node {
            label 'SLAVE01'
        }
    }
 
    tools {
        maven 'maven3'
    }
 
    options {
        buildDiscarder logRotator(
                    daysToKeepStr: '15',
                    numToKeepStr: '10'
            )
    }
 
    environment {
        APP_NAME = "DCUBE_APP",
        APP_ENV  = "DEV"
    }
 
    stages {
        
        stage('Cleanup Workspace') {
            steps {
                cleanWs()
                sh """
                echo "Cleaned Up Workspace for ${APP_NAME}"
                """
            }
        }
 
        stage('Code Checkout') {
            steps {
                checkout([
                    $class: 'GitSCM',
                    branches: [[name: '*/master']],
                    userRemoteConfigs: [[url: 'https://github.com/spring-projects/spring-petclinic.git']]
                ])
            }
        }
 
        stage('Code Build') {
            steps {
                 sh 'mvn install -Dmaven.test.skip=true'
            }
        }
 
        stage('Priting All Global Variables') {
            steps {
                sh """
                env
                """
            }
        }
 
    }   
}
Bây giờ hãy cùng tìm hiểu ý nghĩa của từng block

The Pipeline Block: Tất cả các pipeline dưới dạng mã phải được bọc bên trong pipeline block.

Mã:
pipeline {
 
---<All Pipeline blocks go here>---
 
}
Agent Block: Trong agent block, cần phải nêu rõ các chi tiết slave nơi muốn chạy pipeline job. Nó hỗ trợ cả slaves tĩnh and slave động dựa trên docker . Ở đây nó được dán nhãn là “SLAVE01“. Đó là tên của một slave node.

Mã:
agent {
        node {
            label 'SLAVE01'
        }
    }

Tools Block: Là nơi để tham khảo các tool đã cấu hình trong cấu hình công cụ Jenkins Global. (Sẽ được đề cập đến trong phần tiếp theo)

Mã:
tools {
        maven 'maven3'
    }
Options Block: Nơi chứa tất cả các tùy chọn cần thiết cho job. Ví dụ, bản “Build Discarder” đã được đưa ra để xoay các build log.

Mã:
options {
        buildDiscarder logRotator(
                    daysToKeepStr: '15',
                    numToKeepStr: '10'
            )
    }
Environment Block: Block này đề cập đến tất cả các biến cần thiết cho job , sẵn sang ở mọi giai đoạn. Có thể xác định bất kỳ số lượng biến nào như cặp khóa-giá trị

Mã:
environment {
        APP_NAME = "DCUBE_APP",
        APP_ENV  = "DEV"
    }
Stages: Stage Block chứa các giai đoạn.

Mã:
stages {
 
---<All Pipeline Stages Go Here>---
 
}
Stage Block: Một giai đoạn là một tập hợp con của các giai đoạn. Mỗi giai đoạn có một steps block
Steps Block: Mỗi steps block là nơi xác định tập hợp các thao tác để thực hiện. Ví dụ sau chỉ ra bước dọn dẹp workplace và lặp lại một biến đã được xác định trong Environment block. Những gì muốn chạy trong mỗi giai đoạn phụ thuộc hoàn toàn vào use case.

Mã:
stage('Cleanup Workspace') {
            steps {
                cleanWs()
                sh """
                echo "Cleaned Up Workspace for ${APP_NAME}"
                """
            }
        }
Trên đây là những hiểu biết cơ bản về một pipeline dưới dạng code tối giản, hãy đi vào thực hiện pipeline này trên Jenkins server với một slave node.

Cấu hình pipeline dưới dạng Codetrong Jenkins

Để thực thi pipeline code trong bài viết này, cần cấu hình maven trong Global Tool Configuration

Chuyển đến Manage Jenkins -> Global Tool Configuration -> Maven -> Cài đặt Maven.

Thêm một cấu hình maven như hình dưới đây. Tool đang được sử dụng có tên là maven3trong pipeline, nó đề cập đến maven trong “Global Tool Configuration”.

jenkins-maven-tool.jpg


Lưu ý: Chọn tùy chọn “Install Automatically” để ứng dụng tải xuống phiên bản đã chọn mỗi khi thực hiện job.

Tạo và xây dựng một Pipeline Job

Hãy thực hiện theo các bước dưới đây để tạo và xây dựng pipeline dưới dạng code

Bước 1: Tới trang chủ Jenkins và chọn mục “New Item”

image-10.png


Bước 2: Đặt tên, chọn “Pipeline” và ấn ok.

image-11.png


Bước 3: Cuộn xuống phần Pipeline, sao chép toàn bộ pipeline code trong phần tập lệnh và lưu nó.

image-12.png


Step 4: Bây giờ, hãy nhấp vào “Build Now” và đợi quá trình xây dựng bắt đầu.

image-13.png


Trong khi job được bắt đầu, có thể xem từng giai đoạn thực hiện trong chế độ xem giai đoạn. Dưới đây là ảnh chụp màn hình của một job được thực hiện thành công. Ngoài ra job log cũng có thể được ghi lại bằng cách nhấp vào biểu tượng màu xanh

image-14.png


Giao diện người dùng (UI) xem trạng thái job và log đây khá tốt nếu plugin Blue Ocean đã được cài đặt.. Sử dụng “Open in Blue Ocean” từ bên trái để mở một job trong chế độ xem Blue Ocean.

image-15.png


Thi công pipeline từ Github (Jenkinsfile)

Trong phần cuối cùng, pipeline script đã được sử dụng trực tiếp trên Jenkins. Trong phần này, hãy cùng xem xét cách thực thi pipeline scripts có sẵn trong hệ thống SCM như Github.

Bước 1: Tạo một repo Github với pipeline code trong một tệp có tên Jenkinsfile. Hoặc có thể sử dụng repo Github dưới để thử nghiệm. https://github.com/devopscube/pipeline-as-code-demo

Bước 2: Thực hiện theo các bước tương tự đã sử dụng để tạo một pipeline job. Nhưng thay vì nhập mã trực tiếp vào script block, hãy chọn tùy chọn “Pipeline script từ SCM” và điền chi tiết như hướng dẫnbên dưới.

1. Định nghĩa: Pipeline script từ SCM
2. Kho lưu trữ URL: https://github.com/devopscube/pipeline-as-code-demo
3. Script Path: Jenkinsfile

image-16.png


Bước 3: Lưu cấu hình và chạy bản dựng, bản dựng thành công sẽ được nhìn thấy

Thi công các Pipeline Stage song song

Có những trường hợp phải thực hiện song song các giai đoạn khác nhau vì mỗi giai đoạn độc lập và không phụ thuộc vào các bước khác. Ngoài ra, chạy các giai đoạn riêng biệt song song cũng giúp giảm thời gian xây dựng.

Chạy song song trong các Jenkins pipeline dưới dạng mã có thể thực hiện được bằng cách sử dụng parallel block.

Dưới đây là một giai đoạn ví dụ có chứa ba giai đoạn song song. Nó giống như sẽ có nhiều giai đoạn trong một giai đoạn. Điều này có thể được kiểm tra bằng cách thêm mã sau vào pipeline hiện có .

Mã:
stage('Environment Analysis') {
 
            parallel {
 
                stage('Priting All Global Variables') {
                    steps {
                        sh """
                        env
                        """
                    }
                }
 
                stage('Execute Shell') {
                    steps {
                        sh 'echo "Hello"'
                    }
                }
 
                stage('Print ENV variable') {
                    steps {
                        sh "echo ${APP_ENV}"
                    }
                }
 
            
            }
        }
Các execution song song có thể nhìn thấy từ Blue Ocean view

image-18.png


Tạo Pipeline Scripts

Hầu hết các pipeline script đều có thể được tạo từ Jenkins. Đây là cách nó hoạt động.

Jenkins có trình tạo kịch bản pipeline riêng. có thể truy cập đường dẫn /pipeline-syntax http://<your-jenkins-ip>:port/pipeline-syntax/ hoặc nhận đường dẫn trình tạo cú pháp từ cấu hình pipeline job như dưới đây.

image-19.png


Snippet Generator

Snippet Generator được sử dụng để tạo tất cả script đang được sử dụng bên trong các giai đoạn.

Generator trông như hình ảnh dưới, có thể chọn tùy chọn bắt buộc từ danh sách thả xuống các bước, điền vào các chi tiết cần thiết và tạo script để sử dụng trong pipeline

image-20.png


Declarative Directive Generator

Có thể sử dụng trình tạo lệnh để tạo tất cả các tùy chọn khác trong pipeline. Ví dụ: tùy chọn, tham số, kích hoạt, v.v.

Dưới đây là một ví dụ về việc tạo agent block.

image-22.png


Kết luận

Việc áp dụng pipeline code cho tất cả Jenkins workflow sẽ giúp kiểm soát nhiều hơn và sắp xếp hợp lý các pipeline cho nhu cầu CI / CD . Mở rộng các pipeline với một thư viện chia sẻ cho phép sử dụng lại pipeline code cho mọi triển khai.
 
Top