Jenkins 实战2:pipeline 编写一个自动化部署
我们今天用 Jenkins pipeline 来实现 实战1 相同的内容

前置知识:
Jenkins Pipeline 快速开始 Jenkins 实战1:Jenkins + Maven + Git 自动化部署 手把手包学包会
一、阶段分析
我们首先需要分析一下 Jenkins 构建需要完成哪些步骤:
1、从 GitLab 上拉取代码
2、使用 maven 构建 jar 包
3、清理测试服务器 旧 jar 包、停止 旧进程。
4、上传新构建的 jar 包,启动 Java 进程。
我们以这几步为基础,来新建一个 Jenkins 流水线,帮助我们完成自动化部署。
二、编写流水线
1、新建流水线任务
Dashboard > 新建 Item

2、配置流水线框架
Dashboard > first-pipeline >Configuration
选择 Pipeline script 脚本方式

可以选择的流水线定义有两种:
Pipeline script:自己在下面编辑框内编写流水线脚本。
Pipeline script from SCM:从版本管理系统(如:Git)中拉取已经写好的 Jenkinsfile,实现流水线配置的可版本化。
在右侧下拉选项中,选择 Hello World,以此为基础,编写流水线脚本。

在流水线语法 Tab 页,选择插件或者命令,可以帮助我们以配置的方式,来生成流水线脚本。

3、拉取代码
示例步骤选择 git:Git,填入代码仓库地址,点击添加凭证

填入 gitlab 相关信息,点击添加

下拉选择凭证,点击生成流水线脚本

复制生成的代码,粘贴到流水线编写框中

4、构建 jar 包
构建 jar 包需要使用 maven,而 maven 是一种工具(tools),它的配置在
Dashboard > Manage Jenkins > Tools > Maven 安装里
Maven 我们在 实战1 已经配置过了,所以流水线中我们可以直接拿它的名字 maven386 来使用。

- 添加 "构建 jar 包" 阶段:
pipeline {agent anytools {maven 'maven386' // 引用全局配置的 Maven 名称(需提前在“全局工具配置”中设置)}stages {stage('拉取代码') {steps {git credentialsId: 'gitlab', url: 'http://192.168.40.99/study/jenkins-study.git'echo '拉取成功'}}stage('构建 jar 包') {steps {sh 'mvn clean package -DskipTests=true'echo '构建 jar 包成功'}}}
}
保存【配置】并【立即构建】,可以在控制台输出中查看构建日志

报错:
当你在 Jenkins 中遇到 error: couldn't find any revision to build. verify the repository and branch configuration for this job. 错误时,通常是由于仓库或分支配置错误导致的。
示例:
ERROR: Couldn't find any revision to build. Verify the repository and branch configuration for this job.这个错误通常发生在 Jenkins 尝试构建 Git 仓库时,默认使用了 master 分支,而 GitLab 默认的分支是 main 分支。要解决这个问题,1、可以在 GitLab 新建一个 master 分支;2、也可以在流水线脚本中显式指定 main 分支。
git credentialsId: 'gitlab', branch: 'main', url: 'http://192.168.40.99/study/jenkins-study.git'
- 制品
构建成功后,默认会在 /root/.jenkins/workspace/jenkins-study/target 目录下,帮我们生成一个 jar 包,说明构建 jar 包成功。

5、清理
清理阶段需要用到 SSH Publishers 插件,执行 clean.sh 脚本。
在 流水线语法 配置 SSH Publishers

生成流水线脚本,拷贝到流水线配置里面

pipeline {agent anytools {maven 'maven386' // 引用全局配置的 Maven 名称(需提前在“全局工具配置”中设置)}stages {stage('拉取代码') {steps {git credentialsId: 'gitlab', url: 'http://192.168.40.99/study/jenkins-study.git'echo '拉取成功'}}stage('构建 jar 包') {steps {sh 'mvn clean package -DskipTests=true'echo '构建 jar 包成功'}}stage('清理 jar 包和进程') {steps {sshPublisher(publishers: [sshPublisherDesc(configName: 'test97', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: './clean.sh jenkins-study', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])echo '清理成功'}}}
}
保存【配置】并【立即构建】,现在 test97 这台服务器有 实战1 部署的程序和 jar,我们看看清理步骤跑完后,有没有帮我们清理掉。
清理构建前:

清理构建后:

说明我们的流水线配置是成功的。
6、上传并启动 java 进程
上传阶段也需要用到 SSH Publishers 插件,执行 nohup 命令。
在 流水线语法 配置 SSH Publishers,可以参考 实战1 的配置。

生成流水线脚本,拷贝到流水线配置里面

pipeline {agent anytools {maven 'maven386' // 引用全局配置的 Maven 名称(需提前在“全局工具配置”中设置)}stages {stage('拉取代码') {steps {git credentialsId: 'gitlab', url: 'http://192.168.40.99/study/jenkins-study.git'echo '拉取成功'}}stage('构建 jar 包') {steps {sh 'mvn clean package -DskipTests=true'echo '构建 jar 包成功'}}stage('清理 jar 包和进程') {steps {sshPublisher(publishers: [sshPublisherDesc(configName: 'test97', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: './clean.sh jenkins-study', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])echo '清理成功'}}stage('上传并运行') {steps {sshPublisher(publishers: [sshPublisherDesc(configName: 'test97', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'nohup java -jar /root/jenkins-study/jenkins*.jar >> /root/jenkins-study/log.out 2>&1 &', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/jenkins-study', remoteDirectorySDF: false, removePrefix: '/target', sourceFiles: '**/jenkins*.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])echo '运行成功'}}}
}
保存【配置】并【立即构建】,浏览器访问

7、测试
修改本地代码,提交到 master 分支,使用流水线重新构建。

浏览器访问:

三、实战3 Jenkins + habor + docker 自动化部署
敬请期待。
