閒來無事之 - 手把手從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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章