Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

egg-scripts 部署脚本 #241

Closed
1 of 5 tasks
popomore opened this issue Jan 11, 2017 · 71 comments
Closed
1 of 5 tasks

egg-scripts 部署脚本 #241

popomore opened this issue Jan 11, 2017 · 71 comments

Comments

@popomore
Copy link
Member

popomore commented Jan 11, 2017

功能

  • 构建
    • 支持 nodeinstall
    • 支持语言层编译,如 typescript, babel
    • 自定义构建,如静态文件编译
  • 启动

构建

环境依赖 cnpm,cnpm 会根据配置自动安装 node 到应用包中(需要实现)。

应用添加 install-node 配置 node 版本,并添加 egg-scripts 依赖

{
  "dependencies": {
    "egg-scripts": "*"
  },
  "engines": {
    "install-node": "6.9.1"
  }
}

构建顺序

  1. 下载应用代码
  2. 在应用代码执行 cnpm install --production
  3. 执行 egg-scripts build
    1. 预编译处理(ts,babel 等)
    2. 调用应用的 scripts.build(一般常用于处理静态文件构建)
    3. 修改 scripts.start/scripts.stop 指向 egg-scripts

启动

egg 构建出的应用包没有任何依赖,可直接部署

  1. 设置环境变量 PATH={app_root}/node_modules/.bin:$PATH
  2. 启动 npm startegg-scripts start

扩展

如果框架想提供部署功能,那么可以在框架层依赖 egg-scripts,这样应用就不需要添加了。但是层级比较深,可以在 postinstall 修改 ./node_modules/.bin/egg-scripts.

egg-scritps 主要提供 build 扩展,可以继承 egg-scritps 处理自定义逻辑。

@popomore popomore mentioned this issue Jan 13, 2017
31 tasks
@popomore popomore modified the milestone: 1.x Jan 13, 2017
@atian25
Copy link
Member

atian25 commented Jan 16, 2017

增加下对环境变量转换的支持? 这样就不用自己封装框架和写 loader 了.

@duncup
Copy link

duncup commented Jan 16, 2017

部署脚本的能否对pm2启动进行兼容支持?像我所在公司有考虑用pm2进行服务器管理,而且已经在计划上了,用以便针对进程进行监控日志追踪等。

@jtyjty99999
Copy link
Member

pm2 是能支持的,只需要用pm2启动入口文件就好了

@popomore
Copy link
Member Author

pm2 配上 npm start?

@fengmk2
Copy link
Member

fengmk2 commented Jan 16, 2017

pm2 没有限制,就是有点多余。而且 pm2 自身的稳定性比 egg 内置的 egg-cluster 弱很多。

@duncup
Copy link

duncup commented Jan 16, 2017

@fengmk2 不是为了那个东西的稳定性,而是pm2延伸出来的http://pm2.keymetrics.io所能使用的监控。或者egg有直接实现一套的计划的话肯定是更好。

@fengmk2
Copy link
Member

fengmk2 commented Jan 16, 2017

@duncup 那你直接使用 pm2 就可以了。

@duncup
Copy link

duncup commented Jan 16, 2017

倒也可以,反正两个项目并没什么冲突,服务器直接配倒也可以。就是提一提。

@fengmk2
Copy link
Member

fengmk2 commented Jan 16, 2017

不提,pm2 的用法就是 pm2 index.js 就可以了,所有 node 应用都一样。我们认为 pm2 并不能真正用于生产环境,提了反而误导。

@duncup
Copy link

duncup commented Jan 16, 2017

似乎对pm2的稳定性意见很大的样子?看来我需要重新考虑下pm2了。

谢谢说明 @fengmk2

@fengmk2
Copy link
Member

fengmk2 commented Jan 16, 2017

如果你能说你完全能掌握 pm2 的代码,那我是没有意见的。但是如果没法掌握,那么代表它是未知的。
如果一个 pm 工具的代码比你的应用代码加起来还要复杂,那就应该重新考虑一下了。

@popomore
Copy link
Member Author

和镜像一起做 #142

@atian25
Copy link
Member

atian25 commented Jan 20, 2017

增加下对环境变量转换的支持? 这样就不用自己封装框架和写 loader 了.

补充说明:

我们的应用有可能会部署在不同的地方,如 UAE, leadcloud 等等,往往这些云引擎会有自己的 ENV 来表示服务器类型。

目前的作法,要不在自己的框架里(如 nut 在自己的 startCluster),要不需要在启动脚本里面做判断。

前者不太好,后者其实就是 egg-scripts 的定位吧,可以考虑下这里如何支持该需求,我还没想明白:

  • 提供类似 egg-init-config 的方式来收集常用的映射?
  • 应用在 package.json 里面指定? egg.envMapping: 'some-npm-package' ?
  • egg-scripts 可以被继承?
  • 其他更好的方式?

@popomore
Copy link
Member Author

@atian25 就写自己的 scripts,然后生成 config/env 文件。egg-scripts 是可以被继承的。

@atian25
Copy link
Member

atian25 commented Jan 20, 2017

config/env 文件的话, 就要多次构建了吧? 不能一个包跑多个环境

@popomore
Copy link
Member Author

是的,一次构建多次部署就是通过环境变量设置的,覆盖 getServerEnv 也是一个方法。

@atian25
Copy link
Member

atian25 commented Jan 20, 2017

在 loader 覆盖 getServerEnv 不行吧, 之前 nut 踩坑过一次, app 和 worker 是 prod, 但 master 是 local...

后面我改为覆盖 startCluster 了.

但这 2 种方法, 都是需要在框架层做, 有点太重了.

譬如我开发一个应用, 想同时部署到 2 个云引擎去

@popomore
Copy link
Member Author

popomore commented Jan 20, 2017

现在 master 没问题了,使用 NODE_ENV 就可以了

不是啊,因为你想自己定义环境变量,新开发者使用 EGG_SERVER_ENV 是没有成本的。

@atian25
Copy link
Member

atian25 commented Jan 20, 2017

现在 master 没问题了,使用 NODE_ENV 就可以了

说到这个, 部署文档回头要写清楚线上环境需要加上的 ENV

loader 覆盖 getServerEnv

这个呢? loader 只能在框架层覆盖吧? 我期望是通过启动脚本(egg-script) 或插件解决(如 egg-leadcloud)

但目前的机制, 插件太晚了.

@popomore
Copy link
Member Author

确定不支持自己定义环境变量么

@popomore
Copy link
Member Author

之后写引导器的时候再看看好了,云我还没玩过

@atian25
Copy link
Member

atian25 commented Jan 20, 2017

确定不支持自己定义环境变量么

自定义环境变量的场景, 应该是针对 pre 这些吧?

prod, dev, test 这些是通用的, 只是不同的云引擎的判断方式不一样.

嗯嗯, 后面写的时候看看

@popomore
Copy link
Member Author

我在使用云引擎的时候应该可以去设置环境变量,连我等金融云都支持

@atian25
Copy link
Member

atian25 commented Jan 20, 2017

这个就是框架来做, 还是用户来做的选择了

举个例子, 某云引擎内置的环境变量是 SERVER_MODE=production/test/development

交给框架来做, 就是只要用户安装 egg-XXX 插件, 就无需理会, 自动适配了.

交给用户来做, 就是他需要在每一个应用对应的云引擎的环境变量配置那里去配置 EGG_SERVER_ENV, 并且这些云引擎要支持不同的运行环境, 可以配置不同的 ENV.

@popomore
Copy link
Member Author

我觉得告诉使用者怎么使用 EGG_SERVER_ENV 就好了,不然你还要去解释,这么多云也不会都跑过,出什么问题我们也不知道。

@atian25
Copy link
Member

atian25 commented Jan 20, 2017

如果能在插件里面做这个事情, 就会自然很多了.

譬如写个 egg-leadcloud 插件, 在它里面做环境变量的适配, 挺自然的. 不过插件加载阶段就太晚了.

@atian25
Copy link
Member

atian25 commented Jan 20, 2017

那就先不理了, 等 egg-scripts 出来后再看看有什么更好的方法, 不然就只能框架层实现了.

@atian25
Copy link
Member

atian25 commented Mar 27, 2017

@leonardodream 另开 issue,跟这个 topic 无关,顺便注意下 markdown 排版。

@leonardodream
Copy link

哦哦哦 @atian25

@zhengxs2018
Copy link

egg-scripts 的 bug 也应该提在哪里?window 下 stop 我这里无法关闭 应用

@atian25
Copy link
Member

atian25 commented Aug 8, 2017 via email

@zhengxs2018
Copy link

我的错,没仔细看

@atian25
Copy link
Member

atian25 commented Aug 9, 2017

主要是 win 下的 PS 有点兼容性问题,也很少有部署到 win 的需求,就暂时不支持了,有兴趣的可以提 PR 来支持。

@atian25
Copy link
Member

atian25 commented Aug 9, 2017

顺便同步下,egg-scripts 工具已经发布第一个版本了,https://eggjs.org/zh-cn/core/deployment.html#部署

@zhengxs2018
Copy link

已经在用了,主要是部署在linux,window只是做个预览而已,谢谢

@gitrl
Copy link

gitrl commented Mar 12, 2018

请问一下egg入口文件怎么写呢?

@gitrl
Copy link

gitrl commented Mar 12, 2018

基于egg.js用react发开h5页面,有大佬知道怎么弄的吗 ?弄了一周多了,环境还没打起,求助大神帮帮忙。。。

@atian25
Copy link
Member

atian25 commented Mar 12, 2018

用 egg-scripts 的话不需要入口文件。

自己写入口的话,可以看 https://eggjs.org/zh-cn/faq.html 的 PM2 那里,但这只是一个简单的调用, egg-scripts 里面做的一些启动日志的处理不会在里面,需自行处理

@atian25
Copy link
Member

atian25 commented Apr 18, 2018

@popomore should we close this ?

@popomore
Copy link
Member Author

可以,构建后面再做

@leotian
Copy link

leotian commented Jul 30, 2018

使用egg-scripts 启动,默认NODE_ENV就是production,并且不可修改?

@atian25
Copy link
Member

atian25 commented Jul 30, 2018

正式环境应该只用 production

@leotian
Copy link

leotian commented Jul 31, 2018

可是我们有一个qa环节,部署的代码和正式环境一样,这时候想用egg-scripts 启动,NODE_ENV默认置为production会让我们内部的一些包出问题,我们需要自己设置NODE_ENV

@atian25
Copy link
Member

atian25 commented Jul 31, 2018

包的设计最好不要依赖于环境变量,而是通过构造函数入参来决定。

@leotian
Copy link

leotian commented Jul 31, 2018

恩,你说的有道理

@leotian
Copy link

leotian commented Jul 31, 2018

不过为什么一定要强制帮我设NODE_ENV呢,我自己设不行吗

@atian25
Copy link
Member

atian25 commented Jul 31, 2018

不为什么, 就是 default to good

你有需求就 PR 支持传递 ENV 咯。虽然我还是建议你不要用 ENV 来做判断。

@lxd90
Copy link

lxd90 commented Mar 13, 2019

比pm2更好用

@qq578023708
Copy link

位于Server2012 搭配nssm, 启动后出现定时任务重复执行的BUG,使用 npm run dev就没问题

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests