gulp自动化部署:gulp发布express项目(二)
原文:https://my.oschina.net/songzhu/blog/610337
一、服务器准备
服务器ip地址为:172.16.70.174
1.安装 Node.js
参考:http://my.oschina.net/songzhu/blog/608129
2.安装 PM2
PM2 是一个带有负载均衡功能的 Node 应用的进程管理器。
全局安装 PM2
$ npm install pm2 -g
$ pm2 list
[PM2] Spawning PM2 daemon
[PM2] PM2 Successfully daemonized
┌──────────┬────┬──────┬─────┬────────┬─────────┬────────┬────────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ memory │ watching │
└──────────┴────┴──────┴─────┴────────┴─────────┴────────┴────────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app
安装 PM2 如果出现错误,大概是网络和权限问题导致的。仔细看一下错误提示,如果是网络问题,那么多重试几次应该就可以了。
3.准备发布目录
/home/admin/publish/web/express-demo
$ cd ~
$ mkdir publish && cd publish
$ mkdir web && cd web
$ mkdir express-demo && cd express-demo
$ pwd
/home/admin/publish/web/express-demo
二、创建 PM2 启动脚本
进入 express-demo 目录,添加文件 pm2-start.json
$ touch pm2-start.json
添加以下内容:
[
{
"name" : "express-demo",
"script" : "./app.js",
"watch" : false,
"instances" : "",
"exec_mode" : "cluster_mode",
"env": {
"NODE_ENV": "production"
},
"out_file": "./logs/app.log",
"error_file": "./logs/err.log",
}
]
通过 pm2 start pm2-start.json,可启动 express-demo。
更详细的配置:http://pm2.keymetrics.io/docs/usage/application-declaration/
三、创建 Gulp 任务
Gulp 用自动化构建工具增强你的工作流程。
1.全局安装 gulp
$ npm install gulp -g
$ gulp -v
[::] CLI version 3.9.
2.作为项目的开发依赖安装 gulp
$ npm install --save-dev gulp
$ gulp -v
[::] CLI version 3.9.
[::] Local version 3.9.
3.在项目根目录创建 gulpfile.js
$ touch gulpfile.js
$ gulp
[::] Using gulpfile ~/demos/express-demo/gulpfile.js
[::] Task 'default' is not in your gulpfile
[::] Please check the documentation for proper gulpfile formatting
看到错误是因为我没还没有在 gulpfile.js里面添加内容
4.添加 gulp 部署依赖
$ npm install --save-dev gulp-util gulp-shell gulp-ssh gulp-zip through2 scp2 async progress
5.在项目根目录创建 deploy-ssh.js
$ touch deploy-ssh.js
添加以下内容:
var gulp = require('gulp');
var gutil = require('gulp-util');
var through = require('through2');
var ScpClient = require('scp2').Client;
var ssh = require('gulp-ssh');
var async = require('async');
var ProgressBar = require('progress');
const PLUGIN_NAME = 'deploy-ssh'
module.exports = function (options) {
var servers = options.servers;
var dest = options.dest;
var shell = options.shell;
var logPath = options.logPath;
return through.obj(function (file, enc, callback) {
if (file.isNull()) {
callback(null, file);
return;
}
if (file.isStream()) {
return callback(new gutil.PluginError(PLUGIN_NAME, 'No stream support'));
}
var i = ;
async.eachSeries(servers, function(server, done) {
var hostName = server.sshConfig.host;
gutil.log(PLUGIN_NAME, "start deploy:" + hostName)
var client = new ScpClient(server.sshConfig);
var bar = null;
client.on("transfer", function(buffer, uploaded, total){
if(bar == null){
bar = new ProgressBar(hostName + ' uploading [:bar] :percent :elapsed s', {
complete: '=',
incomplete: ' ',
width: ,
total: total
});
}
bar.tick();
});
client.write({
destination: dest,
content: file.contents
}, function () {
ssh(server).shell(shell, {filePath: logPath + "-" + hostName + ".log", autoExit: true}).on('error', function (err) {
done(err);
gutil.PluginError(PLUGIN_NAME, err)
}).on('finish', function () {
gutil.log(PLUGIN_NAME, "finish deploy:" + hostName);
done();
if (++i === servers.length) {
callback(null, file);
}
}).pipe(gulp.dest('logs'));
});
});
});
};
deploy-ssh 主要用于上传发布包至服务器并登录服务器之行发布脚本。
6.在项目根目录创建 deploy-config.js
$ touch deploy-config.js
添加以下内容:
var config = {
production:{
servers:[
{
sshConfig: {
host: '172.16.70.174',
port: ,
username: 'admin',
password: 'cavin@123',
readyTimeout:
}
}]
}
};
module.exports = config;
deploy-config 主要用于配置deploy服务器信息。
7.修改 gulpfile.js
添加以下内容:
var gulp = require('gulp');
var shell = require('gulp-shell');
var ssh = require('gulp-ssh');
var deployConfig = require("./deploy-config");
var gulpSequence = require('gulp-sequence');
var zip = require('gulp-zip');
var through = require('through2');
var async = require('async');
var scpClient = require('scp2');
var gulpUtil = require('gulp-util');
var deploySSH = require('./deploy-ssh');
const PLUGIN_NAME = 'gulp-deploy ::'
gulp.task('default', shell.task([
'DEBUG=express-demo:* npm start'
]));
gulp.task('production', function (){
shell.task(['rm -rf dist']);
gulpSequence('copyFile', 'zipFile', 'deploy', function() {
gulpUtil.log(PLUGIN_NAME, "***** Deploy Finished!!!!");
process.exit();
});
});
gulp.task('copyFile', function() {
return gulp.src(
[
'*.json',
'*.js',
'routes/**',
'views/**',
'public/**',
'!config.js'
], { base: './'})
.pipe(gulp.dest('./dist'));
});
gulp.task('zipFile', function() {
return gulp.src(['dist/**'], { base: './' })
.pipe(zip('publish.zip'))
.pipe(gulp.dest('./dist'));
});
gulp.task('deploy', function() {
var config = deployConfig.production;
config.deployPath = '/home/admin/publish/web/express-demo/';
return gulp.src("dist/publish.zip", { base: './' })
.pipe(deploySSH({
servers: config.servers,
dest: config.deployPath + 'publish.zip',
logPath: 'deploy',
shell:[ 'cd ' + config.deployPath,
'shopt -s extglob',
'rm -rf !(logs|node_modules|config.js|publish.zip)',
'unzip -o publish.zip',
'cp -rf dist/** .',
'rm -rf dist',
"rm publish.zip",
'npm install --production',
'pm2 startOrRestart pm2-start.json'],
}));
});
主要 gulp 任务流程为:
1)拷贝文档至临时目录
2)压缩文件
3)发布(先上发布包,然后远程登录服务器之行发布脚本)
注:发布目录 '/home/admin/publish/web/express-demo/' 一定要存在,否则scp上传文件时会出错。
四、一键部署 express-demo
执行发布任务
$ gulp production
如果没有错误,登录服务器上面可以看到:
$ pm2 list
┌──────────────┬────┬─────────┬──────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ memory │ watching │
├──────────────┼────┼─────────┼──────┼────────┼─────────┼────────┼─────────────┼──────────┤
│ express-demo │ │ cluster │ │ online │ │ 102s │ 30.117 MB │ disabled │
│ express-demo │ │ cluster │ │ online │ │ 102s │ 30.133 MB │ disabled │
│ express-demo │ │ cluster │ │ online │ │ 102s │ 30.109 MB │ disabled │
│ express-demo │ │ cluster │ │ online │ │ 102s │ 30.363 MB │ disabled │
└──────────────┴────┴─────────┴──────┴────────┴─────────┴────────┴─────────────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app
在浏览器里面输入:http://172.16.70.174:3000/
项目代码:https://git.oschina.net/cavintang/express-demo.git
gulp自动化部署:gulp发布express项目(二)的更多相关文章
- Linux、Debian、Jenkins、GIT、Nginx、码云安装,自动化部署前后端分离项目
1.安装Jenkins i:下载Jenkins安装包(war文件):https://jenkins.io/download/ ii:这里采用Tomcat的war包方式安装,讲下载好的安装包放到Tomc ...
- jenkins之自动化部署github上maven项目
部署流程:将代码从github上拉取下来,使用maven打包,将打包后的jar通过ssh发送到服务器上,然后构建docker镜像,运行容器. 1.安装插件 如果是第一次使用jenkins,需要检查并确 ...
- 从零实现Linux一键自动化部署.netCore+Vue+Nginx项目到Docker中
环境搭建 1.安装Linux,这里我用的阿里云服务器,CentOS7版本 2.进入Linux,安装Docker,执行以下命令 sudo yum update #更新一下yum包 sudo yum in ...
- Team Services 自动化部署项目
一.创建Team Services账号 直接使用vs的账号即可,TS上集成了Git.把项目导入到Git中. 使用前提:有自己的服务器,把项目自动化部署到服务器上. 二.创建一个新的定义 三.选择种类( ...
- Linux(四)—— 项目部署与ansible自动化部署
目录 项目部署与ansible自动化部署 一.项目部署 二.ansible自动化部署(python自动化运维) 1.安装ansible 2.ansible例子 3.ansible自动化部署nginx ...
- 自动化部署--Jenkins
自动化部署--Jenkins--简介安装(一) https://www.jianshu.com/p/b9ce206139f1 自动化部署--Jenkins--Maven构建(二) https://w ...
- 使用GitHub Actions实现自动化部署
前言 大家在工作中想必都是通过自动化部署来进行前端项目的部署的,也就是我们在开发完某个需求时,我们只需要将代码推送到某个分支,然后就能自动完成部署,我们一般不用关心项目是如何build以及如何depl ...
- 利用Gulp优化部署Web项目[长文慎入]
Gulp Gulp是一款项目自动化的构建工具,与Grunt一样可以通过创建任务(Task)来帮助我们自动完成一些工作流的内容.当然,今天我们的内容并不是讨论这二者的区别,仅仅是介绍介绍如何利用Gulp ...
- Gulp 自动化的项目构建工具
在很多场合都会听到前端工和 node 程师推荐 Grunt 来实现项目的自动化,自动化可以自动完成 javascript/coffee/sass/less 等文件的的测试.检查.合并.压缩.格式化.部 ...
随机推荐
- MVC的简单初步学习(2)
今天似乎一切是正常的,我们的课依旧在进行着,但是恍惚脑海中并没有那样的平静,不知道在想些什么?而且今天是学习MVC的初步开始,我应该认真地学习才是正确的啊.但是我并不糊涂,今天是周一,也就是刚开始上课 ...
- webform的学习(2)
突然回想一下,两周之后放假回家,三周之后重返学习,四周之后就要真正的面对社会,就这样有好多的舍不得在脑海中回旋,但是又是兴奋的想快点拥有自己的小生活,似乎太多的人在说程序的道路甚是艰难,我不知道我的选 ...
- 在PowerDesigner中自动生成sqlserver字段备注
在PowerDesigner中自动生成sqlserver字段备注 PowerDesigner是数据库设计人员常用的设计工具,但其自生默认生成的代码并不会生成sqlserver数据库的字段备注说明.在生 ...
- shell编程(一)
迷迷糊糊中发现了一个学习shell的非常好的教程,从头到尾看了一下,等看完全忘记了,没办法只能记录下来,教程网址http://c.biancheng.net/cpp/view/6994.html 以前 ...
- Qt编写视频播放器(vlc内核)
在研究qt+vlc的过程中,就想直接做个播放器用于独立的项目,vlc还支持硬件加速,不过部分电脑硬件不支持除外.用vlc的内核写播放器就是快,直接调用api就行,逻辑处理和ui展示基本上分分钟的事情, ...
- EXCEL通俗易懂讲公式(一):sumif,sumifs,countif,countifs
最近公司招了一批新人,excel基本都是小白阶段,以前用过的也就是画个课程表,没做过什么数据统计和文本计算等工作.因此各种问题都来了,什么vlookup,offset,连条件求和的sumif也不会用, ...
- 一个linux命令之grep---1
grep 表示“匹配” 参数常用的四个 -i 匹配的文件内容忽略大小写 -R 递归的匹配文件(即在一层一层的目录中的文件中去匹配) -n 表示匹配出的行显示在文件中的行号 -H ...
- jpa中时间戳格式应该用哪种类型
遇到个bug,数据库时间存储用了datetime,但是下面的java jpa代码,查询回来,却只有日期. String innerSql = getInnerQuery(departmentId, k ...
- 如何在mysql中查询每个分组的前几名
问题 在工作中常会遇到将数据分组排序的问题,如在考试成绩中,找出每个班级的前五名等. 在orcale等数据库中可以使用partition 语句来解决,但在MySQL中就比较麻烦了.这次翻译的文章就是 ...
- Node.j中path模块对路径的操作
一.path模块 https://nodejs.org/docs/latest/api/path.html#path_path_join_paths 1.join方法 ==> 该方法将多个参数值 ...