jordillonch/deploy-bundle

Symfony2 部署组件

安装: 191

依赖者: 0

建议者: 0

安全: 0

星级: 7

关注者: 3

分支: 4

开放问题: 1

类型:symfony-bundle

dev-master 2015-05-27 08:58 UTC

This package is not auto-updated.

Last update: 2024-09-14 15:32:18 UTC


README

工作进度

Build Status

是什么?

此组件旨在成为您项目的部署系统。

它是一个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

引用具体版本

  1. 要求部署器提供可回滚的版本。
app/console deployer:rollback list --zones=[zone1]
  1. 执行回滚到特定版本
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 文件。