jordillonch / deploy-bundle
Symfony2 部署组件
Requires
- php: >=5.4.0
- yriveiro/php-fslock: 0.1
Requires (Dev)
- guzzle/guzzle: 3.4.*@dev
- mockery/mockery: dev-master@dev
- phpunit/phpunit: 3.7.*
- symfony/symfony: 2.3.*
This package is not auto-updated.
Last update: 2024-09-14 15:32:18 UTC
README
工作进度
是什么?
此组件旨在成为您项目的部署系统。
它是一个Symfony2组件,但可用于部署多种类型的项目。
组件提供了一些命令来自动化部署过程。以下是主要命令
- 初始化:准备部署器和远程服务器,创建用于托管新代码的目录结构。
- 下载:从仓库下载代码,适配,预热…并将其发送到远程服务器,以便将新代码投入生产。
- 代码到生产。原子性地将新代码部署到生产环境,并重新加载Web服务器、应用程序等。
- 回滚。返回到以前的部署版本。
部署器配置了用于部署新代码的区域。
区域是项目和环境的组合(例如prod_api,我们的项目Api用于生产环境)。
部署器使用GitHub仓库、配置的分支和HEAD作为部署的目标。
您可以通过Composer将此组件添加到您的项目中(请参阅安装部分),但我的建议是您创建一个新的项目来部署,因为您可能不希望将生产配置存储在您的仓库项目中。因此,将生产配置委托给部署系统是一个好主意。
此外,此组件还提供了用于自动化常见操作的帮助程序,例如安装 composer 依赖项、为 Symfony2 项目进行 缓存预热、在生产代码部署后刷新 php-fpm、获取新部署代码的 GitHub 差分链接...
它是如何工作的?
有两个基本思想允许部署多个代码版本,将其中一个版本投入生产,并在它们之间回滚。
当您想部署新代码时,您必须执行“下载”操作。此操作将从您的git仓库克隆代码到新目录(例如20130704_180131_a618a56b08549794ec4c9d5db29058a01a58977f),然后对代码进行适配。适配是在添加配置、预热应用程序缓存、下载和安装依赖项、创建指向共享目录的符号链接的步骤。
共享目录是包含您希望在部署之间保留的数据的目录(例如日志、报告、生成的图像...)。
之后,代码被复制到配置的服务器。使用ssh授权密钥允许复制和执行远程服务器的命令。
然后,当您想使用最后下载的代码投入生产时,您必须执行“代码到生产”操作。此操作修改指向已下载最新版本的目录的符号链接。
通常,之后您应该重新启动Web服务器或php-fpm。
注意:这些想法来自Capistrano。
快速入门
创建一个新的Symfony 2.3项目
php composer.phar create-project symfony/framework-standard-edition path/ 2.3.0
安装组件
将以下行添加到您的 composer.json
文件中
"require": {
"jordillonch/deploy-bundle": "dev-master"
},
"minimum-stability": "dev",
执行
php composer.phar update
将其添加到 AppKernel.php
类中
new JordiLlonch\Bundle\DeployBundle\JordiLlonchDeployBundle(),
配置通用设置和一个区域
app/config/parameters.yml
jordi_llonch_deploy:
config:
project: MyProject
vcs: git
servers_parameter_file: app/config/parameters_deployer_servers.yml
local_repository_dir: /home/deploy/local_repository
clean_max_deploys: 7
ssh:
user: myuser
public_key_file: '/home/myuser/.ssh/id_rsa.pub'
private_key_file: '/home/myuser/.ssh/id_rsa'
private_key_file_pwd: 'mypassword'
zones:
prod_myproj:
deployer: myproj
environment: prod
checkout_url: 'git@github.com:myrepo/myproj.git'
checkout_branch: master
repository_dir: /var/www/production/myproj/deploy
production_dir: /var/www/production/myproj/code
app/config/parameters_deployer_servers.yml
prod_myproj:
urls:
- deploy@testserver1:8822
- deploy@testserver2:8822
- 注意:服务器URL存储在其他文件中(
parameters_deployers_servers.yml
),因为此文件包含动态配置,这些配置会在像AWS这样的可扩展环境中更改。
为myproj创建一个部署类
- 首先创建您自己的组件
php app/console generate:bundle --namespace=MyProj/DeployBundle --dir=src --no-interaction
- 创建自己的部署类
src/MyProj/DeployBundle/Service/Test.php
<?php
namespace MyProj/DeployBundle/Service;
use JordiLlonch\Bundle\DeployBundle\Service\BaseDeployer;
class Test extends BaseDeployer
{
public function downloadCode()
{
$this->logger->debug('Downloading code...');
$this->output->writeln('<info>Downloading code...</info>');
$this->downloadCodeVcs();
$this->logger->debug('Adapting code');
$this->output->writeln('<info>Adapting code...</info>');
// Here you can download vendors, add productions configuration,
// do cache warm up, set shared directories...
$this->logger->debug('Copying code to zones...');
$this->output->writeln('<info>Copying code to zones...</info>');
$this->code2Servers();
}
public function downloadCodeRollback()
{
}
protected function runClearCache()
{
$this->logger->debug('Clearing cache...');
$this->output->writeln('<info>Clearing cache...</info>');
$this->execRemoteServers('sudo pkill -USR2 -o php-fpm');
}
}
- 将您的部署类作为带有标签
jordi_llonch_deploy
的服务添加
<service id="myproj.deployer.test" class="MyProj/DeployBundle/Service/Test">
<tag name="jordi_llonch_deploy" deployer="myproj"/>
</service>
myproj
在配置中用作deployer
值。
允许远程服务器 SSH 访问
为了允许访问部署系统,必须在远程服务器上 .ssh/authorized_keys
中添加部署用户的公钥。
初始化
配置部署器后,您需要进行初始化。
app/console deployer:initialize --zones=prod_myproj
下载
现在您可以从您的仓库下载代码并将其复制到您的服务器上。
app/console deployer:download --zones=prod_myproj
代码到生产环境
下载后,只需将代码放入生产环境即可。
app/console deployer:code2production --zones=prod_myproj
回滚
如果出现任何问题,您可以回滚到以前的版本。请参阅回滚命令的帮助。
命令
initialize
准备部署器和远程服务器,创建用于托管新代码的目录结构。
app/console deployer:initialize --zones=[zone1,zone2...]
download
从仓库下载代码,适配,预热...并将其发送到远程服务器,以便将新代码部署到生产环境。
app/console deployer:download --zones=[zone1,zone2...]
code2production
原子性地部署新代码到生产环境,并重新加载 Web 服务器、应用程序...
app/console deployer:code2production --zones=[zone1,zone2...]
syncronize
确保所有下载的代码版本都复制到所有服务器。在您向区域添加新服务器时很有用。如果您不同步新服务器,回滚操作将破坏新服务器上的代码。
app/console deployer:syncronize --zones=prod_myproj
rollback
如果出现任何问题并且您需要回滚到以前的版本,您有两个选择
使用回滚步数
app/console deployer:rollback execute [steps_backward] --zones=[zone1]
- 如果您想回滚到以前的版本,则
steps_backward
应为1
。
引用具体版本
- 要求部署器提供可回滚的版本。
app/console deployer:rollback list --zones=[zone1]
- 执行回滚到特定版本
app/console deployer:rollback execute [version] --zones=[zone1]
status
显示正在运行的版本和最后下载的版本,该版本已准备好投入生产。
app/console deployer:status [--zones=[zone1,zone2...]]
configure
为区域配置远程服务器。这对于自动化扩展很有用。
app/console deployer:configure zone [add, set, rm, list, list_json] [url]
clean
删除旧代码。保留 clean_max_deploys
次部署。
app/console deployer:clean
exec2servers
将作为参数传递的命令执行到所有配置的服务器上。
app/console deployer:exec2servers [command]
配置
部署器配置在 parameters.yml
中设置。
您必须设置一般配置和区域。
一般配置
app/config/parameters.yml
jordi_llonch_deploy:
config:
project: MyProject
vcs: git
local_repository_dir: /home/deploy/deploy_repository
clean_max_deploys: 7
sudo: true
ssh:
user: myuser
public_key_file: '/home/myuser/.ssh/id_rsa.pub'
private_key_file: '/home/myuser/.ssh/id_rsa'
private_key_file_pwd: 'mypassword'
project
您的项目名称。
mail_from
发件人邮箱。
mail_to
发送有关部署的电子邮件的收件人。它是一个数组。
servers_parameter_file
服务器参数文件所在的路径。常见的配置可以是 app/config/parameters_deployer_servers.yml
。
服务器 URL 在此文件中,因为它包含会因像 AWS 这样的可扩展环境中的某些脚本而更改的动态配置。
local_repository_dir
部署器克隆您的仓库、适配代码并在部署系统中保存有关版本数据的目录。
clean_max_deploys
在 clean 命令中用于删除以前的下载版本。保留 clean_max_deploys
次下载版本。
sudo
将 sudo
添加到发送到远程服务器的所有命令中。如果您想使用它,应在所有远程服务器上设置您的部署用户为 sudoers,并使用 NOPASSWD。
/etc/sudoers
:
deployer_user ALL=(ALL) NOPASSWD: ALL
ssh
用于在远程服务器上执行命令以建立连接的 SSH 配置。
以下是一个配置示例
ssh:
proxy: cli
user: jllonch
password: 'mypassword'
public_key_file: '/home/myuser/.ssh/id_rsa.pub'
private_key_file: '/home/myuser/.ssh/id_rsa'
private_key_file_pwd: 'mykeypassword'
proxy
用于执行远程命令的客户端。
可以是
pecl
: php-ssh2 扩展cli
: 控制台 ssh 命令
如果没有定义,它将尝试使用 pecl
(如果已安装),否则将使用 cli
。
user
用于密码认证和公钥认证的凭据。
password
用于密码认证的密码。
public_key_file
公钥文件路径。
private_key_file
私钥文件路径。
private_key_file_pwd
私钥密码。
helper
可以在您的部署类中获取的帮助参数。
区域配置
您需要设置至少一个区域。已创建区域 prod_myproj
app/config/parameters.yml
jordi_llonch_deploy:
...
zones:
prod_myproj:
deployer: myproj
environment: prod
checkout_url: 'git@github.com:myrepo/myproj.git'
checkout_branch: master
checkout_proxy: true
repository_dir: /var/www/production/myproj/deploy
production_dir: /var/www/production/myproj/code
custom:
my_key1: value1
my_key2: value2
app/config/parameters_deployer_servers.yml
prod_myproj:
urls:
- deploy@testserver1:8822
- deploy@testserver2:8822
deployer
用于部署区域的服务的名称。
<service id="myproj.deployer.test" class="MyProj/DeployBundle/Service/Test">
<tag name="jordi_llonch_deploy" deployer="myproj"/>
</service>
环境
环境。
urls
部署代码将被复制并设置为生产状态的远程服务器。
格式为:[用户]@[服务器]:[端口]
checkout_url
git仓库的URL。
checkout_branch
要克隆的Git分支。
checkout_proxy
Deployer始终为每次部署克隆一个仓库。如果您想避免从远程服务器下载,可以在本地克隆您的仓库,然后将checkout_url
设置为您的本地仓库(file:///home/deploy/proxy_repositories/myproj
)。然后,在下载操作之前,Deployer将对本地仓库执行git pull
。
repository_dir
远程服务器上复制新部署代码的路径。
production_dir
Deployer在将新部署代码设置为生产状态时更新的路径。因此,您必须将此路径设置为您的web服务器作为根路径。
custom
可以在您的部署类中获取的自定义参数。
helper
必须设置以使用某些辅助参数的辅助参数。
如果辅助参数在一般配置中设置,则将这些配置合并到这里。
辅助工具
辅助工具自动化常见的操作,如安装composer依赖项,为Symfony2项目执行缓存预热,在生产状态后将代码放置到生产状态后重启php-fpm,获取包含新部署代码差异的GitHub的URL...
如何使用它?
您可以在您的Deployer类中使用辅助工具
来执行常见操作。
以下是一个示例
src/MyProj/DeployBundle/Service/Test.php
<?php
namespace MyProj/DeployBundle/Service;
use JordiLlonch\Bundle\DeployBundle\Service\BaseDeployer;
class Test extends BaseDeployer
{
public function initialize()
{
parent::initialize();
// Shared dirs
$this->getHelper('shared_dirs')->initialize('logs');
}
public function downloadCode()
{
$this->logger->debug('Downloading code...');
$this->output->writeln('<info>Downloading code...</info>');
$this->downloadCodeVcs();
$this->logger->debug('Adapting code');
$this->output->writeln('<info>Adapting code...</info>');
// composer
$this->getHelper('composer')->install();
$this->getHelper('composer')->executeInstall();
// cache warm:up
$this->getHelper('symfony2')->cacheWarmUp();
// shared directories
$this->getHelper('shared_dirs')->set('app/logs', 'logs');
$this->logger->debug('Copying code to zones...');
$this->output->writeln('<info>Copying code to zones...</info>');
$this->code2Servers();
}
public function downloadCodeRollback()
{
}
protected function runClearCache()
{
$this->logger->debug('Clearing cache...');
$this->output->writeln('<info>Clearing cache...</info>');
$this->getHelper('phpfpm')->refresh();
}
}
- 如您所见,我们使用了一些以
helper…
开头的方法来安装composer依赖项,执行缓存预热,设置共享目录和重启php-fpm。
提供的辅助工具
SharedDirs
轻松管理共享目录的方法。
$this->getHelper('shared_dirs')->initialize($path)
- 在共享目录中初始化给定路径。
$this->getHelper('shared_dirs')->set($pathInAppToLink, $pathInSharedDir)
- 为项目中的给定路径设置共享目录,该项目将被删除并替换为指向共享目录的符号链接。
PhpFpm
提供重启php-fpm的方法。
$this->getHelper('phpfpm')->refresh()
- 优雅地刷新php-fpm,但您必须配置您的web服务器(例如Nginx)以重试请求。
$this->getHelper('phpfpm')->refreshCommand()
- 用于重新加载php-fpm的命令
Composer
管理composer安装和一些命令的辅助工具。
$this->getHelper('composer')->install()
- 在新的仓库目录中安装composer.phar。
$this->getHelper('composer')->executeInstall()
- 在新的仓库目录中执行composer install。
- 如果环境是dev或test,则添加--dev参数到composer install
- 如果环境是prod,则添加--no-dev参数到composer install
Symfony2
目前仅提供执行缓存预热的方法。
$this->getHelper('symfony2')->cacheWarmupOnServers()
- 为生产环境执行cache:warmup。此操作应在code2Servers()操作之后执行。
已弃用
$this->getHelper('symfony2')->cacheWarmUp()
- 此预热操作不安全,因为序列化数据可能会损坏。
GitHub
有用的方法,以获取GitHub中的部署反馈。
$this->getHelper('github')->getCompareUrl($gitUidFrom, $gitUidTo)
- 提供两个提交之间的比较URL
- 您必须在jordi_llonch_deploy.zones参数中设置您的GitHub仓库的http URL
helper:
github:
url: https://github.com/YourUser/Repository
$this->getHelper('github')->getCompareUrlFromCurrentCodeToNewRepository()
- 提供当前运行代码与新下载代码之间提交的比较URL。
HipChat
提供向HipChat中的房间发送消息的方法。
$this->getHelper('hipchat')->send($msg, $color='purple')
- 向给定的房间发送消息
- 您必须在jordi_llonch_deploy.general参数中设置您的HipChat的令牌和room_id
helper:
hipchat:
token: your_token
room_id: your_room_id
待办事项
- 测试
- Ssh与Process组件
作者
Jordi Llonch - llonch.jordi at gmail dot com
许可证
DeployBundle 采用 MIT 许可证授权。有关详细信息,请参阅 LICENSE 文件。