分类
前端 技术

android fastlane的配置和使用

一、配置(以mac系统下android项目配置为例,其他系统参考https://docs.fastlane.tools/ )

  1. 下载:brew install fastlane
  2. init:进入需要配置fastlane的项目目录,命令行执行fastlane init,执行成功标志:项目路径下出现fastlane文件夹,里面有四个文件。
  3. 由于fastfile仅能在utf-8下运行(否则会报错fastlane requires your locale to be set to UTF-8.),参考https://docs.fastlane.tools/getting-started/ios/setup/#set-up-environment-variables 进行设置

二、编写fastfile

  • 路径:项目目录/fastlane/fastfile
  • 基础功能编写:
  • 语法:语法本身很简单,部分麻烦的操作还可以通过本地运行参考https://docs.fastlane.tools/actions/
  • 示范:参考安卓音乐圣经下fastlane文档
  • 其他说明:
  1. fastlane本身基于ruby语言,因此可以执行对应的ruby语句。换句话说,任何你需要执行的他默认没有的功能,甚至可以通过执行System("shell命令")的方式进行相应功能的调用。
  2. fastlane基础格式如下
  default_platform(:android) //平台设置语句
  platform :android do //平台设置语句

    puts("开始静态代码检测"); //打印语句
    gradle( //执行gradle方法
      task: 'sonarqube', 
      properties: {
        "Dsonar.projectKey" => "com.boostfield.musicbible",
        "Dsonar.host.url" => "http://localhost:9000 ",
        "Dsonar.login" => "705a58fb1e19b89eae2e74db40211917d8945a43",
      }
    );
    puts("静态代码检测结束");

    desc "上传生产环境的apk"
    lane :uploadBeta do
      filenamedev = "#{release_path}musicbible_#{version_name_dev}_dev_release.apk"
      system "#{ossutil} --access-key-id #{ossid} --access-key-secret #{osssecret} -e #{endpoint} cp  #{filenamedev} #{releasebucket}" //执行shell命令
    end
  end
  1. 方法调用方式:shell执行fastlane 方法名

三、插件使用

  • property file read
  1. 功能描述:用来读.properties(android上用来读取版本号和版本名称,ios已经有默认集成好了的,参考https://docs.fastlane.tools/actions/ 中project下的内容)
  2. github地址:https://github.com/unitedclassifiedsapps/fastlane-plugin-property_file_read
  3. 集成方法:shell命令执行gem install fastlane-plugin-property_file_read
  4. 使用如下:
  # 获取资源文件
  properties = property_file_read(file: "gradle.properties"); //读取文件
  # dev版本名称
  version_name_dev = properties["MAJOR_VERSION_NUMBER"]+"."+ properties["MINOR_VERSION_NUMBER"]+"."+ properties["REVISION_NUMBER"]+"."+properties["BETA_SUFFIX_VERSION"];

.properties中文件内容如下:

  ANDROID_APPLICATION_VERSION_CODE=74
  MAJOR_VERSION_NUMBER=5
  MINOR_VERSION_NUMBER=3
  REVISION_NUMBER=0
  • changelog plugin
  1. 功能描述:能按照节点读取符合https://keepachangelog.com/en/1.0.0/ 格式要求的md文件
  2. github地址:https://github.com/pajapro/fastlane-plugin-changelog
  3. 集成方法:shell命令执行gem install fastlane-plugin-changelog
  4. 使用如下:
  devlog = read_changelog(
      changelog_path: './changelog.md', # Specify path to CHANGELOG.md
      section_identifier: '['+version_name_release+']', # Specify what section to read
      excluded_markdown_elements: ['-', '###']  # Specify which markdown elements should be excluded
    )
  1. 可以使用emojified_changelog方法将文档格式变的更直观

四、特殊功能

  • 使用fastlane向钉钉机器人发消息
  • 参考文档:
  1. https://www.codeleading.com/article/7909571345/ 基础代码参考
  2. https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq 钉钉机器人的开发说明和发送格式文档
  • 基础逻辑说明(以android为例):获取版本号->根据版本号使用read_changelog读取对应版本号节点下的md文件->使用emojified_changelog规范化文档内容->调用钉钉机器人发送消息
  • 特殊说明:虽然钉钉机器人支持发送简单的md类型文档,但是由于直接调用该类型方法进行发送会丢失所有的换行,格式会很奇怪,故放弃该类型转为格式化text内容后以text类型发送
  • 代码参考
desc "钉钉机器人发送生产环境测试包打包完成消息"
  lane :betaTaskFinishedPush do
    devlog = read_changelog(
      changelog_path: './changelog.md', # Specify path to CHANGELOG.md
      section_identifier: '['+version_name_release+']', # Specify what section to read
      excluded_markdown_elements: ['-', '###']  # Specify which markdown elements should be excluded
    )
    emojified_changelog = emojify_changelog
    puts(emojified_changelog)
    text = 
      {
        msgtype: "text", 
        text: {
          content: "【#{app_name}】生产环境打包完成\n#{emojified_changelog}\n\n下载地址:https://mb-shared.oss-cn-hangzhou.aliyuncs.com/apk/musicbible_#{version_name_dev}_dev_release.apk\n"
        },
        at: {
          isAtAll: true
        }
      }
    uri = URI.parse("https://oapi.dingtalk.com/robot/send?access_token=ca9c4e805301ec17ed4058d8ef553d70f35c9d2093d382cef1fb049da55a6188")
    https = Net::HTTP.new(uri.host, uri.port)
    https.use_ssl = true
    request = Net::HTTP::Post.new(uri.request_uri)
    request.add_field('Content-Type', 'application/json')
    request.body = text.to_json
    response = https.request(request)
    puts "Response #{response.code} #{response.message}: #{response.body}"
  end