fastlane自动化打包(android)

目录
一、前言
一、环境搭建
二、初始化项目
三、打包apk
四、发布到蒲公英
五、钉钉通知相关人员

一、前言

项目中经常会进行打包分发, 但是常规的打包过程不免会非常的乏味无聊, 重复性的劳动, 实在没啥意思, 今天就来介绍fastlane工具进行android自动打包, 上传蒲公英(也可以firim)并进行钉钉群组通知相关人员。

Fastlane是一整套的客户端CICD工具集合。Fastlane可以非常快速简单的搭建一个自动化发布服务,并且支持Android,iOS,MacOS。
Fastlane命令执行的底层并不是自己实现的,而是调用其他的插件或者工具执行的。比如说打包,Fastlane中的gym工具只是xcodebuild工具的一个封装,调用的其实还是xcodebuild中的打包命令。
Fastlane本身没有一套特殊语法,使用的Ruby语言。
Fastlane的插件工具叫做action,每一个action都对应一个具体的功能。

一、 环境搭建

1、苹果系统自带有ruby

ruby -v

2、安装今天的主角fastlane

sudo gem install fastlane -NV 
安装权限.jpg

通过修改用户读写权限可以解决

sudo chmod -R 777 /usr/bin/
或者
sudo gem install -n /usr/local/bin fastlane

3、安装蒲公英的 Fastlane 插件

fastlane add_plugin pgyer

如果遇到这种情况:Could not find action, lane or variable 'pgyer'.


pgyer.jpg

可能是你安装pgyer插件的时候,不是在项目fastlane文件夹下安装的,重新安装一下就可以解决上面的错误。

4、安装获取应用版本的 Fastlane 插件

 fastlane add_plugin android_versioning

如果出现类似pgyer的错误,同理在项目fastlane文件夹下重新安装就可以避免找不到插件的命令错误。

二、初始化项目

在使用 Fastlane 之前,我们首先需要在项目中初始化 Fastlane。首先进入 App 的开发目录,执行以下命令来初始化 Fastlane:

fastlane init

三、打包apk

激动人心的时刻终于来了,开始打包。

 gradle(
      task: 'assemble', 
      build_type: 'Release',
      properties: {
        "android.injected.signing.store.file" =>  Dir.pwd + "/street.keystore",
        "android.injected.signing.store.password" => "123456",
        "android.injected.signing.key.alias" => "street",
        "android.injected.signing.key.password" => "123456",
      },
    );

四、发布到蒲公英

 pgyer(api_key: pgy_api_key, user_key: pgy_user_key)

五、钉钉通知相关人员

 markdown = {
        msgtype: "markdown", 
        markdown: {
          title: "#{app_name}Android内测更新", 
          text: ding_talk_update_text,
          # picUrl: "#{app_icon}", 
          # messageUrl: "#{app_url}"
        },
        at: {
          atMobiles: ["18*****38","13*****77","18*****93"],
          isAtAll: false
        }
      }
      ding_talk_url = "https://oapi.dingtalk.com/robot/send?access_token="
      ding_talk_secret = ""
      timestamp = DateTime.now.strftime('%Q') # "1384526946523" (milliseconds)
      finaly_sign = ''
      if ding_talk_secret
        data = timestamp + "\n" + ding_talk_secret
        digest = OpenSSL::Digest.new('SHA256')
        sign_data = OpenSSL::HMAC.digest(digest, ding_talk_secret.force_encoding("UTF-8"), data.force_encoding("UTF-8"))
        finaly_sign = Base64.encode64(sign_data).gsub("\n",'')
        finaly_sign = CGI::escape(finaly_sign)
      end
       
      ding_talk_url = ding_talk_url + "&timestamp=#{timestamp}&sign=#{finaly_sign}"
      puts ding_talk_url
      uri = URI.parse(ding_talk_url)
      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 = markdown.to_json
      puts request.body
      response = https.request(request)
lane :toPgy do
    puts("开始打包Android APK!");
  
    gradle(
      task: 'assemble', 
      build_type: 'Release',
      properties: {
        "android.injected.signing.store.file" =>  Dir.pwd + "/street.keystore",
        "android.injected.signing.store.password" => "skyinfor2016",
        "android.injected.signing.key.alias" => "ZhongshanStreet",
        "android.injected.signing.key.password" => "skyinfor2016",
      },
    );
    puts("------打包后App信息:------")
  
 
    #上传到蒲公英
     pgyer(api_key: "bfb444cc09c3be7695c845b32ec89d3a", user_key: "fb6d0c133cebfe401fc5ad8153612520")

#更新日志
update_log="更新后台定位"
    # 获取Apk默认输出路径
    apk_file_path = lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH];
    # 重新命名Fastlane默认Apk文件,并移动到/fastlane/packages目录下
    fastlane_directory = Dir.pwd
    app_name="数字孪生"
     
    
    # 获取版本号
  app_version = get_version_code(app_project_dir: './app');
  formatted_file_size="未知"
  time_now=Time.now.strftime(“%Y-%m-%d %H:%M:%S”)
  pgy_qrcode="https://www.pgyer.com/app/qrcode/9pHS"
  pgy_app_url="https://www.pgyer.com/9pHS"
  contacts_format="@13024266977"

  app_icon="https://www.pgyer.com/app/qrcode/9pHS"
  app_url=""

      ding_talk_update_text = <<-EOF
#### #{app_name}Android-应用更新
> 版本信息:#{app_version}\n
> 应用大小:#{formatted_file_size} \n
> 更新时间:#{time_now}\n
> 关键词:天覆发版专用\n
> 更新内容:#{update_log}\n

扫描二维码下载:
![二维码](#{pgy_qrcode})\n
[点我进入主页下载](#{pgy_app_url}) #{contacts_format}
EOF
  
      markdown = {
        msgtype: "markdown", 
        markdown: {
          title: "#{app_name}Android内测更新", 
          text: ding_talk_update_text,
          # picUrl: "#{app_icon}", 
          # messageUrl: "#{app_url}"
        },
        at: {
          atMobiles: ["18516666838","13024266977","18225819193"],
          isAtAll: false
        }
      }

      ding_talk_url = "https://oapi.dingtalk.com/robot/send?access_token=13b87d0200ce93b51d9d7c04075be8b31c5c17ae342e67cf5a76b2dc06490a63"
      ding_talk_secret = "SECbb33329836b0421b8e6271b2a34f913575d7e41f9076ae9b636418e2a5c206c9"
      timestamp = DateTime.now.strftime('%Q') # "1384526946523" (milliseconds)
      finaly_sign = ''
      if ding_talk_secret
        data = timestamp + "\n" + ding_talk_secret
        digest = OpenSSL::Digest.new('SHA256')
        sign_data = OpenSSL::HMAC.digest(digest, ding_talk_secret.force_encoding("UTF-8"), data.force_encoding("UTF-8"))
        finaly_sign = Base64.encode64(sign_data).gsub("\n",'')
        finaly_sign = CGI::escape(finaly_sign)
      end
       
      ding_talk_url = ding_talk_url + "&timestamp=#{timestamp}&sign=#{finaly_sign}"
      puts ding_talk_url
      uri = URI.parse(ding_talk_url)
      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 = markdown.to_json
      puts request.body
      response = https.request(request)
      puts "------------------------------"
      puts "Response #{response.code} #{response.message}: #{response.body}"
    
  end
 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容