Jenkins+Pipline+Gitlab实现自动化部署
前置条件
插件安装
本来是照着网上找的教程跟着做的,结果做到一半,发现别人的Ui有的选项我有的找不到,于是又去手敲选项上网去搜,最后发现是自己漏装了插件。因为软工三是要把代码放到Gitlab上,因此主要是从Gitlab上拉代码,这就需要三个插件,分别是Gitlab Hook Plugin
、Build Authorization Token Root Plugin
、Git plugin
(注意,gitlab plugin必须是1.4.2版本以上才能显示UI)。
节点配置
点击系统管理–节点管理–新建节点,节点名称任意
下面用我已经建立的节点来做示范
远程工作目录是Jenkins的安装路径,使用命令行命令安装的Jenkins一般都是这个目录,根据自己的配置自行调整。
主机即是服务器的ip
点击Credentials下的添加,将服务器的root用户和密码输入
保存即可
全局工具配置
点击系统管理–全局工具配置
如果虚拟机装了Maven,那么和我的配置类似即可,如果没有,自行装好,注意别名的命名,后面的pipeline脚本要和别名对应
JDK安装同上,如果虚拟机装过了jdk了,注意别名的命名
如果虚拟机没有装jdk,那么可以使用自动安装
Nodejs我使用的是自动安装,没找到虚拟机装哪了,同样注意别名的命名
与Gitlab项目关联
新建流水线项目
将构建触发器下的下图选项勾选上
在服务器窗口下运行命令
openssl rand -hex 12
,将生成的密钥输入下列位置打开Gitlab,找到想要自动部署的项目,进入settings页面,选择integrations,将第2步图中构建触发器选项中的
Gitlab webhook URL
复制下来,写到URL处,将第3步生成的Token写到Secret Token处。点击Add webhook
。点击test中的
Push events
,成功后如图所示点击流水线语法
选择Git
将项目的仓库地址复制过去,这时会进行报错,那是因为没有添加凭证
在下方的凭据处添加gitlab认证,用户名和密码均为gitlab的用户名和密码
这时报错便消失了
点击生成流水线脚本
将上面的流水线脚本保存好,接下来写流水线脚本
Pipeline脚本
接下来我会提供两份脚本分别对应前后端的,我会进行注释
前端
pipeline {
agent any
tools {
nodejs "nodejs" //引号内的名字和全局工具配置里的别名对应
}
stages {
stage('Prepare'){
steps{
echo 'Preparing'
checkout(
[
$class: 'GitSCM',
branches: [[name: '*/master']], //从哪里拉去
doGenerateSubmoduleConfigurations: false,
extensions: [],
submoduleCfg: [],
userRemoteConfigs: [
[ ////上面与gitlab关联后第十一步生成的脚本 分别对应复制粘贴过来即可,这里我就不贴自己的了
credentialsId: '',
url: ''
]
]
]
)
sh'''
npm install //npm命令
'''
}
}
stage('Build'){
steps{
echo 'Building'
sh'''
npm run build
'''
}
}
stage('Deploy'){
steps{
echo 'Deploying'
sh'''
//下面的这个目录/Tomcat/tomcat9/webapps是云服务器中(配置的节点)里的tomcat配置的路径,需要自己改
rm -rf /Tomcat/tomcat9/webapps/dist
// /var/lib/jenkins/workspace/Kojima_Studio_frontend是我Jenkins的job的workspace对应的目录
mv -f /var/lib/jenkins/workspace/Kojima_Studio_frontend/dist /Tomcat/tomcat9/webapps
'''
}
}
}
}
后端
pipeline {
agent any
tools {
jdk "jdk8" //引号内的名字和全局工具配置里的别名对应
maven "maven"
}
stages {
stage('Build') {
steps {
checkout(
[
$class: 'GitSCM',
branches: [[name: '*/master']],
doGenerateSubmoduleConfigurations: false,
extensions: [],
submoduleCfg: [],
userRemoteConfigs: [
[
credentialsId: '',
url: ''
]
]
]
)
sh "mvn clean install -Dmaven.test.skip=true -Ptest"
}
}
stage('Deploy'){
steps{
echo 'Deploying'
sh '''
PID=$(ps -ef | grep oasis | grep java | grep -v grep | awk '{ print $2 }')
if [ -z "$PID"]
then
echo Application is already stopped
else
echo kill $PID
kill $PID
fi
'''
withEnv(['JENKINS_NODE_COOKIE=dontkillme']){
sh '''
// 下列目录/var/lib/jenkins/workspace/Kojima_Studio_backend是我Jenkins的job的workspace对应的目录
// nohup对应的其实是一个运行jar包的命令 jar包的名字需要和项目进行匹配,建议提前定好
nohup java -jar /var/lib/jenkins/workspace/Kojima_Studio_frontend/target/kojima-0.0.1-SNAPSHOT.jar > ./workspace/backendlog.txt &
'''
}
}
}
}
}
pipeline脚本需要根据个人需要进行路径的修改,修改完之后回到原来的项目处,在设置中的pipeline脚本处将脚本复制粘贴过去保存即可。
个人的一些理解
因为在此之前从来没用过集成工具,因此并不是很了解Jenkins的运行逻辑。一开始以为需要把代码上传到云服务器上,问了学长之后自己又进行了一些摸索,大概是明白了怎么回事。
Jenkins实际上是从git仓库处拉取代码,运行pipeline脚本进行打包和部署,打包操作生成的文件都是放在Jenkins的工作目录中的,以我个人的配置为例,如下图
这是我的Jenkins的工作目录,如果我们点开backend,可以看到有如下的结构
点开target目录,就能看到使用项目打包后的jar包,(pipeline脚本需要和项目的生成jar包名字事先协调一致)
因此只需要绑定好仓库,Jenkins将自动下载代码并帮忙运行部署,可以说是非常方便了。下面放一下之前部署的项目前端的成功截图