Docker + Nginx + Jenkins 部署 SpringBoot Jar
另一篇文章介紹了 如何使用 Jenkins 部署前端React項目
本文能解決的問題:
- 如何使用Docker 部署Jenkins
- Jenkins 會重寫url(使用三級域名)
- nginx 配置 jenkins、前端狱窘、后端
- 部署 Maven 子項目(單 maven 項目更簡單界酒,我相信你們能舉一反三)
一浆劲、docker-compose
編寫 docker-compose,連接 nginx 與 jenkins秸苗。
如果不是使用 Docker 做容器管理,此步可忽略。直接啟動 Nginx 與 Jenkins 即可怖竭。
version: '3'
services:
jenkins:
container_name: 'jenkins.ci'
image: 'jenkins/jenkins:lts'
#ports: 不對外暴露端口,直接使用nginx容器轉(zhuǎn)到8080
#- '8080:8080'
#- '50000:50000'
volumes:
- '/home/docker-images/jenkins/var/jenkins_home:/var/jenkins_home'
- '/home/docker-images/jenkins/html:/usr/share/jenkins/html' #掛載編譯打包后的存放路徑
nginx:
container_name: 'nginx'
depends_on:
- jenkins
image: nginx:alpine
volumes:
- '/home/luokaiii/backstage_page/html:/usr/www/luokaiii/cn/html'
- '/home/docker-images/nginx/conf:/etc/nginx/conf.d'
- '/home/docker-images/nginx/cert:/etc/nginx/cert'
ports:
- 80:80 # 對外統(tǒng)一使用80端口
- 443:443
restart: always
二陡蝇、nginx.conf
upstream apisupport {
# 自己部署的后端服務(wù)痊臭,因為是在容器訪問外部服務(wù)哮肚,所以需要使用內(nèi)網(wǎng)IP
# 第二種方法是在 docker-compose 中將 jar 作為一個 service 連接
server xxx.xx.xx.xxx:9000;
}
# 這里用到了 docker-compose 中的容器,如果沒用docker广匙,直接寫localhost就可以了允趟。
upstream dk-jenkins {
server jenkins:8080;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name www.luokaiii.cn;
return 301 https://$server_name$request_uri;
}
server {
listen 80;
# 我用了一個 三級域名來處理Jenkins的請求,因為 jenkins 會從根目錄查找靜態(tài)資源和發(fā)送請求鸦致,總是會重寫url潮剪。
server_name jenkins.luokaiii.cn;
location / {
proxy_pass http://dk-jenkins/;
}
}
# 如果沒有 https 證書,直接將 ssl 以下的部分寫在 80 里就行了
server {
listen 443 ssl;
server_name www.luokaiii.cn luokaiii.cn;
# ssl config
ssl on; #設(shè)置為on啟用SSL功能分唾。
ssl_certificate cert/2292046_www.luokaiii.cn.pem;
ssl_certificate_key cert/2292046_www.luokaiii.cn.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
# 壓縮請求抗碰,這樣服務(wù)返回會快一些,畢竟國內(nèi)帶寬很貴的
gzip on;
gzip_min_length 1k;
gzip_comp_level 9;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
# 靜態(tài)資源代理绽乔,在Jenkins部署前端項目的文章中弧蝇,就是把前端靜態(tài)文件部署在該目錄下,直接由nginx代理即可迄汛。
root /usr/www/luokaiii/cn/html;
location / {
try_files $uri $uri/ /index.html;
}
# 請求轉(zhuǎn)發(fā)捍壤,將 /api/ 請求轉(zhuǎn)發(fā)到 jar 服務(wù)上
location /api/ {
proxy_pass http://apisupport/;
proxy_redirect http://api/support/ https://www.luokaiii.cn/api/;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Nginx-Proxy true;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 600;
proxy_buffer_size 256k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
proxy_max_temp_file_size 128m;
proxy_http_version 1.1;
#proxy_cache mycache;
#proxy_cache_valid 200 302 1h;
#proxy_cache_valid 301 1h;
#proxy_cache_valid any 1m;
}
}
這里使用了一個三級域名來代理 Jenkins,因為 Jenkins 總是會從根目錄查找靜態(tài)資源鞍爱,以及發(fā)送請求鹃觉。如果是 www.luokaiii.cn/jenkins/ 的話總是會被重寫為 www.luokaiii.cn,所以直接用三級域名睹逃,讓它從根目錄找好了盗扇。
如果有知道如何代理的大佬也可以告訴我,虛心請教沉填,謝謝疗隶。
三、SpringBoot 項目
這里項目以我自己寫的 Demo https://github.com/luokaiii/luokaiii.api 為例翼闹,一個 Maven 多級項目斑鼻,我們只部署其中的 admin-server 模塊。
具體的項目是怎么寫的就不說了猎荠,大致是:打開idea > 新建 Spring Initializr > 選擇maven > 在 Application 中寫一個 GetMapping > OK
四坚弱、進入正題
打開Jenkins,并新建一個 Freestyle(即自由風(fēng)格的軟件項目)关摇。
除了上一節(jié) Jenkins部署前端React項目 中所需的依賴之外荒叶,這里還需要 Maven Integration
依賴。
1. 項目描述(隨便寫)
2. 源碼管理
剛創(chuàng)建的用戶输虱,Credentials 可能為空些楣,創(chuàng)建一個 username+password(一般是你的git賬號密碼)就行,(如果覺得不安全,可以使用SSH的方式愁茁,自己百度)蚕钦。
[圖片上傳失敗...(image-415ece-1565084344823)]
這里分支使用的是
develop
,原因:在 Git Flow 中埋市,develop 為開發(fā)分支(這里用來做測試服務(wù)器的分支)冠桃,master 為主分支(即正式服務(wù)器的分支)。因人而異道宅,你想用 master 也行,反正不是我的項目胸蛛,哈哈污茵。
3. 構(gòu)建(jenkins與測試服務(wù)器在同一臺服務(wù)器上)
如果你的 jenkins 部署在測試服務(wù)器上,那么直接將打包后的 jar 文件移動至指定目錄即可葬项。
- 調(diào)用頂層 Maven 目標泞当,使用maven 打包項目
- 因為打包的是子項目,所以使用 -pl 參數(shù)指定需要打包的子項目民珍,通過 -am 參數(shù)開啟依賴項目的構(gòu)建
- -Dmaven.test.skip=true 跳過測試(一般對單元測試有嚴格要求的都不應(yīng)該跳過此步驟)
- Send files or execute commands over SSH
- 通過 SSH發(fā)送文件或執(zhí)行命令
- 因為jenkins與測試在一起襟士,所以我們只需要執(zhí)行mv命令即可
- 下面的jenkins與服務(wù)器分開(比如正式服部署,總不能還浪費帶寬吧)嚷量,就需要發(fā)送將jar發(fā)送到服務(wù)器然后運行
4. 構(gòu)建(jenkins與測試服務(wù)器分離)
跟步驟3沒什么太大的區(qū)別陋桂,只是將 jar 發(fā)送到服務(wù)器。
最后一句
pm2 restart api-support
類似于nohup java -jar xxx.jar
我是使用 pm2 管理的jar包蝶溶,有興趣的可以自己查一下(或者推薦一下其他的進程管理工具也行)嗜历。
5. 測試
隨便提交一次代碼,點擊立即構(gòu)建抖所。經(jīng)過漫長的等待(maven首次更新梨州、向服務(wù)器發(fā)送jar包),打印出以下日志田轧。
完成暴匠,收工!
最后提一下我為什么會寫兩種構(gòu)建方式傻粘,因為我先用步驟 四4 中的構(gòu)建時每窖,1M (上行才100多k,T_T)小水管發(fā)一個 jar 包快二十分鐘了抹腿。所以想到同服務(wù)器還是直接拷貝的比較好岛请。