实习番外篇:解决C语言使用Makefile无法实现更好的持续集成问题
工作中遇见的一个问题,提供项目源代码的情况下,希望对项目进行持续集成,达到一个C项目增量编译的效果。原本第一天是想通过模拟Makefile执行步骤来实现整个过程的,但是事实上发现整个Makefile显得无规律可寻,并且分布于项目的每个文件夹中,无法做到很好的控制。经过一段时间的讨论想出一个好办法,即将编译前的项目和编译后的项目进行对比,将项目中的编译过程中增加、删除和修改的文件进行记录,之后再根据实际情况对项目进行整体打包,这个便是整个过程中的总体思路。
我的工作步骤为:在项目执行之前对项目中的所有文件——从项目的根路径出发进行记录放在一个text1.txt文件中,而后项目执行完之后再次使用该方法将项目中所有文件记录于text2.txt之中。text1.txt与text2.txt两个文件记录的是项目中所有文件的绝对路径和文件内容的MD5值(MD5值后期优化思路:将绝对路径也放入文件内容之中,这样子相同内容的文件其MD5值也会不相同,更好的应用项目)。通过比对两个文件中的信息可以得出Makefile执行前后文件的增加、删除与修改情况,比对方法如下:
text1中有多行项目文件信息,第一列为项目中所有文件的绝对路径,第二列为相对应的文件MD5值;text2同理。 增加文件:当text2中出现了text1中所没有的文件时(仅仅通过比对增加的绝对路径就ok),那么我们认为该文件为执行Makefile后增加的文件,并将其记录于增加文件的记录之中; 删除文件:与增加文件恰好相反,当text1中出现了text2中没有的文件时(仅仅通过比对增加的绝对路径就ok),那么我们认为该文件为执行Makefile后删除的文件,并将其记录于删除文件的记录之中; 修改文件:修改文件是当text2中出现的路径如果在text1中也存在,如果二者的文件MD5值是相同的,我们认为是同一个文件,该文件是没有变化的;如果二者的文件MD5值是不同的,我们认为不是同一文件,即是修改文件。
因为项目最后的要求是将编译过程中的文件进行增量打包,所以我们要将增加文件和修改文件按照对应项目的相对路径放置于项目的文件夹中,我们可以直接按照记录进行操作即可。最后上传该打包文件时,增加部分的文件可以正常上传,修改文件本系统中是能够直接进行替换(如果无法替换就按照修改文件的路径先将所有修改文件删除,而后再统一上传即可)。对于上传文件初步的设想是读出路径并直接在云端执行shell脚本进行删除。
以上即为项目的总体思路,上述过程均通过python脚本实现。python脚本的调用及替换等操作为已有系统使用shell脚本进行调用,剩余部分工作为我的同事进行协作完成。
以上思想在具体执行过程中还遇见项目具体问题,部分已经解决,部分因为时间原因暂时使用硬编码的方式解决,二期项目将会通过配置文件的方式来解决;
问题一:项目执行过程中仅仅要求记录制定文件目录下的文件变化,对于剩余部分文件目录变化不关心
我们在得到增加和修改的文件路径信息之后,首先对其进行一个预处理。通过硬编码的方式将我们所需的路径筛选出来,而后再按照我们要求的步骤进行处理。 后期的优化方案为:通过类似于搜索引擎的Robots.txt协议的方式,将需要的目录和不需要的目录标明,同时选择默认目录的处理方法,最后通过Python脚本的逻辑实现来完成文件筛选操作
问题二:开发环境,测试环境及生产环境的环境变量配置是不同的,每次都需要单独上传,这个应该如何处理?
对于这部分要求,他们环境变量编译前后是不会发生变化的。我们需要在整个项目将增量取出后,再单独处理这部分文件,将其放置于文件夹之中。
实习番外篇:解决C语言使用Makefile无法实现更好的持续集成问题的更多相关文章
- (八)羽夏看C语言——C番外篇
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...
- (九)羽夏看C语言——C++番外篇
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...
- 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- 给深度学习入门者的Python快速教程 - 番外篇之Python-OpenCV
这次博客园的排版彻底残了..高清版请移步: https://zhuanlan.zhihu.com/p/24425116 本篇是前面两篇教程: 给深度学习入门者的Python快速教程 - 基础篇 给深度 ...
- 可视化(番外篇)——在Eclipse RCP中玩转OpenGL
最近在看有关Eclipse RCP方面的东西,鉴于Gephi是使用opengl作为绘图引擎,所以,萌生了在Eclipse RCP下添加画布,使用opengl绘图的想法,网上有博文详细介绍这方面的内容, ...
- 番外篇 之 C#委托
对于上一节 番外篇之C#多线程的反思 反思一: Thread th = new Thread(参数); ////参数的总结 ////首先,第一情况,对于 Thread th = new Threa ...
- [置顶] think in java interview番外篇-谈程序员如何修练英语
一.程序员对英语能力的重视度和能力要求应该是在各行各业中排在比较靠前的 这样说吧,英语程度的好坏直接影响着一个程序员的编程.开发.创新能力. 道理很简单: 1. 计算机和软件是用英语创造出来的 2. ...
- 番外篇1:在Windows环境中安装JDK
他山之石,可以攻玉!欢迎关注我的微信公众号 本文作为构建第一个Java程序的番外篇一,跟大家探讨下在Windows下怎么安装JDK.由于本人没有Mac,因此如果是Mac的同学,请自行百度哦! 读前预览 ...
- [uboot] (番外篇)uboot之fdt介绍
http://blog.csdn.net/ooonebook/article/details/53206623 以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为 ...
随机推荐
- 利用sshtunnel实现跳板机的效果[嵌套ssh实现]
with SSHTunnelForwarder ( ssh_address_or_host = (conf.server_ip,conf.server_port), ssh_username=conf ...
- mysql8 公用表表达式CTE的使用
公用表表达式CTE就是命名的临时结果集,作用范围是当前语句. 说白点你可以理解成一个可以复用的子查询,当然跟子查询还是有点区别的,CTE可以引用其他CTE,但子查询不能引用其他子查询. 一.cte的语 ...
- go语言使用go-sciter创建桌面应用(六) Element元素操作和Event事件响应
详细的文档请看下面两个链接: https://sciter.com/docs/content/sciter/Element.htm https://sciter.com/docs/content/sc ...
- Task.WaitAll代替WaitHandle.WaitAll
Task.Waitall阻塞了当前线程直到全完.whenall开启个新监控线程去判读括号里的所有线程执行情况并立即返回,等都完成了就退出监控线程并返回监控数据. task.Result会等待异步方法返 ...
- (转)在WinForm中选择本地文件
相信很多朋友在日常的编程中总会遇到各钟各样的问题,关于在WinForm中选择本地文件就是很多朋友们都认为很难的一个学习.net的难点, 在WebForm中提供了FileUpload控件来供我们选择本地 ...
- andorid 对话框
activity_ui2.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout x ...
- [最新原创电子书]lazarus开发者入门及中级教程
目前市面上没有任何一本完整的书,介绍Lazarus,Firebird这两个优秀的开发工具,同时还有一个作为他们之间桥梁的开发套件ZeosDBO,也没有任何完整的中文开发指南,本书以这三种开发套件为主线 ...
- struts2升级
http://www.blogjava.net/ldwblog/archive/2013/10/14/404944.html
- 论坛:一对一关联映射/单向关联/两个类间,可以有两个(多个)关联关系/content为大文本类型/
>>单向:只写一端的映射属性,另一端不写(有一端用不着);双向:两端都写映射属性 >>一对一关联有两类:一类基于主键的(一般不使用),一类基于外键的(重点学习): 外键:是一个 ...
- word2vec_训练模型
from gensim.models import Word2Vecfrom gensim.models.word2vec import LineSentence # 原始的训练语料转化成一个sent ...