Jenkins流水线Jenkinsfile编写

前言

Jenkinsfile文件描述Jenkins项目构建的步骤,以达到将项目构建的配置描述转移到文件中的目的。

Jenkinsfile例子

pipeline {  
    agent any  
    // 指定使用的JDK和Maven,关联的是全局工具配置里面的名称
    tools {  
        jdk 'JDK'  
        maven 'Maven'  
    }
    // 指定构建使用的参数  
    parameters {  
        gitParameter branch: '',  
            branchFilter: '.*',  
            defaultValue: 'origin/test',  
            description: '分支或标签',  
            name: 'branch',  
            quickFilterEnabled: false,  
            selectedValue: 'NONE',  
            sortMode: 'NONE',  
            tagFilter: '*',  
            type: 'GitParameterDefinition'  
        choice choices: ['odm-test', 'odm-dev', 'odm-prod'],  
            description: '''部署到开发环境,选择odm-dev  
部署到测试环境,选择odm-test  
部署到生产环境,选择odm-prod''',  
            name: 'deploy'  
    }
    // 流水线分为5个阶段  
    stages {  
        stage('pull') {  
            // 拉取代码阶段
            steps {  
                checkout poll: false,  
                    scm: scmGit(branches: [[name: '${branch}']],  
                        extensions: [],  
                        userRemoteConfigs: [[credentialsId: 'ac63e72e-96c4-4870-a5bb-0864d699e703',  
                            url: 'http://192.168.2.220/gitlab-instance-f8b3317d/odm.git']])  
            }  
        }  
        stage('pre steps') {  
            // 构建前准备阶段
            steps {  
                // 使用Publish Over SSH插件,构建参数deploy指定要发送的服务器,变量名称与系统配置中的服务器名称关联
                // 这里不传输文件,只执行shell脚本,清理上一次部署留下的文件
                sshPublisher(publishers: [sshPublisherDesc(configName: "${params.deploy}",  
                    transfers: [sshTransfer(cleanRemote: false,  
                        excludes: '',  
                        execCommand: '''rm -rf /opt/odm  
mkdir -p /opt/odm''',  
                        execTimeout: 120000,  
                        flatten: false,  
                        makeEmptyDirs: false,  
                        noDefaultExcludes: false,  
                        patternSeparator: '[, ]+',  
                        remoteDirectory: '',  
                        remoteDirectorySDF: false,  
                        removePrefix: '',  
                        sourceFiles: '')],  
                    usePromotionTimestamp: false,  
                    useWorkspaceInPromotion: false,  
                    verbose: false)])  
            }  
        }  
        stage('build') {  
            // 构建阶段
            steps {  
                // 执行shell命令,使用Maven构建打包
                sh "mvn clean package"  
            }  
        }  
        stage('post steps') {  
            // 构建后处理阶段
            steps {  
                // 同样使用Publish Over SSH插件,将Maven构建后生成的jar包发送到服务器指定路径,并修改jar包名称
                sshPublisher(publishers: [sshPublisherDesc(configName: "${params.deploy}",  
                    transfers: [sshTransfer(cleanRemote: false,  
                        excludes: '',  
                        execCommand: 'mv /opt/odm/*.jar /opt/odm/odm.jar',  
                        execTimeout: 120000,  
                        flatten: false,  
                        makeEmptyDirs: false,  
                        noDefaultExcludes: false,  
                        patternSeparator: '[, ]+',  
                        remoteDirectory: '/opt/odm',  
                        remoteDirectorySDF: false,  
                        removePrefix: 'target',  
                        sourceFiles: 'target/*.jar')],  
                    usePromotionTimestamp: false,  
                    useWorkspaceInPromotion: false,  
                    verbose: false)])  
                // 从Maven构建内容中找到Dockerfile,发送到服务器指定路径
                sshPublisher(publishers: [sshPublisherDesc(configName: "${params.deploy}",  
                    transfers: [sshTransfer(cleanRemote: false,  
                        excludes: '',  
                        execCommand: '',  
                        execTimeout: 120000,  
                        flatten: false,  
                        makeEmptyDirs: false,  
                        noDefaultExcludes: false,  
                        patternSeparator: '[, ]+',  
                        remoteDirectory: '/opt/odm',  
                        remoteDirectorySDF: false,  
                        removePrefix: 'target/classes',  
                        sourceFiles: 'target/classes/Dockerfile')],  
                    usePromotionTimestamp: false,  
                    useWorkspaceInPromotion: false,  
                    verbose: false)])  
                // 从Maven构建内容中找到需要执行的shell脚本,发送到服务器指定路径,设置可执行权限,并执行
                sshPublisher(publishers: [sshPublisherDesc(configName: "${params.deploy}",  
                    transfers: [sshTransfer(cleanRemote: false,  
                        excludes: '',  
                        execCommand: '''chmod +x /opt/odm/*.sh  
/opt/odm/clean.sh  
/opt/odm/run.sh''',  
                        execTimeout: 120000,  
                        flatten: false,  
                        makeEmptyDirs: false,  
                        noDefaultExcludes: false,  
                        patternSeparator: '[, ]+',  
                        remoteDirectory: '/opt/odm',  
                        remoteDirectorySDF: false,  
                        removePrefix: 'target/classes/shell',  
                        sourceFiles: 'target/classes/shell/*.sh')],  
                    usePromotionTimestamp: false,  
                    useWorkspaceInPromotion: false,  
                    verbose: false)])  
                // 清理Jenkins工作空间
                cleanWs()  
            }  
        }  
    }  
}

流水线语法生成

新增一个流水线

点击流水线语法辅助生成Jenkinsfile

上文例子中使用到的流水线语法生成

Declarative Directive Generator

  • tools: Tools

片段生成器

  • sh: Shell Script
  • checkout: Check out from version control
  • sshPublisher: Send build artifacts SSH
  • cleanWs: Delete workspace when build is done

参数化构建

流水线语法生成

Declarative Directive Generator

  • parameters: Parameters

Git参数

安装插件 Git Parameter Plug-In

parameters {
  gitParameter branch: '', branchFilter: '.*', defaultValue: 'origin/test', description: '分支或标签', name: 'branch', quickFilterEnabled: false, selectedValue: 'NONE', sortMode: 'NONE', tagFilter: '*', type: 'GitParameterDefinition'
}
checkout poll: false, scm: scmGit(branches: [[name: '${branch}']], extensions: [], userRemoteConfigs: [[credentialsId: 'ac63e72e-96c4-4870-a5bb-0864d699e703', url: 'http://192.168.2.220/gitlab-instance-f8b3317d/dms.git']])

选项参数

parameters {
  choice choices: ['odm-test', 'odm-dev', 'odm-prod'], description: '''部署到开发环境,选择odm-dev
部署到测试环境,选择odm-test
部署到生产环境,选择odm-prod''', name: 'deploy'
}

参数插值使用时,需要在双引号内

sshPublisher(publishers: [sshPublisherDesc(configName: "${params.deploy}", transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''rm -rf /opt/odm
mkdir -p /opt/odm''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])