網(wǎng)站建設(shè) 王衛(wèi)洲關(guān)鍵詞排名優(yōu)化易下拉排名
項(xiàng)目打包
? 在部署項(xiàng)目前需要對(duì)源碼進(jìn)行打包,一個(gè)簡(jiǎn)單的SpringBoot項(xiàng)目默認(rèn)是打包為jar包,也就是在pom.xml中的<packaging>jar</packaging>
方式,當(dāng)然也會(huì)有一些打包成war包方式,使用外置的Tomcat應(yīng)用服務(wù)器部署war包,那么就是<packaging>war</packaging>
。
在父子類聚合項(xiàng)目中,父工程的pom.xml
文件中的打包方式就需要改為pom
,如下:
<packaging>pom</packaging>
那么所有的子工程pom.xml
中,就需要改為jar方式,或者war
jar包是默認(rèn)的打包方式,子工程如果是打包成jar包那么不需要改任何配置,war包時(shí)如下配置
<packaging>war</packaging>
并且所有的子工程中需要,導(dǎo)入maven插件配置
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><executable>true</executable><layout>JAR</layout></configuration><executions><execution><goals><goal>repackage</goal></goals><configuration><attach>false</attach></configuration></execution></executions></plugin></plugins>
</build>
執(zhí)行打包
在具有maven環(huán)境的情況下,到父工程pom.xml文件所在目錄下執(zhí)行
mvn clean package
即可將此父工程下所有子工程進(jìn)行打包,假如這里得到了三個(gè)jar包為consumer.jar
、provider1.jar
、provider2.jar
那么就可以手動(dòng)執(zhí)行部署了。
命令行部署
使用命令行方式去部署3個(gè)jar包,可以說非常簡(jiǎn)單,但還要考慮項(xiàng)目中需要的一些環(huán)境:
- 服務(wù)器需要由java的jdk環(huán)境,能使用java命令
- 假如項(xiàng)目中用到了nacos,那么還需要做好nacos環(huán)境的配置及服務(wù)的啟動(dòng)
nohup java -jar consumer.jar > consumer.logs.log 2 >&1 &
nohup java -jar provider1.jar > provider1.logs.log 2 >&1 &
nohup java -jar provider2.jar > provider2.logs.log 2 >&1 &
nohup:不掛斷運(yùn)行
> xxx.logs.log 2 > &1 &
:將程序日志輸出到某個(gè)位置并且后臺(tái)運(yùn)行。
那么這些都是手動(dòng)運(yùn)行,目前而言大多都采用了自動(dòng)化部署。
Jenkins
手動(dòng)運(yùn)行需要每次都去上傳jar包,然后更新jar重啟服務(wù)。若服務(wù)數(shù)量較少還比較好,一旦遇到微服務(wù)多jar包情況下,手動(dòng)就會(huì)顯得很繁瑣而無助?;蛘哒f可以采用shell腳本的方式去部署,但這都不是最優(yōu)秀的解決方案??梢允褂肑enkins部署運(yùn)行服務(wù)。
介紹
Jenkins的前身是Hudson。Jenkins是一款較為流行的開源持續(xù)集成工具,地位幾乎可以說是CI&CD軟件領(lǐng)導(dǎo)者,已經(jīng)超過了Hudson,它擁有超過1000個(gè)插件來支持項(xiàng)目的構(gòu)建和部署。幾乎可以適用于所有的項(xiàng)目,沒有項(xiàng)目編程語言的限制。
CI&CD:
- 持續(xù)集成(Continuous Integration,CI):指的是團(tuán)隊(duì)成員每天一次或多次把代碼集成到主干。每次集成會(huì)自動(dòng)構(gòu)建,盡快盡早發(fā)現(xiàn)錯(cuò)誤。持續(xù)集成是為了讓產(chǎn)品快速迭代,同時(shí)保證高質(zhì)量。
- 持續(xù)交付(Continuous Delivery):指的是持續(xù)將新的功能部署到類生產(chǎn)環(huán)境(可理解為測(cè)試環(huán)境qa、uat),交給質(zhì)量團(tuán)隊(duì)或用戶,交給它們?cè)u(píng)審
- 持續(xù)部署(Continuous Deployment):指的是通過評(píng)審后,自動(dòng)部署到生產(chǎn)環(huán)境中
Jenkins的特性:
- 系統(tǒng)平臺(tái)無關(guān)性:Jenkins本身是由Java語言編寫,理論上只要由java的運(yùn)行環(huán)境,就能使用Jenkins
- 編程語言無關(guān)性:支持多種編程語言的項(xiàng)目持續(xù)集成、持續(xù)部署,而非只有java一種
- 安裝和配置簡(jiǎn)單:可以通過yum安裝或war包、Docker方式等,由簡(jiǎn)潔易用的web界面完成配置
- 插件豐富:擁有超過1000個(gè)插件,幾乎可以滿足任何項(xiàng)目的需要
- 容易擴(kuò)展:Jenkins可以通過其插件架構(gòu)進(jìn)行擴(kuò)展,為用戶提供無限可能
- 分布式構(gòu)建:Jenkins能使多臺(tái)服務(wù)器一起構(gòu)建
- 消息通知:構(gòu)建完成后發(fā)送email通知結(jié)果
下載和安裝
Jenkins的官網(wǎng)地址是https://www.jenkins.io/,下載軟件包的地址https://www.jenkins.io/download/。推薦下載LTS(長(zhǎng)期支持)版本。筆者這里選擇Generic Java package(.war),只需要java環(huán)境即可。
當(dāng)然要注意你選擇版本要和你本地的jdk環(huán)境的兼容關(guān)系:
筆者是java8的環(huán)境,選擇一款適用的jenkins版本即可。筆者選擇2.346.3
版本。
提供下下載地址:https://get.jenkins.io/war-stable/2.346.3/jenkins.war
運(yùn)行
- war包下載完畢后,不需要額外的步驟(前提是有java環(huán)境),是可以直接運(yùn)行的
java -jar jenkins.war --httpPort=8085
- –httpPort是設(shè)置程序端口號(hào),若要使程序不掛斷后臺(tái)運(yùn)行,可以這樣執(zhí)行
nohup java -jar jenkins.war --httpPort=8085 > jenkins-logs.log 2 >&1 &
服務(wù)運(yùn)行后,成功訪問UI頁面,記得需要打開防火墻的端口哦
firewall-cmd --permanent --zone=public --add-port=8085/tcp
firewall-cmd --reload
- 打開jenkins的UI地址(筆者這里是http://192.168.1.41:8085)
我們需要去上面的相應(yīng)文件中去找到密碼,然后填寫,確定即可。
注意:第一次啟動(dòng)Jenkins會(huì)初始化去下載一些元(metadata)數(shù)據(jù),打開界面時(shí)提示等待大概4分鐘,等待期間,使用F12調(diào)試時(shí),看到報(bào)錯(cuò)503是正?,F(xiàn)象。等待日志打印Jenkins is fully up adn running 即可
-
下一步會(huì)讓用戶安裝插件,若是新手可以選擇Jenkins推薦的插件,可以減少很多的步驟。筆者這里也選擇推薦的插件了,唯一的缺點(diǎn)是下載的東西多,稍微會(huì)慢點(diǎn)。
-
完成后創(chuàng)建一個(gè)管理員用戶
Jenkins配置
Jenkins初始化完成后,還需要配置一些全局工具,如jdk,maven,git。在Jenkins后臺(tái)頁面點(diǎn)擊Manage Jenkins,再點(diǎn)擊Global Tool Configuration配置全局工具JDK、maven、git
配置maven
找好你的settings.xml文件
的路徑,配置到這里即可。然后再去配置maven的路徑
注意:如果你的maven的bin目錄沒有可執(zhí)行的權(quán)限,要記得增加可執(zhí)行權(quán)限,否則執(zhí)行命令時(shí)會(huì)報(bào)錯(cuò):Permission denied,可以在maven的根目錄下使用命令賦權(quán):chmod +x -R bin
配置jdk
直接輸入JAVA_HOME的安裝地址即可
最后配置git的目錄,記得先安裝git
yum install -y git
使用yum安裝的git,目錄是/usr/bin/git
GitLab簡(jiǎn)介&安裝
持續(xù)集成一般有3個(gè)組成的要素:
- 一個(gè)自動(dòng)構(gòu)建的過程,代碼檢出、編譯構(gòu)建等過程都是自動(dòng)完成,無需人工
- 一個(gè)代碼存儲(chǔ)庫(SVN或git)
- 一個(gè)持續(xù)集成服務(wù)器(如Jenkins)
現(xiàn)在還缺少一個(gè)代碼存儲(chǔ)庫。在企業(yè)中為了掌握代碼的所有權(quán),一般都會(huì)自動(dòng)搭建代碼存儲(chǔ)庫。可以使用Gitlab。
GitLab使用git作為代碼管理工具,并且在此基礎(chǔ)上開發(fā)了Web管理頁面來進(jìn)行項(xiàng)目管理。
與github最大的不同是,gitlab部署在自己的服務(wù)器上,所有權(quán)都是掌握在自己手中。
采用yum方式安裝GitLab
- 安裝需要的依賴和設(shè)置ssh開機(jī)自啟動(dòng),開啟ssh及配置防火墻
yum install -y curl policycoreutils-python openssh-server
systemctl enable sshd
systemctl start sshd
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
systemctl reload firewalld
- 安裝Postfix并設(shè)置開機(jī)自啟動(dòng)、開啟Postfix,便于郵件通知
yum install -y postfix
systemctl enable postfix
systemctl start postfix
- 添加Gitlab軟件包存儲(chǔ)庫并安裝軟件包
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | bash
- 配置Gitlab訪問地址并安裝Gitlab(http://192.168.1.41是gitlab訪問地址)
EXTERNAL_URL="http://192.168.1.41" yum install -y gitlab-ee
- 打開防火墻端口(或關(guān)閉防火墻)
firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --reload
- 完成后,打開http://192.168.1.41,第一次進(jìn)入時(shí)需要去
/etc/gitlab/initial_root_password
找下初始化密碼,然后登錄即可
Docker方式安裝Gitlab
使用Docker方式安裝Gitlab是比較快捷的方式,如下命令即可:
mkdir -p /data/gitlab # 先創(chuàng)建gitlab存儲(chǔ)數(shù)據(jù)、配置、日志的目錄docker run -d --hostname 192.168.1.41:80 --publish 443:443 --publish 80:80 --publish 23:22 --name gitlab --restart always --volume /data/gitlab/config:/etc/gitlab --volume /data/gitlab/logs:/var/log/gitlab --volume /data/gitlab/data:/var/opt/gitlab gitlab/gitlab-ee:latest
-d : 后臺(tái)運(yùn)行
–hostname:gitlab服務(wù)地址
–publish或-p:宿主機(jī)和容器的端口映射
–name 設(shè)置容器名稱
–volume或-v:宿主機(jī)和容器的目錄映射
–restart always: 開機(jī)自啟
Gitlab常用命令
- gitlab-ctl start:啟動(dòng)
- gitlab-ctl stop:停止
- gitlab-ctl status:查看
- gitlab-ctl restart:重啟
Jenkins+Gitlab部署運(yùn)行
現(xiàn)在已經(jīng)有了存儲(chǔ)庫,然后創(chuàng)建git倉庫把項(xiàng)目上傳到Gitlab上面。
git init
git remote add origin http://192.168.1.41/root/jenkins-demo.git
git add .
git commit -m "Initial commit"
git push -u origin main
這些就比較簡(jiǎn)單了,筆者這里不再贅述了。直接展示下項(xiàng)目的目錄
需要注意的是:如果普通用戶push代碼,可能會(huì)沒有權(quán)限,管理員設(shè)置下即可。
Jenkins頁面創(chuàng)建任務(wù)
- 在Jenkins頁面點(diǎn)擊新建項(xiàng)目(New Item),輸入項(xiàng)目名稱(名稱隨便取,別重復(fù))。選擇自由風(fēng)格項(xiàng)目。
- 在General一欄輸入描述,可以任意填寫,重要的是源代碼管理,倉庫地址就填寫gitlab的項(xiàng)目地址,然后添加你的gitlab賬號(hào)的憑證(賬號(hào)密碼)。
- 完成后,下面有一個(gè)分支選擇,選擇你要部署的分支即可。
- 來到構(gòu)建這一欄,點(diǎn)擊添加構(gòu)建步驟,選擇Invoke toplevel maven targets(調(diào)用頂層 Maven 目標(biāo))項(xiàng),maven版本選擇配置好的,目標(biāo)Goals填寫
clean package
這里的maven命令不需要添加mvn
,請(qǐng)注意!!
- 打包完成后,就可以運(yùn)行jar包了,再增加一個(gè)構(gòu)建步驟,選擇Excecute shell,執(zhí)行shell命令,在Command輸入以下命令,考慮到可能出現(xiàn)第二次部署時(shí),需要把上一次的jar停止,那么命令如下
#!/bin/bash
# 先停止進(jìn)程
ps -ef |grep consumer |grep -v 'grep' | awk '{print $2}' | xargs kill -s 15
ps -ef |grep provider-8001 |grep -v 'grep' | awk '{print $2}' | xargs kill -s 15
ps -ef |grep provider-8002 |grep -v 'grep' | awk '{print $2}' | xargs kill -s 15
sleep 5s # 5s后再啟動(dòng)
BUILD_ID=dontKillMe # 表示別干掉啟動(dòng)的程序
cd consumer/target/
nohup java -jar consumer-1.0-SNAPSHOT.jar > consumer.logs.log 2 >&1 &
cd ../../provider-8001/target/
nohup java -jar provider-8001-1.0-SNAPSHOT.jar > provider1.logs.log 2 >&1 &
cd ../../provider-8002/target/
nohup java -jar provider-8002-1.0-SNAPSHOT.jar > provider2.logs.log 2 >&1 &
完事后,保存即可。
- 點(diǎn)擊立即構(gòu)建,即可
同時(shí)還可以去看日志信息:
我們可以到服務(wù)器上看下程序有沒有啟動(dòng)成功
ps -ef |grep java
成功部署了三個(gè)jar包。
Webhook網(wǎng)絡(luò)鉤子
當(dāng)我們需要每次提交合并代碼時(shí),自動(dòng)進(jìn)行項(xiàng)目部署時(shí),可以使用網(wǎng)絡(luò)鉤子Webhook完成我們的需求。
大致流程就是:Jenkins提供一個(gè)地址,當(dāng)代碼有更新時(shí)代碼存儲(chǔ)庫(gitlab)主動(dòng)調(diào)用一次這個(gè)地址,觸發(fā)Jenkins構(gòu)建即可。
需要在Jenkins上面安裝Generic Webhook Trigger插件
到項(xiàng)目主界面,點(diǎn)擊配置,到構(gòu)建觸發(fā)器那里,選擇Generic Webhook Trigger一項(xiàng),然后添加一個(gè)Token(隨便寫,但不要重復(fù)了)
那么,構(gòu)建的URL格式如下:
http://JENKINS_URL/generic-webhook-trigger/invoke/invoke?token=剛剛自定義的Token
JENKINS_URL:是JENKINS的訪問地址。
此項(xiàng)目中就是如下
http://192.168.1.41:8085/generic-webhook-trigger/invoke/invoke?token=nihaowoshichufaqi
回到gitlab
因?yàn)镚itlab10.6版本后,為了安全,默認(rèn)不允許向本地網(wǎng)絡(luò)發(fā)送Webhook請(qǐng)求,這里因?yàn)楣P者是把gitlab和jenkins安裝到一臺(tái)服務(wù)器了,所以這里先允許發(fā)送本地網(wǎng)絡(luò)webhook。
到gitlab項(xiàng)目中,設(shè)置webhook即可。這里暫時(shí)寫所有分支push時(shí)觸發(fā)了,實(shí)際可以按照項(xiàng)目情況執(zhí)行。
配置完成
完成后,即可提交任意分支的代碼,看到j(luò)enkins已經(jīng)自動(dòng)觸發(fā)構(gòu)建了,并且jar也重新啟動(dòng)了