jenkins版本:2.150.1

pipeline语法选择有:Scripted(脚本式) Declarative(声明式)
jenkins从2.5版本开始支持两种格式的写法,本文使用Declarative语法,Jenkins社区推荐的语法。

本文篇幅有限,省略了代码检查、单元测试、制品库管理等过程。

环境

2台服务器,jenkins和部署服务器,其中jenkins服务器也用作编译服务器,最合理的方式应该将jenkins和编译服务器分别独立。
jenkins服务器:linux CentOS 6.7
部署服务器:linux CentOS 6.7
项目:springboot 2.x
源码管理:SVN

添加节点

将jenkins服务器的/root/.ssh/id_rsa.pub内容添加至节点的/root/.ssh/authorized_keys文件下,若没有则创建
在jenkins服务器上执行 ssh ip 命令若能免密登录则配置成功

登录jenkins选择节点列表,点击New Node,添加节点的详细过程不做详细说明。

创建jenkins job

新建任务--> 选择流水线方式

pipeline{
    agent none
    
    stages{
        stage('检出代码'){
            agent {
                label 'master'    
            }
            steps{
                checkout([$class: 'SubversionSCM', additionalCredentials: [], excludedCommitMessages: '', excludedRegions: '', excludedRevprop: '', 
                excludedUsers: '', filterChangelog: false, ignoreDirPropChanges: false, includedRegions: '', 
                locations: [[cancelProcessOnExternalsFail: true, credentialsId: '799a3fc0-7728-4579-a0dc-386af2bc8383', 
                depthOption: 'infinity', ignoreExternalsOption: true, local: '.', 
                remote: '']], quietOperation: true, workspaceUpdater: [$class: 'UpdateUpdater']])    
//remote参数是项目的SVN地址                
            }
        }
        stage('构建'){
            agent {
                label 'master'    
            }
            tools{  //tools的解释见下文
                maven 'mvn-3.6.0'
            }            
            steps{
                sh "mvn clean package -DskipTests"//这里忽略了单元测试
            }
        }
        stage("上传制品"){
            agent {
                label 'master'    
            }            
            steps{
                stash(includes: "*/*.jar", name: "springboot.jar")
            }
        }
        
        stage("下载制品"){
            agent{
                label ''//部署服务器的别名
            }
            steps{
                unstash(name: "springboot.jar")
            }
        }
        stage("部署"){
            agent{
                label ''//部署服务器的别名
            }
            steps{
                sh "mv target/*.jar /项目路径/springboot.jar"//springboot项目的存放位置
                sh "/项目路径/server.sh restart"//server.sh是springboot项目的启动脚本,需自行编写
            }
        }    
    }
}

tools解释

jenkins中可以定义全局工具 系统管理 --> 全局工具配置,这样在pipeline中使用tools{maven 'mvn-3.6.0'},会自动检测并安装,不需要手动安装到服务器了
image.png

checkout语法

checkout的pipeline语法太长,一般不自己写,用jenkins的pipeline-syntax自动生成
image.png
这里是以SVN为例,填写url,认证信息,本地工作空间
点击最下方的Generate Pipeline Script

工作空间

假设jenkins home的路径为/home/jenkins
创建了一个名为Example的jenkins任务
那么该任务的执行过程中文件的存放路径为:/home/jenkins/Example
若Checkout的Local Module directory为.,那么检出的文件就直接存放于/home/jenkins/Example

pipeline脚本的版本化

为了使pipeline脚本版本化,一般将pipeline脚本存放于SVN或Git中,然后使用Pipeline script from SCM的方式
image.png
填写脚本存放的SVN目录,认证信息,本地工作空间,Script Path
例如:
http: //.../pipeline/jenkinsfile-delopy.gy
SVN路径填写:http: //.../pipeline
Script Path填写:jenkinsfile-delopy.gy

注意Local Module directory

使用Pipeline script from SCM时,会先将脚本从SVN上检出到jenkins的工作目录,若脚本中包含了检出源代码的操作,可能会导致Local Module directory冲突,因此建议在配置Local Module directory时使用一个具有一定业务含义的目录,而不是用默认值

注意ProcessTreeKiller

jenkins会将job中产生的进程杀死
本例中在jenkins pipeline中执行server.sh启动springboot项目,jenkins任务结束后springboot项目的进程也会被杀死,这是jenkins的一个合理行为。
解决方法:
在参数化构建过程中添加:
JENKINS_NODE_COOKIE
dontKillMe
image.png

注意unstash和stash

stash步骤会将文件存储在tar文件中,对于大文件的stash操作会消耗Jenkins master的计算资源,Jenkins官方文档推荐,当文件大小为5~100MB时,应考虑使用其他方案,例如用制品仓库管理。


lianh
1 声望0 粉丝