在2018年10月份发布的Nexus 3.14版中提供了CleanUp功能,这对于使用Nexus的用户是一个原本早就该提供的功能,在这个功能中提供了对于长时间不使用的二进制制品的清除策略。这篇文章主要就此项功能的使用方式进行说明。
在Nexus3.14中提供的CleanUp功能,主要针对不断增长的二进制制品带来多方面的影响提供的解决方案。
二进制制品是编译之后所生成的中间产物,一般每次编译都会形成一个新的二进制制品,而做的彻底的项目可能即使非代码变更也会导致重新编译生成新的部署制品。再加上不同的环境有时可能会使用不同的制品,另外企业内部也会存在多个项目,而制品则是和项目中的应用个数相关的,随着部署频度的增加,这个数量的叠加是非常客观的,在稍微大一点的开发中心或者项目中,如果不认真考虑二进制制品的清除策略,很快问题就会来找到你。越来越多的二进制制品,对于备份恢复显然都需要更长的时间和磁盘使用量,都会给运维造成影响。使用docker镜像方式启动Nexus的3.16.1版本的服务。docker-compose.yml信息如下所示:
version: '2' services: # Repository service: Nexus nexus: image: sonatype/nexus3:3.16.1 ports: - "32004:8081" volumes: - /home/local/nexus/data/:/nexus-data environment: - JAVA_MAX_MEN=512m - JAVA_MIN_MEN=128m restart: "no"二进制制品在DevOps实践中具有一定的特殊性,其中之一体现在此二进制制品与版本的关联,而落到实际的运维需要考虑的则往往是如下的观点来进行清除策略的设定
根据是否还有人或者应用在使用此二进制制品的版本来设定清除策略根据此版本最近更新的时间来设定清除策略落到实际的二进制制品私库中只需要有如下机制即可完成清除的策略
二进制制品创建、更新时间的记录二进制制品下载的记录而需要考虑到的另外一个因素则是需要结合整个持续集成和持续部署来考虑,二进制制品私库的引入是很多企业在做DevOps实践中的很小的一个环节,作为二进制制品库来说,这个环节起到的作用往往只是中转而不是终点和目的,比如如果容器化的应用的情况下,Java应用生成的二进制制品jar文件最终还会在镜像私库中同样存在,同样一份文件,两处都存在,谁主谁辅,都是需要考虑的。如果将二进制制品作为临时性的使用角度来考虑,定期清除即可完成需求。但是如果二进制制品为主,而镜像私库为辅的情况下,往往镜像私库会小一点,如果需要回退至某个版本时,则需要从二进制制品库中寻到此版本文件,删除的策略必须保证能够满足项目回退的要求,清除策略将会复杂很多,而现有的Nexus的机制能否实现也是需要考虑的。(实际上这个功能就是既有文件的删除,虽然这是一个看似非常简单的功能,而在Nexus3中,直到2018年10月份才添加进去,而且作为3.14版本的一个重要特性发布出来的。)
在Nexus上可以通过如下步骤来创建相关的清理策略(本文使用Nexus3.16作为示例环境进行介绍)
确认一下此Nexus环境中的blob的信息,在执行清理策略之前,磁盘使用状况如下所示
使用Admin账户登录,在Repository中选择Cleanup Policies即可创建或者确认清除策略。按照下表设定进行Cleanup 策略的创建清除策略,raw文件类型如果是1天以上的情况会被删除。
类型设定值说明NameRawFileDailyCleanup策略名称Format设定Cleanup策略的适用对象文件可选类型参看 <<Format可选择类型>>Notes备注信息非必填选项Published Before1存放一天以上的raw文件会被作为清除对象Last Downloaded Before-根据最新的下载情况确认清除对象的策略设定的情况 <<Format可选择类型>> Format可选择的类型如下所示在实际执行清除之前可以通过使用preview功能确认哪些文件是清除对象, 同时确认一下清除策略是否按照预想进行文件的删除。比如这里事前上传一个一天之前的raw类型的文件,按照步骤1中设定的策略,此文件应该被删除,而实际情况也是正确的,详细如下图所示
对制品库进行创建和修改的时候,可以指定清除策略,比如这里将如下的一个raw类型的制品库与刚刚创建的清除策略进行关联
上述的执行策略在执行层面,Nexus是通过Task来完成的,上述的步骤正常的话,此时这时可以看到Nexus的Task中已经创建了一个名为Cleanup service的task,如果没有的话,重启服务一般则可以看到此Task的存在。 缺省状态下,Nexus会创建一个1点执行的task,详细信息如下所示
任务可以通过手动执行,也可以等待程序自动按照设定执行,比如此处会等到1点时自动执行,可以看到此时的状态为Waiting 执行之前的文件确认 手动执行任务 执行完毕之后再次确认,可以看到在preview中列出的文件已经被删除
虽然在上一步骤中进行了文件的删除,但是在Nexus中直到你执行Compact blob store的任务之前,并没有实际的释放空间,可以从blob的磁盘使用状况可以看到,虽然在上一步骤中删除了文件,但是空间并没有得到实际的释放(演示示例的blob在default中,其和执行删除之前的Total size没有任何变化)
这里创建一个Compact blob store的任务 为了演示的方便,设定成手工执行,在实际环境中可根据自己的需要进行执行时间的设定。然后手动执行此任务 此时再确认磁盘使用率,则可以看到删除的效果已经能够体现出来的,磁盘空间真正得到了释放。Total Size变成了3.8M
早期版本中并没有Cleanup的功能,如果希望使用此功能,则直接升级镜像即可(前提是/nexus-data的卷挂出来了)。按照如下步骤即可使用此版本功能
请注意,如果旧版的容器中有手动设定,请自行备份
使用挂载出来的数据卷启动新版Nexus
本文示例中删除的二进制制品即为在旧版(3.2.1)中生成并上传,而删除的动作则是按章上述步骤进行,相同的使用场景可以进行参照。
https://blog.sonatype.com/keeping-your-nexus-repositories-clean-just-got-easier https://help.sonatype.com/repomanager3/cleanup-policies#CleanupPolicies-CleanupTask
淼叔 认证博客专家 神经网络 TensorFlow NLP 资深架构师,PMP、OCP、CSM、HPE University讲师,EXIN DevOps Professional与DevOps Master认证讲师,曾担任HPE GD China DevOps & Agile Leader,帮助企业级客户提供DevOps咨询培训以及实施指导。熟悉通信和金融领域,有超过十年金融外汇行业的架构设计、开发、维护经验,在十几年的IT从业生涯中拥有了软件开发设计领域接近全生命周期的经验和知识积累,著有企业级DevOps技术与工具实战。