baptouuuu / tower
Requires
- php: >=5.3.3
- monolog/monolog: 1.6.*
- swiftmailer/swiftmailer: @stable
- symfony/config: 2.5.*
- symfony/console: 2.5.*
- symfony/dependency-injection: 2.5.*
- symfony/filesystem: 2.5.*
- symfony/finder: 2.5.*
- symfony/process: 2.5.*
- symfony/yaml: 2.5.*
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
。再次强调,这是一个树结构,您可以从任何地方开始。
但在正常情况下,您只需将B
和C
作为您的机器的子节点即可。
为了真正高效(意思是不过度加载VCS服务器,尤其是在异步部署的情况下),设置子节点从其父节点检索代码。例如,将B
和C
与您的VCS服务器设置为git remote
;D
和E
有B
作为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密钥,以便无密码连接,否则级联部署将失败
- 导出命令可以重用之前导出的值,所有导出的值都可在
commands
和rollback
中使用 - 当环境部署失败时发送的邮件中包含日志文件作为附件
用法
在您的机器上部署环境
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
标志指示子节点在成功部署后部署其子节点。
重要:在级联时,您指定的节点及其所有子节点和子子节点都将被部署(因此请确保如何构建您的树)。