`

结合ruby写的一个校验工具

 
阅读更多

 

 

背景:

每次发布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 中的 RaspberryPi 的 esp8266 开发驱动程序

    总之,ESP8266-RPI-RUBY 是一个强大的工具,它让 Ruby 开发者能够在 Raspberry Pi 上轻松控制 ESP8266 WiFi 模块,为 IoT 应用程序的开发带来便利。无论你是初学者还是经验丰富的程序员,都可以利用这个驱动程序在 ...

    Groovy学习资料

    Groovy是一种动态、灵活的编程语言,它是Java平台上的一个强类型、静态类型的脚本语言。Groovy结合了Java的面向对象特性和Python、Ruby的简洁语法,使得它成为Java开发者进行快速开发、自动化任务以及编写简洁代码的...

    百度网盘工程架构演进-徐亚非1

    【百度网盘工程架构演进】是百度网盘在技术上的一个重要历程,主要由百度资深研发工程师徐亚非分享。该演讲涵盖了多个关键知识点,包括项目背景、架构设计、技术选型以及工具链的演进。 1. **项目介绍**: 百度...

    使用Gitlab的Hooks(钩子) + Checkstyle插件做Push代码检测.docx

    总结来说,利用GitLab Hooks和Checkstyle插件,你可以建立一个自动化的代码审查流程,确保团队遵循一致的编码标准,提升代码质量,减少潜在的错误和维护成本。这是一个非常实用的实践,尤其对于大型Java项目团队而言...

    野鸡医院查询应用

    压缩包内的“解压校验.exe”可能是Windows平台上的一个解压工具,用于验证文件的完整性和正确性,确保下载的压缩包没有损坏或被篡改。“说明.htm”则可能包含项目的介绍、使用指南、开发注意事项等内容,帮助用户更...

    Hadoop权威指南(第三版)

    - **HDFS High-Availability (HA)**:通过配置两个NameNode实例(一个处于活动状态,另一个处于备用状态),确保即使主NameNode失败也能快速恢复服务。 - **Hadoop I/O** - **数据完整性**:Hadoop通过各种机制...

    convert string to integer

    了解了不同语言中字符串转整数的基本方法后,我们可以结合源码和工具来优化或扩展这个功能,比如添加自定义的校验逻辑、处理异常、支持多种进制等。对于开发者来说,熟悉并掌握这些基本操作是至关重要的,因为它们在...

    JFinal-手册-1.3

    JFinal是一款基于Java语言的轻量级Web开发框架,其设计理念是追求开发迅速、...整个手册提供了一个从基础到高级的完整学习路径,让开发者能够快速掌握JFinal框架,并应用于实际项目开发中,提高开发效率和项目质量。

    [Pro.Spring.3(2012)].Clarence.Ho.文字版

    Spring框架是一个开源的Java平台,它提供了控制反转(Inversion of Control,IoC)容器、面向切面编程(Aspect-Oriented Programming,AOP)功能、声明式事务管理、持久层框架整合、MVC Web框架、测试支持等功能。...

    断言:基于可扩展注释的对象验证库

    总之,“断言:基于可扩展注释的对象验证库”是 Crystal 语言中一个用于对象验证的工具,它通过注解简化了验证规则的定义,并提高了代码的可读性和安全性。这个库的使用能够帮助开发者更有效地管理他们的数据,防止...

    jfinal手册

    - **JFinal** 是一个基于 Java 语言的极速 WEB + ORM 开发框架,它旨在提供高效、简洁、易于学习和使用的开发体验。相较于其他重量级框架如 Spring,JFinal 更加轻量且使用起来更加便捷。 - **设计理念**:JFinal ...

    serialport.cr:libserialport的水晶绑定:用于访问串行端口的跨平台库

    它是一个C库,由开源组织`sigrok`开发,旨在提供一个统一的接口来处理不同操作系统上的串行通信。这个库支持Linux、macOS、Windows等操作系统,确保了代码的可移植性。`libserialport`包含了读取、写入、配置波特率...

    spine.rails3:演示Spine和Rails集成的示例应用程序

    Spine.js 是一个轻量级的JavaScript MVC框架,它借鉴了Ruby on Rails的MVC模式,为前端开发提供了结构化和组织化的解决方案。而Ruby on Rails(简称Rails)是Ruby语言的一款强大的Web应用框架,遵循“约定优于配置”...

    JQuery实战教程

    - **服务器环境**:搭建一个简单的应用服务器,如Apache或Nginx,用于部署项目。 #### 七、案例分析 - **用户名校验**: - **服务器端实现**:当接收到用户名查询请求时,检查数据库中是否存在该用户名,如果存在...

Global site tag (gtag.js) - Google Analytics