背景:
每次发布detail这边一般都要发布多个js文件,然后同步到不同的CDN;现阶段CDN有提供一个平台,前端在发布js后可以根据js的文件名来逐个校验下每个js是否同步到每一个CDN节点,但在有多个js发布的时候,可能不能逐一校验,detail这边有出现发布js后同步到个别的CND节点同步失败,所以考虑用一个简便的方式来执行;
大致流程:
通过svn的命令拿到每次js发布的文件名,然后根据文件名在CDN同步校验平台上检测是否同步到每个CDN节点,如果同步失败返回信息;
具体步骤:
1、通过命令拿到每次要发布的js文件信息,这些信息包含 版本号、时间、提交者、文件名,将这些信息定向到一个XML文件
2、解读XML文件,根据提交者的名字查询该用户修改发布的文件名,将文件名转换成数组的元素
3、将数组中的每个文件名在CDN校验平台上逐一校验,并返回信息;
下面是具体实现方式:
本机调试:
运行CMD执行
svn log --revision HEAD:{2012-11-24} http://svn.../malldetail/
如果执行上述的命令有输出相应的内容则请忽略下面的内容,如果提示SVN不是外部内部命令时请看下面:
Q1:
SVN 不是有内部或外部命令,也不是可运行的程序或批处理文件。
现场:
CMD内输入SVN显示:不是有内部或外部命令,也不是可运行的程序或批处理文件。、
本机已安装SVN
解决方案:
需要安装subversion,传送门:SubVersion,xp装32位 Win 7-64位 .
安装好对应的subversion后,重新执行运行输出结果;
由于需要拿到更新文件的文件名以及所在的路径信息,所以可以尝试使用SVN参数,在这里可以尝试下:
svn log --quiet --verbose --revision HEAD:{2012-11-24} http://svn.../malldetail/
--quiet --verbose 参数加入后,输出信息将会输出更新文件的概要信息;
再将文件定向到一个XML文件(这里可以是其它后缀的文件,定义成XML是为了后面读取方便),继续加参数:
svn log --quiet --verbose --xml --revision HEAD:{2012-11-24} http://svn.../malldetail/
在ruby中:
def svn_log(start_date) #reversion --{date} timespan = " --revision HEAD:{#{start_date}}" puts timespan #URL中对应的目录是可更改的 url="http://svn....../malldetail/assets/3.0b" root=url #将更新的文件重定向到一个文件中 可以csv 也可以xml #参数说明--quiet 查看程序的版本号不会打印日志信息正文本身;--verbose参数表示显示详细信息; `svn log #{timespan} #{root} --quiet --verbose --xml >updatw_file.xml` # puts `svn log #{timespan} #{root}` puts 'done,已将修改的文件重定向到一个xml文件中' end
那么到这里,我们第一步通过svn拿到前端要发布的文件信息了;
{下面是svn log常用的几个参数
svn log [PATH]
svn log URL [PATH...]
它有几个参数:
--revision (-r) REV
--quiet (-q) 不打印信息,或只打印概要信息
--verbose (-v) 打印附加信息
--targets FILENAME 传递文件 ARG 内容为附件参数
--stop-on-copy 可以关闭这种行为,这可以用来找出分支点
--incremental 给予适合串联的输出
--xml 输出为 XML
全局配置项说明
--username USER 指定用户名称 ARG
--password PASS 指定密码 ARG
--no-auth-cache 不要缓存用户认证令牌
--non-interactive 不要交互提示
--config-dir DIR 从目录 DIR读取用户配置文件
}
第二步:读取XML文件,根据提交用户名字拿到该用户更新的文件,下面是具体的实现方式:
先附上一段xml内容:
<?xml version="1.0" encoding="UTF-8"?>
<log>
<logentry
revision="7842">
<author>daqiu.lym</author>
<date>2012-12-27T09:49:13.386760Z</date>
<paths>
<path
action="M"
kind="">/trunk/malldetail/assets/4.0a/common/util.js</path>
<path
action="M"
kind="">/trunk/malldetail/assets/4.0a/other/ishare.js</path>
</paths>
</logentry>
</log>
def process() #可以更改时间,这里是从 date_info = "2012-12-12" svn_log(date_info) # ********* 解析xml文件,根据提交的用户名拿到更新的文件名 ******* #读取xml文件 filename = "updatw_file.xml" doc = Document.new(File.open(filename)) #根据author的值拿到更新的文件名称 在这里是可以更新author的值的 #[author='daqiu.lym']作者名字可改 path = "//logentry[author='daqiu.lym']/paths/path" #xpath根据提交代码用户的名字拿到他更新的文件 v1 = XPath.match(doc,path).map{|uf| uf.text} #将文件转换成to_string的形式 v3 = v1.to_s #将以js 或者css结尾时自动的换取行 v4=v3.gsub(/js/,'js ').gsub(/\.css/,'.css ').gsub(/vm/,'vm ').gsub(/trunk/,"apps").gsub(/\/assets/,"") #.gsub(/\.txt/,".txt #") #将输出的文件名称转换成数组形式 然后去重 arr = v4.to_a.uniq puts " 文件更新列表:"
这里需要补充下,有将trunk替换为 apps,以及将assets去除,是为了方便第三步拼接URL校验;
感兴趣的还可以了解下sub或者gsub方法来进行替换的区别,他们两个方法第一个参数都是接受正则表达式。其中,sub方法替换掉第一个匹配的地方,而gsub方法替换掉左右匹配的地方,所以这里选择用gsub;
第二步实现方式就这么多了,在这过程中有遇到下面的两情况,最终通过查阅些资料和时间,选择了使用XPath.match
Q2:XPath
**不是直接的arr = IO.readlines(%%1) #"myfile" 因为不需要太多的内容,我们只需要获取部分内容
Q3:
# # xml解析
#没有选取
#doc = Document.new(File.open("my.xml"))
#doc.elements.each("log/logentry/paths"){ |elem|
# puts elem.attributes["path"]
# puts "start"
#}
第三步:将数组中的文件名放到CDN校验平台逐一校验
校验平台: http://assets.f2e.taobao.net/
这里是直接的将文件名以及路径拼接到校验平台后的方式来实现:
#访问到查看页面 url="http://a...../" ie = IEModel.start(url) #将更新的文件拼到URL中,然后检测更新的文件是否被同步到每个节点 for $i in 0...(arr.size()-1) do # 拼接URL urla="http://a.cn"+arr[$i].to_s ie.goto(url+"?path="+urla)
然后校验页面的返回信息,根据返回信息作出相应的操作;
到这里为止,三部曲就完成了,这里还需要更多优化,目前这个需要依赖ruby的环境,我在这里抛砖引玉,希望大家有更好的更简洁方便的方法,然后一起来探讨。
相关推荐
总之,ESP8266-RPI-RUBY 是一个强大的工具,它让 Ruby 开发者能够在 Raspberry Pi 上轻松控制 ESP8266 WiFi 模块,为 IoT 应用程序的开发带来便利。无论你是初学者还是经验丰富的程序员,都可以利用这个驱动程序在 ...
Groovy是一种动态、灵活的编程语言,它是Java平台上的一个强类型、静态类型的脚本语言。Groovy结合了Java的面向对象特性和Python、Ruby的简洁语法,使得它成为Java开发者进行快速开发、自动化任务以及编写简洁代码的...
【百度网盘工程架构演进】是百度网盘在技术上的一个重要历程,主要由百度资深研发工程师徐亚非分享。该演讲涵盖了多个关键知识点,包括项目背景、架构设计、技术选型以及工具链的演进。 1. **项目介绍**: 百度...
总结来说,利用GitLab Hooks和Checkstyle插件,你可以建立一个自动化的代码审查流程,确保团队遵循一致的编码标准,提升代码质量,减少潜在的错误和维护成本。这是一个非常实用的实践,尤其对于大型Java项目团队而言...
压缩包内的“解压校验.exe”可能是Windows平台上的一个解压工具,用于验证文件的完整性和正确性,确保下载的压缩包没有损坏或被篡改。“说明.htm”则可能包含项目的介绍、使用指南、开发注意事项等内容,帮助用户更...
- **HDFS High-Availability (HA)**:通过配置两个NameNode实例(一个处于活动状态,另一个处于备用状态),确保即使主NameNode失败也能快速恢复服务。 - **Hadoop I/O** - **数据完整性**:Hadoop通过各种机制...
了解了不同语言中字符串转整数的基本方法后,我们可以结合源码和工具来优化或扩展这个功能,比如添加自定义的校验逻辑、处理异常、支持多种进制等。对于开发者来说,熟悉并掌握这些基本操作是至关重要的,因为它们在...
JFinal是一款基于Java语言的轻量级Web开发框架,其设计理念是追求开发迅速、...整个手册提供了一个从基础到高级的完整学习路径,让开发者能够快速掌握JFinal框架,并应用于实际项目开发中,提高开发效率和项目质量。
Spring框架是一个开源的Java平台,它提供了控制反转(Inversion of Control,IoC)容器、面向切面编程(Aspect-Oriented Programming,AOP)功能、声明式事务管理、持久层框架整合、MVC Web框架、测试支持等功能。...
总之,“断言:基于可扩展注释的对象验证库”是 Crystal 语言中一个用于对象验证的工具,它通过注解简化了验证规则的定义,并提高了代码的可读性和安全性。这个库的使用能够帮助开发者更有效地管理他们的数据,防止...
- **JFinal** 是一个基于 Java 语言的极速 WEB + ORM 开发框架,它旨在提供高效、简洁、易于学习和使用的开发体验。相较于其他重量级框架如 Spring,JFinal 更加轻量且使用起来更加便捷。 - **设计理念**:JFinal ...
它是一个C库,由开源组织`sigrok`开发,旨在提供一个统一的接口来处理不同操作系统上的串行通信。这个库支持Linux、macOS、Windows等操作系统,确保了代码的可移植性。`libserialport`包含了读取、写入、配置波特率...
Spine.js 是一个轻量级的JavaScript MVC框架,它借鉴了Ruby on Rails的MVC模式,为前端开发提供了结构化和组织化的解决方案。而Ruby on Rails(简称Rails)是Ruby语言的一款强大的Web应用框架,遵循“约定优于配置”...
- **服务器环境**:搭建一个简单的应用服务器,如Apache或Nginx,用于部署项目。 #### 七、案例分析 - **用户名校验**: - **服务器端实现**:当接收到用户名查询请求时,检查数据库中是否存在该用户名,如果存在...