如何在每个合并请求上通过Docker启动应用程序?
我运行jenkins和我的应用程序dockerized,即当我运行容器它暴露端口3000,我可以指向我的浏览器。 在每个Github PR上,我都想将git commit部署到某个正在运行的容器,并让Jenkins将其链接到可以访问的链接。 任何PR更新都会自动重新部署,并在PRclosures/解决它被取消。
我已经看过kubernetes和一个小农场主,但假设我只能部署到一个盒子,最简单的方法是什么?
有一个jenkins插件github-pullrequest可以解决你的问题。
先决条件:
- 你有一个jenkins服务器可以通过互联网访问,如果你想通过webhook触发你的构build。
- 你有一个GitHub API令牌来访问/pipe理你的Git仓库,它可以自己在设置中生成。
请按照指导configuration设置您的jenkins与github集成。
configuration完成后:
- 你可以通过PR事件触发你的构build: 打开 / 提交改变 / closures ,或具有特定模式的评论 。
- 您可以通过环境variables$ {GITHUB_PR_STATE}获得PR状态,以便您可以启动或停止特定值的容器。
- 您可以发布评论给PR,在启动docker容器后告诉您的Web服务的地址。
关于公开端口的多公关端口,你可以运行带有-p 3000
容器,它会自动在docker主机上暴露一个范围内的端口, docker port <container>
会显示特定的端口号,例如:
-
container1
的地址为<host>:32667
为PR1
-
container2
,地址为<host>:35989
用于PR2
我认为最简单的解决办法是创build两个不同的Jenkins Jobs,一个部署,另一个部署它。 这个触发器可以在GitHub中设置一个用于PR创build的webhooks,一个用于PRparsing。
正如Sylvain GIROD指出的那样:
只有一个盒子来运行应用程序,你需要改变公开的端口。 当一个GitHub PR发生时,你部署你的应用程序(docker run -p newport:containerport)。 如果您正在部署服务,则更改目标端口。
然后你把这个端口的链接发回给用户(email?)。
此外,您需要一些键值存储来记住为哪些用户创build了哪个窗格,以便您可以决定是否销毁旧的容器。
我也build议给服务一些时间来生活和定期清理陈旧的容器/服务。