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 包" 阶段:
bash 复制代码
pipeline {
    agent any
    tools {
        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. 错误时,通常是由于仓库或分支配置错误导致的。

示例:

bash 复制代码
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 分支。

bash 复制代码
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

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

bash 复制代码
pipeline {
    agent any
    tools {
        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 的配置。

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

bash 复制代码
pipeline {
    agent any
    tools {
        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 自动化部署

敬请期待。

相关推荐
元气满满-樱4 分钟前
Nginx虚拟主机实验
运维·chrome·nginx
福尔摩斯张4 分钟前
Linux Kernel 设计思路与原理详解:从“一切皆文件“到模块化架构(超详细)
java·linux·运维·开发语言·jvm·c++·架构
深圳市恒讯科技5 分钟前
俄罗斯服务器常见故障汇总及排查方法
运维·服务器
wanhengidc7 分钟前
云端算力 云手机 巨 椰
运维·服务器·科技·智能手机·云计算
FreeBuf_17 分钟前
攻击者利用React2Shell漏洞部署Linux后门程序,日本成重点攻击目标
linux·运维·安全
weixin_3077791317 分钟前
Jenkins声明式流水线权威指南:从Model API基础到高级实践
开发语言·ci/cd·自动化·jenkins·etl
I · T · LUCKYBOOM19 分钟前
25.本地yum仓库搭建--CentOS 7
linux·运维·centos
wanhengidc20 分钟前
高性价比云手机 多端同步
运维·服务器·科技·智能手机·云计算
素雪风华28 分钟前
只使用Docker+Maven实现全自动化流程部署服务;Docker创建ffmpeg环境;
java·运维·后端·docker·容器·自动化·maven
roman_日积跬步-终至千里35 分钟前
【运维-架构】Starrocks生产级运维脚本设计与实现
运维