手摸手教你docker+jenkins+gitlab部署你的前端項目
大廠技術(shù)??高級前端??Node進(jìn)階
點擊上方?程序員成長指北,關(guān)注公眾號
回復(fù)1,加入高級Node交流群
作者:作曲家種太陽
原文:https://juejin.cn/post/6950280074876682276
學(xué)習(xí)了一周的CICD,踩了很多坑,都是淚,特此記錄一下整個過程,本次項目產(chǎn)出效果是,git push的時候自動化直接部署到服務(wù)器上,以下是整個大致流程:

1.本地代碼push到gitlab 2.gitlab通過webhook通知到j(luò)enkins 3.jenkins拉取gitlab倉庫代碼,并執(zhí)行shell腳本 4.shell腳本執(zhí)行docker命令,打包項目 5.安裝nginx,并把打包好的dist目錄映射到nginx代理目錄下 6.部署成功,訪問服務(wù)器ip+端口號訪問你的項目
你所需要準(zhǔn)備的:
docker最基本的知識,并安裝docker和docker-compose linux最基本命令,知道私鑰公鑰生成 使用過git工具 你的前端項目npm run build 成功 你需要一臺 ram>1G的linux服務(wù)器 基本應(yīng)變能力,排查bug能力
1.使用docker安裝jenkins
(1).創(chuàng)建一個docker-compose.yml文件,放到/home/work/文件夾下(可自定義,注意邏輯
?version:?'2.0'
services:
??jenkins:
????container_name:?'jenkins'??#?容器名稱
????image:?jenkins/jenkins:lts?????#鏡像名稱
????restart:?always?????#是否重啟
????user:?jenkins:994???#備注1
????ports:??????????????#映射端口號
??????-?"10050:8080"
??????-?"50001:50000"
??????-?"10051:10051"
????volumes:
??????-?/home/jenkins/data:/var/jenkins_home
??????-?/usr/bin/docker:/usr/bin/docker
??????-?/var/run/docker.sock:/var/run/docker.sock
備注1:使用cat /etc/group | grep docker,我得到的
docker:x:994:
docker組名是994,所以user這里寫jenkins:994 (2).cd /home//work/ 并且 使用 docker-compose up -d 來加載docker-compose.yml 這時候會生成一個docker的容器,使用 docker logs jenkins 查看jenkins容器的日志

找到這一段代碼,復(fù)制出來,這是等會兒使用jenkins的秘鑰
ps:這時候你有可能會見到日志是權(quán)限不允許

給宿主機的/home/jenkins/data目錄一個777的權(quán)限
輸入命令 chmod 777 -R /home/jenkins/data
然后重新執(zhí)行docker-compose up -d 并重啟jenkins容器(docker restart jenkins)
(3).開啟jenkins,瀏覽器訪問 服務(wù)器IP地址:10050 第一次訪問,會讓你輸入剛才logs里面的秘鑰
2.配置gitlab
前提:你得有一個ssh生成的私鑰(id_rsa)和公鑰(id_rsa.pub),自行百度怎講么生成 (1).gitlab.com/[1] 上面注冊一個賬戶 (2). 點擊右上角設(shè)置

(3).找到ssh秘鑰,并把公鑰粘貼到里面(一定是公鑰)
(4).創(chuàng)建一個項目,點擊進(jìn)入項目中,點擊webhooks
這里是讓輸入jenkins的 ip地址 和 加密鑰匙,先不著急輸入,我們馬上配置
3.配置jenkins
前提:你需要自行安裝jenkins插件(ssh,gitlab,build parms插件)
(1).新建一個item (2).進(jìn)入到項目的配置頁面
(3).填寫shell自定義變量,照著上面的填寫,后面填寫shell腳本時候會用到

(5).跟著步驟來

(6).第五步點擊高級設(shè)置按鈕后
ps:配置頁面先不要關(guān)閉,還沒有配置shell腳本哦
(7)還記得配置gitlab的時候么,還有url和秘鑰沒有配置,現(xiàn)在把剛才copy的url和秘鑰復(fù)制到webhooks當(dāng)中
這時候下方就會多出來一個webhooks的任務(wù),頁面別關(guān),留著,繼續(xù)跟著走 ps:記得把ssl驗證給取消
好了,到這時候,就打通了gitlab到j(luò)enkins的過程,進(jìn)度完成了一大半了,加油~~~~
4.創(chuàng)建你的vue項目
前提:請準(zhǔn)備好你的vue項目,并且能確保npm run build 成功 (1)在當(dāng)前目錄下面創(chuàng)建Dockerfile和.dockerignore文件
#?build?stage
FROM?node:10?as?build-stage
LABEL?maintainer="[email protected]"
WORKDIR?/app
COPY?.?.
RUN?npm?install
RUN?npm?run?build
#?production?stage
FROM?nginx:stable-alpine?as?production-stage
COPY?--from=build-stage?/app/dist?/usr/share/nginx/html
EXPOSE?80
CMD?["nginx",?"-g",?"daemon?off;"]
大概意思是把文件copy到app文件目錄下,執(zhí)行npm install 和 npm run build,并且吧生成的dist文件移動到nginx的代理目錄下面,端口是 80
(2).dockerignore
#?Dependency?directory
#?https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
node_modules
.DS_Store
dist
#?node-waf?configuration
.lock-wscript
#?Compiled?binary?addons?(http://nodejs.org/api/addons.html)
build/Release
.dockerignore
Dockerfile
*docker-compose*
#?Logs
logs
*.log
#?Runtime?data
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw*
pids
*.pid
*.seed
.git
.hg
.svn
(3).此時的目錄結(jié)構(gòu)是

(4).提交到gitlab遠(yuǎn)程倉庫 1. git init 2. git remote add origin ssh地址 #git添加遠(yuǎn)程倉庫 3. git add . #代碼添加到暫存區(qū) 4.git commit -m "testjenins" #提交代碼 5. git push origin master #推送代碼到遠(yuǎn)程master分支 ps:可能會有這樣的git報錯

解決方法:segmentfault.com/q/101000000…[2]
ps:這是一系列g(shù)it操作,目的是遠(yuǎn)程推送到創(chuàng)建的gitlab倉庫當(dāng)中,中間遇到的git報錯需要自己去排查,實在不行,你可以借助gitlab項目中的webide這個功能模擬推送到master分支上
5.配置shell腳本
前言:這時候我們已經(jīng)打通了本地代碼->gitlab-jenkins的這個環(huán)節(jié)了,然后我們編寫shell腳本執(zhí)行docker語句構(gòu)建容器并且執(zhí)行就OK了 (1).在jenkins中配置shell腳本
#!/bin/bash
CONTAINER=${container_name}
PORT=${port}
#?build?docker?image
docker?build?--no-cache?-t?${image_name}:${tag}?.
checkDocker()?{
??RUNNING=$(docker?inspect?--format="{{?.State.Running?}}"?$CONTAINER?2>/dev/null)
??if?[?-z?$RUNNING?];?then
????echo?"$CONTAINER?does?not?exist."
????return?1
??fi
??if?[?"$RUNNING"?==?"false"?];?then
????matching=$(docker?ps?-a?--filter="name=$CONTAINER"?-q?|?xargs)
????if?[?-n?$matching?];?then
??????docker?rm?$matching
????fi
????return?2
??else
????echo?"$CONTAINER?is?running."
????matchingStarted=$(docker?ps?--filter="name=$CONTAINER"?-q?|?xargs)
????if?[?-n?$matchingStarted?];?then
??????docker?stop?$matchingStarted
??????docker?rm?${container_name}
????fi
??fi
}
checkDocker
#?run?docker?image
docker?run?-itd?--name?$CONTAINER?-p?$PORT:80?${image_name}:${tag}
大概意思是構(gòu)建docker容器,checkDocker是判斷同名的docker容器是否存在,存在就刪除.最后執(zhí)行docker容器并且映射到port變量
ps:還記得我們之前在jenkins配置的shell變量么,別忘了一一對應(yīng)哦

(2).保存jenkins任務(wù)的配置

欣賞成果
(1).把本地代碼改動后繼續(xù)推送到遠(yuǎn)程gitlab倉庫上 (2).查看jenkins任務(wù)的終端輸出
(4).看到終端輸出success后,瀏覽器打開項目部署的url(服務(wù)器IP:port)

項目打開啦,說明之前我們的辛苦沒有白費~
可以繼續(xù)優(yōu)化的點
jenkins構(gòu)建后發(fā)送郵件通知 shell腳本判斷端口是否被占用,如果占用可以隨機分配端口并且通知到用戶 shell腳本中的npm install換成淘寶源可以速度快一些
一點點感悟
CICD這個流程難在比較繁瑣,每個細(xì)節(jié)都得注意,當(dāng)我們學(xué)會docker,shell,linux,jenkins,ssh公鑰私鑰配置這方面的知識后,剩下來的就是把這些串起來,排故的時候需要耐心,先跑通整個流程
參考資料
https://gitlab.com/: https://link.juejin.cn?target=https%3A%2F%2Fgitlab.com%2F
[2]https://segmentfault.com/q/1010000002736986: https://link.juejin.cn?target=https%3A%2F%2Fsegmentfault.com%2Fq%2F1010000002736986
Node 社群
我組建了一個氛圍特別好的 Node.js 社群,里面有很多 Node.js小伙伴,如果你對Node.js學(xué)習(xí)感興趣的話(后續(xù)有計劃也可以),我們可以一起進(jìn)行Node.js相關(guān)的交流、學(xué)習(xí)、共建。下方加 考拉 好友回復(fù)「Node」即可。
如果你覺得這篇內(nèi)容對你有幫助,我想請你幫我2個小忙:
1. 點個「在看」,讓更多人也能看到這篇文章 2. 訂閱官方博客?www.inode.club?讓我們一起成長 點贊和在看就是最大的支持??
