IOS 一键打包上传蒲公英脚本

一、背景

目前的IOS打包不支持蒲公英上传,并且原有的打包脚本是基于Python直接调用xcodebuild来完成打包操作,有以下几个缺点:

● 脚本书写繁杂难以理解,不方便日后维护,并且脚本中强依赖项目路径,可移植性比较差
● 脚本强依赖Python执行环境
● 只有单纯的打包功能,没有上传蒲公英、钉钉通知等功能
● 打完包之后无法区分是哪一个分支、哪一个时间段打的包

在以上的背景之下,我基于FastLane+Python重新开发了一套打包机制,并有较强的可移植性。

二、实现效果

只需工程根目录执行脚本PgyerBuild Debug即可完成打包+上传蒲公英+钉钉通知

三、脚本集成步骤

● 机器安装FastLane,我使用的版本是2.189.1
● 工程内集成FastLane,修改FastLane配置文件,第四章会给出配置模板
● 拖入Python工程生成的脚本PgyerBuild到工程根目录(Python脚本内只需修改工程名即可)
● 集成完毕!执行打包脚本,即可完成打包+上传蒲公英+钉钉通知

脚本使用教程

#打Debug包
PgyerBuild Debug
#打Release包
PgyerBuild Release

四、脚本源码

Python脚本

# This is a sample Python script.

import json
# Press ⇧F10 to execute it or replace it with your code.
# Press Double ⇧ to search everywhere for classes, files, tool windows, actions, and settings.
import os
import re
import sys
import time

import requests

# 时间格式化字符串
time_format = '%Y%m%d%H%M%S'
# 当前路径
basedir = os.path.dirname(os.path.realpath(sys.argv[0]))
# 蒲公英Apikey
api_key = "cd17b24dxxxxxxxxxxxxxxxxxxxxxxx"
# 蒲公英UserKey
user_key = "7058cxxxxxxxxxxxxxxxxxxxxxxxx"
# 工程名称
projectName = "TooWellMerchant"


# 获取系统当前时间并转换请求数据所需要的格式
def getTime(format_str):
    now = int(time.time())
    timeStruct = time.localtime(now)
    strTime = time.strftime(format_str, timeStruct)
    return strTime


# 执行IOS打包
def fastlane(buildType):
    if buildType == "Debug":
        os.system("fastlane buildDebug")
    else:
        os.system("fastlane buildRelease")


# 获取Git分支号
def getGitBranch():
    with open(f'{basedir}/.git/HEAD') as f:
        return f.read().replace("ref: refs/heads/", "")


# 获取版本号
def getVersionNo():
    with open(f'{basedir}/{projectName}.xcodeproj/project.pbxproj') as f:
        content = f.read()
        return re.findall(r"MARKETING_VERSION = (.+?);", content)[0]


# 上传蒲公英
def uploadPyger(buildType):
    if buildType == 'Debug':
        description = f'[Debug]business-debug-v{getVersionNo()}-{getTime(time_format)}.ipa'
    else:
        description = f'[Release]business-release-v{getVersionNo()}-{getTime(time_format)}.ipa'
    cmd = f'curl -F _api_key={api_key} -F userKey={user_key} -F file=@{basedir}/{projectName}.ipa -F ' \
          f'buildInstallType=2 -F buildPassword=carzone123 -F buildUpdateDescri' \
          f'ption={description} https://www.pgyer.com/apiv2/app/upload '
    print(f'正在执行上传脚本:{cmd}')
    result = os.popen(cmd)
    resultStr = result.read()
    print(f'蒲公英上传结果:{resultStr}')
    return json.loads(resultStr)


# 获取文件大小
def getFileSize(size):
    def strofsize(integer, remainder, level):
        if integer >= 1024:
            remainder = integer % 1024
            integer //= 1024
            level += 1
            return strofsize(integer, remainder, level)
        else:
            return integer, remainder, level

    units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB']
    integer, remainder, level = strofsize(size, 0, 0)
    if level + 1 > len(units):
        level = -1
    return ('{}.{:>03d} {}'.format(integer, remainder, units[level]))


# 发送钉钉通知
def sendDingMessage(message):
    # 构建通知内容
    fileSize = getFileSize(int(message['buildFileSize']))
    buildUpdated = message['buildUpdated']
    buildUpdateDescription = message['buildUpdateDescription']
    buildBuildVersion = message['buildBuildVersion']
    buildVersion = message['buildVersion']
    buildKey = message['buildKey']
    buildQRCodeURL = message['buildQRCodeURL']
    text = []
    text.append('\n\n### IOS构建成功,已上传蒲公英')
    text.append('\n\n**构建应用**:\n\nXXXX')
    text.append(f'\n\n**构建时间**:\n\n{buildUpdated}')
    text.append(f'\n\n**构建描述**:\n\n{buildUpdateDescription}')
    text.append(f'\n\n**蒲公英版本号**:\n\nbuild{buildBuildVersion}')
    text.append(f'\n\n**IOS包大小**:\n\n{fileSize}')
    text.append(f'\n\n**IOS版本号**:\n\n{buildVersion}')
    text.append(f'\n\n**Git分支**:\n\n{getGitBranch()}')
    text.append(f'\n\n**下载地址**:\n\nhttps://www.pgyer.com/{buildKey}')
    text.append(f'\n\n**安装密码**:\n\ncarzone123')
    text.append(f'\n\n![]({buildQRCodeURL})')
    context = ''.join(text)

    # 发送钉钉通知
    webhook = 'https://oapi.dingtalk.com/robot/send?access_token' \
              '=1c7d9f9d880ca4ca9fxxxxxxxxxxxxxxxxxxxxxxxxxxxx '
    headers = {'Content-Type': 'application/json'}
    data = {
        'msgtype': 'markdown',
        'markdown': {
            "title": '蒲公英机器人',
            'text': context
        },
        'at': {
            'atMobiles': [],
            'isAtAll': False
        }
    }
    x = requests.post(url=webhook, data=json.dumps(data), headers=headers)
    if x.json()["errcode"] == 0:
        print("\n*************** 钉钉消息已发送 ***************")


# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    # 构建应用
    fastlane(sys.argv[1])
    # 上传蒲公英
    uploadResult = uploadPyger(sys.argv[1])
    # 发送钉钉通知
    sendDingMessage(uploadResult['data'])
# See PyCharm help at https://www.jetbrains.com/help/pycharm/

  • 使用pyinstaller 打出脚本,重命名PgyerBuild

FastLane配置模板

# This file contains the fastlane.tools configuration
# You can find the documentation at https://docs.fastlane.tools
#
# For a list of all available actions, check out
#
#     https://docs.fastlane.tools/actions
#
# For a list of all available plugins, check out
#
#     https://docs.fastlane.tools/plugins/available-plugins
#

# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane

default_platform(:ios)

platform :ios do
  desc "build project"
  lane :buildDebug do
    #配置工程基本信息
    update_app_identifier(
      xcodeproj: "TooWellMerchant.xcodeproj", # Optional path to xcodeproj, will use the first .xcodeproj if not set
      plist_path: "TooWellMerchant/Info.plist", # Path to info plist file, relative to xcodeproj
      app_identifier: "com.xxxxxx.xxxxxx" # The App Identifier
    )
    #配置签名以及证书
    automatic_code_signing(
      path: "TooWellMerchant.xcodeproj",
      #启用自动签名
      use_automatic_signing: true,
      code_sign_identity: "Apple Development",
      #根据证书拿到团队ID或者直接去苹果开发者官方查阅
      team_id:"K4T4XXXXXX",
    )
    #配置生成包的类型以及发布渠道
    gym(scheme: "TooWellMerchant",
      workspace: "TooWellMerchant.xcworkspace",
      configuration: "Debug",
      clean: true,
      output_name:"TooWellMerchant.ipa",
      #只打Arm64,缩小包体积
      xcargs:"ARCHS='arm64'",
      #IOS 9适配
      export_xcargs:"-allowProvisioningUpdates",
      export_method: "development"           # app-store, ad-hoc, package, enterprise, development, developer-id
    )
  end
  lane :buildRelease do
    update_app_identifier(
      xcodeproj: "TooWellMerchant.xcodeproj", # Optional path to xcodeproj, will use the first .xcodeproj if not set
      plist_path: "TooWellMerchant/Info.plist", # Path to info plist file, relative to xcodeproj
      app_identifier: "com.xxxxxx.xxxxxx" # The App Identifier
    )
    automatic_code_signing(
      path: "TooWellMerchant.xcodeproj",
      use_automatic_signing: true,
      code_sign_identity: "Apple Development",
      team_id:"K4T4XXXXXX",
    )
    gym(scheme: "TooWellMerchant",
      workspace: "TooWellMerchant.xcworkspace",
      configuration: "Release",
      clean: true,
      output_name:"TooWellMerchant.ipa",
      #只打Arm64,缩小包体积
      xcargs:"ARCHS='arm64'",
      #IOS 9适配
      export_xcargs:"-allowProvisioningUpdates",
      export_method: "development"           # app-store, ad-hoc, package, enterprise, development, developer-id
    )
  end
end

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,951评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,606评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,601评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,478评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,565评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,587评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,590评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,337评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,785评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,096评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,273评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,935评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,578评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,199评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,440评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,163评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,133评论 2 352

推荐阅读更多精彩内容