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 自动化部署

敬请期待。

相关推荐
...对方正在输入......14 分钟前
Elasticsearch集群部署实战指南
elasticsearch·jenkins
h***015427 分钟前
Docker启动安装nacos(详情讲解,全网最细)
运维·docker·容器
z***948428 分钟前
Linux下安装Nginx服务及systemctl方式管理nginx详情
linux·运维·nginx
默恋~微凉34 分钟前
Nginx(十一)——反向代理与负载均衡
运维·nginx·负载均衡
凉晓风40 分钟前
Linux上TCP通信异常排查工具命令
linux·运维·tcp/ip
码龄3年 审核中1 小时前
Linux record 03
java·linux·运维
星驰云1 小时前
记一次CentOS 硬盘损坏无法启动修复教程
linux·运维·centos
ALex_zry2 小时前
高并发系统渐进式改造技术调研报告:策略、架构与实战
java·运维·架构
wljt2 小时前
Docker常用命令
运维·docker·容器
木童6622 小时前
Nginx 深度解析:反向代理与负载均衡、后端Tomcat
linux·运维·nginx