# ideploy **Repository Path**: luyongfugx/ideploy ## Basic Information - **Project Name**: ideploy - **Description**: ideploy是为前端团队构建部署工程化而开发的一个持续交付平台.随着团队人员,项目增长而面临的越来越多在构建,交付等日常工作中的痛点,ideploy设计了很多特有而简单易用的功能,节省了团队很多构建部署的协调和copy体力工作,极大的提升了团队的开发效率。随着功能的完善,觉得这个系统可以帮助很多类似我们这样成长中的前端团队(当然系统其实也是支持java,php等项目的部署的,通过插件编写也可以支持go甚至更多语言的构建部署)实现快速构建,快速部署,放心上线 - **Primary Language**: JavaScript - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 94 - **Forks**: 37 - **Created**: 2017-04-18 - **Last Updated**: 2024-05-31 ## Categories & Tags **Categories**: develop-tools **Tags**: None ## README # iDeploy # 如果觉得我们项目靠谱,请到我们的[github](https://github.com/wdfe/ideploy) 给我们star 多谢 * [1.简介](#desc) * [2.项目技术栈](#tech) * [3.快速启动](#quickstart) * [4.部署第一个项目](#firstpro) * [5.多语言支持](#morelang) * [6.编写插件支持高级功能](#advanced) ## 简介
ideploy是为前端团队构建部署工程化而开发的一个持续交付平台.我们根据团队人员,项目增长而面临的越来越多在构建,交付等日常工作中的痛点,设计了很多特有而简单易用的功能,节省了团队很多构建部署的协调和copy体力工作,极大的提升了团队的开发效率。随着功能的完善,觉得这个系统可以帮助很多类似我们这样成长中的前端团队(当然系统其实也是支持java,php等项目的部署的,通过插件编写也可以支持go甚至更多语言的构建部署)实现快速构建,快速部署,放心上线。
## 技术栈 1. 开发语言: [nodejs](http://nodejs.org/ "nodejs") 2. 数据库: [mysql](https://www.mysql.com/) 3. 后端框架: [thinkjs](https://thinkjs.org/) 4. 前端js框架 [react](https://github.com/facebook/react) 5. 前端ui框架 [ant.design](https://ant.design) ## 快速启动(只支持linux) 1. git clone xxxxx.git 代码到本地 2. 安装nodejs 依赖:在根目录下运行npm install 3. 安装ansible (依赖ansible做部署前后的命令行执行) 4. 安装mysql 数据库,这里就不展开讲了,具体请参考:[mysql文档](https://dev.mysql.com/doc/refman/5.7/en/) 5. 新建一个数据库(名字自己取一个就行,比如fe_build),并且开放足够的访问权限,具体可以参考[mysql文档](https://dev.mysql.com/doc/refman/5.7/en/database-use.html) 6. 配置数据库:打开src/common/config/db.js,分别填写数据库ip地址,数据库名称,用户名和密码,如下所示
export default {
type: 'mysql',
log_sql: true,
log_connect: true,
adapter: {
mysql: {
host: '127.0.0.1',
port: '',
database: 'wdfe_publish',
user: 'root',
password: '',
prefix: '',
encoding: 'utf8'
},
}
}
7. 代码,通知邮件等访问权限配置:
由于构建部署系统需要从代码仓库(svn,git)拉取代码,所以需要首先配置svn仓库用户名和密码 打开src/common/config/config.js,分别填写各项配置,具体如下:
export default {
cvsUser: 'myuser',//svn用户名
cvsPass: 'mypass',//svn密码
emailHost: 'smtp.qq.com',//通知邮箱地址,这里用qq邮箱作为参考
emailport: 465,//端口
emailUser: '3333@qq.com',//邮箱账号
emailPass: 'xxxxx',//邮箱授权码(具体可以登录mail.qq.com->设置->账户->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务->生成授权码获取)
cvsDir: '/temp',//svn代码临时保存目录
port: 80 //服务器端口,就是部署平台的web服务端口,
}
如果是git项目请保证部署机器能直接有访问git的权限
8. 代码编译,启动
输入命令以下命令进行编译:
npm run build
编译完成,运行以下名命令启动:
npm run start
也可以用forever或者pm2来管理服务,以forever为例:
npm install -g forever
项目内置了forever的启动和停止脚本:
./start.sh
./stop.sh
服务器起来以后,我们直接访问
http://localhost:2016
页面自动跳到登录注册页面,说明启动成功:
这个项目本来是为了前端构建部署而设计的,但是随着系统的日益完善,我们也支持其他语言如 java项目的构建和部署,接下来我们来看看如何部署一个通过maven管理的javaweb项目(我随便找了个javaweb项目fork出来:https://github.com/luyongfugx/maventest.git)。
1.首先部署平台所在机器需要安装jdk(java运行环境),目标机器安装好tomcat 2.在新建项目的时候,我们选择程序语言为java(这样在点击构建的时候,其实是执行,src/common/service/impl/build_java.sh '命令执行目录' 'mvn package 命令行' '项目id' '是否npm install') 3.在添加机器时,构建命令我们填写mvn package(maven编译命令),部署前需要删除服务器上代码可以直接配置部署前命名删除,部署后需要重启则可以填写重启命令比如这个项目我们填写的如下信息:
this.state={
getItemList:'',
selectedRows:'',
codeLangArray:['javascript','java','go'],//增加go语言支持。
selectedMacRowKeys :''
}
添加完重新build项目运行,添加项目的时候语言就多了一个go选项,填上你的项目名称和代码仓库地址(这个例子是一个特别简单的httpserver,需要本地编译上传,重启)。
然后到src/common/service/ipml目录下增加build_go.sh文件,点击构建的时候会执行这个文件,并传入4个参数,'命令执行目录' '执行的命令' '项目id' '是否npm install',根据这个我们可以执行编译命令,以下是我们写的build_go.sh文件。
#!/bin/bash
projectPath=$1
cd $projectPath
echo '开始构建'
$2
接着我们需要在添加机器的时候填写构建命令和重启命令,例子如下:
'use strict';
class BuildPlugin extends think.service.base {
init(...args) {
super.init(...args);
}
async before(params){
console.log('before build hook :',params);
return params;
}
async after(params){
console.log('afterProject build hook :',params);
return params;
}
}
export default new BuildPlugin();
before方法是项目构建前会调用,after方法是项目构建后会调用,params为传入参数,参数主要是一些项目信息和构建信息,比如:
{
id: 17,
name: 'ssr',
creater: 'waynelu',
vcs_type: 1,
code_url: 'https://github.com/luyongfugx/vue-ssr-hmr-template.git',
build_type: 0,
online_tag: '2017022700004',
last_tag: '2017022700004',
pub_time: '2017-02-24 10:14:30',
status: '1',
op_item_id: 0,
op_item_name: '0',
code_lang: 'javascript',
hook_params: 'port:8081',
deploy_hook: 'deploy_nodejs_plugin',
build_hook: 'build_nodejs_plugin',
task: 'build ',
pro_id: 17,
pro_name: 'ssr',
sessionUser: { id: 1, name: 'luyongfu', pass: '111111', avatar: 'avatar' },
shellParams:
{ build_shell: './src/common/service/impl/build_javascript.sh',
buildDir: './temp/luyongfu/17',
task: 'build ',
isNpmInstall: '1' },
buildDir: './temp/luyongfu/17' }
将这个js放到src/common/service目录下,然后到项目信息里面添加构建hook为build_nodejs_plugin,这样在构建前后会分别调用before和after,如果想添加参数,
可以填写hook参数,这个参数会被传入before,after方法里。
部署hook,是在部署前后调用的hook,内部又细分为部署项目前后的总hook和部署某台机器前后的hook,我们还是同样建立一个deployHook,新建一个deploy_nodejs1_plugin.js文件,内容如下:
'use strict';
class DeployPlugin1 extends think.service.base {
init(...args) {
super.init(...args);
}
async beforeProject(params){
console.log('beforeProject hook1 :',params);
return params;
}
async afterProject(params){
console.log('afterProject hook1 :',params);
return params;
}
async beforeMachine(params,projectHookParams){
console.log('beforeMachine hook1 :',params,projectHookParams);
return params;
}
async afterMachine(params,projectHookParams){
console.log('afterMachine hook1 :',params,projectHookParams);
return params;
}
}
export default new DeployPlugin1();
我们同样把这个文件放到src/common/service目录下,这样在部署的时候,一开时会调用beforeProject,然后再每台机器部署前后调用beforeMachine,afterMachine方法,最后再调用afterMachine 方法,我们在项目基本信息的时候填写部署hook为deploy_nodejs1_plugin,如果需要每台机器有特殊hook,则在机器基本信息里填写部署hook(这时候部署这台机器时会只执行本hook的beforeMachine,afterMachine方法,不执行项目基本信息里面的beforeMachine,afterMachine方法)
如果觉得我们的项目不错,希望能给我们star,我们的github:[github](https://github.com/wdfe/ideploy)