爲何要實現自動部署?javascript
在2個月的時間裏,一直都在忙着整理博客,每個程序員都有一個博客夢(固然也不排除有些是沒有的),我前後使用過各類博客系統:
php
這些都由於前先後後的緣由,我沒有采用,而是本身寫了一個博客系統:vue-blog-generater【請容許我再求一波star】點擊這裏查看說明文檔html
爲何呢?由於我須要一個本身對其高度熟悉的系統,這樣有什麼問題,我都知道問題出在哪,由於以前的這些系統,固然很好,可是不管是主題的編輯,仍是代碼的部署以及自定義,這些都不能知足個人要求。vue
話說回來,當我實現好了基礎功能和頁面以後,我開心了好一下子,而後把一些還有意義的博文轉移過來,這就涉及到了發佈和部署。java
咱們都知道一個vue-cli
生成的項目,一般打包的目錄都是dist
,那麼我實際上須要掛載到服務器上的代碼就是這個dist
中的代碼。node
那按照常理,整個文章的更新流程應該是這樣:
react
markdown
博文npm run build
編譯到dist
dist
的文件上傳到對應的代碼倉庫dist
main
git clone dist倉庫
到指定的位置看到了吧,只是更新一篇文章,卻須要這麼多步驟,是否是以爲很麻煩呢?麻煩就對了,在這裏咱們就是來解決這個麻煩的。nginx
我明白了爲何要作自動部署,可是我從哪下手呢?git
作一件事情以前,咱們要理清楚思路,有哪些步驟呢?其實很是簡單:程序員
markdown
博文【這一步是跑不掉的】npm run build
編譯到dist
,執行build.js
中判斷config.js
中是否配置了dist
的遠程倉庫地址。dist
目錄,進行git
初始化,同時將總體代碼上傳到Main倉庫
這裏默認不配置,Main
倉庫至關於本地倉庫關聯的遠程倉庫dist
目錄關聯遠程倉庫,並把代碼推送到指定的dist
對應的遠程倉庫中。POST
請求時,作出對應的響應:拉取遠程dist
倉庫的master
分支而且強制覆蓋本地的master
分支咱們先來看看在第2,3個所說的內容怎麼實現。
shell
幫助咱們在nodejs中執行命令 chalk
豐富打印信息//安裝shell
yarn add shell --save
yarn add chalk --save
複製代碼
build.js
中設計一個函數autoUpdate
,來幫助咱們提交main
倉庫和咱們的dist
倉庫的更新,咱們先實現更新main
倉庫:請注意:這裏須要使用await確保代碼的執行順序const config = require('../config')
const shell = require('shelljs')
async function autoUpdate() {
console.log(chalk.cyan(
`Start to upload whole project to coding.net`
))
if (!shell.which('git')) {
//向命令行打印git命令不可用的提示信息
shell.echo('Sorry, this script requires git');
//退出當前進程
shell.exit(1);
}
// 推送當前目錄[main 目錄]的代碼
await shell.exec('git add .')
await shell.exec(`git commit -m '${config.commitMessage}'`).code
await shell.exec('git push origin master -f');
console.log(chalk.green(
`main dir-> succeed`
))
}
複製代碼
@/config/index.js
中配置 dist遠程倉庫 相關的屬性的值module.exports = {
...
distOriginSSh: 'git@github.com:xxx/xxx-blog-xxx.git',
...
}
複製代碼
autoUpdate
中添加提交dist
倉庫的更新的代碼:請注意:這裏須要使用await確保代碼的執行順序//進入到dist目錄下
await shell.cd('dist');
//執行 git init
await shell.exec(config.initLocal)
//刪除本地的dist已經對應的遠程倉庫
await shell.exec(config.deleteRemote)
//添加目標遠程倉庫到dist
await shell.exec(`git remote add origin '${config.distOriginSSh}'`)
//提交
await shell.exec('git add .')
let code = await shell.exec(`git commit -m '${config.commitMessage}'`).code
if (code !== 0) {
await shell.echo('Error: Git commit failed');
await shell.exit(code);
} else {
await shell.exec('git push origin master -f');
//chalk 這個庫是爲了豐富打印信息的
console.log(chalk.green(
`dist-> succeed`
))
}
複製代碼
實現了本地上傳到遠程倉庫,那麼接下來咱們須要去作幾件事,來實現步驟4:
這裏默認你已經在服務器上完成了對dist代碼的部署
POST
的請求,若是肯定這個請求是通知咱們須要更新服務器上對應dist
目錄對應的源碼的話,執行對應的git
命令來更新。hooks
,在監聽到咱們的push
請求時,就會自動POST
一個請求到咱們配置的hooks
對應的地址中。這個地址也就是咱們在服務器上啓動的服務地址。Okay,知道了要作什麼,那咱們就開始吧。首先在服務器上啓動一個node server
,咱們新建一個server.js
,而且進入到編輯狀態
touch server.js
//若是你安裝了vim
vim server.js
//若是沒有安裝vim,能夠用vi
vi server.js
//進入文件後,咱們能夠按a健進入 insert狀態
複製代碼
能夠參考個人server.js
進行配置 請注意,須要你本身配置端口和路徑,我已經去除了我本身的配置
var http = require('http')
, exec = require('exec')
// 配製你的端口號
const PORT = XXX
, PATH = './xxx'
//PATH:你的dist目錄的路徑,相對於server.js所在的目錄而言。
var deployServer = http.createServer(function(request, response) {
if (request.url.search(/deploy\/?$/i) > 0) {
var commands = [
'cd ' + PATH,
'git fetch --all',
'git reset --hard origin/master',
'git pull'
].join(' && ')
exec(commands, function(err, out, code) {
if (err instanceof Error) {
response.writeHead(500)
response.end('Server Internal Error.')
throw err
}
process.stderr.write(err)
process.stdout.write(out)
response.writeHead(200)
response.end('Deploy Done.')
})
} else {
response.writeHead(404)
複製代碼
編輯完成後,而後咱們先按下esc
而後輸入:wq!
保存文件。而後node server.js
啓動一個服務。可是你又會發現,node server.js
這樣啓動的服務會在一段時間後自動中止,因此咱們須要來用一個守護進程的工具來守護咱們的服務,推薦你們使用forever
#安裝
npm install forever -g
#啓動
forever server.js
複製代碼
尚未結束,咱們還須要在nginx
配置文件中設置一個代理,將對應子域名代理到咱們剛剛配置的端口上。這樣作的緣由是由於我只有一個域名···
你可能會問什麼是子域名,好比我有一個一級域名dendoink.com
那麼我能夠在解析的時候多添加一條新記錄xxx.dendoink.com
,這個就是子域名,他一樣能夠訪問到咱們域名對應的服務器。
若是你使用的也是nginx來管理服務,那能夠參考我下面的配置
server {
listen 80;
# 配置你的子域名
server_name xxx.你的域名.com;
#charset koi8-r;
access_log /var/log/nginx/githook.dendoink.com.access.log main;
# 這裏是重點
location / {
proxy_pass http://127.0.0.1:1024;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
複製代碼
這樣配置好之後咱們就能夠經過外部訪問到咱們定義好的服務啦。只須要把這個地址加入到對應的githook的配置中【具體的hook配置參考你的託管平臺教程】。
是否是很簡單呢?有任何問題能夠掘金和我聯繫,或者郵件 dendise7en@gmail.com
另外求一波關注和star -> 看這裏,最美博客系統~
另外求一波關注和star -> 看這裏,最美博客系統~
另外求一波關注和star -> 看這裏,最美博客系統~
特別聲明:題圖來源unsplash