iOS 持續整合方案,傻瓜式一鍵全自動化打包、上傳!—— Python

水果刀削麵發表於2018-12-24

iOS 持續整合方案(完整程式碼)

前言:目前市面上iOS開發持續整合的方案很多,在主流的分發平臺fir、蒲公英都有相應的方案介紹(Fastlane,Jenkins,實用又強大);但就實際需求來說還是不夠友好;在前面使用Python為公司開發兩個自動化指令碼之餘,產生使用Python開發一個完全傻瓜式的自動化指令碼,並滿足自身需求,在公司另一臺Mac mini上進行自動打包上傳,測試人員可HTTP調起打包上傳、自動通知產品、測試相關人員。

本人Python新手,該指令碼小工具、小工具、小工具目前自學自用,許多不足之處,大神見諒指教。如果您有更好的建議,可以一起學習交流。?

  • 語言:Python
  • 環境:Python 3.6 (3.6開發、暫不相容 2+)

需求

  • 可執行指令碼 或 整合 App 使用,傻瓜式執行,隨身攜帶,即插即用
  • 無需配置執行環境(構建Mac App)
  • 滿足跨平臺(PC、手機)調起打包上傳(http服務)
  • 可喚起多個專案打包
  • 自動執行 git / svn 命令更新程式碼
  • 自動上傳指定分發平臺,包括App Store
  • 上傳完畢通知測試等相關人員(郵件、QQ、微信)
  • 定時打包任務(後期新增)

設計

iOS 持續整合方案,傻瓜式一鍵全自動化打包、上傳!—— Python

iOS 持續整合方案,傻瓜式一鍵全自動化打包、上傳!—— Python

使用

  • 1、配置好Andromeda.plist檔案
  • 2、雙擊Andromeda.app執行(構建的App與測試結果有出入,暫不支援)
  • 2、執行 Python指令碼
python3 Andromeda.py  (暫不考慮相容 Python 2)
複製程式碼
  • 3、如果設定開啟HTTP服務,瀏覽器調起
/*
// 通過瀏覽器內網訪問
/*
target(可選) 專案Target
type(可選) 引數 構建 的IPA型別 0:appstore / 1:adhoc / 2:enterprise / 3:development
pod (可選) 執行pod 指令  install  update   update MJRefresh ....
*/
http://192.168.0.190:8989/ipa
or
http://192.168.0.190:8989/ipa?target='TargetA'&type=0&pod=update MJRefresh

複製程式碼

原理

1、構建 archive & ipa -> xcodebuild 命令

文件(難找,自行問度娘、谷哥《xcodebuild》)

    def __clean(self):
        clean = '-workspace %s.xcworkspace' % (self.target) if self.is_workspace else '-project %s.xcodeproj'%(self.target)
        s = 'cd %s;' \
            'xcodebuild clean %s ' \
            '-scheme %s ' \
            '-configuration %s' \
            % (self.path, clean, self.target, self.build_type)
        ok = os.system(s)
        if ok > 0:
            raise Exception("Clean Error !")
        else:
            pass

    def __build(self):
        build = "-workspace %s.xcworkspace" % self.target if self.is_workspace else "-project %s.xcodeproj" % self.target
        s = "cd %s;" \
            "xcodebuild archive %s " \
            "-scheme %s " \
            "-archivePath %s/%s " \
            % (self.path, build, self.target, self.archive_path, self.archive_name)
        ok = os.system(s)
        if ok > 0:
            raise Exception("Archive Error !")
        else:
            pass
            
    def __ipa(self):
        s = "cd %s;" \
            "xcodebuild -exportArchive -archivePath %s/%s.xcarchive" \
            " -exportPath %s" \
            " -exportOptionsPlist '%s'" \
            % (self.path, self.archive_path, self.archive_name, self.ipa_path, self.export_plist)
        print('----------> self.archive_path', self.archive_path)
        print('----------> self.archive_name', self.archive_name)
        print('----------> self.ipa_path', self.ipa_path)
        print('----------> self.export_plist', self.export_plist)
        ok = os.system(s)
        if ok > 0:
            raise Exception("Export Error !")
        else:
            pass

複製程式碼

2、上傳App Store Connect

文件

def upload_to_appstore(path, name, pwd, altool_path):
    print('----- 驗證App----->')
    s = '%s ' \
        '--validate-app -f %s ' \
        '-u %s ' \
        '-p %s ' \
        '-t ios --output-format xml' % (altool_path, path, name, pwd)
    v = os.system(s)
    print('----------> ', v)
    if v == 0:
        print('----- 上傳App----->')
        ss = '%s ' \
             '--upload-app -f %s  ' \
             '-u %s ' \
             '-p %s ' \
             '-t ios --output-format xml' % (altool_path, path, name, pwd)

        u = os.system(ss)
        if u == 0:
            print('----- 上傳App 成功----->')
            pass
        else:
            raise Exception("上傳 App Store 失敗 !")
    else:
        raise Exception("驗證 App 失敗 !")

複製程式碼

3、上傳蒲公英

文件

4、上傳fir.im

文件

5、郵件通知

  • SMTP -- smtplib、email 模組

6、HTTP服務

  • Flask
pip install flask
pip install flask_restful
or
pip3 install flask
pip3 install flask_restful
複製程式碼

不過該指令碼還沒有完全開發完畢,但是完成初版的開發和測試,可投入實際運用

如果你感興趣,可移駕GitHub - iOS 持續整合方案傻瓜式一鍵全自動化打包、上傳!

相關文章