10

我想部署一个基于 Jenkins 的持续集成平台。由于我有各种各样的项目(PHP / Symfony、node、angular,……),并且我希望这些测试在本地和 Jenkins 上运行,我正在考虑使用 Dockers 容器。

我的目标是:

  • 在 Github / Gitlab 上打开了一个合并请求
  • 一个 webhook 通知 Jenkins 合并请求
  • Jenkins 拉取 repo,构建容器并运行 shell 脚本来执行测试
  • 测试完成后,Jenkins 从其中一个容器中检索结果(通过共享卷)并处理结果。

我不希望詹金斯在一个容器中。

通过这种过程,我希望能够非常轻松地在每台开发人员机器上运行测试,例如 adocker-composer up然后在其中一个容器中运行./tests all

我对詹金斯不是很熟悉。我已经阅读了很多文档,但其中大多数建议事先为每种项目定义 Jenkins slave。我希望一切都尽可能动态,并尽可能减少对 Jenkins 的配置。

如果您曾经实现过类似的东西,我将不胜感激您的测试过程的描述。如果您认为我的目标是不可能的,如果您能向我解释原因,我也将不胜感激。

4

1 回答 1

4

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

基础是派生的 Docker 映像,它通过添加 Docker 命令行客户端来扩展jenkins:2.x映像。Jenkins 作为一个容器启动,它的主文件夹(例如从 Docker 主机安装的 /var/jenkins_home 文件夹)和 Docker 套接字文件能够从 Jenkins 构建作业启动 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 version”输出未显示

docker 守护进程是否在此主机上运行?

一切都很好。

在您的构建作业中,您可以配置上面提到的过程。让 Jenkins 简单地检查存储库。存储库应包含您的构建和测试脚本。

使用带有 shell 执行的自由式构建作业。shell 执行可能如下所示:

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

此命令只是使用来自 jenkins 的卷启动一个新容器(以构建和/或测​​试您的项目)。这意味着克隆的存储库将在 $WORKSPACE 下可用。因此,如果您运行“bash $WORKSPACE/<pathToYourProjectWithinTheGitRepository>/build.sh”,您的项目将在“yourImageToBuildAndTestTheProject”的容器中构建。运行后,您可以启动其他容器进行集成测试,或者通过将其安装在派生的 Jenkins 映像上,将其与“docker-compose”结合使用。

优点是您在 Jenkins 中的配置最少 - 只需要用于克隆 GIT 存储库的 SCM 配置。由于每个 Jenkins 作业直接使用 Docker 客户端,您可以为每个项目使用一个或 Docker 映像来构建和/或测​​试,而无需进一步的 Jenkins 配置。

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

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

--volumes-from jenkins

自动将工作空间和配置文件添加到您的每个构建作业。

于 2017-02-12T13:50:29.490 回答