<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>

          純 Git 實(shí)現(xiàn)前端 CI/CD

          共 4176字,需瀏覽 9分鐘

           ·

          2021-11-05 14:49

          作者:楊成功

          來源:SegmentFault 思否社區(qū)


          最近要高效的把前端 react 項(xiàng)目部署到私有服務(wù)器上,研究了好幾種持續(xù)部署方案,這里簡單描述一下。

          總的部署思路分兩種:

          • 編譯后的文件部署
          • 源碼部署
          編譯后的文件部署,就是先在本地進(jìn)行npm run build打包,生成 build 文件夾,然后將 build 文件夾傳到服務(wù)器,再用 Nginx 配置一個(gè)靜態(tài)解析即可。
          這種方案用 rsync 直接上傳就可以,這里不贅述。
          源碼部署就是把源文件上傳到服務(wù)器上,然后:
          $ npm install && npm run build

          這種方式是將打包工作交給服務(wù)器(或其他構(gòu)建工具),本地只是將源代碼 push 上去,git 監(jiān)聽到推送然后自動(dòng)開始構(gòu)建。這是現(xiàn)在流行的方式,大多數(shù)持續(xù)集成工具都是這么干的。
          今天的重頭戲來了!我們不借助其他構(gòu)建工具,只用純 Git 實(shí)現(xiàn)監(jiān)聽 push 并自動(dòng)構(gòu)建。相信我,這一步非常有趣~

          服務(wù)端

          首先準(zhǔn)備一臺(tái)服務(wù)器,安裝好 node git nginx,開始動(dòng)手。
          服務(wù)器信息如下:
          host:198.234.456.8(假的)
          項(xiàng)目目錄:/home/react-test

          創(chuàng)建裸倉庫

          登入服務(wù)器,在服務(wù)器的 /opt 目錄下創(chuàng)建一個(gè)裸倉庫
          什么是裸倉庫?裸倉庫就是沒有工作目錄的倉庫,說白了就是你的項(xiàng)目目錄下的 .git 文件夾
          執(zhí)行命令創(chuàng)建:
          cd /opt
          $ git init --bare react-test.git

          創(chuàng)建好后,會(huì)生成 react-test.git 文件夾,所以我們的裸倉庫位置是 /opt/react-test.git,記住這里后面會(huì)用到。
          接下來,進(jìn)入 react-test.git 文件夾,發(fā)現(xiàn)里面有個(gè) hook 文件夾。這個(gè)文件夾可不得了,是放 Git “鉤子” 的地方。
          所謂“鉤子”,其實(shí)就是一個(gè) shell 文件。在執(zhí)行 git 操作(如:push,pull)時(shí)觸發(fā)執(zhí)行。
          現(xiàn)在我們創(chuàng)建一個(gè)鉤子。

          添加 push 鉤子

          在 hook 目錄下新建 post-receive 文件,這個(gè)鉤子文件會(huì)在代碼 push 到這個(gè)裸倉庫后執(zhí)行,這里是本文最重要的重點(diǎn)。
          cd /opt/react-test.git/hook
          $ vim post-receive

          post-receive 的具體內(nèi)容如下:
          #!/bin/bash
          echo 'server: received code push...'
          cd /home/react-test

          echo 'server: checkout latest code from git...'

          git --git-dir=/opt/react-test.git --work-tree=/home/react-test checkout -f release

          echo 'server: running npm install...'

          npm install \
          && echo 'server: buildding...' \
          && npm run build \
          && echo 'server: done...'

          這個(gè)腳本最重要的就一條命令:
          git --git-dir=/opt/react-test.git --work-tree=/home/react-test checkout -f release

          什么意思呢?首先說下我們平時(shí)怎么用 git。
          一般我們是在項(xiàng)目目錄下用 git init 初始化 git 倉庫。執(zhí)行的 add,commit 等操作,默認(rèn)就是與這個(gè)倉庫交換文件。
          這里有兩個(gè)重要概念:項(xiàng)目目錄 和 git 倉庫。項(xiàng)目目錄就是 package.json 文件所在的目錄,我們的代碼放在這里。git 倉庫是項(xiàng)目目錄下的 .git 文件夾,它是個(gè)隱藏目錄,在 npm init 時(shí)自動(dòng)生成。
          那么,有沒有辦法在當(dāng)前項(xiàng)目目錄下,使用其它目錄的 git 倉庫呢
          是可以的,--git-dir 參數(shù)就允許你指定一個(gè)其他的 git 倉庫。
          比如說,我要將 /home/react-test 下修改的文件添加到暫存區(qū):
          # 默認(rèn)加到 /home/react-test/.git
          $ git add .
          # 加到 /home/git-test/.git
          $ git --git-dir /home/git-test/.git add .

          既然項(xiàng)目目錄可以指定其它的 git 倉庫,那么 git 倉庫可不可以指定其它的項(xiàng)目目錄呢?
          當(dāng)然也可以,--work-tree參數(shù)就允許你指定其他的項(xiàng)目目錄。
          比如說,我要在 /home/react-test 下檢出分支:
          # 默認(rèn)從 /home/react-test/.git 檢出
          $ git checkout dev-test
          # 從 /home/git-test/.git 檢出
          $ git --work-tree /home/git-test/.git checkout dev-test

          神奇吧,哈哈。這樣就把項(xiàng)目和倉庫分開了。
          理解到這,再看上面那條命令的意思:將 /opt/react-test.git 這個(gè) git 倉庫的 release 分支,檢出(checkout)到項(xiàng)目目錄 /home/react-test,從而更新了項(xiàng)目目錄的代碼。
          檢出新代碼之后,運(yùn)行打包命令,更新部署文件夾,這樣部署就實(shí)現(xiàn)了。

          nginx 解析

          上一部,部署完成,并打包了 build 文件夾。這個(gè)文件夾就是要部署的文件夾。
          最后一步,則是配置一個(gè)域名,解析到這個(gè)文件夾。
          cd /etc/nginx/conf.d
          $ vim react-test.conf

          在 react-test.conf 文件中寫上如下配置:
          server {
              listen 80;
              server_name yourhost; # 如 www.baidu.com
              root /home/react-test/build; # 指向打包后的目錄

              location / {
                  index index.html;
              }
          }

          保存并退出后,nginx -s reload,這樣解析就配好了!
          至此,服務(wù)器端的打包,部署,解析流程就全部完成了。下面就是接受本地代碼的推送,然后自動(dòng)觸發(fā)這個(gè)流程。

          客戶端

          前面在服務(wù)器建好了 git 裸倉庫 react-test.git,回到客戶端只需要做一件事:將代碼推到這個(gè)裸倉庫。

          推送代碼

          第一步,我們先在本地項(xiàng)目下,將這個(gè)裸倉庫添加為遠(yuǎn)程倉庫。
          $ git remote add prod ssh://[email protected]/opt/react-test.git

          第二步,我們直接將代碼推送到這個(gè)遠(yuǎn)程倉庫:
          $ git checkout -b release
          $ git push prod release

          這里必須要切換到 release 分支再推送。因?yàn)樵谶h(yuǎn)程倉庫鉤子中,我們定義的是檢出 release 分支,所以要推送的是 release 分支。
          這里可能會(huì)要求你輸入服務(wù)器密碼,可以配置 ssh免密登錄 來直接推送,這里不介紹。
          推送后,會(huì)在控制臺(tái)看到我們在 post-receive 中寫好的輸出。當(dāng)推送完成,查看服務(wù)器下的 /home/react-test 目錄,會(huì)看到源文件和打包后的 build 文件
          到這里,CI/CD 工作已經(jīng)全部完成。
          后續(xù)的持續(xù)部署工作,只需要 push 一下即可。


          點(diǎn)擊左下角閱讀原文,到 SegmentFault 思否社區(qū) 和文章作者展開更多互動(dòng)和交流,掃描下方”二維碼“或在“公眾號(hào)后臺(tái)回復(fù)“ 入群 ”即可加入我們的技術(shù)交流群,收獲更多的技術(shù)文章~

          - END -


          瀏覽 62
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  欧美黄色免费网站 | 操泥马网 | 欧美videos办公室丝袜长腿 | 欧美亚洲及日本黄色电影 | 麻豆九色 |