<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          手摸手教你docker+jenkins+gitlab部署你的前端項目

          共 4935字,需瀏覽 10分鐘

           ·

          2022-04-11 22:14

          大廠技術(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)備的:

          1. docker最基本的知識,并安裝docker和docker-compose
          2. linux最基本命令,知道私鑰公鑰生成
          3. 使用過git工具
          4. 你的前端項目npm run build 成功
          5. 你需要一臺 ram>1G的linux服務(wù)器
          6. 基本應(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)化的點

          1. jenkins構(gòu)建后發(fā)送郵件通知
          2. shell腳本判斷端口是否被占用,如果占用可以隨機分配端口并且通知到用戶
          3. shell腳本中的npm install換成淘寶源可以速度快一些

          一點點感悟

          CICD這個流程難在比較繁瑣,每個細(xì)節(jié)都得注意,當(dāng)我們學(xué)會docker,shell,linux,jenkins,ssh公鑰私鑰配置這方面的知識后,剩下來的就是把這些串起來,排故的時候需要耐心,先跑通整個流程

          參考資料

          [1]

          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?讓我們一起成長

          點贊和在看就是最大的支持??

          瀏覽 69
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产视频一区二区三区四区 | 91亚洲国产精品 | 99爱视频精品在线观看 | 久爱avcn | 日韩色妇|