通过 Jenkins 在所有 AWS Beanstalk 实例上部署新的 PHP 代码并运行 Composer?

Posted

技术标签:

【中文标题】通过 Jenkins 在所有 AWS Beanstalk 实例上部署新的 PHP 代码并运行 Composer?【英文标题】:Deploying new PHP code and run composer on all AWS Beanstalk instances via Jenkins? 【发布时间】:2016-08-03 12:21:36 【问题描述】:

我是 Jenkins 的新手,所以我有一个关于部署的问题。我的网站通过 Docker(自动缩放)在 Amazon Beanstalk 上运行。目前有 3 个正在运行的实例,我的 php 应用程序位于 /var/www

我想做的是每当我创建git push(假设测试通过)时,我想用新的 PHP 代码自动更新每个正在运行的 EC2 实例(由 Beanstalk 启动),然后运行 ​​composer install它。

现在我看到人们在 Jenkins 上使用的命令更新服务器类似于 rsync 然后 ssh 进入服务器以运行 composer update

由于我没有创建实例(Beanstalk 是),所以我不知道我的实例的 IP 地址,所以我不能将它放在我的 Jenkins 工作中(就像教程一样)。

所以我的问题是:我的 Jenkins 如何在由 Amazon Beanstalk 启动的已运行实例(以及任何新创建的实例)上触发代码更新和 composer install

这样做的正确方法是什么?

【问题讨论】:

【参考方案1】:

我使用 CodePipeline 来用我的 rails 应用程序做这件事。

CodePipeline 是一项免费服务,可控制您的部署,我仅使用 git push 部署和执行构建和测试。

创建一个使用您的 git 存储库作为源的管道。然后在构建提供者下的构建阶段选择“添加 Jenkins”,输入服务器 URL 和项目名称。接下来为 Beta 选择 AWS ElasticBeanstalk 作为部署提供商,选择您希望 ElasticBeanstalk 部署到的应用程序和环境,然后您就可以设置好了。

您正在告诉 CodePipeline 监视 git 存储库的特定分支以进行更改。当它注意到更改时,您希望它执行管道。当 CP 看到更改时,它会去 github,获取代码,构建包并通过管道引导包。在构建阶段,它会将包传递给 Jenkins,让 Jenkins 做这件事。当 Jenkins 将成功消息发送回 CodePipeline 时,CodePipeline 将执行管道中的下一步。在这种情况下,您告诉 CodePipeline 您希望它调用 ElasticBeanstalk 来部署您的应用程序。所以它将包传递给 ElasticBeanstalk 并说“做你的事”。哪个 EB 可以。

所以我们现在让 Jenkins 触发您的代码更新,我们现在只需在所有实例上运行 composer install,然后进行部署。您可以通过在 .ebextensions 目录中创建一个 .config 文件来执行此操作。您将像这样创建一个容器命令:

#.ebextensions/composer.config

container_commands:
  01_first_line:
    command: cd /var/www
  02_second_line
    command: composer install

容器命令将在服务器启动后、应用程序版本提取后、部署前执行。作为一名 Rubyist,我不确定 composer install 是否需要在部署前、部署后执行,或者是否无关紧要。您可以在此处http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#linux-container-commands 找到有关在您的服务器上自定义 Linux 软件的 AWS 文档,其中之一将允许您在适当的时间运行 composer install

【讨论】:

感谢您让它如此易于理解。关于从代码管道部署到 EB 的三个问题。这是怎么发生的? Q1) 我正在使用自定义 Docker 映像(带有 PHP 代码的 zip 文件、Dockerfile 文件和 .ebextensions 目录)在 EB 上部署我的站点。 Q2) 当git push 发生时,它会终止我正在运行的实例并启动新实例吗? Q3) 有停机时间吗? 我的荣幸...请不要忘记选择它作为答案:)。回答您的问题 1) 是一个声明,没有问题,2) 不,EB 部署到相同的运行实例,3) 没有停机时间。

以上是关于通过 Jenkins 在所有 AWS Beanstalk 实例上部署新的 PHP 代码并运行 Composer?的主要内容,如果未能解决你的问题,请参考以下文章

来自 AWS ECR 的 Jenkins 管道 Docker 代理

使用 AWS CodePipeline 在 Jenkins 中构建多个 Gradle 项目

从 jenkins 文件动态更新 AWS Task definition.json 文件

在 Jenkins 中构建成功,但 AWS-Codebuild 给出插件错误

AWS Lambda 配合Jenkins实现自动化持续部署

如何将 AWS 凭证与 Jenkins 一起使用以部署到 Elastic Beanstalk?