項目打包
? 在部署項目前需要對源碼進行打包,一個簡單的SpringBoot項目默認是打包為jar包,也就是在pom.xml中的<packaging>jar</packaging>
方式,當然也會有一些打包成war包方式,使用外置的Tomcat應用服務器部署war包,那么就是<packaging>war</packaging>
。
在父子類聚合項目中,父工程的pom.xml
文件中的打包方式就需要改為pom
,如下:
<packaging>pom</packaging>
那么所有的子工程pom.xml
中,就需要改為jar方式,或者war
jar包是默認的打包方式,子工程如果是打包成jar包那么不需要改任何配置,war包時如下配置
<packaging>war</packaging>
并且所有的子工程中需要,導入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
即可將此父工程下所有子工程進行打包,假如這里得到了三個jar包為consumer.jar
、provider1.jar
、provider2.jar
那么就可以手動執(zhí)行部署了。
命令行部署
使用命令行方式去部署3個jar包,可以說非常簡單,但還要考慮項目中需要的一些環(huán)境:
- 服務器需要由java的jdk環(huán)境,能使用java命令
- 假如項目中用到了nacos,那么還需要做好nacos環(huán)境的配置及服務的啟動
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:不掛斷運行
> xxx.logs.log 2 > &1 &
:將程序日志輸出到某個位置并且后臺運行。
那么這些都是手動運行,目前而言大多都采用了自動化部署。
Jenkins
手動運行需要每次都去上傳jar包,然后更新jar重啟服務。若服務數量較少還比較好,一旦遇到微服務多jar包情況下,手動就會顯得很繁瑣而無助。或者說可以采用shell腳本的方式去部署,但這都不是最優(yōu)秀的解決方案??梢允褂肑enkins部署運行服務。
介紹
Jenkins的前身是Hudson。Jenkins是一款較為流行的開源持續(xù)集成工具,地位幾乎可以說是CI&CD軟件領導者,已經超過了Hudson,它擁有超過1000個插件來支持項目的構建和部署。幾乎可以適用于所有的項目,沒有項目編程語言的限制。
CI&CD:
- 持續(xù)集成(Continuous Integration,CI):指的是團隊成員每天一次或多次把代碼集成到主干。每次集成會自動構建,盡快盡早發(fā)現錯誤。持續(xù)集成是為了讓產品快速迭代,同時保證高質量。
- 持續(xù)交付(Continuous Delivery):指的是持續(xù)將新的功能部署到類生產環(huán)境(可理解為測試環(huán)境qa、uat),交給質量團隊或用戶,交給它們評審
- 持續(xù)部署(Continuous Deployment):指的是通過評審后,自動部署到生產環(huán)境中
Jenkins的特性:
- 系統(tǒng)平臺無關性:Jenkins本身是由Java語言編寫,理論上只要由java的運行環(huán)境,就能使用Jenkins
- 編程語言無關性:支持多種編程語言的項目持續(xù)集成、持續(xù)部署,而非只有java一種
- 安裝和配置簡單:可以通過yum安裝或war包、Docker方式等,由簡潔易用的web界面完成配置
- 插件豐富:擁有超過1000個插件,幾乎可以滿足任何項目的需要
- 容易擴展:Jenkins可以通過其插件架構進行擴展,為用戶提供無限可能
- 分布式構建:Jenkins能使多臺服務器一起構建
- 消息通知:構建完成后發(fā)送email通知結果
下載和安裝
Jenkins的官網地址是https://www.jenkins.io/,下載軟件包的地址https://www.jenkins.io/download/。推薦下載LTS(長期支持)版本。筆者這里選擇Generic Java package(.war),只需要java環(huán)境即可。
當然要注意你選擇版本要和你本地的jdk環(huán)境的兼容關系:
筆者是java8的環(huán)境,選擇一款適用的jenkins版本即可。筆者選擇2.346.3
版本。
提供下下載地址:https://get.jenkins.io/war-stable/2.346.3/jenkins.war
運行
- war包下載完畢后,不需要額外的步驟(前提是有java環(huán)境),是可以直接運行的
java -jar jenkins.war --httpPort=8085
- –httpPort是設置程序端口號,若要使程序不掛斷后臺運行,可以這樣執(zhí)行
nohup java -jar jenkins.war --httpPort=8085 > jenkins-logs.log 2 >&1 &
服務運行后,成功訪問UI頁面,記得需要打開防火墻的端口哦
firewall-cmd --permanent --zone=public --add-port=8085/tcp
firewall-cmd --reload
- 打開jenkins的UI地址(筆者這里是http://192.168.1.41:8085)
我們需要去上面的相應文件中去找到密碼,然后填寫,確定即可。
注意:第一次啟動Jenkins會初始化去下載一些元(metadata)數據,打開界面時提示等待大概4分鐘,等待期間,使用F12調試時,看到報錯503是正?,F象。等待日志打印Jenkins is fully up adn running 即可
-
下一步會讓用戶安裝插件,若是新手可以選擇Jenkins推薦的插件,可以減少很多的步驟。筆者這里也選擇推薦的插件了,唯一的缺點是下載的東西多,稍微會慢點。
-
完成后創(chuàng)建一個管理員用戶
Jenkins配置
Jenkins初始化完成后,還需要配置一些全局工具,如jdk,maven,git。在Jenkins后臺頁面點擊Manage Jenkins,再點擊Global Tool Configuration配置全局工具JDK、maven、git
配置maven
找好你的settings.xml文件
的路徑,配置到這里即可。然后再去配置maven的路徑
注意:如果你的maven的bin目錄沒有可執(zhí)行的權限,要記得增加可執(zhí)行權限,否則執(zhí)行命令時會報錯:Permission denied,可以在maven的根目錄下使用命令賦權:chmod +x -R bin
配置jdk
直接輸入JAVA_HOME的安裝地址即可
最后配置git的目錄,記得先安裝git
yum install -y git
使用yum安裝的git,目錄是/usr/bin/git
GitLab簡介&安裝
持續(xù)集成一般有3個組成的要素:
- 一個自動構建的過程,代碼檢出、編譯構建等過程都是自動完成,無需人工
- 一個代碼存儲庫(SVN或git)
- 一個持續(xù)集成服務器(如Jenkins)
現在還缺少一個代碼存儲庫。在企業(yè)中為了掌握代碼的所有權,一般都會自動搭建代碼存儲庫??梢允褂肎itlab。
GitLab使用git作為代碼管理工具,并且在此基礎上開發(fā)了Web管理頁面來進行項目管理。
與github最大的不同是,gitlab部署在自己的服務器上,所有權都是掌握在自己手中。
采用yum方式安裝GitLab
- 安裝需要的依賴和設置ssh開機自啟動,開啟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并設置開機自啟動、開啟Postfix,便于郵件通知
yum install -y postfix
systemctl enable postfix
systemctl start postfix
- 添加Gitlab軟件包存儲庫并安裝軟件包
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
- 打開防火墻端口(或關閉防火墻)
firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --reload
- 完成后,打開http://192.168.1.41,第一次進入時需要去
/etc/gitlab/initial_root_password
找下初始化密碼,然后登錄即可
Docker方式安裝Gitlab
使用Docker方式安裝Gitlab是比較快捷的方式,如下命令即可:
mkdir -p /data/gitlab # 先創(chuàng)建gitlab存儲數據、配置、日志的目錄
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 : 后臺運行
–hostname:gitlab服務地址
–publish或-p:宿主機和容器的端口映射
–name 設置容器名稱
–volume或-v:宿主機和容器的目錄映射
–restart always: 開機自啟
Gitlab常用命令
- gitlab-ctl start:啟動
- gitlab-ctl stop:停止
- gitlab-ctl status:查看
- gitlab-ctl restart:重啟
Jenkins+Gitlab部署運行
現在已經有了存儲庫,然后創(chuàng)建git倉庫把項目上傳到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
這些就比較簡單了,筆者這里不再贅述了。直接展示下項目的目錄
需要注意的是:如果普通用戶push代碼,可能會沒有權限,管理員設置下即可。
Jenkins頁面創(chuàng)建任務
- 在Jenkins頁面點擊新建項目(New Item),輸入項目名稱(名稱隨便取,別重復)。選擇自由風格項目。
- 在General一欄輸入描述,可以任意填寫,重要的是源代碼管理,倉庫地址就填寫gitlab的項目地址,然后添加你的gitlab賬號的憑證(賬號密碼)。
- 完成后,下面有一個分支選擇,選擇你要部署的分支即可。
- 來到構建這一欄,點擊添加構建步驟,選擇Invoke toplevel maven targets(調用頂層 Maven 目標)項,maven版本選擇配置好的,目標Goals填寫
clean package
這里的maven命令不需要添加mvn
,請注意!!
- 打包完成后,就可以運行jar包了,再增加一個構建步驟,選擇Excecute shell,執(zhí)行shell命令,在Command輸入以下命令,考慮到可能出現第二次部署時,需要把上一次的jar停止,那么命令如下
#!/bin/bash
# 先停止進程
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后再啟動
BUILD_ID=dontKillMe # 表示別干掉啟動的程序
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 &
完事后,保存即可。
- 點擊立即構建,即可
同時還可以去看日志信息:
我們可以到服務器上看下程序有沒有啟動成功
ps -ef |grep java
成功部署了三個jar包。
Webhook網絡鉤子
當我們需要每次提交合并代碼時,自動進行項目部署時,可以使用網絡鉤子Webhook完成我們的需求。
大致流程就是:Jenkins提供一個地址,當代碼有更新時代碼存儲庫(gitlab)主動調用一次這個地址,觸發(fā)Jenkins構建即可。
需要在Jenkins上面安裝Generic Webhook Trigger插件
到項目主界面,點擊配置,到構建觸發(fā)器那里,選擇Generic Webhook Trigger一項,然后添加一個Token(隨便寫,但不要重復了)
那么,構建的URL格式如下:
http://JENKINS_URL/generic-webhook-trigger/invoke/invoke?token=剛剛自定義的Token
JENKINS_URL:是JENKINS的訪問地址。
此項目中就是如下
http://192.168.1.41:8085/generic-webhook-trigger/invoke/invoke?token=nihaowoshichufaqi
回到gitlab
因為Gitlab10.6版本后,為了安全,默認不允許向本地網絡發(fā)送Webhook請求,這里因為筆者是把gitlab和jenkins安裝到一臺服務器了,所以這里先允許發(fā)送本地網絡webhook。
到gitlab項目中,設置webhook即可。這里暫時寫所有分支push時觸發(fā)了,實際可以按照項目情況執(zhí)行。
配置完成
完成后,即可提交任意分支的代碼,看到jenkins已經自動觸發(fā)構建了,并且jar也重新啟動了文章來源:http://www.zghlxwxcb.cn/news/detail-728143.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-728143.html
到了這里,關于Gitlab+Jenkins自動化部署,解放雙手的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!