Jenkins流水线

简介: 之前采用Jenkins的自由风格构建的项目,每个步骤流程都要通过不同的方式设置,并且构建过程中整体流程是不可见的,无法确认每个流程花费的时间,并且问题不方便定位问题。Jenkins的Pipeline可以让项目的发布整体流程可视化,明确执行的阶段,可以快速的定位问题。并且整个项目的生命周期可以通过一个Jenkinsfile文件管理,而且Jenkinsfile文件是可以放在项目中维护。所以Pipeline相对自由风格或者其他的项目风格更容易操作。

一、Jenkins流水线任务介绍
之前采用Jenkins的自由风格构建的项目,每个步骤流程都要通过不同的方式设置,并且构建过程中整体流程是不可见的,无法确认每个流程花费的时间,并且问题不方便定位问题。
Jenkins的Pipeline可以让项目的发布整体流程可视化,明确执行的阶段,可以快速的定位问题。并且整个项目的生命周期可以通过一个Jenkinsfile文件管理,而且Jenkinsfile文件是可以放在项目中维护。
所以Pipeline相对自由风格或者其他的项目风格更容易操作。
二、 Jenkins流水线任务

  1. 构建Jenkins流水线任务

构建任务

构建Jenkins流水线任务

生成Groovy脚本

Hello World脚本生成

构建后查看视图

构建后查看视图

  1. Groovy脚本

Groovy脚本基础语法
// 所有脚本命令包含在pipeline{}中
pipeline {

// 指定任务在哪个节点执行(Jenkins支持分布式)
agent any

// 配置全局环境,指定变量名=变量值信息
environment{
    host = '192.168.11.11'
}

// 存放所有任务的合集
stages {
    // 单个任务
    stage('任务1') {
        // 实现任务的具体流程
        steps {
            echo 'do something'
        }
    }
    // 单个任务
    stage('任务2') {
        // 实现任务的具体流程
        steps {
            echo 'do something'
        }
    }
    // ……
}

}
复制代码

编写例子测试
pipeline {

agent any

// 存放所有任务的合集
stages {
    stage('拉取Git代码') {
        steps {
            echo '拉取Git代码'
        }
    }

    stage('检测代码质量') {
        steps {
            echo '检测代码质量'
        }
    }

    stage('构建代码') {
        steps {
            echo '构建代码'
        }
    }

    stage('制作自定义镜像并发布Harbor') {
        steps {
            echo '制作自定义镜像并发布Harbor'
        }
    }

    stage('基于Harbor部署工程') {
        steps {
            echo '基于Harbor部署工程'
        }
    }
}

}
复制代码

配置Grovvy脚本

查看效果

查看效果

Ps:涉及到特定脚本,Jenkins给予了充足的提示,可以自动生成命令

生成命令位置
3.Jenkinsfile实现
Jenkinsfile方式需要将脚本内容编写到项目中的Jenkinsfile文件中,每次构建会自动拉取项目并且获取项目中Jenkinsfile文件对项目进行构建

配置pipeline

配置pipeline

准备Jenkinsfile

准备Jenkinsfile文件

测试效果

测试效果

三、Jenkins流水线任务实现

  1. 参数化构建

添加参数化构建,方便选择不的项目版本

Git参数化构建

  1. 拉取Git代码

通过流水线语法生成Checkout代码的脚本

语法生成

pipeline {

agent any
stages {

    stage('拉取Git代码') {
        steps {
            checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://49.233.115.171:8929/root/test.git']]])
        }
    }
}

}
复制代码

  1. 构建代码

通过脚本执行mvn的构建命令
pipeline {

agent any

stages {

    stage('拉取Git代码') {
        steps {
            checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://49.233.115.171:8929/root/test.git']]])
        }
    }

    stage('构建代码') {
        steps {
            sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
        }
    }

}

复制代码

  1. 代码质量检测

通过脚本执行sonar-scanner命令即可
pipeline {

agent any

stages {

    stage('拉取Git代码') {
        steps {
            checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://49.233.115.171:8929/root/test.git']]])
        }
    }

    stage('构建代码') {
        steps {
            sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
        }
    }

    stage('检测代码质量') {
        steps {
            sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=target/ -Dsonar.login=31388be45653876c1f51ec02f0d478e2d9d0e1fa' 
        }
    }
}

}

复制代码

  1. 制作自定义镜像并发布

生成自定义镜像脚本
pipeline {

agent any
environment{
    harborHost = '192.168.11.11:80'
    harborRepo = 'repository'
    harborUser = 'DevOps'
    harborPasswd = 'P@ssw0rd'
}

// 存放所有任务的合集
stages {

    stage('拉取Git代码') {
        steps {
            checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://49.233.115.171:8929/root/test.git']]])
        }
    }

    stage('构建代码') {
        steps {
            sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
        }
    }

    stage('检测代码质量') {
        steps {
            sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=target/ -Dsonar.login=31388be45653876c1f51ec02f0d478e2d9d0e1fa' 
        }
    }

    stage('制作自定义镜像并发布Harbor') {
        steps {
            sh '''cp ./target/*.jar ./docker/
            cd ./docker
            docker build -t ${JOB_NAME}:${tag} ./'''

            sh '''docker login -u ${harborUser} -p ${harborPasswd} ${harborHost}
            docker tag ${JOB_NAME}:${tag} ${harborHost}/${harborRepo}/${JOB_NAME}:${tag}
            docker push ${harborHost}/${harborRepo}/${JOB_NAME}:${tag}'''
        }
    }
}

}
复制代码

生成Publish Over SSH脚本
pipeline {

agent any
environment{
    harborHost = '192.168.11.11:80'
    harborRepo = 'repository'
    harborUser = 'DevOps'
    harborPasswd = 'P@ssw0rd'
}

// 存放所有任务的合集
stages {

    stage('拉取Git代码') {
        steps {
            checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://49.233.115.171:8929/root/test.git']]])
        }
    }

    stage('构建代码') {
        steps {
            sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
        }
    }docker

    stage('检测代码质量') {
        steps {
            sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=target/ -Dsonar.login=7d66af4b39cfe4f52ac0a915d4c9d5c513207098' 
        }
    }

    stage('制作自定义镜像并发布Harbor') {
        steps {
            sh '''cp ./target/*.jar ./docker/
            cd ./docker
            docker build -t ${JOB_NAME}:${tag} ./'''

            sh '''docker login -u ${harborUser} -p ${harborPasswd} ${harborHost}
            docker tag ${JOB_NAME}:${tag} ${harborHost}/${harborRepo}/${JOB_NAME}:${tag}
            docker push ${harborHost}/${harborRepo}/${JOB_NAME}:${tag}'''
        }
    }
    
    stage('目标服务器拉取镜像并运行') {
        steps {
            sshPublisher(publishers: [sshPublisherDesc(configName: 'testEnvironment', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/usr/bin/deploy.sh $harborHost $harborRepo $JOB_NAME $tag $port ", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
        }
    }
}

}

相关文章
|
4月前
|
jenkins 持续交付 开发工具
jenkins学习笔记之一:流水线基础语法
jenkins学习笔记之一:流水线基础语法
|
4月前
|
jenkins Devops Java
jenkins学习笔记之十:配置Gitlab提交流水线
jenkins学习笔记之十:配置Gitlab提交流水线
|
4月前
|
jenkins 持续交付 Windows
Jenkins Pipeline 多分支流水线 Input length = 1
Jenkins Pipeline 多分支流水线 Input length = 1
38 0
|
4月前
|
运维 jenkins Devops
Jenkins 多分支流水线(SVN)
Jenkins 多分支流水线(SVN)
76 0
|
4月前
|
jenkins 持续交付
Jenkins Pipeline 流水线 - Parameters 参数化构建
Jenkins Pipeline 流水线 - Parameters 参数化构建
123 0
|
4月前
|
jenkins 持续交付 网络安全
Jenkins Pipeline 流水线 - 完整构建 Pipeline Script 脚本
Jenkins Pipeline 流水线 - 完整构建 Pipeline Script 脚本
76 0
|
4月前
|
Kubernetes jenkins 网络安全
Jenkins Pipeline 流水线 - 使用代理节点,Remote SSH 对 K8S 进行升级
Jenkins Pipeline 流水线 - 使用代理节点,Remote SSH 对 K8S 进行升级
53 0
|
27天前
|
jenkins Devops Java
DevOps实践:Jenkins在持续集成与持续部署中的价值
【10月更文挑战第27天】在快速发展的软件开发领域,DevOps实践日益重要。Jenkins作为一款流行的开源自动化服务器,在持续集成(CI)和持续部署(CD)中扮演关键角色。本文通过案例分析,探讨Jenkins在Java项目中的应用,展示其自动化构建、测试和部署的能力,提高开发效率和软件质量。
47 2
|
4月前
|
jenkins 持续交付 开发者
自动化部署:使用Jenkins和Docker实现持续集成与交付
【8月更文挑战第31天】本文旨在为读者揭示如何通过Jenkins和Docker实现自动化部署,从而加速软件开发流程。我们将从基础概念讲起,逐步深入到实际操作,确保即使是初学者也能跟上步伐。文章将提供详细的步骤说明和代码示例,帮助读者理解并应用这些工具来优化他们的工作流程。
|
15天前
|
运维 jenkins Java
Jenkins在持续集成与持续部署中的价值
Jenkins在持续集成与持续部署中的价值