记录 Jenkins + gitlab + maven
自动打包部署后端项目详细过程!
不会偷懒的程序员不是好码农,传统的项目部署,有时候采用本地手动打包,再通过 ssh
传到服务器部署运行,这种方式对于单应用部署还算可以,不会耗费太大时间,但假如分布式项目,拆分为多个微服务部署,那么每个服务都打包部署一遍,发布上线可能会耗时非常久, Jenkins + gitlab + maven
可以实现自动打包,部署到远程服务器~
什么是 gitlab
?
程序员肯定都懂的,跟 gayhub
一样的东西,可以在内网自己搭建一套来管理项目代码。
什么是 Jenkins
?
可以简单地理解为可以代替你实现自动从 gitlab
拉取代码,打包,部署到远程服务器的工具。
docker
安装 gitlab
gitlab
的安装这里不做过多记录,可以参考以下内容:
docker
安装 Jenkins
docker run --name jenkins --privileged=true -d -v /home/docker/data/jenkins_home:/var/jenkins_home -p 8090:8080 -p 50000:50000 jenkins/jenkins:lts
--name jenkins
:指定 Jenkins
容器名称 --privileged=true
:防止 docker
容器没有权限 -d
:容器在后台启动 -v /home/docker/data/jenkins_home:/var/jenkins_home
:将容器的 /var/jenkins_home
映射到本机的 /home/docker/data/jenkins_home
目录,为了便于管理 Jenkins
容器的数据,需要注意的是, 挂载出来的目录允许我们往容器里面添加文件或者目录,也就是在 /home/docker/data/jenkins_home:/var/jenkins_home
中添加的文件或者目录都会被映射到容器目录 /var/jenkins_home
,那么我们最终在 Jenkins
中配置软件环境时应当使用容器目录路径,因为 Jenkins
实际上是在容器中跑的 ,比如 JDK
家目录,你放在 /home/docker/data/jenkins_home/jdk_home
,那么最终配置应当写成 /var/jenkins_home/jdk_home
-p 8090:8080 -p 50000:50000
:将容器的 8080
端口映射到本机的 8090
端口, 5000
端口映射为 5000
端口 jenkins/jenkins:lts
:指定镜像名称跟 tag chmod 777 /home/docker/data/jenkins_home chown -R 1000 /home/docker/data/jenkins_home
至此, Jenkins
已经部署好了,然而....折腾才刚刚开始...
Jenkins
基础配置 http://192.168.2.219:8090
打开 Jenkins
首页如下图:
按照界面提示,为了管理员安全地设置 Jenkins
,已将密码写入日志文件: /var/jenkins_home/secrets/initialAdminPassword
,提示写的是 Jenkins
容器中的文件,映射到本机文件则是 /home/docker/data/jenkins_home/secrets/initialAdminPassword
,复制文件中的文本,输入,点击继续...滴滴滴~掉坑里了。
这是怎么肥事? 原来 Jenkins
在启动的时候,请求 Google
,检查当前机器是否可以联网,在 请求/home/docker/data/jenkins_home/updates/default.json
中存在如下数据:
而由于天朝的网络原因,请求 Google
失败,则一直卡住,解决办法是修改为 www.baidu.com
即可解决。
Jenkins
资源 url
,使用默认即可
至此, Jenkins
基础配置完成,开始使用。随后登录 Jenkins
后发现页面空白,没找到具体原因,重启下 Jenkins
容器后再登录就好了。
Jenkins
插件安装 Jenkins
插件安装的步骤为:系统管理-->插件管理.. 相信聪明的你一定知道怎么安装了。我们需要安装的插件如下:
Maven
项目插件: Maven Integration plugin
,这个插件可以让我们创建一个 maven
构建任务 ssh
传输工具插件: Publish Over SSH
项目打包完成后,使用这个插件,通过 ssh
的方式传输到远程服务器 Gitlab
插件:允许 Jenkins
访问 gitlab
服务器,拉取代码 系统管理-->全局工具配置,安装一些打包必须的配置环境,如 jdk
, maven
, git
, maven
下载
#下载 git yum update yum install git # 配置用于拉取gitlab代码的用户名和邮箱 git config --global user.name "yourname" git config --global user.email "youremail"
生成 ssh
秘钥, 首先查看是否已经有ssh秘钥:
cd ~/.ssh`
如果没有则提示没有此文件夹, 此时手动生成秘钥:
ssh-keygen -t rsa -C “youremail”
连续按三次回车,生成 id_rsa
和 id_rsa.pub
文件夹,查看公钥文件内容: cat id_rsa.pub
,复制公钥到 gitlab
配置 ssh key
.
ssh -T git@192.168.2.219
如下结果表示配置成功:
The authenticity of host '192.168.2.210 (192.168.2.210)' can't be established. RSA key fingerprint is SHA256:7oKBkxcwp5naXUzohvjPwEJsow6Y/pF1fSpWFZPVscA. RSA key fingerprint is MD5:9c:a1:39:7c:2c:6c:d0:a2:4b:e8:8d:3a:73:6e:c9:c1. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.2.210' (RSA) to the list of known hosts. Welcome to GitLab, jenkins_easywits!
最终配置如下图:
如图:
如图:
凭据是为了访问 Gitlab
拉取代码使用的,分别创建三个凭据:账号密码类型, api token
访问类型, git
私钥访问类型,总体配置如下图:
解析:
gitlab
创建一个账户,同时这个账户拥有访问项目仓库的权限即可。 api token
类型则是使用上述步骤创建的账户登录 GitLab
,去生成一个访问令牌,如下图:
git
私钥访问类型,拷贝 git
客户端私钥配置即可,如下图:
系统管理-->系统配置。。主要是配置访问 GitLab
服务器拉取代码,还有配置`ssh`远程服务器地址,目的是为了打包后上传文件到远程服务器。
GitLab
配置如下图,使用 git api token
依据访问:
ssh
远程服务器配置如下图,主要配置远程主机名,主机ip,用户名/密码,还有远程根目录从/开始:
至此,所有配置完成,可以创建构建任务了。
maven
构建任务
gitlab
ssh
传输到远程服务器,执行远程 shell
脚本
最后保存,点击构建按钮,即可自动打包,并且部署到远程 tomcat
服务器。远程 shell
脚本如下:
#!/bin/bash # 配置java环境变量 export JAVA_HOME=/usr/java/jdk/jdk1.8.0_161 # jdk 根目录 export JRE_HOME=/usr/java/jdk/jdk1.8.0_161/jre # jre 目录 export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$JAVA_HOME:$PATH # 配置tomcat环境变量 export CATALINA_BASE=/home/wwwroot/easywits-operation/tomcat-easywits-operation export CATALINA_HOME=/home/wwwroot/easywits-operation/tomcat-easywits-operation export TOMCAT_HOME=/home/wwwroot/easywits-operation/tomcat-easywits-operation echo "stopping tomcat_easywits_operation......" #关闭tomcat port=xxxx #根据端口号查询对应的pid pid=$(netstat -nlp | grep :$port | awk '{print $7}' | awk -F"/" '{ print $1 }'); #杀掉对应的进程,如果pid不存在,则不执行 if [ -n "$pid" ]; then kill -9 $pid; fi #删除tomcat旧war包 rm -rf /home/wwwroot/easywits-operation/tomcat-easywits-operation/webapps/easywits rm -rf /home/wwwroot/easywits-operation/tomcat-easywits-operation/webapps/easywits.war #复制war包到tomcat/webapps目录,并重命名 cp /home/wwwroot/easywits-operation/deploy_history/easywits.war /home/wwwroot/easywits-operation/tomcat-easywits-operation/webapps/easywits.war # 文件名 + 当前日期时间错,备份发布文件包 #DEPLOY_DATE=`date +%Y%m%d%H%M%S` #DEPLOY_FILE_NAME=easywits-op-server_$DEPLOY_DATE.war #mv /home/wwwroot/easywits-operation/deploy_history/easywits.war /home/wwwroot/easywits-operation/deploy_history/$DEPLOY_FILE_NAME rm -rf /home/wwwroot/easywits-operation/deploy_history/* echo "restarting tomcat_easywits_operation......" sleep 5 /home/wwwroot/easywits-operation/tomcat-easywits-operation/bin/startup.sh
整个 shell
脚本很常规,就是将文件复制到 tomcat
的 webapp
目录下,并重启。
当 gitlab
代码仓库发生事件:提交代码等操作时,触发打包部署动作
Jenkins
配置
GitLab
代码仓库配置
这样,当推送代码到指定代码仓库时候就会触发自动打包部署啦!
Jenkins Jenkins
记录一个自动部署的操作,后续会不定期更新原创文章,欢迎关注公众号 「张少林同学」!