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

我想要一个Jenkins的master和slave设置来运行标准的Rails应用程序(PostgreSQL,sidekiq / redis,RSPec,capybara-webkit,一个通用的Rails栈)的specs,所以它也可以放在其他的机器上。 我有几台好的固定式机器收集灰尘。

  1. 任何人都可以共享一个可执行的dockerjenkins铁轨堆栈的例子?

  2. 什么阻止了这件事?

主从设置也是优选的。

前言:经过几天的上网,几个教程没有成功,我即将放弃项目。 我对docker,docker-machine,docker compose和volume有了一个基本的了解,我有一个简单的应用程序的dockerregistry。

我对Jenkins几乎一无所知,但是我已经在其他CI平台上相当广泛地使用了Docker。 所以我只会写这个。 根据您的应用程序的依赖性和怪癖,难度级别会有很大差异。 我会尝试给出一个相当普遍有用的提纲,然后离开处理应用程序的怪癖。

我不认为你所描述的问题应该要求你与docker-machine混在一起。 docker builddocker-compose应该是足够的。

首先,您需要为您的应用程序构build一个图像。 如果你的应用程序有一个全面的Gemfile ,而且没有太多的依赖关系与基础设施等有关(例如,文件生活在特定的地方,应用程序本身没有设置),那么你将有一个非常容易的时间。 如果没有,那么设置这些依赖将变得复杂。 这里有一个简单的Rails应用程序的Docker人员的指南 ,这将有助于你开始。

一旦图像被构build,将其推送到诸如Docker Hub的存储库。 login到Docker Hub并创build一个仓库,然后使用docker logindocker push <image-name>使图像可以被其他机器访问。 如果要在一台机器上构build图像并在其他机器上testing,这将非常重要。

一旦图像被构build并推送,在图像中运行应用程序的unit testing可能是值得放弃的工作。 这将让你提前失败,并避免浪费宝贵的执行时间在一个错误版本:)

接下来,您需要满足应用程序的外部依赖性,例如Redis和Postgres。 这是Docker Compose文件的来源。使用它来指定应用程序需要的所有服务,以及为了运行应用程序(例如RAILS_ENV )而设置的环境variables等。

您可能会发现提供一些非基本服务(如内存caching)的假货,或将其全部留出。 这将降低您的设置的复杂性,并且对您的CI系统要求不高。

从上面的链接指南也有一个例子撰写文件,但你需要扩大它。 最重要的是要注意的是,您提供服务的名称(例如来自指南的示例中的db )将用作映像中的主机名。 正如@tomwj所build议的那样,您可以在Docker Hub上search像postgres和Redis这样的常见图像,并且可以很容易地find它们。 您可能需要使用新的主机名来configuration新的Rails环境等,以便正确configuration所有服务主机名。

您将从头开始您的所有服务,包括您的数据库,因此您需要在每次运行时迁移和种子(以及任何其他数据存储)。 因为你从一个空的postgres实例开始,期望花一些时间。 作为快捷方式,您可以在迁移之前从以前的版本恢复备份。 无论如何,您需要做一些工作来使您的数据存储成形,以便您的testing结果为您提供有用的信息。

其中一个棘手的问题就是将Capybara运行在应用程序Docker镜像中,默认情况下它不会有任何X显示。 xvfb (X虚拟帧缓冲区)可以帮助解决这个问题。 我没有尝试过,但build立在像这样的图像顶部可能会有一些帮助。

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

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

总之,没有什么阻止它,虽然它是相当复杂的,并定制设置。 所以没有现成的解决scheme。

假设您的目标是让Jenkins构build,部署到Docker,然后在Dockerised环境中testingRails应用程序。

  1. 提供固定的机器,我build议使用Ansible Galaxyangular色。
    • 安装Jenkins
    • 安装Docker
    • 设置一个本地的Dockerregistry
  2. 设置Docker环境,调出多个容器的方法是使用docker compose,这将允许您使用公共Docker中心镜像调出DB,Redis,Rails等。
  3. 创build一个Jenkinspipe道
    • 构buildrails应用程序docker image这将包含rails应用程序。
    • 部署应用程序,这会从本地Dockerregistry中更新Docker群中的应用程序。
    • testing,针对正在运行的应用程序运行testing。

我抛开了Jenkins主/从configuration,因为如果你只在一台机器上运行,你可以增加执行器的数量。 例如,主人可以牺牲速度执行更多的工作。