jenkins使用pipeline进行持续集成

Pipeline 简而言之,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化

Pipeline 支持两种语法

1、声明式(jenkins2.5新加入的语法)

特点:
1.最外层必须由pipline{ //do something }来进行包裹
2.不需要分好作为分隔符,每个语句必须在一行内
3.不能直接使用groovy语句(例如循环判断等),需要被script {}包裹

2、脚本式

特点:
1.最外层有node{}包裹
2.可直接使用groovy语句


第一步、创建流水线任务


第二步、编写Pipeline

1、我们需要从svn拉取代码

选择拉取代码的版本库然后点击自动生成脚本

将生成的脚本,写入执行脚本的第一个步骤

pipeline
{
    agent any
    environment
    {
        MAVEN_HOME = "/opt/apache-maven-3.6.3"
    }
   stages
   {
        stage('pull')
        {
            steps
            {
              echo 'pull.......'
              checkout([$class: 'SubversionSCM', additionalCredentials: [], excludedCommitMessages: '', excludedRegions: '', excludedRevprop: '', excludedUsers: '', filterChangelog: false, ignoreDirPropChanges: false, includedRegions: '', locations: [[cancelProcessOnExternalsFail: true, credentialsId: '5e2fd655-fbb0-477a-8d84-82f2fc98f39d', depthOption: 'infinity', ignoreExternalsOption: true, local: '.', remote: 'svn://8.133.171.148/repo/demo']], quietOperation: true, workspaceUpdater: [$class: 'UpdateUpdater']])
            }
        }
   }
}

2、编译打包代码

pipeline
{
    agent any
    environment
    {
        MAVEN_HOME = "/opt/apache-maven-3.6.3"
    }
   stages
   {
        stage('pull')
        {
            steps
            {
              echo 'pull.......'
              checkout([$class: 'SubversionSCM', additionalCredentials: [], excludedCommitMessages: '', excludedRegions: '', excludedRevprop: '', excludedUsers: '', filterChangelog: false, ignoreDirPropChanges: false, includedRegions: '', locations: [[cancelProcessOnExternalsFail: true, credentialsId: '5e2fd655-fbb0-477a-8d84-82f2fc98f39d', depthOption: 'infinity', ignoreExternalsOption: true, local: '.', remote: 'svn://8.133.171.148/repo/demo']], quietOperation: true, workspaceUpdater: [$class: 'UpdateUpdater']])
            }
        }
       stage('build')
       {
           steps
           {
               echo "build....."
               sh "${MAVEN_HOME}/bin/mvn clean package -Dmaven.test.skip=true"
           }
       }
   }
}

3、部署到服务器,和之前一样,我们选择上传服务器的操作,之后生成对应的脚本


第四步、我们在项目中创建一个名为Jenkinsfile的文件,写入脚本(所有步骤),并且在jenkins中选择引入方式为外部引入

pipeline
{
    agent any

    environment
    {
        MAVEN_HOME = "/opt/apache-maven-3.6.3"
    }

    stages
    {
        stage('pull')
        {
            steps
            {
                echo 'pull.......'
                checkout([$class: 'SubversionSCM', additionalCredentials: [], excludedCommitMessages: '', excludedRegions: '', excludedRevprop: '', excludedUsers: '', filterChangelog: false, ignoreDirPropChanges: false, includedRegions: '', locations: [[cancelProcessOnExternalsFail: true, credentialsId: '5e2fd655-fbb0-477a-8d84-82f2fc98f39d', depthOption: 'infinity', ignoreExternalsOption: true, local: '.', remote: 'svn://8.133.171.148/repo/demo']], quietOperation: true, workspaceUpdater: [$class: 'UpdateUpdater']])
            }
        }
        stage('build')
        {
            steps
            {
                echo "build....."
                sh "${MAVEN_HOME}/bin/mvn clean package -Dmaven.test.skip=true"
            }
        }
        stage('deploy')
        {
            steps
            {
                echo "deploy....."
                sshPublisher(publishers: [sshPublisherDesc(configName: 'test-fuwuqi', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/home/work', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'Dockerfile'), sshTransfer(cleanRemote: false, excludes: '', execCommand: '''#自定义的工作路径(Dockerfile存放的路径)
                MY_WORK_PATH=/home/work
                PROJECT_NAME=my-demo
                
                CID=$(docker ps | grep "$PROJECT_NAME" | awk '{print $1}')
                IID=$(docker images | grep "$PROJECT_NAME" | awk '{print $3}')
                
                function delete(){
                docker stop $CID
                docker rm $CID
                docker rmi $IID
                }
                
                
                function build(){
                cd $MY_WORK_PATH
                docker build -t $PROJECT_NAME .
                }
                
                function run(){
                echo "构建最新代码"
                transfer
                delete
                build
                docker run --name $PROJECT_NAME  -d -p 8000:8000 $PROJECT_NAME
                echo "$PROJECT_NAME容器创建完成"
                }
                run''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/home/work', remoteDirectorySDF: false, removePrefix: 'target/', sourceFiles: 'target/*.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            }
        }
    }
}

第五步、构建项目

可以看到,与之前构建模式相比,pipeline这种构建模式可以看到你自定义的构建步骤


常见问题 :

1、Jenkins 编译JAVA报错:package javafx.util does not exist

Ubuntu下mvn编译java程序时报错,但开发环境没有错误

package javafx.util does not exist

查找代码发现使用了javafx类,该类仅存在OracleJDK中,OpenJDK中没有该类,就算安装了OpenJFX也无法解决

解决过程

1、Jenkins多版本JDK

  • 配置Jenkins的多版本JDK:Dashboard->全局工具配置->JDK
  • 选择JDK版本,选择自动安装
  • 或选择服务器上,其他版本JDK路径

2、Pipeline指定JDK版本 

成功编译 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值