美文网首页
iOS自动化发布组件【私有】pods 库(二)

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

作者: hylccmh | 来源:发表于2022-09-25 12:30 被阅读0次

    一、 前言

    上节讲到我们团队多项目协同进行开发,为了避免重复造轮子,我们开发了一些公共服务组件,供业务组的小伙伴使用,以提升开发效率,同时,有些相同的业务模块,比如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 库(二)

          本文链接:https://www.haomeiwen.com/subject/stcnortx.html