展參考:Jenkins+Gitlab通過腳本自動(dòng)部署回滾web項(xiàng)目至集群
1):Gitlab服務(wù)器:ubuntu 192.168.152.131 ---參考搭建:Linux安裝gitlab,docker安裝gitlab教程
2):Jenkins服務(wù)器:ubunu 192.168.152.130 ---參考搭建:linux安裝Jenkins,或docker安裝Jenkins教程
在服務(wù)器上生成ssh-keygen,用于配置web服務(wù)器和Gitlab服務(wù)器。
#生成密鑰和私鑰,至于為什么用這些參數(shù)生產(chǎn)密鑰,詳情往下看。
ssh-keygen -m PEM -t rsa -b 4096
#將公鑰傳給web服務(wù)器,實(shí)現(xiàn)免密碼連接
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.152.150
3):web服務(wù)器:centos 192.168.152.150 ---已搭建好LNMP環(huán)境
4):開發(fā)者電腦:Windows+key密鑰 (用于提交代碼)
1:在gitlab創(chuàng)建項(xiàng)目Test Project
2:配置ssh keys
2.1): 配置一個(gè)開發(fā)者電腦的ssh公鑰到gitlab
配置一個(gè)開發(fā)者電腦的ssh公鑰到gitlab,這樣才能模擬開發(fā)上傳代碼到gitlab。
windows生成key過程及git安裝,可參考:Windows下git和github的使用圖文詳細(xì)教程_the丶o(jì)nly的博客-CSDN博客_github win
在windows測(cè)試clone,和提交代碼。
#克隆代碼倉(cāng)庫(kù),然后測(cè)試是否能夠上傳代碼到gitlab
cd D:/code #D盤code文件夾作為測(cè)試代碼文件夾
#第一次需要配置全局郵箱和姓名,否則commit會(huì)報(bào)錯(cuò)
git config --global user.email "xxxxxxx@gmail.com"
git config --global user.name "dev"
#克隆提交
git clone git@192.168.152.131:root/test-project.git
cd test-project/
echo this is test html > index.html
git add .
git commit -m "add 1.txt"
git push
注:最新版git 已經(jīng)將默認(rèn)分支master改為main了。所以看到main,而不是master不要太奇怪
測(cè)試成功,在gitlab也顯示有index.html文件。
2.2): 配置jenkins公鑰到gitlab
同理,同樣需要jenkins公鑰,因?yàn)閖enkins也需要拉去gitlab的代碼。
在 jenkins服務(wù)器 上查看公鑰并復(fù)制添加到gitlab,并命名為jekins。
cat .ssh/id_rsa.pub
1:插件管理,安裝插件
jenkins本身沒什么功能,主要是依靠插件來實(shí)現(xiàn)各種強(qiáng)大的功能。
基本需要添加的插件:Gitlab Hook、Build Authorization Token Root、Publish Over SSH、Gitlab Authentication、Gitlab、Git Parameter
可以在Manage Jenkins >> Manage Plugins查看管理插件。在Available 選項(xiàng)搜索安裝插件即可。
安裝完成后,重啟Jenkins。
2:添加需要部署的web主機(jī)
在Manage Jenkins >> Configure System 中往下翻,找到 Publish over SSH 選項(xiàng),點(diǎn)擊add ssh server。
在Jenkins服務(wù)器上,查看私鑰,注,是私鑰,不是公鑰。
cat .ssh/id_rsa
將私鑰填寫在key位置,還有添加web服務(wù)器相關(guān)信息。
注:如果測(cè)試報(bào)錯(cuò)如下
Failed to connect or change directory
jenkins.plugins.publish_over.BapPublisherException: Failed to add SSH key. Message [invalid privatekey: [B@2e54414f]
是因?yàn)槟J(rèn)用ssh-keygen命令,默認(rèn)生成了OPENSSH 格式密鑰。而Jenkins暫時(shí)不支持這種私鑰,私鑰開頭結(jié)尾如下:
-----BEGIN OPENSSH PRIVATE KEY-----
jPay5FNbtfwDVN91InyRdFrt+14cFD8fM9ItDG4AS4WTajSP0Zdgf2PxcUBiFfMj
…
-----BEGIN OPENSSH PRIVATE KEY——
所以,需要生成rsa密鑰格式的。用開頭說的ssh-keygen加其他參數(shù)生成即可。
私鑰開頭結(jié)尾如下:
----BEGIN RSA PRIVATE KEY-----
fiUBpwmwPki3PU4jagpIhQuX6qokcLBb/E3B0QXC2Ws+mVwCD64q1nd/zA8=
.....
-----END RSA PRIVATE KEY-----
再次測(cè)試,顯示success,則成功。然后點(diǎn)擊save保存即可。
3:構(gòu)建任務(wù)項(xiàng)目
首頁(yè)創(chuàng)建任務(wù)或者一個(gè)項(xiàng)目
命名為web-project,選擇為freestyle project 自由項(xiàng)目。然后ok確認(rèn)。
3.1):源碼管理 Source Code Management
選擇源碼管理,添加gitlab的項(xiàng)目clone地址。
注:最后路徑選擇分支,我gitlab主分支名字為main,如果是master,則寫master,或者合并的其他分支。
在add添加用戶
添加完成后,選擇git用戶,這時(shí)沒有紅色提醒,說明已成功連接
3.2):構(gòu)建觸發(fā)器 Build Triggers
現(xiàn)在Build Triggers,勾選build when....,其他默認(rèn),并記下鏈接http://192.168.152.130:8080/project/web-project
點(diǎn)擊高級(jí) advance 選項(xiàng)。
勾選filter branches regex選擇,填寫分支,生產(chǎn)token。其他默認(rèn)
3.3):構(gòu)建 Build
選擇Build 選項(xiàng)。選擇ssh
添加web服務(wù)器
添加完畢,最后save保存。
1:添加鉤子webhooks.
選擇自己的項(xiàng)目Test Project,在設(shè)置setting里,選擇鉤子webhooks.
填寫剛才記下的http://192.168.152.130:8080/project/web-project和token值。
最后Add webhook完成:
2:如添加失敗,報(bào)錯(cuò),更改Network
注:如填寫失敗提示Url is blocked: Requests to the local network are not allowed
還需更改Network選項(xiàng)。
3:測(cè)試鉤子
添加完成后,下面會(huì)出現(xiàn)鉤子選擇。點(diǎn)擊test中的,push event。
出現(xiàn)successful,即添加成功。
在Jenkins也可以看到剛才的測(cè)試時(shí)間信息。
在開發(fā)電腦上測(cè)試提交,我這里為Windows電腦測(cè)試。
打開Git Bash,輸入以下命令:
#進(jìn)入代碼目錄
$ cd D:/code
#進(jìn)入代碼項(xiàng)目目錄
$ cd test-project/
#添加內(nèi)容到原測(cè)試網(wǎng)頁(yè)
$ echo "test jenkins" >> index.html
$ git add .
$ git commit -m "test commit"
#最后提交
$ git push
提交成功,回到Jenkins,查看是否構(gòu)建成功:
綠色顯示構(gòu)建成功,無錯(cuò)誤顯示。回到gitlab查看項(xiàng)目。
時(shí)間顯示剛才也提交成功,無錯(cuò)誤。最后在瀏覽器輸入web地址測(cè)試,本人配置了web訪問端口8082。所以輸入IP加端口訪問。
內(nèi)容也已經(jīng)自動(dòng)更新成功。
完結(jié)撒花!!!
?本文介紹使用Jenkins一鍵將NodeJS(Vue)前端項(xiàng)目打包并上傳到生產(chǎn)環(huán)境服務(wù)器,這里使用的是直接打包靜態(tài)頁(yè)面,發(fā)送到遠(yuǎn)程服務(wù)器Nginx配置目錄的方式,首先確保服務(wù)器環(huán)境配置好,安裝Nginx,運(yùn)行目錄,日志存放目錄等。
??Nginx安裝也有多種方式,源碼安裝、yum安裝、Docker安裝等,安裝并不復(fù)雜,我們這里采用Docker安裝的方式,由于習(xí)慣于標(biāo)準(zhǔn)化及存檔,方便在不同服務(wù)器部署相同的環(huán)境,我們這里使用了Docker Compose來定義Nginx容器配置信息。
??Docker及Docker Compose安裝配置,前面有詳細(xì)介紹,這里不再贅述,以下是Nginx容器的Docker Compose定義文件內(nèi)容:
version: '3'
services:
##nginx配置
nginx:
image: nginx:latest
restart: always
container_name: nginx
environment:
- TZ=Asia/Shanghai
ports:
#端口映射,前面是宿主機(jī)端口,后面是服務(wù)端口
- 80:80
- 443:443
volumes:
- /data/container/nginx/html:/nginx/html
- /data/container/nginx/www:/var/www
- /data/container/nginx/logs:/var/log/nginx
- /data/container/nginx/etc:/etc/nginx
- /data/container/nginx/etc/nginx.conf:/etc/nginx/nginx.conf
- "/etc/localtime:/etc/localtime"
- "/usr/share/zoneinfo/Asia/Shanghai:/etc/timezone"
#若用到ssl,可以引入
- /bxl/container/nginx/ssl:/nginx/ssl
部分參數(shù)說明:
mkdir -p /opt/tmp /opt/bak /opt/script /data/container/nginx/html /data/container/nginx/www /data/container/nginx/logs /data/container/nginx/etc /bxl/container/nginx/ssl
chmod -R 777 /opt/tmp /opt/bak /opt/script /data/container/nginx/html /data/container/nginx/www /data/container/nginx/logs /data/container/nginx/etc /bxl/container/nginx/ssl
server {
listen 80;
server_name 域名;
gzip on;
gzip_buffers 32 4K;
gzip_comp_level 6;
gzip_min_length 100;
gzip_types application/javascript text/css text/xml text/plain application/x-javascript image/jpeg image/gif image/png;
gzip_disable "MSIE [1-6]\.";
gzip_vary on;
#charset koi8-r;
access_log /var/log/nginx/portal.access.log main;
location / {
root /nginx/html/gitegg_portal;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /gitegg-api/ {
proxy_set_header Host $http_host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://172.17.0.1:8080/;
}
}
#param validate
if [ $# -lt 1 ]; then
echo "you must use like this : ./publish_portal.sh <project_namename> [portal home dir]"
exit
fi
if [ "$1" != "" ]; then
project_name="$1"
fi
if [ "$2" != "" ]; then
portal_home="$2"
fi
# 刪除
rm -rf "$portal_home"/index.html "$portal_home"/favicon.ico "$portal_home"/_app.config.js "$portal_home"/logo.png "$portal_home"/resource/ "$portal_home"/assets/
# 解壓
cd /opt/tmp/portal
tar -zxvf portal.tar.gz
#bak project_name
BAK_DIR=/opt/bak/portal/$project_name/`date +%Y%m%d`
mkdir -p "$BAK_DIR"
cp /opt/tmp/portal/portal.tar.gz "$BAK_DIR"/"$project_name"_`date +%H%M%S`.tar.gz
#remove tmp
rm -rf portal.tar.gz
#copy portal code
cp -r * "$portal_home"
#remove tmp
rm -rf index.html favicon.ico _app.config.js logo.png resource assets
echo "Portal is starting,please try to access $project_name conslone url"
project_name="portal"
portal_home="/data/container/nginx/html"
#param validate
if [ $# -lt 1 ]; then
echo "you must use like this : ./publish_portal.sh <project_namename> [portal home dir]"
exit
fi
if [ "$1" != "" ]; then
project_name="$1"
fi
if [ "$2" != "" ]; then
portal_home="$2"
fi
echo "portal code copy"
#publish project_name
echo "$project_name publishing"
rm -rf "$portal_home"/index.html "$portal_home"/favicon.ico "$portal_home"/_app.config.js "$portal_home"/logo.png "$portal_home"/resource/ "$portal_home"/assets/
cd /opt/tmp/portal
tar -zxvf portal.tar.gz
#bak project_name
BAK_DIR=/opt/bak/portal/$project_name/`date +%Y%m%d`
mkdir -p "$BAK_DIR"
cp /opt/tmp/portal/portal.tar.gz "$BAK_DIR"/"$project_name"_`date +%H%M%S`.tar.gz
#remove tmp
rm -rf portal.tar.gz
#copy portal code
cp -r * "$portal_home"
#remove tmp
rm -rf index.html favicon.ico _app.config.js logo.png resource assets
#start portal
echo "Portal is starting,please try to access $project_name conslone url"
chmod 755 publish_portal.sh
echo $PATH
node -v
pnpm -v
pnpm install
pnpm run build
cd dist
rm -rf portal.tar.gz
tar -zcvf portal.tar.gz *
cd ../
/opt/script/publish_portal.sh portal /data/container/portal
任何簡(jiǎn)單操作的背后,都有一套相當(dāng)復(fù)雜的機(jī)制。本文將以SpringBoot應(yīng)用的在Docker環(huán)境下的打包部署為例,詳細(xì)講解如何使用Jenkins一鍵打包部署SpringBoot應(yīng)用。
Jenkins是開源CI&CD軟件領(lǐng)導(dǎo)者,提供超過1000個(gè)插件來支持構(gòu)建、部署、自動(dòng)化,滿足任何項(xiàng)目的需要。我們可以用Jenkins來構(gòu)建和部署我們的項(xiàng)目,比如說從我們的代碼倉(cāng)庫(kù)獲取代碼,然后將我們的代碼打包成可執(zhí)行的文件,之后通過遠(yuǎn)程的ssh工具執(zhí)行腳本來運(yùn)行我們的項(xiàng)目。
docker pull jenkins/jenkins:lts
復(fù)制代碼
docker run -p 8080:8080 -p 50000:5000 --name jenkins \
-u root \
-v /mydata/jenkins_home:/var/jenkins_home \
-d jenkins/jenkins:lts
復(fù)制代碼
docker logs jenkins
復(fù)制代碼
我們可以使用Jenkins的角色管理插件來管理Jenkins的用戶,比如我們可以給管理員賦予所有權(quán)限,運(yùn)維人員賦予執(zhí)行任務(wù)的相關(guān)權(quán)限,其他人員只賦予查看權(quán)限。
這里我們使用mall-learning項(xiàng)目中的mall-tiny-jenkins模塊代碼來演示下如何使Jenkins一鍵打包部署SpringBoot應(yīng)用。
#!/usr/bin/env bash
app_name='mall-tiny-jenkins'
docker stop ${app_name}
echo '----stop container----'
docker rm ${app_name}
echo '----rm container----'
docker run -p 8088:8088 --name ${app_name} \
--link mysql:db \
-v /etc/localtime:/etc/localtime \
-v /mydata/app/${app_name}/logs:/var/logs \
-d mall-tiny/${app_name}:1.0-SNAPSHOT
echo '----start container----'
復(fù)制代碼
chmod +x ./mall-tiny-jenkins.sh
復(fù)制代碼
#使用vim編輯器來修改
vi mall-tiny-jenkins.sh
# 查看文件格式,windows上傳上來的默認(rèn)為dos
:set ff
#修改文件格式為unix
:set ff=unix
#保存并退出
:wq
復(fù)制代碼
./mall-tiny-jenkins.sh
復(fù)制代碼
作者:MacroZheng
鏈接:https://juejin.im/post/5df780d3e51d4557ff140b30
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。