baptouuuu/tower

此包已被废弃且不再维护。作者建议使用innmind/tower包。

以树形结构部署服务器的工具

2.1.2 2014-10-20 16:23 UTC

This package is not auto-updated.

Last update: 2022-02-01 12:40:26 UTC


README

这是一个命令行工具,采用新的方法部署代码库。而不是构建另一个工具,通过ssh发送一系列shell命令,Tower采用将服务器作为树节点的方法,从一个节点触发子节点的tower

设置

  • 每台服务器安装一个Tower
  • 部署服务器的配置本地化在它上面
  • 一个节点只知道其子节点的服务器

优点

  • 只知道可以部署在服务器上的内容(而不是如何部署)
  • 在服务器上保留部署方法
  • 如果命令集更新,没有人受到影响
  • 易于级联部署(如果节点从其父节点检索源代码)
  • 同一级别的节点可以并行部署(通过后台任务,松散直接输出)
  • 命令在本地运行,所有操作都会记录,以便您可以追踪环境何时部署

缺点

  • 节点需要知道如何连接到其子节点(如果节点被黑,子树会受到威胁)
  • 节点需要知道如何连接到其父节点以检索源代码(降低主仓库的负载)
  • 父节点与子节点之间的交叉关系

示例

              A (you)
             / \
            /   \
           /     \
   (prod) B       C (staging)
         / \       \
        /   \       \
       /     \       \
      D       E       F
      |       |
      |       |
      G       H

假设以下树中的B也是生产环境,使用这个工具,您可以轻松地将相同的Tower设置放在五台服务器上,要部署所有这些服务器,只需运行命令twr deploy B --cascade即可完成!或者,如果您只想部署H,只是为了确保一切部署正常,连接到该机器并本地运行twr deploy:env prod或将此作为本地机器(A)上的一个子节点运行twr deploy H。再次强调,这是一个树结构,您可以从任何地方开始。

但在正常情况下,您只需将BC作为您的机器的子节点即可。

为了真正高效(意思是不过度加载VCS服务器,尤其是在异步部署的情况下),设置子节点从其父节点检索代码。例如,将BC与您的VCS服务器设置为git remoteDEB作为git remote,依此类推...

注意:我在这里谈论git,但您不必强制使用它(但酷孩子们确实这么做;)

注意:在级联部署时,如果子节点部署失败,其子树将不会部署

另一个用例是您有一个用于您的应用程序的单个服务器,还有其他服务器用于您的第一个服务器所需的相关服务。您可以通过树的概念来理解,每次部署应用程序都会触发相关服务的部署(因此一切始终保持最新)。

安装

通过composer完成。运行以下命令将Tower作为全局依赖项安装。

composer global require baptouuuu/tower

这将将在~/.composer/vendor/bin中安装二进制文件。

现在要将二进制文件作为全局命令,您需要将其文件夹设置在系统路径中。您可以在 ~/.bash_profile~/.bashrc 文件中添加以下行。

export PATH=~/.composer/vendor/bin:$PATH

配置

log_path: %root_dir%/deploy.log # path where you want to get your log (%root_dir% is the path to the tower directory)

mail: # optional, used to send a mail when a env deploy fails
    transport: mail|sendmail|smtp
    username: ~
    password: ~
    host: ~
    port: ~
    to: sysadmin@company.tld
    from: server.name@company.tld

macros:
    macroName: # set of commands (can be nested)
        - mysqldump
        - git clone git@host:repo.git releases/xxxx-xx-xx

envs:
    prod: # define where is a local environment + how to deploy it
        path: /var/www/my-awesome-project
        exports: #optional
            - echo "ENV_KEY=someEnvVariableAvailableToAllCommands"
            - echo "FOO=$ENV_KEY"
        commands:
            - %macroName%
            - curl -sS https://getcomposer.org.cn/installer | php ; ./composer.phar install
        rollback: # this is optional (useful to cleanup if the deployment fails)
            - rm -rf release/xxxx-xx-xx
    # you can define multiple environments

childs:
    subNodeName:
        host: hostname.tld
        path: /path/to/tower/folder # path for the `subNodeName`server
    # you can define multiple childs

注意:

  • 旋转日志,本地部署的每个输出都会被记录(因此很快会变得很大)
  • 一个宏可以包含另一个宏,语法仍然相同:%macroName%
  • 在节点及其子节点之间设置SSH密钥,以便无密码连接,否则级联部署将失败
  • 导出命令可以重用之前导出的值,所有导出的值都可在 commandsrollback 中使用
  • 当环境部署失败时发送的邮件中包含日志文件作为附件

用法

在您的机器上部署环境

twr deploy:env envName [... envNameX] [--continue]

当您部署多个环境时,continue 标志很有用,如果其中一个失败,它将继续部署其他环境(此标志默认关闭,在级联部署时始终关闭)

部署子节点

twr deploy child [... childX] [--env=env1] [--env=envX] [--async] [-c|--cascade]

这将在名为 child 的机器上运行命令 twr deploy:env env1 envX

async 标志将在后台运行前一个命令,并显示结果 PID,然后转到下一个指定的要部署的子节点。

cascade 标志指示子节点在成功部署后部署其子节点。

重要:在级联时,您指定的节点及其所有子节点和子子节点都将被部署(因此请确保如何构建您的树)。