使用Jenkins部署Symfony项目:最佳实践

时间:2016-02-11 18:57:26

标签: jenkins symfony

我在Jenkins服务器上管理了一些Symfony 2/3项目,我正在部署到实时服务器。这是我目前的设置:

构建

  • 使用git插件结帐
  • 删除数据库(如果存在)
  • 执行composer install(prod模式,优化自动加载器)
  • 执行bower install以获取我的资产
  • 执行gulp构建,缩小并连接css / javascript(我们不使用资产)
  • 执行我的数据库创建内容
  • 执行单元测试

存档

在构建之后,我归档构建的工件,而不使用vendornode_modulesbower_components文件夹作为zip文件使用“{{ 3}}“插件。

部署

我使用“Compress Artifacts”插件和“Promoted builds”插件组合:如果我想要使用构建“上线”,我会通过SSH发布工件(我的zip文件)到名为staging_dir的目录中的我的实时系统。文件上传后,我执行一些SSH命令:

  • 将实时系统设置为维护模式
  • 在我的staging_dir
  • 中解压缩工件zip
  • 在实时系统上执行composer install(与构建期间相同的配置)
  • bower install并且gulp构建不是必需的,因为我们使用在构建期间创建的资产)
  • 迁移数据库
  • 将当前的实时系统文件移至backup文件夹
  • 复制staging_dir
  • 中的文件
  • 将实时系统设置为“生产”模式(禁用维护模式)

最佳做法?

我现在想收集部署的最佳实践:

  • 您是否希望将vendor文件夹转移到实时系统,而不是再次执行composer install
  • 资产怎么样?您是bower installgulp再次在实时系统上构建还是使用已发布的资产?
  • 执行实时促销时如何处理密码?
  • ......我忘记的其他事情。

1 个答案:

答案 0 :(得分:24)

我和几位同事现在已经处理了这个问题很长一段时间了。当我们开始时,很难找到关于这个主题的好帖子。这就是为什么我想分享我们发现的工作"最好的"为了我们。

项目详情

我们的一位客户拥有一个庞大而沉重的平台,用于管理他的业务流程(如ERP和CRM)。该平台最初是使用Symfony 2开发的,我们现在已经升级到Symfony 3.为了确保一切正常,该项目有大量的测试用例。我们还使用:

  1. Doctrine Migrations因此,只要有必要,我们就可以安全地更新生产服务器上的数据库。
  2. Phing
  3. 鲍尔
  4. Assetic
  5. PHPUnit的
  6. GIT中
  7. 詹金斯
  8. 测试

    一旦有人提交我们的git服务器,一个钩子让Jenkins知道并触发构建。作业成功完成后,我们手动触发部署。这是通过登录客户端的机器并触发我们已经开发的脚本来完成的。

    部署

    我们过去常常采用与您相同的方式 - 在jenkins完成作业后上传档案。然而,这被证明是非常有问题的,因为在某些情况下存档可能会被破坏(即由于jenkins实例和生产服务器之间的网络连接问题)。将文件从我们的服务器上传到客户端服务器也需要相当长的时间。这就是为什么我们决定使用git并从那里提取必要的版本。使用git证明更可靠,并确保您在客户端拥有项目的绝对副本。此外,回滚到以前的版本只有一个git checkout远:)

    由于我们大多数人已经拥有antphp的使用经验,因此我们决定使用Phing并创建构建脚本并自动完成大部分常规任务。在构建脚本中,我们已经添加了我们一直运行的大多数常见任务,例如安装,升级,清除缓存,安装资产等。然后我们在每个生产服务器上提供此脚本。

    一旦jenkins构建工作成功并且我们已手动发布&标记了产品的版本,我们通过SSH在客户端的计算机上运行phing update(此步骤可能已自动执行但由于某些项目而故意要求)。这个命令的作用是:

    1. 从我们的git服务器获取最新的标记版本
    2. 如果当前版本< 最新标记版本(使用哈希19a6d9)进入下一步
    3. phing maintenance:on(将平台设置为离线模式)
    4. git fetch origin 19a6d9
    5. git checkout 19a6d9
    6. phing composer:install
    7. phing database:upgrade(运行一些命令,包括数据库备份和doctrine:migrations:migrate
    8. phing assets(运行bower installassetic命令并将所有js / css编译为one.cssone.js
    9. phing cache:clean
    10. phing maintenance:off(打开平台)
    11. 我们的phing update任务也被trycatch包围,如果更新阶段遇到问题,它将自动进入回滚阶段。它通过phing rollback PREVIOUS_VERSION命令完成:

      1. git checkout PREVIOUS_VERSION - 将fs恢复到之前的git版本
      2. phing composer:install
      3. phing database:rollback PREVIOUS_VERSION
      4. phing assets
      5. phing report(这会报告我们的问题跟踪器升级到附带日志文件的问题)
      6. 您的问题的答案

        1. 是否要将bower_componentsvendor文件夹转移到实时系统,而不是再次执行bower installcomposer install

          • 我会选择bower installcomposer install,因为在您第一次使用缓存后的所有内容之后。每次下一次运行几乎是瞬时的,或者至少比通过ftp一次又一次地重新上传所有资产快得多。这可能会为您节省一些带宽,最重要的是时间。如果您选择对我的设置进行类似的设置,您可能希望避免在Jenkins实例上使用compiling js / css,因为您将在prod服务器上执行此操作。
        2. 执行实时促销时如何处理密码?

          • 不确定你在问什么?
        3. 结论

          设置主要取决于您的项目要求,您可用的资源(即vps,共享主机,git,ssh等)和您的发布过程。如您所见,我们的部署与您正在进行的部署略有不同。这并不是坏事也不好事 - 它只是满足我们的需要。如果你已经拥有的东西为你工作并解决了你所有的问题 - 你应该坚持下去并尝试优化它。如果你刚刚开始这是你应该最小心的事情:

          1. 完整 ... BACKUPS !备份生产文件系统很棒,但您还应备份数据库。在项目的开发过程中,您可能会拥有更改数据库的新功能。其中一些更改可能是向后不兼容的。因此,请确保备份所有内容,否则您最终可能会在没有数据库的情况下使用fs备份,因此无法回滚。

          2. 回滚 - 创建一个脚本,执行将项目回滚到先前版本的所有必要步骤。如果您承受了很大的压力,或者事情对时间敏感,您可能会无意中犯错误并打破备份或其他内容......因此请制作一个脚本来为您执行此操作。

          3. 在本地或测试计算机上测试部署过程,以确保在实际生产服务器上执行之前一切正常。

          4. 我希望这有助于您找到适合您的发布的最佳解决方案。部署过程。如果您碰巧找到了更好的解决方案,请将其作为答案发布 - 这肯定会有所帮助!