我有一个基于生产环境中运行的官方node
Docker映像的NodeJS映像。
如何使NodeJS服务器保持最新状态?
npm
软件包保持最新状态?答案 0 :(得分:0)
您可以使用jenkins安排按所需间隔创建nodejs图像的作业。
处理docker映像的软件包和更新的最佳方法是使用所有更新创建单独的标签。所有新更新的单独标签使您可以在发生向后兼容性问题时进行回滚。
使用此新映像创建您的应用程序映像,如果要实现连续交付,请始终运行测试套件。
答案 1 :(得分:0)
[UPDATE]-基于OP的评论
要从Docker获取最新图像,然后通过以下过程进行部署,可以使用DockerHub API(基于Registry HTTP API)来查询图像标签。然后找到您使用的图像(“高山”,“超薄”或“任意”)并获取最新的标签。之后,运行您的测试管道并将该标签注册为部署候选人
TOKEN=//curl https://hub.docker.com/v2/users/login with credentials
REPO="node"
USERNAME="MyDockerHubUsername"
TAGS=$(curl -H "Authorization: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/${USERNAME}/${REPO}/tags/)
您的问题看似简单。实际上,保持生产图像为最新所需要的不仅仅是在一定的间隔上更新图像。要获得图像的真实CI / CD,您每次需要更新时都需要执行一系列步骤。
一个成功的管道(Jenkins,Bamboo,CircleCi,CodePipeline等)将包含所有这些步骤。并且,理想会在每次提交时运行:
静态分析
首先,使用短毛绒(eslint)和一些代码覆盖率指标来分析代码。我不会说什么是可接受的覆盖率水平,因为这很大程度上是基于意见的,但是至少应该有一定的覆盖率。
测试(单位)
使用Karma / Mocha / Cucumber之类的代码来运行单元测试。
构建
现在您可以构建Docker映像了。我更喜欢Hashicorp's Packer之类的工具来构建图像。 由于我假设您正在容器中运行节点服务器(Express或类似的东西),因此在此阶段之后,您可能还想启动容器并运行一些本地验收测试。
注册
接受容器的本地测试后,使用您使用的任何服务(ECR,Dockerhub,Nexus)注册映像,并以有意义的方式对其进行标记。
部署
现在您有了一个可以正常运行的容器,您需要将其部署到业务流程环境中。这可能是Kubernetes,Docker Swarm,AWS ECS或其他。但是,重要的是您还不能向该容器提供流量。
测试(集成)
随着容器在有意义的测试环境(非生产,阶段,测试等)中运行,您现在可以对其进行集成测试。这些将检查以确保它可以与数据层连接,或者会查找到500/400错误的大发生率。
别忘了-安全性也应该始终是测试的一部分。这是个好地方
切换
现在,您已经在非生产环境中进行了测试,则可以将其部署到生产环境中,也可以将路由切换到刚刚针对其进行测试的常规容器。在这里,您应该决定使用绿色/蓝色部署还是A / B部署。如果为蓝色/绿色,则开始将所有流量路由到新容器。如果是A / B,请根据一定比例设置路由策略。无论使用哪种方式,请确保您对哪种故障率被认为是可以接受的都有一个了解。监视新部署是否存在任何故障(500个错误代码或您认为重要的错误),并确保在出现问题时能够快速回滚到旧容器。
接受
经过足够时间而没有任何缺陷之后,您可以接受新容器作为稳定的候选对象。重新标记图像,或将图像标签保存在带有“稳定”符号的位置,然后使新的实际图像启动。
频率
现在回答“多久一次”。频率是良好迭代开发的副作用。如果您的代码更改受到大小和范围的限制,那么只要代码通过测试,就应该对启动很有信心。因此,通过强大的DevOps实践,只要代码提交到仓库,您就可以部署新映像。一天可能是一次,两次或五十次。这个数字最终变得任意。
保持NPM软件包为最新版本
这取决于您使用的软件包。对于公共软件包,您可能需要限制为一个版本。然后创建管道,以在沙盒环境中测试这些软件包的某些发行版,然后再允许它们进入您的环境。
对于私有软件包,请确保您也为每个私有软件包都有一个管道。在使用npm或您的私有存储库(例如Nexus)注册新代码之前,管道应该运行分析,测试和其他重要任务。