用pipeline来实现一个自由风格的构建

189 阅读2分钟

经过了之前的学习,我们了解了pipline的基本使用方式,那么我们来一个小的实战,之前jenkins构建的时候,我们完成了一个自由风格的构建,那么,我们可不可以用pipline的方式去实现它,当然是可以的,那么我们先回顾一下,构建的流程。

我们要配置一个Git的环境变量,可以选择部署哪个分支。然后,我们需要源码管理,来下载代码。之后,我们要打包项目,最后,要把项目复制到远程目录,那么我们一步一步来实现。

首先我们要配置git的环境变量,我们需要的模块是parameters,代码如下:

    parameters {
        gitParameter branchFilter: 'origin/(.*)', defaultValue: 'main', name: 'GIT_TAG', type: 'PT_BRANCH'
    }

下面我们将开始编写stages的阶段,他一共分为三个stage。首先是CheckOut,我们用来获取代码,然后是Build用来打包程序,最后是Deploy,用来发送到项目服务器。他的大体结构如下

    stages{
        //阶段1 获取代码
        stage("CheckOut"){
            steps{
                script{
                    println("获取代码")
                }
            }
        }
        stage("Build"){
            steps{
                script{
                    println("进行构建")
                }
            }
        }
        stage("Deploy"){
            steps{
                script{
                    println("进行部署")
                }
            }
        }
    }

然后我们来一步一步,将它填完整 首先是拉取代码,我们需要调用git,

steps{
    script{
        println("获取代码")
        git branch: 'main', credentialsId: 'gitlab', url: 'https://gitlab.yuanminglei.com/mpweixin/koaserver.git'
    }
}

然后,我们进行构建,这里需要在script里面用sh命令运行脚本

 stage("Build"){
     steps{
         script{
             println("进行构建")
             sh "/opt/shell/jenkins/koaserver/build-koaserver-pipline.sh $GIT_TAG"
         }
     }
 }

最后就是,发送到远端服务器,我们要调用sshPublisher模块来完成

stage("Deploy"){
    steps{
        script{
            println("进行部署")
        }
        sshPublisher(
            publishers: [sshPublisherDesc
			    (configName: 'aliyun', transfers: 
			    	[sshTransfer
			    		(cleanRemote: false, 
			    		 excludes: '', 
			    		 execCommand: 'pwd', 
			    		 execTimeout: 120000, 
			    		 flatten: false, 
			    		 makeEmptyDirs: false, 
			    		 noDefaultExcludes: false, 
			    		 patternSeparator: '[, ]+', 
			    		 remoteDirectory: '/opt/test1', 
			    		 remoteDirectorySDF: false, 
			    		 removePrefix: 'target', 
			    		 sourceFiles: 'target/jenkins-test-build01-*.tar.gz'
			    		)
			    	], 
			    	usePromotionTimestamp: false, 
			    	useWorkspaceInPromotion: false, 
			    	verbose: false
			    )
		    ]
        )
    }
}

这里要主要sshPublisher不在是,包在,script里面的命令了,而是和script平行的模块。

那么有的同学可能要问,想这么复杂的配置,怎么可能记得住,这里就要使用jenkins另外一个工具,流水线语法。它就在,我们配置完pipeline最后。

image.png

点击进入

image.png

如果我们要用sshPublisher,可以在示例步骤中,选择sshPublisher: Send build artifacts over SSH

image.png

配置完成,点击生成流水线脚本

image.png

image.png

这样就已经生成好了。

下面我把,今天的例子完整部分贴在下面。供你测试

String workspace = "/opt/jenkins/workspace/"

pipeline{
    //指定运行此流水线的节点
    agent { node { 
            label "master"
            customWorkspace "${workspace}"
        }
    }
    
    parameters {
        gitParameter branchFilter: 'origin/(.*)', defaultValue: 'main', name: 'GIT_TAG', type: 'PT_BRANCH'
    }
    
    //流水线的阶段
    stages{
        //阶段1 获取代码
        stage("CheckOut"){
            steps{
                script{
                    println("获取代码")
					git branch: 'main', credentialsId: 'gitlab', url: 'https://gitlab.yuanminglei.com/mpweixin/koaserver.git'
                }
            }
        }
        stage("Build"){
            steps{
                script{
                    sh "/opt/shell/jenkins/koaserver/build-koaserver-pipline.sh $GIT_TAG"
                }
            }
        }
        stage("Deploy"){
            steps{
                script{
                    println("进行部署")
                }
                sshPublisher(
	                publishers: [sshPublisherDesc
					    (configName: 'aliyun', transfers: 
					    	[sshTransfer
					    		(cleanRemote: false, 
					    		 excludes: '', 
					    		 execCommand: 'pwd', 
					    		 execTimeout: 120000, 
					    		 flatten: false, 
					    		 makeEmptyDirs: false, 
					    		 noDefaultExcludes: false, 
					    		 patternSeparator: '[, ]+', 
					    		 remoteDirectory: '/opt/test1', 
					    		 remoteDirectorySDF: false, 
					    		 removePrefix: 'target', 
					    		 sourceFiles: 'target/jenkins-test-build01-*.tar.gz'
					    		)
					    	], 
					    	usePromotionTimestamp: false, 
					    	useWorkspaceInPromotion: false, 
					    	verbose: false
					    )
				    ]
                )
            }
        }
    }
    post {
        always{
            script{
                println("流水线结束后,经常做的事情")
            }
        }
        
        success{
            script{
                println("流水线成功后,要做的事情")
            }
        
        }
        failure{
            script{
                println("流水线失败后,要做的事情")
            }
        }
        
        aborted{
            script{
                println("流水线取消后,要做的事情")
            }
        
        }
    }
}