解放双手 | Jenkins + gitlab + maven 自动打包部署项目

前言

记录 Jenkins + gitlab + maven 自动打包部署后端项目详细过程!html

需求背景

不会偷懒的程序员不是好码农,传统的项目部署,有时候采用本地手动打包,再经过ssh传到服务器部署运行,这种方式对于单应用部署还算能够,不会耗费太大时间,但假如分布式项目,拆分为多个微服务部署,那么每一个服务都打包部署一遍,发布上线可能会耗时很是久,Jenkins + gitlab + maven 能够实现自动打包,部署到远程服务器~java

什么是gitlabgit

程序员确定都懂的,跟gayhub同样的东西,能够在内网本身搭建一套来管理项目代码。程序员

什么是Jenkinsweb

能够简单地理解为能够代替你实现自动从gitlab拉取代码,打包,部署到远程服务器的工具。docker

环境准备

使用docker安装gitlab

gitlab的安装这里不作过多记录,能够参考如下内容:shell

使用docker安装Jenkins

docker run -d --name jenkins --privileged=true -v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime -v /etc/timezone:/etc/timezone -v /home/docker/data/jenkins_home:/var/jenkins_home -p 8090:8080 -p 50000:50000 --env JAVA_OPTS=-Dhudson.util.ProcessTree.disable=true jenkins/jenkins:lts
复制代码

参数解析:api

  • --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端口
  • JAVA_OPTS=-Dhudson.util.ProcessTree.disable=true:指定参数,取消Jenkins自动部署后,杀死应用进程的坑
  • -v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime -v /etc/timezone:/etc/timezone:解决时区问题
  • jenkins/jenkins:lts:指定镜像名称跟 tag

可能会踩的坑:

chmod 777 /home/docker/data/jenkins_home
chown -R 1000  /home/docker/data/jenkins_home
复制代码

至此,Jenkins已经部署好了,然而....折腾才刚刚开始...

Jenkins基础配置

  1. 访问http://192.168.2.219:8090打开Jenkins首页以下图:

按照界面提示,为了管理员安全地设置Jenkins,已将密码写入日志文件:/var/jenkins_home/secrets/initialAdminPassword,提示写的是Jenkins容器中的文件,映射到本机文件则是/home/docker/data/jenkins_home/secrets/initialAdminPassword,复制文件中的文本,输入,点击继续...滴滴滴~掉坑里了。

  1. 若是不出意外的话,这里有个,上一步以后会一直卡在以下图所示的加载界面:

这是怎么肥事? 原来Jenkins在启动的时候,请求Google,检查当前机器是否能够联网,在请求/home/docker/data/jenkins_home/updates/default.json 中存在以下数据:

而因为天朝的网络缘由,请求Google失败,则一直卡住,解决办法是修改成www.baidu.com便可解决。

  1. 选择下载推荐的插件,仍是自选插件,这里我选择下载推荐的插件,而后进入下载loading

  1. 建立管理员帐号

  1. 配置Jenkins 资源 url,使用默认便可

至此,Jenkins 基础配置完成,开始使用。随后登陆Jenkins后发现页面空白,没找到具体缘由,重启下Jenkins 容器后再登陆就行了。

Jenkins插件安装

Jenkins插件安装的步骤为:系统管理-->插件管理.. 相信聪明的你必定知道怎么安装了。咱们须要安装的插件以下:

  • Maven项目插件:Maven Integration plugin,这个插件可让咱们建立一个maven构建任务
  • ssh传输工具插件:Publish Over SSH 项目打包完成后,使用这个插件,经过ssh的方式传输到远程服务器
  • Gitlab插件:容许Jenkins访问gitlab服务器,拉取代码

全局工具配置

系统管理-->全局工具配置,安装一些打包必须的配置环境,如 jdkmavengitmaven

安装git客户端:

  1. 下载

    #下载 git
    yum update
    yum install git
    
    # 配置用于拉取gitlab代码的用户名和邮箱
    git config --global user.name "yourname"
    git config --global user.email "youremail"
    复制代码
  2. 配置公钥

生成ssh秘钥, 首先查看是否已经有ssh秘钥:

cd ~/.ssh`
复制代码

若是没有则提示没有此文件夹, 此时手动生成秘钥:

ssh-keygen -t rsa -C “youremail”
复制代码

连续按三次回车,生成id_rsaid_rsa.pub文件夹,查看公钥文件内容:cat id_rsa.pub,复制公钥到gitlab配置ssh key.

  1. 测试
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!
复制代码

最终配置以下图:

安装 jdk:

如图:

安装maven:

如图:

添加凭据

凭据是为了访问Gitlab拉取代码使用的,分别建立三个凭据:帐号密码类型,api token访问类型,git私钥访问类型,整体配置以下图:

解析:

  • 帐号密码类型凭据,只须要上gitlab建立一个帐户,同时这个帐户拥有访问项目仓库的权限便可。
  • api token类型则是使用上述步骤建立的帐户登陆GitLab,去生成一个访问令牌,以下图:

  • git私钥访问类型,拷贝git客户端私钥配置便可,以下图:

全局系统配置

系统管理-->系统配置。。主要是配置访问GitLab服务器拉取代码,还有配置`ssh`远程服务器地址,目的是为了打包后上传文件到远程服务器。

GitLab配置以下图,使用git api token依据访问:

ssh远程服务器配置以下图,主要配置远程主机名,主机ip,用户名/密码,还有远程根目录从/开始:

至此,全部配置完成,能够建立构建任务了。

实战场景,自动部署web项目

  1. 建立一个 maven 构建任务

  1. 项目信息描述,指定远程链接gitlab

  1. 配置构建的缓存数量

  1. 拉取远程代码配置

  1. 构建触发器配置

  1. 打包配置

  1. 打包后操做,配置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脚本很常规,就是将文件复制到tomcatwebapp目录下,并重启。

  1. 部署结果,看看日志信息以下,表示成功:

提交代码,自动打包部署

gitlab代码仓库发生事件:提交代码等操做时,触发打包部署动做

  1. Jenkins配置

  1. GitLab代码仓库配置

这样,当推送代码到指定代码仓库时候就会触发自动打包部署啦!

总结

  • Jenkins 自动打包部署操做,理论上跟本地打包部署是一个道理,该安装的环境一个不能少,只不过能够自动化罢了
  • Jenkins能够作的事情还有不少,配置太多啦,一篇文章也只能作个引导做用,更多配置仍是须要多看

最后

记录一个自动部署的操做,后续会不按期更新原创文章,欢迎关注公众号 「张少林同窗」!

相关文章
相关标签/搜索