我的所有文章會在我的個人博客首發(fā)和更新,歡迎使用微博與我交流,一起探討技術問題。
在開發(fā)過程中,修改完代碼后部署到服務器是一件頭疼的事,每一次部署都要上傳代碼,重啟程序,這個過程最少也需要3分鐘的時間,作為程序員,怎么能把時間浪費在這種重復操作上呢,我們可以通過一些現(xiàn)有工具的配合,實現(xiàn)碼的自動部署,這篇文章的最終實現(xiàn)效果是將本地中修改完的nodejs代碼一鍵運行在服務器端,其它語言同理,只是使用到的工具會有所不同。
一、準備工作:安裝node.js和git
我更喜歡用nvm來管理nodejs的版本,nvm需要高版本git支持,而centos yum源里的git版本太低,所以我們要先編譯安裝新版本的git,關于如何安裝,可以看下面這篇文章:
安裝新版本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í)行完后退出終端重新進入
nvm --version #可以看到nvm版本```
如果執(zhí)行curl安裝nvm的過程中出現(xiàn)如下錯誤:fatal: Unable to find remote helper for 'https',是因為系統(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 #安裝一個較為穩(wěn)定的版本
nvm ls #查看已經(jīng)安裝的版本nvm use v4.6.0 #切換版本
nvm alias default v6.2.0 #設置默認版本node --version ```
二、使用git自動部署代碼
接下來我們使用最為優(yōu)秀的版本控制工具git來同步我在本地和服務器上的代碼。
*先梳理一下大致流程:*
* 首先在服務器端創(chuàng)建一個文件夾,使用初始化指令使其成為git的中心倉庫。
* 然后在本地電腦新建的項目文件夾中clong上一步在服務器中建立的中心倉庫。
* 在服務器中新建一個要部署代碼的目錄,并clone中心倉庫。
* 修改服務器中心倉庫中的hook文件,實現(xiàn)本地電腦push代碼后,自動部署到上一步建立的代碼目錄。
*下面是每一步的具體操作:*
1、在服務器中初始化git中心倉庫
mkdir /gitRepo #新建一個文件夾作為倉庫
cd /gitRepogit init --bare project.git #初始化一個名為progect的倉庫
cd project.git #可以看到新倉庫中的各個文件```
執(zhí)行完以上步驟,會在 /gitRepo 文件夾中創(chuàng)建一個名為project的裸庫,這個倉庫就是之后在客戶端的目標倉庫
2、在本地電腦克隆遠程倉庫
要在本地連接到倉庫首先需要將本地機器的公鑰復制給服務器
ssh-keygen -t rsa #如果本地還沒有生成公鑰和秘鑰,使用此命令生成
cat .ssh/id_rsa.pub #查看生成的公鑰,將此公鑰復制到服務器的 ~/.ssh/authorized_keys 文件末尾
git clone 用戶名@服務器地址:/gitRepo/project.git #在當前目錄克隆倉庫```
3、在服務器中配置代碼自動部署
git clong /gitRepo/project.git #在要部署代碼的文件夾里克隆倉庫
cp post-receive-sample post-receive #拷貝一份示例文件post-receivevi為post-receive
在文件中加入以下指令
#!/bin/sh unset GIT_DIR
cd 項目路徑 #就是進入剛才做克隆操作時的文件夾
git pull #執(zhí)行拉取指令
chmod 775 post-receive #最后一定要將此文件的權(quán)限改為可執(zhí)行
執(zhí)行完所有步驟之后,每次在本地電腦中提交代碼到中心倉庫,git便會自動將最新的代碼pull到服務器中的代碼目錄。
`附:git常用命令`
git add . #添加所有文件到git索引
git commit -m "" #提交索引到的文件到緩沖區(qū)
git push origin master #客戶端第一次提交時需要使用此命令提交到遠程master分支
git push #提交緩沖區(qū)中的文件
git rm <filename> #在git索引中移除文件git rm -r . #在索引中移除所有文件```
三、node程序自動運行
現(xiàn)在通過git提交的代碼可以自動部署到服務器的代碼目錄了,接下來通過使用pm2,在代碼變更后讓程序自動重啟。
npm install -g pm2 #服務器中全局安裝pm2
pm2 start helloworld.js #使用pm2啟動nodejs程序
四、編寫push腳本,一鍵將本地程序運行在服務器
現(xiàn)在每次使用git提交代碼后,服務器會自動部署代碼并重啟程序,已經(jīng)不需要我們再對服務器做任何操作了,是不是已經(jīng)簡化了百分之七十的工作量了?但是我們的目標不僅于此,畢竟每次push還需要三條指令呢,作為新時代的程序員,能讓電腦做的決不自己去做。所以我們要通過一個腳本,在每次更改完代碼之后一鍵把本地的代碼運行在服務器上。
# 以下為shell腳本,在mac上可以原生執(zhí)行,使用Windows的同學可以自行搜索bat腳本寫法,類推一下。
touch push.sh #在本地的代碼目錄新建一個腳本文件。
chmod +x push.sh #設置腳本權(quán)限為可執(zhí)行
vim push.sh #打開腳本,并寫入以下命令
git add ./
read commitMessage
git commit -m commitMessage
git push echo Wow! 代碼一鍵部署完成!
** 最后,激動人心的時刻到了,以后每次修改完代碼,執(zhí)行這個命令:./push.sh,然后輸入提交信息,好了,你的代碼已經(jīng)在服務器上飛起來了!**