如何在每个 Pull Request 上通过 Docker 启动应用程序?

Posted

技术标签:

【中文标题】如何在每个 Pull Request 上通过 Docker 启动应用程序?【英文标题】:How to launch an app via Docker on every Pull Request? 【发布时间】:2017-07-21 07:36:40 【问题描述】:

我运行 Jenkins,我的应用程序是 dockerized,即当我运行容器时,它会公开端口 3000,我可以将浏览器指向那里。在每个 Github PR 上,我想将该 git commit 部署到某个正在运行的容器中,并让 Jenkins 将可以访问它的链接发回 PR。在任何 PR 更新时,它都会自动重新部署,而在 PR 关闭/解决时,它会被拆除。

我看过 kubernetes 和一个小牧场主,但假设我只能部署到一个盒子,那么最简单的方法是什么?

【问题讨论】:

此设置的超级简单替代方案是 CircleCi 或 Travis,因为它们为每个构建(每个 PR)专用虚拟机,然后在构建机器被销毁后。 Jenkins 是我们使用 b/c 的灵活性。我们不会切换。 我不太了解 jenkins,但如果有“on PR”脚本,您可以编写一个脚本,从源 repo/branch 构建图像并在另一个端口上启动它(即3001)。在新的 PR 上,它会检查容器是否存在并在新构建之前将其删除... 是的,Gitlab 有审查应用程序,这是我试图重新创建的。 【参考方案1】:

有一个jenkins插件github-pullrequest可以解决你的问题。

先决条件:

    如果您想通过 webhook 触发构建,您可以通过 Internet 访问 jenkins 服务器。 您有一个 github API 令牌来访问/管理您的 git 存储库,它可以在 settings 中自己生成。

请按照指南 configuration 设置您的 jenkins 与 github 的集成。

配置后:

您可以通过 PR 事件触发您的构建:opened/commit changed/close,或用特定模式评论强>。 您可以通过环境变量 $GITHUB_PR_STATE 获取 PR 状态,因此您可以根据特定值启动或停止容器。 您可以在启动 docker 容器后向 PR 发布评论以告知您的 Web 服务的地址。

关于多 PR 暴露 cotainer 的端口,你可以用-p 3000 运行容器,它会在 docker 主机上自动暴露一个范围内的端口,docker port <container> 会显示具体的端口号,例如:

container1 地址为<host>:32667PR1 container2 地址为<host>:35989PR2

【讨论】:

【参考方案2】:

正如 Sylvain GIROD 指出的那样:

只有一个盒子可以运行应用程序,您需要更改公开的端口。当 GitHub PR 发生时,您部署您的应用程序(docker run -p newport:containerport)。如果您正在部署服务,则更改目标端口。

然后你将这个端口的链接发回给用户(电子邮件?)。

此外,您需要一些键值存储来记住为哪些用户创建了哪个 pod,以便您可以决定新 PR 是否销毁旧容器。

我还建议给服务一段时间,并定期清理陈旧的容器/服务。

【讨论】:

【参考方案3】:

我认为最简单的解决方案是创建两个不同的 Jenkins Jobs,一个负责部署,另一个负责核对它。可以在 GitHub 中设置 2 个 webhook,一个用于 PR 创建,一个用于 PR 解析。

【讨论】:

以上是关于如何在每个 Pull Request 上通过 Docker 启动应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

Pull Request的正确打开方式(如何在GitHub上贡献开源项目)

如何将 Bitbucket 的 pull request 签出到本地 review

pull request的一些思考

我的Github之Pull request的使用

我的Github之Pull request的使用

Git - Pull Request工作流