fastlane 实现自定义 Action

阅读 212
收藏 1
2017-06-07
原文链接:www.jianshu.com

有的时候官方提供的所有的Action并不能满足我们的需求,这个时候就需要我们自己自定义Action用来调用了,我感觉这也是fastlane一个很好的扩展功能。
比如我们现在有这么一个场景,在使用fastlane更新远程的私有库或者共有库的时候,我们在给项目打tag的时候,先判断一下当前的项目是不是已经存在了相同名称的tag,如果有的话,删除掉,再进行下一步操作,如果没有的话,不执行我们的action。
如果对fastlane的action概念不是很熟悉的话,建议先看一下 fastlane更新远程的私有库,里面有对Action操作和运用的相关示例。

创建自定义的Action步骤如下:
1、先创建一个ruby文件
1.1、首先进入到fastlane的目录下面


image.png

1.2、运行命令创建ruby文件

fastlane new_action

image.png

注意事项,自定义的action名字的命名规范如下:

Must be lower case, and use a '_' between words. Do not use '.'
examples: 'testflight', 'upload_to_s3'

2、认识下创建出来的文件的组成部分


image.png
image.png

3、修改创建出来的ruby文件,形成我们的自定义的Action脚本
3.1、说一下我们当前设计的Action的需求是,给出三个参数,
tag: tag号,字符串,不可省略
isRL: 是否要删除本地仓库的tag,Bool类型,可以省略,默认的参数是false
isRR: 是否要删除远程仓库的tag,Bool类型,可以省略,默认的参数是false

module Fastlane
    module Actions
        module SharedValues
            REMOVE_TAG_CUSTOM_VALUE = :REMOVE_TAG_CUSTOM_VALUE
        end

        class RemoveTagAction < Action
            def self.run(params)
            # 最终要执行的东西,在这里执行

            # 1、获取所有输入的参数
            # tag 的名称 如 0.1.0
            tageName = params[:tag]
            # 是否需要删除本地标签
            isRemoveLocationTag = params[:isRL]
            # 是否需要删除远程标签
            isRemoveRemoteTag = params[:isRR]

            # 2、定义一个数组,准备往数组里面添加相应的命令
            cmds = []

            # 删除本地的标签
            # git tag -d 标签名称
            if isRemoveLocationTag
                cmds << "git tag -d #{tageName}"
            end

            # 删除远程标签
            # git push origin :标签名称
            if isRemoveRemoteTag
                cmds << "git push origin :#{tageName}"
            end

            # 3、执行数组里面的所有的命令
            result = Actions.sh(cmds.join('&'))
            UI.message("执行完毕 remove_tag的操作 🚀")
            return result


        end

        #####################################################
        # @!group Documentation
        #####################################################

        def self.description
        "输入标签,删除标签"
    end

    def self.details
    # Optional:
    # this is your chance to provide a more detailed description of this action
"我们可以使用这个标签来删除git远程的标签\n 使用方式是:\n remove_tag(tag:tagName,isRL:true,isRR:true) \n或者 \nremove_tag(tag:tagName)"
end

# 接收相关的参数
def self.available_options

# Define all options your action supports.

# Below a few examples
[

# 传入tag值的参数描述,不可以忽略<必须输入>,字符串类型,没有默认值
FastlaneCore::ConfigItem.new(key: :tag,
                             description: "tag 号是多少",
                             optional:false,# 是不是可以省略
                             is_string: true, # true: 是不是字符串
                             ),
# 是否删除本地标签
FastlaneCore::ConfigItem.new(key: :isRL,
                             description: "是否删除本地标签",
                             optional:true,# 是不是可以省略
                             is_string: false, # true: 是不是字符串
                             default_value: true), # 默认值是啥

# 是否删除远程标签
FastlaneCore::ConfigItem.new(key: :isRR,
                             description: "是否删除远程标签",
                             optional:true,# 是不是可以省略
                             is_string: false, # true: 是不是字符串
                             default_value: true) # 默认值是啥

]
end

def self.output
# Define the shared values you are going to provide
# Example

end

def self.return_value
# If your method provides a return value, you can describe here what it does
nil
end

def self.authors
# So no one will ever forget your contribution to fastlane :) You are awesome btw!
["zhangyan"]
end

# 支持平台
def self.is_supported?(platform)
# you can do things like
#
#  true
#
#  platform == :ios
#
#  [:ios, :mac].include?(platform)
#

platform == :ios
end
end
end
end

3.2、写完之后验证一下书写的格式是否正确终端命令在fastlane的上级目录下执行

fastlane action remove_tag

image.png

4、调用使用
在我们的fastfile中写的lane中进行相关的调用,下面展示的是更新远程私有库的lane

调用代码

# 验证当前tag是否存在,如果说存在的话,干掉,进行下一步,创建一个tag,如果说不存在的话,直接创建tag
if git_tag_exists(tag: tagName)
  UI.message("发现 tag:#{tagName} 存在,即将执行删除动作 🚀")
  # 下面的两种写法都可以
  remove_tag(tag:tagName,isRL:true,isRR:true)
  #remove_tag(tag:tagName)
end

lane的整体代码

#################################################################

desc "通过 upgradePrivateSpec 可以快速的对远程私有库完成升级工作"
lane :upgradePrivateSpec do |options|
#外界输入的tag值
tagName = options[:tag]

specName = options[:specName]

podspecPath = "#{specName}.podspec"

#具体在这个文件上执行哪些行为

# 1、git pull
git_pull

# 2、pod install

cocoapods(
clean: true,
podfile: "./Example/Podfile"
)

# 3、git add .

git_add(path: ".")

#  git commit -m 'message'

git_commit(path: ".", message: "Version Bump")

#  git push origin master

push_to_git_remote

# 验证当前tag是否存在,如果说存在的话,干掉,进行下一步,创建一个tag,如果说不存在的话,直接创建tag
if git_tag_exists(tag: tagName)
  UI.message("发现 tag:#{tagName} 存在,即将执行删除动作 🚀")
  # 下面的两种写法都可以
  remove_tag(tag:tagName,isRL:true,isRR:true)
  #remove_tag(tag:tagName)
end


# 4、git tag ...

add_git_tag(
tag: tagName
)

#    git push --tags

push_git_tags


# 5、pod spec lint 检测当前spec的格式

pod_lib_lint(allow_warnings: true)

#    pod repo push XXX  xxxx.podspec

pod_push(path: podspecPath, repo: "PrivateSpecsGather", allow_warnings:true)

end

5、测试一下
5.1、为了测试,可以先把远程私有库添加上一个tag,然后再去运行我们的lane。看一下能不能把我们的本地的和远程的tag都给干掉。
运行lane

fastlane upgradePrivateSpec tag:0.1.8 specName:DownLoader repo:PrivateSpecsGather

注意:当前我们的代码tag已经存在0.1.8了。


image.png
image.png

大功告成。

其他的自定义的Action也可以这么进行创建。

如有失误请各位路过大神即时指点,或有更好的做法,也请指点一二。在下不甚感激。

评论