自动检测第三方Pod小工具

需求原因

做了半年的组件化了,原本的项目由一个集中式的仓库开发被拆分为几十个基础组件,还有各种业务组件。仓库在逻辑上分离也给开发和测试带来了很多好处。当然也有不好的地方。业务方的同事对这方面更为敏感,由于开发的时候壳工程有原来的依赖十几个第三方Pod变成了现在依赖将近上百个Pod,频繁的install 或者 update,偶尔会意外造成某些库更新,这些更新可能是不稳定的,而且QA由于不知道这些修改,会导致突然有些bug出现,有时候会造成不必要的沟(Si)通(Bi)。
所以业务方的同学提了一个模糊的需求: 我能不能在每次install 或者update的时候自动检测到第三方Pod的更新,来给我提示,让我重新check这些Pod是否真的需要更新或者是不稳定的版本。之所以说是模糊的,可能确实由于我们确实也不太知道我们需要怎么做,只是有痛点。

不过既然有了痛点,就要去解决。先做出来一般之后在修改。

尝试方案

我收到这个需求的时候,也确实有点懵逼,因为可能最初只是一点抱怨,说的也不明确,我刚开始也没什么思路。不过仔细想了想之后发现,可以把需求整理为2个核心目标。

  1. 检测更新
  2. 通知开发者有变化

检测更新

作为一个iOS开发者我们要熟悉我们使用的工具,我们知道Pod如何来绑定版本的变化,使用的是当前工作目录的Podfile.lock文件,那么我在每次Pod更新前,我用脚本去分析下新旧文件,如果更新了则是有库发送了变化,再去通知开发者。
说起来简单,不过我这种shell 0基础选手怎么办,当然是学了
这里找到了shell30分钟入门教程
说起来30分钟不过我这种笨人学了3个小时才练习完,不过shell脚本确实非常实用,推荐读者去学习下,在平时的开发中确实能帮到自己。

学完shell之后,我写了个脚本要求开发者使用我的脚本进行Pod install 或者 update等。不能再直接终端执行这个命令 。

install

代码逻辑如下


  echo "请输入Pod command 相关参数 "
  echo "1 : install"
  echo "2 : update"
  echo "3 : install --verbose --no-repo-update"
  echo "4 : update --verbose --no-repo-update"
  echo "5 : 自定义参数"
  podcommandParam="install"
  while  read podCommandInputParam
  do
    case ${podCommandInputParam} in
      1)
      podcommandParam="install"
      break
      ;;
      2)
      podcommandParam="update"
      break
      ;;
      3)
      podcommandParam="install --verbose --no-repo-update"
      break
      ;;
      4)
      podcommandParam="update --verbose --no-repo-update"
      break
      ;;
      5)
      echo "请输入自定义参数"
      read podcommandParam
      break
      ;;
      *)
      echo "输入有错请重新输入"
      ;;
    esac

  done


  echo "您选择的是-------${podcommandParam}"

备份逻辑

到这一步我们就可以去做备份功能了。
Q: 为什么备份?
A: 每次执行Pod命令 CocoaPod都会进行原地修改,设计到三个东西 *.xcworkspace Podfile.lock Pods/ ,回忆一下以往执行命令的时候,你执行pod命令的时候可能还报过错,但是发现整个的几千个文件瞬间都发送变化了,真是非常恶心。有了备份之后我们还可以在pod执行错误的时候恢复这三个东西的原来面目,不用我们每次再用sourcetree去重置文件。

Pod 命令执行完有两种情况

  1. 执行成功 ----> 检测更新 --> 删除备份
  2. 执行失败------> 恢复文件,删除备份--->并报错

下面是基本的代码逻辑

function beforePod() {

  #先复制一份原始的lock文件 和 Pods文件夹
  echo "正在备份资源"
  cp  ${oriPodLockName} ${backPodLockName}  >> ${logFile}
  cp -a ${oriPodsDIR}   ${backPodsDIR}  >> ${logFile}
  cp -a ${currentworkSpace} ${backworkSpaceDIR} >> ${logFile}
}
function afterPod() {
  echo "资源后续清理"
  rm ${backPodLockName}  >> ${logFile}
  rm -rf ${backPodsDIR} >> ${logFile}
  rm -rf ${backworkSpaceDIR} >> ${logFile}
}
function recoverPod() {
  echo "正在恢复原始文件"
  mv -f ${backPodLockName} ${oriPodLockName}

  rm -rf ${oriPodsDIR} >> ${logFile}
  cp -a ${backPodsDIR}   ${oriPodsDIR}  >> ${logFile}
  rm -rf ${backPodsDIR} >> ${logFile}
  # mv -f ${backPodsDIR} ${oriPodsDIR}
  rm -rf ${currentworkSpace} >> ${logFile}
  cp -a ${backworkSpaceDIR}   ${currentworkSpace}  >> ${logFile}
  rm -rf ${backworkSpaceDIR} >> ${logFile}

}

检测更新

  echo "-------------------------------当前发生变更的pod库---------------------------------" >> ${diffchangeFile}
  echo "--------------------------------------------------------------------------------" >> ${diffchangeFile}
  for (( i = 0; i < 3; i++ )); do
    echo ""
  done
  ### something
  diff ${oriPodLockName} ${backPodLockName}  -H >> ${diffchangeFile}
  echo "-----------------------------当前发生变更的第三方文件统计----------------------------" >> ${diffchangeFile}
  echo "--------------------------------------------------------------------------------" >> ${diffchangeFile}
  for (( i = 0; i < 3; i++ )); do
    echo ""
  done
  diff ${backPodsDIR} ${oriPodsDIR} -r -B -a | diffstat >> ${diffchangeFile}


  echo "-------------------------当前发生变更的第三方文件变化详细统计-------------------------" >> ${diffchangeFile}
  echo "--------------------------------------------------------------------------------" >> ${diffchangeFile}
  for (( i = 0; i < 3; i++ )); do
    echo ""
  done
  diff ${backPodsDIR} ${oriPodsDIR} -r -B -b >> ${diffchangeFile}

通知开发者

目前我做的是直接打开文件来给开发者看


  open -a Atom     ${diffchangeFile}

  if [  $? != 0 ]
  then
    open -a Xcode ${diffchangeFile}
  fi

  if [  $? != 0 ]
  then
    open  ${diffchangeFile}
  fi

完整演示

这是一个失败的演示:

checkErr

这是一个成功的演示

checkSuccess

后记

后面拿着给业务方的同学看了,业务方感叹效率,觉得做的很快,不过还有几点不足(其实就是不满意喽),。

  1. 我们这么大的团队(30iOS 左右)靠开发者主动使用脚本这个约束并不是特别好,如果有新人入职不知道怎么办,有时候着急忘记了怎么办。
  2. 开发者万一没有仔细看log'怎么办,我们需要一个留存的证据 ,比如邮件,这样在出bug的时候就嘿嘿嘿的甩锅给他喽。

后面的话和安卓的朋友一起沟通说可以放在server端去做,我们使用的CR平台是gerrit,gerrit能检测到开发者merge代码。可以在这个时候去做,检测 并且可以直接利用邮件系统发给开发组的全组同学,大大降低出现风险的机会。
不过作为一次学习的记录还是总结一下分享给大家。
代码地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,137评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,824评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,465评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,131评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,140评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,895评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,535评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,435评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,952评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,081评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,210评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,896评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,552评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,089评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,198评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,531评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,209评论 2 357

推荐阅读更多精彩内容