将新版本部署到容器

时间:2016-02-04 11:04:16

标签: git amazon-web-services docker ansible go-cd

我在AWS上运行CoreOS群集。 在AWS中的每个实例上,我运行一个docker容器。 例如,我有2个名为API的实例,它使用我们最新的软件版本运行docker镜像。

我还有6个proccessors实例,它们使用最新版本运行另一个docker镜像。

我想更新群集中的每个容器,所以今天我使用带有管道的GoCD来激活一个完成所有工作的ansible-playbook。 管道监听github项目,一旦我将更改推送到该分支,它就会激活管道。

它构建API和处理器新的docker镜像, 它将新更新的图像上传到dockerhub, 然后它连接到AWS实例并为刚刚上传的映像发出docker pull, 最终,它会使用新的拉动图像启动容器。

这是我目前控制版本部署的方式。

问题是:

  1. 需要很长时间
  2. 它有时因各种原因而失败
  3. 它不灵活(我需要硬编码特定的分支来监听github并从中提取文件)
  4. 您还有其他建议\工具可以完成这项工作吗? 有时我需要更新3台机器,有时需要7台机器,我需要可以扩展的东西。

2 个答案:

答案 0 :(得分:1)

我不在我的环境中使用git,但是使用了提交后的SVN挂钩,这些挂钩启动了Jenkins部署工作流程。添加Jenkins Build Pipeline Plugin,这样您就可以从失败中恢复,而不是从头开始重新启动。也就是说,检查GoCD是否支持这种事情,如果不需要,则切换工具没有意义。

我建议进行以下更改:

  1. 将ansible playbook分解为部署工具中的不连续步骤。这样您就可以在更接近故障的情况下重新开始,浪费更少的时间。

  2. 在您的管道中设置通知以通知您失败,并在最后通知您一个通知您成功的通知。没有必要照看进度条......快速变得令人沮丧

  3. 开始量化流程中瓶颈的位置。您可以一步一步地修复一个缓慢的过程,确定最先解决的最简单的事情。

答案 1 :(得分:0)

从问题#3开始,您可能想要考虑是否要从各个分支发布代码。作为持续交付工具的GoCD最适合基于主干的开发,即始终从主数据库发布。

您不希望直接在每次推送到主干上部署到生产。您可以在Go中进行手动批准步骤,或者使用其他组件(即生产中运行的版本,或者测试和手动批准)运行一组自动化测试。

关于问题#2,您可能希望在GoCD中有更多步骤,以便您可以按照Go Web UI中的流程,获取有关失败的电子邮件通知,并从失败的点恢复等。

关于#1,你必须告诉我们什么是慢,以及你对时间有什么样的期望。 GoCD在开始使用时并不快速闪电。我认为它每分钟轮询GIT回购一次,并且空闲代理在某个时间间隔与服务器签入以查看是否有工作要做。这基本上是一个固定的延迟。它不会因为你有100台主机升级而变慢,除非你为每个实例制作一个GoCD工作(这可能不是一个好主意)。

这听起来像是一个码头工作者,而码头工人群可能是你使用Ansible的工作的更好工具。