6.Jenkins pipeline

Jenkins pipeline

Pipeline 流水线

Jenkins 流水线是一套插件,用来实现CI / CD pipeline

6.Jenkins pipeline_第1张图片

Jenkinsfile

Jenkinsfile定义了整个Jenkins Pipeline的执行过程。

Jenkinsfile 本身能使用声明和脚本两套语法,一般推荐使用声明式语法。

Pipeline DSL
Jenkins DSL

Job DSL是Jenkins最早流行的插件之一,它允许将配置写成代码的形式。

DSL代表Domain specific language领域特定语言。Jenkins DSL基于Groovy实现。

[外链图片转存中…(img-rv1wohiX-1705545500712)]

DSL Plugin

如果之前没有安装过DSL Plugin:

  • Manage Jenkins > Manage Plugins > Available Tab
  • 在filter框内输入DSL,找到Job DSL,点击install without restart
  • 点击 restart jenkins when installation is complete and np jobs are running
  • 安装完成后进入Installed Tab查看

Pipeline插件准确说使用的是Pipeline DSL来实现CI / CD pipeline。和Jenkins DSL不完全相同,并且Jenkins Pipeline对于复杂的管道在性能、可维护、复杂度管理等方面表现更加出色。

Pipeline Plugin

Pipeline Plugin是Jenkins初次启动时,推荐安装的插件之一。如果之前使用了默认安装,此时应该已经加载有Pipeline Plugin

  • Manage Jenkins > Manage Plugins > Installed Tab
  • 在filter框内输入Pipeline,查看Pipeline plugin
Declarative Pipeline 声明式流水线
pipeline {
    agent any

    stages {
        stage('Build') { 
            steps {
                echo 'Building ...'
            }
        }
        stage('Test') { 
            steps {
                echo 'Testing ...'
            }
        }
        stage('Deploy') { 
            steps {
                echo 'Deploying ...'
            }
        }
    }
}
  1. Declarative Pipeline jenkinsfile 总是从pipeline开始。 pipeline 流水线是最基础的概念模型。定义了整个流水线的构建过程, 通常包括构建, 测试和交付等步骤(指令块block)。
  2. agent 声明Jenkins为整个流水线分配一个执行器 (在节点上)和工作区。any表示在任何可用的代理上执行。agent一般定义在pipeline 块的顶层, 但是每个stage可以有自己的agent。
  3. stages可以封装多个stage指令。
  4. stage定义了在整个流水线的不同阶段(比如Build, TestDeploy),可以包含多个步骤。
  5. steps 包含了一串执行列表

Pipeline project

New Item > Pipeline (name: pipeline)

  • pipeline section,填入上面的jenkinsfile
  • 保存
  • Build
  • 查看每阶段log
  • 查看输出
multi-steps pipeline
pipeline {
    agent any

    stages {
        stage('Build') { 
            steps {
                sh 'echo "multi-steps pipeline"'
                sh '''
                    echo "Hello World"
                    whoami
                    ls -l
                '''
            }
        }
    }
}
失败重试
pipeline {
    agent any

    stages {
        stage('Timeout') { 
            steps {
                retry(3) {
                    sh 'timeout failure...'
                }
            }
        }
    }
}
失败超时
pipeline {
    agent any

    stages {
        stage('Deploy') { 
            steps {
                retry(3) {
                    sh 'echo hello_world'
                }

                timeout(time: 3, unit: 'SECONDS') {
                    sh 'sleep 5'
                }
            }
        }
    }
}
环境变量
pipeline {
    agent any

    environment {
        NAME1 = 'Tom'
        NAME2 = 'Jerry'
    }

    stages {
        stage('Build') { 
            steps {
                sh 'echo "Hello, $NAME1 and $NAME2"'
            }
        }
    }
}
post actions
pipeline {
    agent any

    stages {
        stage('Test') { 
            steps {
                sh 'echo "test fail!"; exit 1'
            }
        }
    }

    post {
        always {
            echo 'always executed'
        }
        success {
            echo 'executed if this test success'
        }
        failure {
            echo 'executed if this test fails'
        }
    }
}
pipeline {
    agent any

    stages {
        stage('Test') { 
            steps {
                sh 'echo "test success!"'
            }
        }
    }

    post {
        always {
            echo 'always executed'
        }
        success {
            echo 'executed if this test success'
        }
        failure {
            echo 'executed if this test fails'
        }
    }
}

Blue Ocean

除了在Jenkins项目配置中写入Pipeline DSL, 还可以通过BlueOcean UI设置流水线项目。

Blue Ocean 重新思考Jenkins的用户体验,重新设计Jenkins Pipeline, 但与原有的Jenkins作业兼容,增加了新的特性:

  • Pipeline可视化
  • 异常处理可视化
  • Pipeline 编辑器
  • Git集成协作

但是BlueOcean暂时还不成熟,原有的Jenkins classic UI依然保留。需要以插件的形式安装BlueOcean

BlueOcean Plugin

默认情况下不安装 BlueOcean Plugin,手动安装流程如下

  • Manage Jenkins > Manage Plugins > Available Tab
  • 在filter框内输入blue ocean,点击安装
  • Blue Ocean 会自动安装有依赖关系的插件
  • 重启

Dashboard左侧出现Open Blue Ocean

添加Git Repo到流水线

  • 将Jenkins Group改为public
  • 新建一个空的Gitlab repo blueocean,也选pulic
  • 将Ubuntu添加为owner

在BlueOcean页面

  • 选New Pipeline
  • Git
    • URL: http://10.0.0.215/jenkins/blueocean.git
    • credential
      • Username: Ubuntu
      • Password: 12345678
  • Create pipeline
点击Create Pipeline

进入UI配置界面,点击+添加一个新的stage

  • Stage Name: Build
  • 点击 Add steps:
    • 选Shell script
      • echo "Hello World!"
  • 再次点击 Add steps:
    • Print Message:Hello BlueOcean
  • 点击Save
    • Description: Add initial Jenkinsfile
    • Commit to master
    • Save & run

点击 Show branches
构建成功会更新状态图标
点击查看pipeline

回到Git repo查看

刷新一下BlueOcean的git repo。出现了一个Jenkinsfile

pipeline {
  agent any
  stages {
    stage('Build') {
      steps {
        sh 'echo "Hello World!"'
        echo 'Hello BlueOcean'
      }
    }
  }
}

将BlueOcean设置为定期构建新的更动

回到BlueOcean的项目页面

  • 点击⚙️
  • Scan Multibranch Pipeline Triggers
  • 勾选 Periodically if not otherwise run
    • Interval : 1 minute
  • 保存

BlueOcean会每隔1分钟去查看一下有没有新的代码更动,如果有会自动执行pipeline

加入新的pipeline流程

新增代码

通过Gitlab的Web IDE,新建一个静态页面,写入一些有bug的代码

index.html

 doctype html>
    <html>
      <head>
        <title>Static HTML Sitetitle>
      head>
      <body>
        <p>This is a simple Static HTML site. There is no <strong>CSSstrong> or <strong>JavaScriptscript>.p>
      body>
    html>

安装tidy

sudo apt-get install -y tidy

在Jenkinsfile中,加入Lint检查

pipeline {
  agent any
  stages {
    stage('Build') {
      steps {
        sh 'echo "Hello World!"'
        echo 'Hello BlueOcean'
      }
    }
    stage('Lint HTML') {
        steps {
            sh 'tidy -q -e *.html'
        }
    }
  }
}
  • Create commit
  • Create a new branch
    • name: html
    • Start a new merge request
查看pipeline

BlueOcean 显示 Lint HTML 阶段失败,提示

line 7 column 83 - Warning: replacing unexpected script with

找到对应的代码,修改bug,并提交

等待1分钟,重试pipeline,Lint HTML 阶段成功

提交Merge request

  • 在Gitlab中,从html branch向main branch发起合并请求
  • 点击Approve
  • 点击Merge

代码进入main branch

BlueOcean 显示了一个新的main branch构建

Jenkins & Maven& BlueOcean

simple-java-maven-app 中也包含了一个Jenkinsfile,

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                sh 'mvn -B -DskipTests clean package'
            }
        }
        stage('Test') {
            steps {
                sh 'mvn test'
            }
            post {
                always {
                    junit 'target/surefire-reports/*.xml'
                }
            }
        }
        stage('Deliver') {
            steps {
                sh './jenkins/scripts/deliver.sh'
            }
        }
    }
}

安装Maven命令

sudo apt-get install -y maven

在BlueOcean页面

  • 选New Pipeline
  • Git
    • URL: http://10.0.0.215/jenkins/maven.git
    • credential
      • Username: Ubuntu
      • Password: 12345678
  • Create pipeline

但是Jenkinsfile并不在默认路径上,所以需要进Configure页面修改

  • 选择 Build Configuration
  • Script Path:jenkins/Jenkinsfile
  • 保存

显示 Scan Multibranch Pipeline Log 成功,点击Open Blue Ocean
Start > Build > Test > Deliver > End 成功, 输出Hello World

你可能感兴趣的:(jenkins,servlet,java)