iOS自动化发布组件【私有】pods 库(二)

一、 前言

上节讲到我们团队多项目协同进行开发,为了避免重复造轮子,我们开发了一些公共服务组件,供业务组的小伙伴使用,以提升开发效率,同时,有些相同的业务模块,比如IM、广告模块等,我们也做了组件化处理。随着各个项目组业务的变化,组件化的更新频次增加,维护成本变高【会花费大量的时间和注意力在 提交代码,发布 tag 版本,推送 podspec 库上】,于是便想到使用脚本封装一套自动化发布流程工具。

二、脚本编写

在写脚本之前,我们先回忆一下,发布 cocoapods 库更新时,都有哪些步骤:
1、把写好的代码提交到 git
2、在git上打一个 tag ,并且和***.podspec 上的 s.version 保持一致
3、通过 pod 命令验证 podspec 文件
pod spec lint ***.podspec --allow-warnings
4、把 podspec 文件推送到 [私有repod]
pod repo push [私有repod] ***.podspec --allow-warnings

清晰了发布流程,我们就可以基于以上步骤,编写自动化脚本了,在写脚本之前确保自己电脑已安装了 cocoapods 和 fastlane 工具,具体的安装步骤,这里不在叙述。我们用到 fastlane 主要是为了对上述步骤命令进行封装。对于fastlane还不知道是什么的小伙伴,可以看下官网 fastlane
既然是想达到自动化的目的,我们希望执行一行命令之后,最终反馈给我们一个成功或者失败的结果,过程我们无需关心,为了达到以上目的,分为两步骤进行:

步骤一、通过一个脚本文件,找到 ***.podspec 文件,并获取需要的信息【podspec_version、podspec的文件名】
步骤二、通过 fastlane 命令完成发布流程

首先,在组件的根目录创建一个 AutoUpdatePod.sh 脚本文件,脚本的内容如下:主要实现的功能是找到 podspec 文件 ,并获取提交代码打tag时需要的版本号,并传递给fastlane命令

#!/bin/sh

# ************************* 配合 Fastlane 自动更新私有库 ****************************

echo "\n************************************ 执行自动更新 cocoapod 私有库脚本 ************************************\n"
 
# 获取到的文件路径
file_path=""
file_name=""
# 文件后缀名
file_extension="podspec"
# 文件夹路径,pwd表示当前文件夹
directory="$(pwd)"
 
# 参数1: 路径;参数2: 文件后缀名
function getFileAtDirectory(){
    for element in `ls $1`
    do
        dir_or_file=$1"/"$element
        # echo "$dir_or_file"
        if [ -d $dir_or_file ]
        then
            getFileAtDirectory $dir_or_file
        else
            file_extension=${dir_or_file##*.}
            if [[ $file_extension == $2 ]]; then
#                echo "$dir_or_file 是 $2 文件"
                file_path=$dir_or_file
                file_name=$element
            fi
        fi
    done
}
getFileAtDirectory $directory $file_extension
 
#echo "\n file_path: ${file_path}"
#echo "\n file_name: ${file_name}"
#
#
#echo "\n ---- 读取podspec文件内容 begin ---- \n"
 
# 定义pod文件名称
pod_file_name=${file_name}
# 查找 podspec 的版本
search_str="s.version"
 
# 读取podspec的版本
podspec_version=""
pod_spec_version_new=""
 
#定义了要读取文件的路径
my_file="${pod_file_name}"
while read my_line
do
#输出读到的每一行的结果
# echo $my_line
 
    # 查找到包含的内容,正则表达式获取以 ${search_str} 开头的内容
    result=$(echo ${my_line} | grep "^${search_str}")
    if [[ "$result" != "" ]]
    then
#           echo "\n ${my_line} 包含 ${search_str}"
           # 分割字符串,是变量名称,不是变量的值; 前面的空格表示分割的字符,后面的空格不可省略
        array=(${result// / })
        # 数组长度
        count=${#array[@]}
        # 获取最后一个元素内容
        version=${array[count - 1]}
        # 去掉 '
        version=${version//\'/}
 
        podspec_version=$version
    #else
           # echo "\n ${my_line} 不包含 ${search_str}"
    fi
 
done < $my_file
echo "\n\n\n         【 当前正在更新的库名字是: ${file_name}       版本号:${podspec_version} 】\n\n\n\n\n"

#执行 fastlane 命令 ,并执行更新 私有组件库
if [[ "$file_name" != "" ]];then    #编写代码时,注意[[ A ]] ,A 两边要留空格,不然会报错
    fastlane updatePod tag:$podspec_version specName:$file_name
else
  echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>> 没有找到 podspec 文件  (⊙︿⊙) <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
fi

接下来,编写发布流程相关的命令,同样还是进入到组件项目的根目录,执行命令:

 fastlane init 

执行命令之后会出现如下视图:

01.png

根据提示选择最后一个 手动设置
最后我们会在项目中得到两个文件 APPfile、Fastfile
02.png

APPfile 主要配置 ipa 打包时需要的信息,这里我们用不到,我们主要用到的文件是 Fastfile :用于编写我们发布组件时需要的action 命令,当然可以封装自己的Action,这些命令都可以在 fastlane的官网上找到Action,具体如下:

desc 'Hero 自动化升级维护私有库'
lane :updatePod do |options|

tagNum = options[:tag]
podspecName = options[:specName]

# 航道上需要执行的操作
# 具体action到 https://docs.fastlane.tools/actions 上面查找
# 这里的路径以仓库根目录为准

# 1、修改spec文件(修改s.version,s.description等)
# 2、pod install (使Example与pod下来的库产生关联)
cocoapods(
  clean: true,
  podfile: "./Example/Podfile"
)


# 3、提交本地仓库代码至远程仓库
git_add(path: ".")
git_commit(path: ".", message: "upgrade repo")
push_to_git_remote


# 4、打标签,并提交至远程
# 先验证tag是否存在,如果存在则删除本地标签和远程标签【前提是你拥有删除的权限】
if git_tag_exists(tag: tagNum)
  UI.message("您输入的tag:#{tagNum}已存在,即将自动清除") 
  remove_git_tag(tagNum: tagNum)
end
add_git_tag(
  tag: tagNum
)
push_git_tags


# 5、验证spec,并提至私有索引库
pod_lib_lint(allow_warnings: true,skip_import_validation:true,sources:["http://xxx.git(存放podspec文件的私有仓库地址)", "https://github.com/CocoaPods/Specs"])
# podspec的名字需要由外界传入
#这里的***Spec 由于是本地repod的仓库,基本不会变化,可以写死
pod_push(path: "#{podspecName}", repo: "***Spec", allow_warnings:true,skip_import_validation:true)

end

注意:【***Spec 】一定要换成自己的私有repod
项目文件已经放到 github
到这里,自动化发布组件工具编写完了,接下来,在项目根目录下执行命令:

./AutoUpdatePod.sh

可以看到,我们的组件已在执行自动化发布流程


03.png
04.png

显示 success 说明组件已发布成功。

三、总结

编写工具的目的是为了解放我们的时间和注意力,让这些重复性的工作交给机器执行,欢迎大家一起交流 !

你可能感兴趣的:(iOS自动化发布组件【私有】pods 库(二))