使用Overmind组织您的开发流程

开发人员很少会只运行一个流程就可以使他们的整个开发环境运行。

为了开始开发我们的应用程序,我们经常必须加快一系列流程,例如:

  • API服务器(例如:rails)
  • 客户端应用(例如:webpack)
  • 后台作业处理器(例如:sidekiq)
  • 可能还有很多其他人…

我们通常在多个终端窗口中分别运行它们,运行一个分叉进程的脚本,等等。

解决这种混乱的流程的一种流行方法是使用Procfile ,这种格式用于指定应用程序提供的流程类型以及运行这些服务的命令。 它是Heroku和其他平台即服务的标准。

一个简单的Procfile定义了一个运行 rails 服务器 的Web进程 和一个运行 sidekiq 的工作进程

 网址:rails 
工人:bundle exec sidekiq

我们有很多工具来运行Procfile ,其中最著名的是David Dollar的foreman ,但我想向您展示如何通过Overmind将Procfiles提升到一个新水平。

对于现有的基于Procfile的流程管理工具感到沮丧,Sergey Alexandrovich着手开发出一种解决他的问题的工具。 如Github项目所述:

这些工具大多数的问题是,您要管理的进程开始认为它们正在将其输出记录到文件中,并且可能导致各种问题:严重的滞后,丢失或破坏彩色输出。 工具还可以添加虚荣信息(日志中不需要的时间戳)。

他通过Hivemind项目解决了这些问题。 但是,这还不够,他希望流程在其输出中捆绑在一起,但开发人员仍应直接对其进行访问。 他继续将tmux与Hivemind集成在一起,创建了Overmind。

那么,Overmind可以做什么其他Procfile管理器不能做的事情? 以下是Github存储库中的综合列表:

  • 它在tmux会话中启动进程(我们将在稍后讨论tmux的工作),因此您可以轻松地连接到任何进程并对其进行控制。 这特别有用,因为它允许我们连接到调试器。
  • 它可以即时重新启动单个进程-您无需重新启动整个堆栈。
  • 它允许指定的进程死亡而不会中断所有其他进程;
  • 它使用pty捕获过程输出-因此不会被裁剪,延迟,也不会破坏彩色输出。
  • 它可以从文件中读取环境变量并将其用作参数,以便您可以全局和/或按目录配置Overmind行为。

注意:目前,Overmind仅支持Linux,* BSD和macOS。

既然您已经了解了Overmind可以为您做什么,那么让我们开始进行设置。

Overmind需要tmux,因此您需要先安装它:

  #在macOS上(使用自制软件) 
$在Ubuntu上brew install tmux#
$ apt-get安装tmux

如果您使用的是macOS,则使用Homebrew安装Overmind相对容易:

  $ brew install过多 

否则,您可以下载最新的二进制文件或从源代码构建。

完成后,您可以开始使用:

  $ overmind start -f path / to / your / Procfile 

Overmind中的秘密成分是终端复用器tmux。 它使您可以在一个终端中的多个程序之间切换,在后台运行时分离它们,然后将它们重新连接到另一个终端。 您不需要了解tmux即可使用Overmind,但了解一点点知识可以有所帮助。

一些有用的命令:

Ctrl + b d —一旦您进入了overmind connectovermind connect tmux窗口分离

Ctrl + b 0在tmux窗口中,将为不同的进程分配不同的编号,您可以使用它们在各进程之间导航。

注意:我的tmux看起来有所不同,因为我已经对其进行了自定义。 您可以通过编辑.tmux.conf定义tmux。 gpakosz撰写的tmux是一个不错的起点。

通常,当我们调试问题时,我们想使用pry或byebug进行实时调试。 但是,对于大多数Procfile管理器或其他同时运行进程的方法,我们无法访问该进程的调试控制台。 另一方面,Overmind允许我们使用overmind connect 命令连接到新窗口中的任何正在运行的进程。 在下面的图片中,您可以看到调试器已在Web进程上启动,并且我能够使用overmind connect web连接到该进程并开始调试。

调试变得容易

通常,有时我们想重新启动Procfile中的Procfile进程(也许是sidekiq工作者),并且这样做,我们必须关闭领班和所有进程。 但是,在Overmind中,我们可以使用overmind restart 来重新启动该进程。

通常,我们只需要运行一堆流程即可。 您可能需要一套单独的过程来运行Slack机器人或启动验收测试服务器。 由于Overmind在Procfiles上运行,因此我们可以为用例创建不同的集合,例如Procfile.slack来启动侦听事件和ngrok的过程,或者Procfile.acceptance来启动接受服务器并运行数据库设置。

  #Procfile.slack 
侦听器:捆绑执行耙子松弛:listen_for_events
localtunnel:ngrok http 3000#Procfile.dev
网址:rails
工作者:捆绑exec sidekiq#Procfile.acceptance
客户:佣金接受:客户
服务器:接受佣金:服务器

如果要从同一路径同时运行多个Procfile,则会遇到此错误:

overmind:似乎Overmind已经在运行。 如果不是,请删除path / to / project / .overmind.sock,然后重试

您可以通过为您的进程指定套接字来解决此问题,而overmind start -f Procfile.dev -s ./dev.sock 。 使用套接字启动Overmind后,您需要使用同一套接字运行所有命令。

  $ overmind connect -s path / to / socket web 
$ overmind restart -s path / to / socket sidekiq
$ overmind kill -s path / to / socket

谢谢阅读! 如果您有任何建议或其他需要与我们分享的内容,请随时在下面写回信与我们联系。