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

敬请期待。

相关推荐
城南花开时7 小时前
CCID工具,Jenkins、GitLab CICD、Arbess一文全方位对比分析
jenkins·gitlab cicd
江湖人称小鱼哥8 小时前
Jenkins 在构建 Java 项目并操作 Docker 时 CPU 会突然飙高
java·docker·jenkins
曾经的三心草11 小时前
最新版本组件的docker下载-Seata
运维·docker·容器
梁正雄13 小时前
15、Docker swarm-2-安装与存储
运维·docker·容器
fyakm14 小时前
Linux文件搜索:grep、find命令实战应用(附案例)
linux·运维·服务器
wanhengidc15 小时前
云手机存在的意义是什么
运维·服务器·arm开发·安全·智能手机
snow@li16 小时前
运维:部署Jenkins
运维·jenkins
大海绵啤酒肚18 小时前
OpenStack虚拟化平台之T版搭建部署
linux·运维·云计算·openstack
The Chosen One98520 小时前
【Linux】Linux权限讲解 :写给文件的一封情书
linux·运维·服务器