將本地開發(fā)的Node.js應(yīng)用一鍵部署到服務(wù)器


我的所有文章會(huì)在我的個(gè)人博客首發(fā)和更新,歡迎使用微博與我交流,一起探討技術(shù)問題。

在開發(fā)過程中,修改完代碼后部署到服務(wù)器是一件頭疼的事,每一次部署都要上傳代碼,重啟程序,這個(gè)過程最少也需要3分鐘的時(shí)間,作為程序員,怎么能把時(shí)間浪費(fèi)在這種重復(fù)操作上呢,我們可以通過一些現(xiàn)有工具的配合,實(shí)現(xiàn)碼的自動(dòng)部署,這篇文章的最終實(shí)現(xiàn)效果是將本地中修改完的nodejs代碼一鍵運(yùn)行在服務(wù)器端,其它語言同理,只是使用到的工具會(huì)有所不同。
一、準(zhǔn)備工作:安裝node.js和git
  我更喜歡用nvm來管理nodejs的版本,nvm需要高版本git支持,而centos yum源里的git版本太低,所以我們要先編譯安裝新版本的git,關(guān)于如何安裝,可以看下面這篇文章:
安裝新版本git: https://segmentfault.com/a/1190000007134786
1.安裝nvm

yum install curl-devel   #確保curl-devel已經(jīng)安裝
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh | bash #執(zhí)行完后退出終端重新進(jìn)入
nvm --version #可以看到nvm版本```
如果執(zhí)行curl安裝nvm的過程中出現(xiàn)如下錯(cuò)誤:fatal: Unable to find remote helper for 'https',是因?yàn)橄到y(tǒng)找不到git-remote-https,修改下PATH就好了。

2.修改PATH:

vi ~/.bash_profile PATH=$PATH:/usr/libexec/git-core #在PATH里添加這一行source ~/.bash_profile```
3.使用nvm安裝指定版本nodejs

nvm ls-remote #查看可安裝版本
nvm install v6.2.0 #安裝一個(gè)較為穩(wěn)定的版本
nvm ls #查看已經(jīng)安裝的版本nvm use v4.6.0 #切換版本
nvm alias default v6.2.0 #設(shè)置默認(rèn)版本node --version ```
二、使用git自動(dòng)部署代碼
接下來我們使用最為優(yōu)秀的版本控制工具git來同步我在本地和服務(wù)器上的代碼。
*先梳理一下大致流程:*
* 首先在服務(wù)器端創(chuàng)建一個(gè)文件夾,使用初始化指令使其成為git的中心倉庫。

* 然后在本地電腦新建的項(xiàng)目文件夾中clong上一步在服務(wù)器中建立的中心倉庫。

* 在服務(wù)器中新建一個(gè)要部署代碼的目錄,并clone中心倉庫。

* 修改服務(wù)器中心倉庫中的hook文件,實(shí)現(xiàn)本地電腦push代碼后,自動(dòng)部署到上一步建立的代碼目錄。

*下面是每一步的具體操作:*

1、在服務(wù)器中初始化git中心倉庫

mkdir /gitRepo #新建一個(gè)文件夾作為倉庫
cd /gitRepogit init --bare project.git #初始化一個(gè)名為progect的倉庫
cd project.git #可以看到新倉庫中的各個(gè)文件```
  執(zhí)行完以上步驟,會(huì)在 /gitRepo 文件夾中創(chuàng)建一個(gè)名為project的裸庫,這個(gè)倉庫就是之后在客戶端的目標(biāo)倉庫
2、在本地電腦克隆遠(yuǎn)程倉庫
要在本地連接到倉庫首先需要將本地機(jī)器的公鑰復(fù)制給服務(wù)器

ssh-keygen -t rsa #如果本地還沒有生成公鑰和秘鑰,使用此命令生成
cat .ssh/id_rsa.pub #查看生成的公鑰,將此公鑰復(fù)制到服務(wù)器的 ~/.ssh/authorized_keys 文件末尾
git clone 用戶名@服務(wù)器地址:/gitRepo/project.git #在當(dāng)前目錄克隆倉庫```
3、在服務(wù)器中配置代碼自動(dòng)部署

git clong /gitRepo/project.git #在要部署代碼的文件夾里克隆倉庫
cp post-receive-sample post-receive #拷貝一份示例文件post-receivevi為post-receive

在文件中加入以下指令

#!/bin/sh   unset GIT_DIR   

cd 項(xiàng)目路徑 #就是進(jìn)入剛才做克隆操作時(shí)的文件夾
git pull #執(zhí)行拉取指令
chmod 775 post-receive #最后一定要將此文件的權(quán)限改為可執(zhí)行

  執(zhí)行完所有步驟之后,每次在本地電腦中提交代碼到中心倉庫,git便會(huì)自動(dòng)將最新的代碼pull到服務(wù)器中的代碼目錄。

`附:git常用命令`

git add . #添加所有文件到git索引
git commit -m "" #提交索引到的文件到緩沖區(qū)
git push origin master #客戶端第一次提交時(shí)需要使用此命令提交到遠(yuǎn)程master分支
git push #提交緩沖區(qū)中的文件
git rm <filename> #在git索引中移除文件git rm -r . #在索引中移除所有文件```
三、node程序自動(dòng)運(yùn)行
  現(xiàn)在通過git提交的代碼可以自動(dòng)部署到服務(wù)器的代碼目錄了,接下來通過使用pm2,在代碼變更后讓程序自動(dòng)重啟。

npm install -g pm2 #服務(wù)器中全局安裝pm2
pm2 start helloworld.js #使用pm2啟動(dòng)nodejs程序

四、編寫push腳本,一鍵將本地程序運(yùn)行在服務(wù)器
現(xiàn)在每次使用git提交代碼后,服務(wù)器會(huì)自動(dòng)部署代碼并重啟程序,已經(jīng)不需要我們?cè)賹?duì)服務(wù)器做任何操作了,是不是已經(jīng)簡化了百分之七十的工作量了?但是我們的目標(biāo)不僅于此,畢竟每次push還需要三條指令呢,作為新時(shí)代的程序員,能讓電腦做的決不自己去做。所以我們要通過一個(gè)腳本,在每次更改完代碼之后一鍵把本地的代碼運(yùn)行在服務(wù)器上。

# 以下為shell腳本,在mac上可以原生執(zhí)行,使用Windows的同學(xué)可以自行搜索bat腳本寫法,類推一下。
touch push.sh #在本地的代碼目錄新建一個(gè)腳本文件。
chmod +x push.sh #設(shè)置腳本權(quán)限為可執(zhí)行
vim push.sh #打開腳本,并寫入以下命令   
    git add ./   
    read commitMessage    
    git commit -m commitMessage    
    git push   echo Wow! 代碼一鍵部署完成!

** 最后,激動(dòng)人心的時(shí)刻到了,以后每次修改完代碼,執(zhí)行這個(gè)命令:./push.sh,然后輸入提交信息,好了,你的代碼已經(jīng)在服務(wù)器上飛起來了!**

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,973評(píng)論 19 139
  • 本文參考了四弦同學(xué)的文章:在Linux服務(wù)器上搭建Hexo:OS X、Windows與Linux本地環(huán)境,講解得非...
    野狗子嗷嗷嗷閱讀 11,649評(píng)論 3 18
  • Swift版本點(diǎn)擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 25,566評(píng)論 7 249
  • 初識(shí)不知曲中意,再聽已是曲中人
    知白守黑IW閱讀 158評(píng)論 0 0
  • 有一次暑假在家燒到41度 但是我沒有很害怕 爸叫我穿個(gè)長袖外套就開車載我去看醫(yī)生 給我貼退燒貼還一直夸我額頭高、 ...
    小小君閱讀 248評(píng)論 0 0