闲来无事之 - 手把手从0到1实现JavaWeb项目的自动化构建和部署

项目介绍

  本篇文章将手把手 教你从0到1搭建一个属于自己独有(装 * )的网站(当然网站内容,前后端具体设计实现还是靠自己做哈,这里只做简单的Demo网站),并且实现基于jenkins的自动化部署。
  网站部署使用ESC云服务器,项目代码存储与代码仓库,可以是git,gitlab,gitee等,另外还可有个自己独有的域名来访问你的网站。

项目整体设计

在这里插入图片描述
域名云解析:
  目前市面上部分特殊后缀的域名还是很便宜 的!不过域名是需要备案的,首次备案比较麻烦,如果不考虑用域名这块可以跳过。
  目前购买注册域名的渠道有很多,可以通过一些比较有名云厂商来购买域名,并且大多都能提供免费的云解析!像阿里云,腾讯云等。域名注册成功并且备案后就可以在通过相应平台来解析域名,将域名解析到你的服务器的外网地址。以腾讯云为例:
在这里插入图片描述

ESC服务器:
   如果想要部署一个外网可以访问的网站,云服务器是相当不错的选择,目前有很多云服务器厂商,像阿里云,腾讯云,滴滴云等。阿里云和腾讯云的学生机相对比较便宜,滴滴云新用户注册也很划算(没有学生认证的话是个不错选择:https://i.didiyun.com/27g0Inj5bDS)。
  web代理服务器我们选择用nginx,轻量级,性能高,使用简单。
  JavaWeb项目的部署我们使用Tomcat服务器,对于过个项目我们可以用一个Tomcat服务部署多个Webapp的形式来部署。
  自动化构建和部署(CI/CD)我们使用 Jenkins,通过在云服务器上搭建 Jenkins 服务,我们可以不用每次写完代码后发布都要打包然后手动上传war包到服务器上然后还要手动重启tomcat服务器,我们可以直接将代码提交然后push到代码仓库后 Jenkins 就给我们自动化构建项目,打包,部署服务。
  数据库我们在云服务器上自建,有条件也可以使用RDS,缓存的话可以使用Redis,根据项目使用来选择安装。

外部服务:
  外部服务我们依赖代码仓库(git/gitlab/gitee),如果有需要可以使用云存储服务,推荐七牛云存储,有10G的免费使用空间。
  

环境准备

所需服务准备

  • 域名(可选)

  域名购买注册和备案

  • ESC云服务器

  云服务器购买,推荐CentOS 6或者 7,windows的建议用 xshell 连接登陆访问,macOS用自带的终端就行。

  • 代码仓库(推荐gitee)

  创建gitee账号(也可以是git或gitlab),可以先新建个JavaWeb项目。

  • OSS云存储(可选,推荐七牛云)

  创建七牛云账号,创建一个对象存储空间。

ESC软件环境安装和配置

  软件安装推荐使用 yum ,CentOS一般自带这个工具 。
  常用命令
     yum list [package] # 显示安装包信息
     yum install [package] # 安装 安装包
     yum remove [package] # 卸载安装程序
     rpm -ql [package] # 查询安装包路径

  需要用到的软件安装

  • JDK

   CentOS 安装 JDK 时需要注意的是 CentOS 有自带的 OpenJDK,关于 OpenJDK 和 JDK 的区别可以见这遍博客 OpenJDK 和 JDK 的区别,所以还是建议安装 JDK,版本推荐 JDK8。

  1. 在 /usr/local/ 目录下新建java目录
cd /usr/local/
mkdir java
cd java
  1. 进入官网下载 JDK8,复制下载地址 ,需要注册Oracle 账号 https://www.oracle.com/java/technologies/javase-jdk8-downloads.html
wget  https://download.oracle.com/otn/java/jdk/8u241-b07/1f5b5a70bf22433b84d0e960903adac8/jdk-8u241-linux-x64.tar.gz?AuthParam=1586136592_bbc81e0c55cb2ec6b43f89321ae51ca2

下载完成后在这里插入图片描述
3. 解压

tar -zxvf tar -zxvf jdk-8u241-linux-x64.tar.gz\?AuthParam\=1586136592_bbc81e0c55cb2ec6b43f89321ae51ca2

解压之后
在这里插入图片描述
4. 配置环境变量

vim /etc/profile

在后面追加

#java
export JAVA_HOME=/usr/local/java/jdk1.8.0_241
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib

然后让配置生效

source /etc/profile
  1. 验证安装
java -version

正常显示 jdk 版本就说明安装成功了!

  • Maven
  1. 安装maven
#maven
cd /usr/local/
mkdir maven
cd maven
wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz
tar zxf apache-maven-3.5.4-bin.tar.gz
rm -f apache-maven-3.5.4-bin.tar.gz
  1. 配置环境变量
vim /etc/prifile

在后面追加

export M2_HOME=/usr/local/maven/apache-maven-3.5.4
export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin

生效配置

source /etc/prifile
  1. 验证
 mvn -v

正常显示版本信息就安装成功了

这里可能会有一个小问题,就是退出ESC连接后重新登陆后 mvn 命令失效
解决方案是在 .bashrc 文件后面追加 source /etc/prifile

vim /root/.bashrc
然后在后面追加
source /etc/prifile
保存退出后
source /root/.bashrc
  • Tomcat
  1. 安装 tomcat
#tomcat
cd /usr/local/
mkdir tomcat
cd tomcat
wget https://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.53/bin/apache-tomcat-8.5.53.tar.gz
tar -zxv -f apache-tomcat-8.5.53
rm -f apache-tomcat-8.5.53.tar.gz
  1. 启动 tomcat
cd /usr/local/tomcat/apache-tomcat-8.5.53/bin/
./startup.sh

tomcat 默认是 8080 端口 所以直接访问 http://ip:8080/
如果不能访问,那可能是 8080 端口被防火墙拦截,则需要配置防火墙,开放8080端口
在 /etc/sysconfig/iptables 后面追加
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
然后重启防火墙 service iptables restart

  • MySQL
  1. 安装mysql
#mysql
cd /usr/local/src/
wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
yum -y install mysql57-community-release-el7-10.noarch.rpm
yum -y install mysql-community-server
  1. 启动 mysql 服务
service mysqld restart
  1. 登陆 mysql
    mysql 初始化时会默认给 root 用户一个初始化密码
    获取初始化密码
grep 'temporary password' /var/log/mysqld.log(如果之前安装过MySQL则这里可能会有多个密码,用最后一个,注意这个密码输入时是可以粘贴的)

第一次登陆需要修改密码

mysql -uroot -p(这是一个MySQL的以密码登录root用户的命令)
# 修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root123456789';
# 注意密码不能太简单,不然会提示密码过于简单
  • Redis(可选)

Redis 安装详见 CentOS7 linux下yum安装redis以及使用

  • Git
# git
# 检查是否已有 git
git --version
# 若没有则安装
yum install -y git
# 检查是否安装成功
git --version
  • Nginx

Nginx 安装详见 centos7 yum 安装 配置 nginx

  • Jenkins
  1. 安装 Jenkins
 # Jenkins
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
yum install jenkins
# 按照提示输入 y 继续安装,安装过程可能有些些慢,如果安装失败则 重新执行 yum install jenkins
  1. 修改初始配置信息
    首先我们可以用 rpm -ql jenkins 看下 jenkins 的安装路径
    /etc/init.d/jenkins # 启动脚本
    /etc/logrotate.d/jenkins
    /etc/sysconfig/jenkins # 系统配置
    /usr/lib/jenkins
    /usr/lib/jenkins/jenkins.war # jenkins 部署war包
    /usr/sbin/rcjenkins
    /var/cache/jenkins
    /var/lib/jenkins # 默认安装路径
    /var/log/jenkins # 默认日志路径
# 1. 修改默认端口 Jenkins 默认使用 8080 端口,我们可以换个好区分的端口 比如 8088,如果端口被占用则换个其它没有被占用的
# 2. 修改默认用户,Jenkins 默认的用户是 jenkins,我们需要将它改成 root 用户
vim /etc/sysconfig/jenkins
# 找到 JENKINS_PORT="8080" 将其修改为 JENKINS_PORT="8081"
# 找到 JENKINS_USER="jenkins" 将其修改为 JENKINS_USER="root" 

# 3. 修改 JDK 安装路径,在 /etc/init.d/jenkins 有默认的一些JDK安装路径,如果我们的 JDK 安装路径没在里面则需要我们手动添加 JDK 安装路径
vim /etc/init.d/jenkins
# 找到candidates="
#/etc/alternatives/java
#/usr/lib/jvm/java-1.8.0/bin/java
# /usr/lib/jvm/jre-1.8.0/bin/java
#/usr/lib/jvm/java-1.7.0/bin/java
#/usr/lib/jvm/jre-1.7.0/bin/java
#/usr/lib/jvm/java-11.0/bin/java
#/usr/lib/jvm/jre-11.0/bin/java
#/usr/lib/jvm/java-11-openjdk-amd64
#/usr/bin/java
#"
# 如果没有我们本地的安装路径则将我们本地的JDK安装路径加到里面

# 4. 修改插件镜像地址 /var/lib/jenkins 为 jenkins 默认安装地址,如果是其它的则换成对应的路径
vim /var/lib/jenkins/hudson.model.UpdateCenter.xml
# 找到 <url>http://updates.jenkins-ci.org/update-center.json</url> 将其 修改为 
# <url>http://mirror.xmission.com/jenkins/updates/update-center.json</url>
  1. 启动jenkins
service jenkins start

启动成功后输入地址 http://ip:port/ 访问
初次访问时需要输入默认密码
通过该命令可以找到默认的密码 tail /var/lib/jenkins/secrets/initialAdminPassword

进入页面后我们可以选择安装默认插件,这个过程可以会很慢,所以我们也可以自定义安装插件,选择一些常用的插件安装,可以先选择安装以下几个插件,用于将页面语言设置成中文
Locale , Localization Support, Localization: Chinese (Simplified)
一些常见的 Jenkins 配置也可自行百度/谷歌
在这里插入图片描述

ESC 发布项目

  前面我们已经准备了所有的环境了,现在可以手动通过 ESC 部署一个 JavaWeb 项目了!

项目准备

   如果有自己的项目的话可以选择自己的项目,如果没有则可以使用这个 SpringBootDemo 的项目,项目 giteee 下载地址为: https://gitee.com/klxwz/SpringBootDemo.git 可以在本地用 git colone 拉取项目

git clone https://gitee.com/klxwz/SpringBootDemo.git

   然后在本地执行 mvn package 打包成 war 包。
在这里插入图片描述
   然后将 war 包上传到ESC服务器,如果本地是 windows 可以用 xftp, mac 可以用Transmit,或者直接用命令 scp 上传到ESC服务器。

Tomcat 部署项目

   将上传的 war 包放置在Tomcat安装目录下的webapps下。然后修改 conf 目录下的 server.xml 文件,将Service标签的内容修改成如下。

<Service name="Catalina">
	<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

	<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
	<Engine name="Catalina" defaultHost="localhost">
	<Realm className="org.apache.catalina.realm.LockOutRealm">
     <Realm className="org.apache.catalina.realm.UserDatabaseRealm" 
     resourceName="UserDatabase"/>
     </Realm>

    <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
    <Context path="" docBase="demo" reloadable="true" />
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
     </Host>
    </Engine>
</Service>

  然后重启tomcat服务就可以访问项目了。

cd &TOMCAT_HOME/bin/
./shutdown.sh
./startup.sh 

   通过 http://ip:80808/ 就可以访问项目了

nginx配置

   如果有域名的同学可以配置下nginx反向代理,没有则可以配置下外网 IP 地址的反向代理。

  1. 添加反向代理配置
    在前面的安装 nginx 的博客中有介绍到,nginx 的配置文件在安装目录的 conf 目录下,对于主配置文件 nginx.xml 会包含一个子目录下的所有配置文件,默认有个 default.conf的文件,我们可以编辑这个文件如下
server {
     listen 80;
     autoindex on;
     server_name xx.xx.xx.xx www.xxxxx.xx;   # 外网IP地址 / 域名地址 可以填写多个,域名地址需要解析到外网IP地址
     access_log /usr/local/nginx/logs/access.log combined; # 日志地址
     index index.html index.htm index.jsp index.php;
     if ( $query_string ~* ".*[\;'\<\>].*" ){ return 404; }


      location / {
            proxy_pass http://localhost:8080/;
            proxy_set_header Host $host;
      }


}

该配置文件是将 xx.xx.xx.xx 地址通过代理服务器指向到 http://localhost:8080/ ,也就是项目的启动地址,如果是域名地址,需要将域名解析到外网IP地址
2. 重启 nginx 服务

cd &NGINX_HOME/sbin/
./nginx -s reload

然后就可与通过 外网地址 或者 域名地址 访问项目了

自动化部署配置

  对于上面这种方式,我们每次修改完代码后都需要重新打包,上传 war 包,重新部署,对于个人来说可能没什么,但是对于团队开发就特别麻烦了,还涉及多人合作开发。所以这里会用到 CI/CD (持续集成/持续交付)这两个概念,对于CI/CD的介绍这里不做介绍,可以自行百度/谷歌。而目前业界对于CI/CD的工具也有很多,我们这里使用的是Jenkins。
  前面我们已经安装好了 Jenkins服务,也可以正常访问了,所以接下来我们将基于 Jenkins 和 gitee 来实现自动化构建和部署,大致流程如下。
在这里插入图片描述

Jenkins 配置
插件安装

   考虑到通过 jenkins 安装插件比较慢,我们可以先本地在Jenkins插件的官网下载插件,然后上传插件进行安装。Jenkins插件下载地址为 https://plugins.jenkins.io/
   我们假设已经安装好了一些基础插件 Credentials,Deploy to container,SSH Credentials,Trilead API Plugin等。接下来我们需要安装 Gitee 的插件 和 maven插件,Gitee 需要依赖 Git 和 Git client 插件,当然中间可能还有些其它依赖的插件,如果安装过程中有出现缺少依赖插件而失败可以,可以先自行安装缺少的依赖插件。

全局工具配置

   首先我们需要现在Jenkins做一些全局工具的配置,像 Git,Maven,JDK。在Jenkins -> 系统管理 -> 全局工具配置下。

  • Maven
     Maven配置
    在这里插入图片描述
     Maven安装配置(用本地安装路径)
    在这里插入图片描述
  • Git
     Git安装配置(用本地安装路径)
    在这里插入图片描述
  • JDK
     Git安装配置(用本地安装路径)
    在这里插入图片描述
Gitee 配置

  Gitee的配置先参考官方的配置文档 https://gitee.com/help/articles/4193,我们只需先配置 [添加码云链接配置] 。前面的插件安装可以参考下。

自动化构建部署任务

  前面我们已经将Jenkins的系统配置配置好了,接下来就是新建一个自动化构建部署任务。

  1. 新建 maven 项目任务
    在这里插入图片描述

  2. 通用信息配置
    这里选择Gitee配置的面配置的gitee在这里插入图片描述
    系统配置中 gitee 配置的信息在这里插入图片描述

  3. 源码管理配置
    源码管理我们选择 git
    在这里插入图片描述
    这里有个需要注意的点是 Credentials 是需要我们新建一个基于用户名和密码(gitee 登陆的账号和密码)的全局凭证,如果是私有仓库的话!
    Name: origin
    Refspec: +refs/heads/:refs/remotes/origin/ +refs/pull//MERGE:refs/pull//MERGE
    Branches to build: origin/master

    然后我们需要选择Additional Behaviours 新增一个 Merge before build 在这里插入图片描述

  4. 构建触发器
    这里我们选择Gieee Webhook 触发构建
    在这里插入图片描述
    我们需要在 Gitee的项目里新建一个 webhook,填写这个URL,密码使用这边生成的
    在这里插入图片描述
    gitee添加 webhook
    在这里插入图片描述
    在这里插入图片描述
    post地址填写上面的URL地址,密码填写上面生成的密码。

  5. build 配置
    构建配置我们就填写 pom.xml
    在这里插入图片描述

  6. Post Steps 配置
    这里我们需要执行一个 shell 脚本 ,当 build 成功后。
    deploy.sh 脚本需要添加 可执行 的权限,不然脚本无法执行。
    在这里插入图片描述

#当jenkins进程结束后新开的tomcat进程不被杀死
BUILD_ID=DONTKILLME
#加载变量
. /etc/profile
#配置运行参数
 
#PROJ_PATH为设置的jenkins目录的执行任务目录
export PROJ_PATH=/var/lib/jenkins/workspace
#配置tomcat所在目录
export TOMCAT_APP_PATH=/root/java/apache-tomcat-8.5.30

#执行写好的自动化部署脚本
sh /var/lib/jenkins/deploy.sh

接下来我们需要在 jenkins 的安装目录(/var/lib/jenkins/deploy.sh)下 新建一个 deploy.sh 的脚本

 #!/usr/bin/env bash
#编译+部署项目站点

#需要配置如下参数
# 项目路径, 在Execute Shell中配置项目路径, pwd 就可以获> 得该项目路径
export PROJ_PATH=/var/lib/jenkins/workspace/Demo

# 输入你的环境上tomcat的全路径
export TOMCAT_APP_PATH=/root/java/apache-tomcat-8.5.30


### base 函数
killTomcat()
{
   #pid=`ps -ef|grep tomcat|grep java|awk '{print $2}'`
   #echo "tomcat Id list :$pid"
   #if [ "$pid" = "" ]
   #then
   #  echo "no tomcat pid alive"
   #else
   #  kill -9 $pid
   #fi
   #上面注释的或者下面的
   cd $TOMCAT_APP_PATH/bin
   sh shutdown.sh
}


# 停tomcat
killTomcat

# 删除原有工程
rm -f $TOMCAT_APP_PATH/webapps/demo.war



# 复制新的工程到tomcat上
cp $PROJ_PATH/Demo/target/demo-1.0-SNAPSHOT.war > > $TOMCAT_APP_PATH/webapps/demo.war


# 启动Tomcat
cd $TOMCAT_APP_PATH/
sh bin/startup.sh

  1. 构建后操作
    自行选择构建后回调的结果在这里插入图片描述
    至此,任务配置就完成了。
    我们可以先执行下构建,看是否能构建成功,如果能成功,在验证下 push 代码后有没有自动执行任务。

当然其中也还有一些需要注意的坑,当遇到后可以更具具体错误百度/谷歌查找解决方案,我也是在其中踩了无数个坑,最终一个一个填完了,当然我这里也不可能全部的坑都给出,我们需要更具具体情况具体分析。

  
  
最后说明:
  
  如过文章有不正确的地方还请提出来,我看到后也会及时修改。
  关于Demo项目可以自行 fork 到你的仓库。
  文章有一些配置和脚本都是依照我这边的来写的,具体的配置信息还得根据你们自己的配置来写。
  如有遇到解决不了的问题或者有一些自己的想法欢迎和我来讨论。联系方式Demo项目中的【关于】页面中有。

  
  
  
一些参考文档
https://gitee.com/help/articles/4193
https://www.jianshu.com/p/c517f09df025
https://blog.csdn.net/qq_37372007/article/details/81586751

发布了110 篇原创文章 · 获赞 76 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/qq_34731703/article/details/105334715