在Docker容器中运行Jenkinstesting从代码库中的dockerfile构build

我想部署一个基于Jenkins的持续集成平台。 因为我有各种各样的项目(PHP / Symfony,node,angular,…),而且我想要这些testing在本地和Jenkins上运行,所以我在考虑使用Dockers容器。

我正在瞄准的过程是:

  • 合并请求在Github / Gitlab上打开
  • webhook通知Jenkins该合并请求
  • jenkins拉回购,build立容器并运行一个shell脚本来执行testing
  • 一旦testing完成,Jenkins从其中一个容器(通过共享卷)检索结果并处理结果。

我不希望jenkins在一个容器里。

有了这样的过程,我希望能够非常容易地在每个开发人员机器上运行诸如docker-composer up者之类的testing,然后在容器之一中./tests all

我不太熟悉jenkins。 我已经阅读了很多文档,但是他们中的大多数都build议事先为每种types的项目定义Jenkins的奴隶。 我希望一切都尽可能dynamic,并尽可能减lessjenkins的configuration。

如果您曾经实施过类似的东西,我将不胜感激您的testing过程的描述。 如果你认为我所瞄准的是不可能的,那么我也很感激你能向我解释为什么。

我build议的设置是Docker中的Docker。

基础是派生的Docker镜像,通过添加一个Docker命令行客户端来扩展jenkins:2.x镜像。 Jenkins作为一个容器与其主文件夹(一个文件夹例如/ var / jenkins_home从Docker主机上挂载)和Docker套接字文件启动,以便能够从Jenkins构build作业启动Docker容器。

 docker run -d --name jenkins -v /var/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock ... <yourDerivedJenkinsImage> 

要检查,如果这个设置正在工作,只需在启动Jenkins容器后执行以下命令:

 docker exec jenkins docker version 

如果“docker版本”输出不显示:

docker守护程序是否在这个主机上运行?

每个人都好。

在你的构build工作中,你可以configuration你上面提到的过程。 让jenkins简单地检查存储库。 存储库应该包含你的构build和testing脚本。

使用shell执行的自由式构build作业。 一个shell执行可能看起来像这样:

 docker run --rm --volumes-from jenkins <yourImageToBuildAndTestTheProject> bash $WORKSPACE/<pathToYourProjectWithinTheGitRepository>/build.sh 

这个命令简单地启动一个新的容器(用来build立和/或testing你的项目)和来自jenkins的卷。 这意味着克隆的存储库将在$ WORKSPACE下可用。 所以如果你运行“bash $ WORKSPACE / <pathToYourProjectWithinTheGitRepository> /build.sh”,你的项目将被build在“yourImageToBuildAndTestTheProject”的容器中。 运行这个之后,你可以启动其他容器进行集成testing,或者将其与“docker-compose”结合,将其安装在派生的Jenkins图像上。

优点是Jenkins中最小的configuration,只需要用于克隆GIT存储库的SCMconfiguration。 由于每个Jenkins作业直接使用Docker客户端,因此您可以使用每个项目或Docker图像来构build和/或测​​试, 而不需要进一步的Jenkinsconfiguration。

如果您需要其他configuration,例如SSH密钥或Maven设置,只需将它们放在Docker主机上,并使用其他卷(包含这些configuration文件)启动Jenkins容器。

在构build作业的shell执行中使用此Docker选项:

 --volumes-from jenkins 

自动将工作区和configuration文件添加到每个构build作业。