1. 简介
- 我们要正式的使用jenkins了,第一个任务就是自动化打包部署项目。工作一共有四个步骤:
- 从git上拉取项目代码
- 使用maven打包项目
- 上传到远程服务器上
- 部署远程服务器的项目
- 说实话一开始我并不了解jenkins应该怎么使用,也是慢慢一点点摸索出来的,希望大家看完我这篇博客也能对jenkins的使用有进一步的了解。
2. 工作环境
- jdk
- git
- maven
- gitlab 存放项目代码
- gitlab安装要求环境比较高,直接用github或码云也是一样的。
- freeSSHd 支持部署服务器的远程操作
- jenkins
3. 配置所需的环境
- 我这边默认搭建jenkins开始时有安装默认的插件了,如果执行以下过程中有发现页面工具有缺失什么的,应该是缺失对应的插件支持。去插件管理添加对应插件,如git,maven等。
3.1 全局工具配置
- 我们需要使用jenkins拉取项目,打包部署,那么就需要让jenkins拥有这些功能。
- 全局工具配置中就是配置jdk,maven,git的位置,之后jenkins才有可能根据这些软件去实现对应的功能。
- 以下配置的地址都是jenkins所在服务器下jdk,maven,git的配置路径
- Maven Configuration
- JDK
- Git
- maven
- 我们看到上面也可以自动安装这些软件,但是个人觉得还是直接安装这些软件再来配置路径的好些。耦合性不会太高。
3.2 配置凭据
- 我们gitlab上拉取代码是需要凭证的,比如用户名密码或SSH秘钥验证。我这边采用的秘钥验证方式,所以需要配置秘钥的凭证才能去gitlab上拉取对应代码。
- 首先我们需要生成公钥,私钥,打开git bash执行
- 生成过程中要你填写秘钥的密码,如果不需要直接回车跳过(我直接跳过了)
ssh -****** -t rsa
- Gitlab 创建提供给jenkins的用户并分配项目权限,并使用该用户打开gitlab(用github的话直接用自己的账户就好了)
- 为jenkins用户添加ssh公钥
- 为jenkins 添加私钥凭据
3.3 配置远程插件
-
我将代码拉取下来打包后需要部署到另一台服务上启动,那jenkins就需要能够远程上传文件与远程操作对应的服务器。
-
首先远程的服务器我采用的window server2008 需要先安装freeSSHd才能支持远程操作。
-
jenkins要远程到该服务器得先安装对应的插件(Publish over SSH) 支持
-
搜索 Publish over SSH
- 我这边是之前安装好了,所以3处看不到插件
- 我这边是之前安装好了,所以3处看不到插件
-
系统管理-》系统设置 设置Publish over SSH
4. 创建自动化打包部署任务
- 准备工作做好了,现在我们需开始建我们的任务了
4.1 New 任务
- 我们选择第一个,这种方式好像比较简单。用下面的流水线(pipeline)等其他的项目类型也能实现对应功能,而且pipeline比较有意思,通过第一个任务类型了解jenkins,其他几个也可以尝试的使用一下。除了第一个其他的我也还没尝试过
4.2 Source Code Management
-
配置项目来源
-
下面的version是gitlab的version,只需要前两位。如果是github什么的就不用填verison了
-
查看版本命令:rpm -qa|grep gitlab (例如我的版本girlab-ce-11.8.1-ce.0.el7.x86_64 )
-
下载的代码会到 项目的安装路径\workspace 文件夹下,这里是任务的工作空间。如( D:\Program Files\jenkins\workspace)
-
现在我们就可以先保存一下,去立即构建查看一下代码是否下载下来了
-
在console output 我们可以查看构建的过程
-
下载代码是成功的
4.3 Build Environment
- 每次构建前删除旧的构建,要不然每次下载下来的代码都会堆积在那边,越集越多
4.4 BUILD
- 这里是我们将代码下载下来后需要执行的操作,一个是打包项目,另一个就是发送打包好的项目到远程服务器上部署
- 选择调用顶层Maven目标(invoke top-level Maven targets)
* 这里的M2_HOME就是我们前面全局配置的maven - jenkins就会帮我们使用该maven对拉取下来的项目执行 goals打包命令
-
之后我们再选择 add build step ,选择 SSH这个
-
如果我们之前不安装 Publish over SSH 是没有这个选项的(插件原来是这样用的)
-
Transfers 就是对远程服务的操作
- source files 配置需要上传到远程服务的文件,这个目录文件是相对的,而且是相对拉取下来的项目文件夹(不是从workspace!!,不是从workspace!!,不是workspace!!),对应我这边的项目就是相对rjsoft-jycj-admin-dev目录
- source files 也可以采用模糊匹配,比如 : **/ * 这样就是项目下的所有文件都发送到出去
- remove prefix: 文件传递过去的时候会把从项目目录到文件所在位置的路径中的文件夹全部拷贝过去,remove prefix的作用就是剔除这些目录,如下只会把target下的jar包传输过去。
- remote directory : 文件发送到的位置,这里填的是相对路径,相对Publish over SSH配置的路径
- Exec commond: 文件上传后需要执行的操作,我这边在E:/jycj里面定义了一个bat,执行这个bat就能自动的启动本目录下的jar项目
-
如果下边Exec timeout 时间不够,会报出如下异常,把时间改长一点就好了
ERROR: Exception when publishing, exception message [Exec timed out or was interrupted after 120,000
- 我把bat文件内容也贴一下
- 第一句的作用检测删除8080端口的进程,由于会多次构建,所以不删除上次构建的项目进程会报端口冲突
for /f "tokens=5" %%i in ('netstat -ano ^| findstr 8080 ^| findstr LISTENING') do (
taskkill -pid %%i -f
)
title xxx
ping -n 3 127.0.0.1
java -jar -Xms500m -Xmx500m -Dspring.profiles.active=dev jycj\xxx.jar
- 拉到最下方保存
5. 构建项目
- 在console Output中可以查看构建过程
6. 构建中的问题
- 就是我在4.4步骤中,搞错了路径的问题,以为路径是从workspace下开始的,导致远程服务器的文件一直没有接收到,而且什么错也没报。
- 第二个是什么时候构建我这边也没还有确定,是隔一定时间构建一次,还是根据什么通知定时构建,比如发现gitlab上代码发生了变化。
- 还有就是我项目跑起来了,还是报了超时异常,没有正常退出。百度上说jenkins不会正常关闭exec脚本,具体解决方案我还没找到,有待解决
ERROR: Exception when publishing, exception message [Exec timed out or was interrupted after 240,000 ms]
Build step 'Send files or execute commands over SSH' changed build result to UNSTABLE