Docker,Jenkins和Rails - 在典型的Rails堆栈上运行规范的设置

时间:2017-08-23 09:56:37

标签: ruby-on-rails docker jenkins

我想要一个Jenkins主从设置,用于在标准Rails应用程序(PostgreSQL,sidekiq / redis,RSPec,capybara-webkit,一个常见的Rails堆栈)上运行规范,使用docker,因此它也可以放在其他机器上。我有一些好的固定机器收集灰尘。

  1. 任何人都可以共享可执行的docker jenkins rails stack示例吗?

  2. 什么阻止这样做?

  3. 也适用于主从设置。

    序: 经过几天在线,在几个教程没有成功之后,我即将放弃项目。我对docker,docker-machine,docker compose和volumes有了基本的了解,我得到了几个简单应用程序的docker注册表。

2 个答案:

答案 0 :(得分:1)

我对Jenkins几乎一无所知,但我已经在其他CI平台上广泛使用了Docker。所以我只是写下这个。根据您应用的依赖性和怪癖,难度会有很大差异。我会尝试提供一个非常有用的大纲,并将处理应用程序的怪癖留给您。

我不认为您描述的问题应该要求您使用docker-machine。 <{1}}和docker build就足够了。

首先,您需要为您的应用程序构建一个图像。如果您的应用程序具有全面的docker-compose,并且没有太多与基础架构等相关的依赖关系(例如,生活在应用程序没有为自己设置的特定位置的文件),那么您将拥有一个很容易的时间。如果没有,那么设置这些依赖项将变得复杂。这是来自Docker人员的一个guide的简单Rails应用程序,可帮助您入门。

构建映像后,将其推送到Docker Hub等存储库。登录Docker Hub并创建一个repo,然后使用Gemfiledocker login使其他计算机可以访问该图像。如果您想在一台计算机上构建映像并在其他计算机上进行测试,这将非常重要。

一旦构建并推送图像,在图像内运行应用程序的单元测试可能是值得的。这会让你早日失败并避免浪费宝贵的执行时间在一个错误的修订上:)

接下来,您需要满足应用程序的外部依赖关系,例如Redis和postgres。这就是Docker Compose文件的用武之地。使用它来指定应用程序所需的所有服务,以及为运行应用程序进行测试而设置的环境变量等(例如docker push <image-name>)。

您可能会发现提供某些非必要服务(例如内存中缓存)的假货,或者完全将它们排除在外是有用的。这将降低您的设置的复杂性,并降低对CI系统的要求。

上面链接中的指南也有一个示例撰写文件,但您需要对其进行扩展。需要注意的最重要的事情是,您提供服务的名称(例如指南中示例中的RAILS_ENV)将用作图像中的主机名。正如@tomwj建议的那样,你可以在Docker Hub上搜索像postgres和Redis这样的常见图像,并且很容易找到它们。您可能需要使用新的主机名等配置新的Rails环境,以便正确配置所有服务主机名。

您在这里从头开始创建所有服务,包括您的数据库,因此您需要在每次运行时迁移和播种它(以及任何其他数据存储)。因为您从一个空的postgres实例开始,所以需要花一些时间。作为一种快捷方式,您可以在迁移之前从先前版本还原备份。在任何情况下,您都需要做一些工作才能使您的数据存储成型,以便您的测试结果为您提供有用的信息。

其中一个棘手的问题是让Capybara在你的应用程序Docker镜像中运行,默认情况下它不会有任何X显示。 db(X虚拟帧缓冲区)可以帮助解决这个问题。我还没有尝试过,但建立像this one之类的图像可能会有所帮助。

祝你好运。如果您有时间坚持下去,它将真正帮助您了解您的应用程序为了工作而真正依赖的内容。它确实对我和我的团队有用!

答案 1 :(得分:0)

解决这个问题需要解决很多问题,这是如何开始以及在哪里寻求帮助的指南。

总之,没有什么能阻止它,尽管设置相当复杂和定制。因此没有现成的解决方案。

假设您的目标是构建Jenkins,部署到Docker,然后在Dockerised环境中测试Rails应用程序。

  1. 配置固定机器,我建议使用Ansible Galaxy个角色。
  2. 设置Docker环境,提出多个容器的方法是使用docker compose这将允许你使用公共docker hub映像调出DB,redis,Rails等。
  3. 创建Jenkins pipeline
    • Build the rails app docker image 这将包含rails app。
    • 部署应用程序,从本地Docker注册表更新Docker swarm中的应用程序。
    • 测试,对正在运行的应用程序运行测试。
  4. 我遗漏了Jenkins主/从配置,因为如果你只在一台机器上运行,你可以增加执行器的数量。例如。主人可以牺牲速度来执行更多的工作。