Jenkins安装部署以及打包部署Maven项目,使用pipline部署多台服务等
持续集成环境Jenkins安装
-
安装JDK 请自行安装
-
获取jenkins安装包, jenkins下载地址 由于我的服务器是centos7.6, 这里我们选择LTS长期支持版
-
将安装包jenkins-2.235.1-1.1.noarch.rpm上传到服务器,进行安装
rpm -ivh jenkins-2.235.1-1.1.noarch.rpm
; -
修改jenkins配置
vi /etc/syscofig/jenkins
修改JENKINS_PORT="8888"
; -
启动jenkins
systemctl start jenkins
-
打开浏览器进行访问 192.168.1.1:8888
-
根据提示获取密码并输入
-
插件安装 建议新手直接安装推荐的插件
-
添加管理员账户,并进入Jenkins后台
邮箱随便填,记住用户名和密码就行
10.保存并完成
Jenkins插件安装
点击->系统管理->插件管理 可以安装相关插件
若后面发现有些模块我有而你没有很可能是你没安装某个插件,请根据你的需求自行查询相关插件安装
AnsiColor: 可以让你控制台输出颜色显示
Environment Injector Plugin : 环境变量输入
Extended Choice Parameter Plug-In : 变量可选择输入
Git Parameter Plug-In : git参数选择
Localization: Chinese (Simplified) : 中文语言包
Maven Integration plugin : 建立maven任务必备
Pipeline:构建pipline任务必备
Publish Over SSH: 远程传输文件以及执行shell命令,建议安装
SSH plugin: 远程执行shell
ThinBackup : 自动备份jenkins
Jenkins环境设置及部分插件的使用
凭据
点击左侧凭据->下拉菜单中点击系统->右侧出现全局凭据->点击全局凭据
->点击左侧添加凭据
凭证类型有多种,根据自己需要选择.我这里选择的是Username with password
以gitlab账号为例,输入gitlab的账号和密码, ID需要唯一,可以输入或者等待jenkins自动生成
Publish over SSH
配置远程发布的服务器
点击系统管理->点击系统配置->找到Publish over SSH
Name:随意填写,作为远程SSH Server的标识
Hostname:请填写你远程服务器的IP
Username:远程服务器的账号
Remote Directory: 传输文件的目录
Passphrase / Password: 服务器账户的密码
填写完后可以点击 Test Configuration查看是否联通
SSH remote hosts
远程执行Shell的SSH site 配置
Hostname: 远端服务器IP
Port: 端口号 默认22
Credentials: 凭证 在之前的凭证处配置 远端服务器的登录账号和密码.配置后选择
点击Check connection 成功显示Successfull connection
JDK配置
java安装略.
Jenkins->Global Tool Configuration(全局工具配置)->JDK->新增JDK,配置如下:
Maven配置
maven安装略.
Jenkins->Global Tool Configuration(全局工具配置)->Maven->新增Maven,配置如下:
配置大概就告一段落,如果有问题请留言.
构建Maven项目
该示例仅作为入门示范,更详细的可用于生产环境的, 请参考pipeline章节
1. 点击新建任务, 选择构建一个maven项目, 点击左下角 OK
2. 点击左侧配置
丢弃旧的构建:不解释了
参数化构建过程:根据自己的需求是否启用, 比如这里我添加了字符参数profile_name, 默认值prod.那么我构建的时候,点击build with Parameters出现参数选项
那profile_name参数可以以{profile_name}的形式在jinkens执行命令的过程中使用
添加源码地址 URL: 你的源码库地址 ,Credentials凭证.可以在凭据里面添加. 或者使用SSH秘钥的方法,在jenkins服务器上面安装git 并生成ssh公钥, 然后进入gitlab或者github的设置添加公钥.
构建触发器: 根据自己需求选择启用. 比如定时构建(可以点击右侧问号, 有规则说明) ,Build when a change is pushed to GitLab(需要在gitlab上启用webhook, 并填写地址等)
构建环境:比如我这里勾选了Color ,用于后面控制台输出的时候显示颜色, 其余选项jenkins也都说的很详细.
Build: 构建的命令 相当于mvn clean -P ${profile_name} -q deploy -Dmaven.test.skip=true,(
p
r
o
f
i
l
e
n
a
m
e
前
面
环
境
参
数
设
置
)
P
o
s
t
S
t
e
p
s
:
这
里
我
选
择
的
是
只
有
构
建
成
功
才
会
执
行
的
步
骤
.
点
击
a
d
d
p
o
s
t
−
b
u
i
l
d
s
t
e
p
增
加
步
骤
选
择
S
e
n
d
f
i
l
e
s
o
r
e
x
e
c
u
t
e
c
o
m
m
a
n
d
s
o
v
e
r
S
S
H
.
构
建
成
功
后
传
输
文
件
及
远
程
执
行
命
令
.
下
面
逐
项
说
明
:
N
a
m
e
:
在
P
u
b
l
i
s
h
o
v
e
r
S
S
H
插
件
中
配
置
s
s
h
s
e
r
v
e
r
中
的
n
a
m
e
,
插
件
根
据
这
个
名
字
找
到
你
配
置
的
服
务
器
信
息
S
o
u
r
c
e
f
i
l
e
s
:
资
源
文
件
s
p
r
i
n
g
b
o
o
t
项
目
打
包
后
的
j
a
r
包
路
径
,
通
常
位
于
t
a
r
g
e
t
/
目
录
下
.
如
果
是
模
块
化
项
目
比
如
!
[
在
这
里
插
入
图
片
描
述
]
(
h
t
t
p
s
:
/
/
i
m
g
−
b
l
o
g
.
c
s
d
n
i
m
g
.
c
n
/
20200710165020245.
P
N
G
)
那
么
为
m
o
d
e
l
n
a
m
e
/
t
a
r
g
e
t
/
∗
.
j
a
r
这
里
可
以
填
∗
.
j
a
r
或
者
你
具
体
的
x
x
x
.
j
a
r
R
e
m
o
v
e
p
r
e
f
i
x
:
移
除
前
缀
R
e
m
o
t
e
d
i
r
e
c
t
o
r
y
:
该
插
件
远
程
传
输
资
源
文
件
的
目
的
路
径
.
前
面
P
u
b
l
i
s
h
o
v
e
r
S
S
H
插
件
中
填
写
了
R
e
m
o
t
e
d
i
r
e
c
t
o
r
y
:
/
h
o
m
e
那
么
这
里
传
输
到
你
目
标
服
务
器
的
地
址
为
/
h
o
m
e
/
x
x
x
/
t
e
m
p
E
x
e
c
c
o
m
m
a
n
d
:
在
远
程
服
务
器
上
执
行
命
令
(
p
s
:
这
里
用
到
的
脚
本
会
在
后
面
p
i
p
e
l
i
n
e
章
节
给
出
)
c
d
/
h
o
m
e
/
x
x
x
/
{profile_name}前面环境参数设置) Post Steps: 这里我选择的是只有构建成功才会执行的步骤. 点击add post-build step 增加步骤 选择Send files or execute commands over SSH. 构建成功后传输文件及远程执行命令. 下面逐项说明: Name: 在Publish over SSH插件中配置ssh server中的name, 插件根据这个名字找到你配置的服务器信息 Source files : 资源文件 springboot项目打包后的jar包路径,通常位于target/目录下. 如果是模块化项目比如![在这里插入图片描述](https://img-blog.csdnimg.cn/20200710165020245.PNG)那么为model_name/target/*.jar 这里可以填*.jar或者你具体的xxx.jar Remove prefix: 移除前缀 Remote directory : 该插件远程传输资源文件的目的路径. 前面Publish over SSH插件中填写了 Remote directory: /home 那么这里传输到你目标服务器的地址为 /home/xxx/temp Exec command: 在远程服务器上执行命令 (ps:这里用到的脚本会在后面pipeline章节给出) cd /home/xxx/
profilename前面环境参数设置)PostSteps:这里我选择的是只有构建成功才会执行的步骤.点击addpost−buildstep增加步骤选择SendfilesorexecutecommandsoverSSH.构建成功后传输文件及远程执行命令.下面逐项说明:Name:在PublishoverSSH插件中配置sshserver中的name,插件根据这个名字找到你配置的服务器信息Sourcefiles:资源文件springboot项目打包后的jar包路径,通常位于target/目录下.如果是模块化项目比如![在这里插入图片描述](https://img−blog.csdnimg.cn/20200710165020245.PNG)那么为modelname/target/∗.jar这里可以填∗.jar或者你具体的xxx.jarRemoveprefix:移除前缀Remotedirectory:该插件远程传输资源文件的目的路径.前面PublishoverSSH插件中填写了Remotedirectory:/home那么这里传输到你目标服务器的地址为/home/xxx/tempExeccommand:在远程服务器上执行命令(ps:这里用到的脚本会在后面pipeline章节给出)cd/home/xxx/{project_name} // 首先切换到工作的目录
./backup.sh || true //执行备份脚本, 在命令后面添加’|| true’, 意思是无论是否该命令执行成功都继续往下 面执行
mv /home/xxx/temp/*.jar ./ //从临时文件夹移到到当前目录
./stop.sh ${project_name} //根据项目名停止java进程
./start.sh ${project_name} //启动jar包 , ${project_name} 作为参数参入脚本执行
参数配置完成,点击保存
点击 Build with Parameters 开始构建
右下角 Build History 可以看到构建进度 , 点击进去再点击Console Output 查看构建控制台输出
构建pipeline项目部署项目到多台服务器
构建Job部署项目到多台服务器,并且可以选择相关参数例如git地址,分支,服务器地址等
新建任务选择流水线
点击配置
点击参数化构建->点击添加参数->git参数
名称BRANCH作为后面使用的环境变量
默认值master分支
参数类型 分支 (还可以向tag等)
已选值: 选择default 这样构建的时候默认选中 默认值master
继续添加参数 ->点击Extended Choice Parameter 增加可选的参数列表
定义ips 需要发布的服务器地址使用 ","分割
下面继续定义了一些字符参数
对, 上面定义的service_name, 在下面project_name中就可以使用
流水线配置
对你没看错,就已经配置完成了.你可以build了.
好了,不开玩笑了. 你可能好奇一些关键的构建步骤去哪里了. Jenkinsfile就是其中的奥秘所在.但是在我告诉你Jenkinsfile之前,还是细说下上图的插件的用处.
SCM 选择Git表名我们是通过git拉取Jenkinsfile文件
Repository URL : 拉取jenkinsfile 的git地址 (比如我们可以单独创建一个git库用于存放我们的jenkinsfile文件)
指定分支: 你准备从哪个分支上面拉取jenkinsfile
脚本路径: 关键点 请看图 这是我截取的gitlab上的图. 我目前是放在工程的根目录下面后期可能会单独建立git库存放
Jenkinsfile
来一起看看Jenkinsfile文件. 目前我使用的vscode编写,主要可以有代码美观. 如果有其他更好的编辑工具希望大家可以告诉我.
pipeline {
agent any
environment {
// Server IP list
ipList = "$ips"
}
parameters {
//git拉取参数设置 从origin/(.*)过滤 , 默认值为master, 参数名称BRANCH
gitParameter branchFilter: 'origin/(.*)', defaultValue: 'master', name: 'BRANCH',selectedValue: 'DEFAULT', sortMode: 'DESCENDING_SMART', type: 'PT_BRANCH'
}
//开始打包
stages {
stage('Build') {
steps {
// 从git拉取代码, 填写凭证, url地址,选择分支
git branch: "${params.BRANCH}", changelog: false, credentialsId:"${credentials_id}" , poll: false, url: "${git_url}"
// 拉取代码后 执行mvn命令
sh "mvn clean -P ${mvn_param} -q deploy -Dmaven.test.skip=true"
}
post {
//成功后打包, 使用pipeline若要打包存放jar, 这不可以缺少
success {
archiveArtifacts '**/target/*.jar'
}
}
}
//开发发布到远程服务器
stage('Deploy') {
steps {
//使用ansiColor 目的是控制台能有颜色的输出,便于观察
ansiColor("xterm") {
script{
script{
//通过',' 分割ipList 得到多台服务器地址
for (item in ipList.tokenize(',')){
//传输文件到远程目录, 执行脚本 , 注意这里面的变量需要使用"""params"""括起来
sshPublisher(publishers: [sshPublisherDesc(configName: item , transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: """cd /home/your/your/${service_name} //切换到工作目录
./backups/clean.sh || true //清除多余的备份
./backup.sh || true //开始备份
mv /home/your/temp/${service_name}/*.jar /home/your/your/${service_name} //移到jar到工作目录
./stop.sh ${project_name} //停止原来的项目
BUILD_ID=DONTKILLME //在pipeline中应该是无效的,但是我没有测试 本意是防止jenkins执行完后kill掉启动的jar进程
./start.sh ${service_name} ${project_name}""", //执行启动脚本
execTimeout: 120000, flatten: false, makeEmptyDirs: true, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: """/your/temp/${service_name}""", remoteDirectorySDF: false, removePrefix: """${project_name}/target/""", sourceFiles: """${project_name}/target/*.jar""")], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
}
}
}
}
}
}
注意为了方便大家理解 我在脚本中使用 "//"进行解释 ,若需要测试这个脚本 ,请自行删掉我的解释
好了大功告成了.点击Build with Parameters
脚本地址: 添加链接描述