iOS 2017 自動(dòng)打包(python腳本)

前言

需要自動(dòng)發(fā)布腳本的同學(xué)請(qǐng)移步:自動(dòng)打包發(fā)布到App Store

打包,是每個(gè)app開(kāi)發(fā)人員必須做得的一件枯燥無(wú)味且相當(dāng)浪費(fèi)時(shí)間的事情,于是,萬(wàn)能的開(kāi)發(fā)者們學(xué)會(huì)了利用腳本來(lái)解放雙手,這就是我接下來(lái)要講的--自動(dòng)打包.

正文

閑話(huà)少說(shuō),直入主題,不過(guò)在入主題之前先做準(zhǔn)備工作:

先安裝fir,fir是比較好用的第三方內(nèi)測(cè)托管網(wǎng)站之一,下面實(shí)現(xiàn)命令安裝

$? gem install fir-cli

詳情請(qǐng):

https://github.com/FIRHQ/fir-cli/blob/master/doc/install.md

此時(shí)我遇到了下面的錯(cuò)誤:

ERROR: SSL verification error at depth 1: unable to get local issuer certificate (20)

ERROR: You must add /C=IL/O=StartCom Ltd./OU=Secure Digital Certificate

Signing/CN=StartCom Certification Authority to your local trusted store

ERROR:? While executing gem ... (Gem::FilePermissionError)

You don't have write permissions for the /Library/Ruby/Gems/2.0.0 directory.

這時(shí)真是無(wú)語(yǔ)啊,就不能順利點(diǎn)嗎?

解決問(wèn)題吧,還能怎樣....

一個(gè)一個(gè)來(lái):

首先第一個(gè)肯定是ssl證書(shū)問(wèn)題,方法:

1.$ cd$rvm_path/usr/ssl

2.$ sudo curl-O http://curl.haxx.se/ca/cacert.pem

3.$ sudo mv cacert.pem cert.pem

第二個(gè)error是ruby的問(wèn)題,我以為是ruby的環(huán)境問(wèn)題,畢竟淘寶不能用了嘛,不管,換成最新的:

$gem sources --remove? https://ruby.taobao.org/

$gem sources --add https://gem.ruby-china.com

再試..還是報(bào)錯(cuò),好吧,那就是ruby版本的問(wèn)題咯,好吧,繼續(xù)解決問(wèn)題:

1.先安裝Homebre ,終端輸入這條命令即可:

$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

2. 安裝rvm$ curl -L get.rvm.io | bash -s stable

3.裝載rvm$ source ~/.rvm/scripts/rvm

4.安裝2.3.0版本ruby$ rvm install 2.3.0

5.將2.3.0設(shè)為默認(rèn)$ rvm use 2.3.0 --default

第三個(gè)貌似是權(quán)限問(wèn)題,不管 sudo 他:

$ sudo gem install fir-cli

OK啦!!!!!

然后,去fir 注冊(cè)一個(gè)賬號(hào)再創(chuàng)建一個(gè)應(yīng)用先放著

=====準(zhǔn)備工作告一段落=====

正題終于來(lái)了,先聲明我的思路,寫(xiě)程序思路很重要,這是真理:

一??? 創(chuàng)建和管理build文件夾

二??? 用xcodebuild編譯出.app文件

三??? 把.app文件打包成IPA文件

四??? 上傳到fir

五???? 發(fā)郵件通知給測(cè)試人員

o了!!!!!

然后一步步實(shí)現(xiàn)---

不想多說(shuō)怎么辦?----

直接上代碼,這些代碼是經(jīng)過(guò)本人親自測(cè)試過(guò)的,沒(méi)毛病,可直接使用,沒(méi)辦法,哥就是這么霸氣!!!

/*********************代碼開(kāi)始********************/

# -*- coding: utf-8 -*-

import os

import sys

import time

import hashlib

from email import encoders

from email.header import Header

from email.mime.text import MIMEText

from email.utils import parseaddr, formataddr

import smtplib

# 項(xiàng)目根目錄

project_path = "/Users/xxxxx"

# 編譯成功后.app所在目錄

app_path = "/Users/xxx/Desktop/xxxx/build/xxxx-iphoneos/xxx.app"

# 指定項(xiàng)目下編譯目錄

build_path = "build"

# 打包后ipa存儲(chǔ)目錄

targerIPA_parth = "/Users/xxxx/Desktop"

fir_URL = "http://fir.im/xxxx"

# fir的api token

fir_api_token = "xxxxx"

from_addr = "xxxx@163.com"

#注意是授權(quán)密碼不是登錄密碼

password = "xxxx"

smtp_server = "smtp.163.com"

to_addr = 'xxx@163.com,xxxx@qq.com'

# 清理項(xiàng)目 創(chuàng)建build目錄

def clean_project_mkdir_build():

os.system('cd %s;xcodebuild clean' % project_path) # clean 項(xiàng)目

os.system('cd %s;mkdir build' % project_path)

def build_project():

print("build release start")

os.system ('xcodebuild -list')

os.system("cd %s;xcodebuild -configuration xxx -target xxx"%(project_path))

# 打包ipa 并且保存在桌面

def build_ipa():

global ipa_filename

ipa_filename = time.strftime('xxx_%Y-%m-%d-%H-%M-%S.ipa',time.localtime(time.time()))

os.system ('xcrun -sdk iphoneos PackageApplication -v %s -o %s/%s'%(app_path,targerIPA_parth,ipa_filename))

#上傳

def upload_fir():

if os.path.exists("%s/%s" % (targerIPA_parth,ipa_filename)):

print('watting...')

# 直接使用fir也可

ret = os.system("/usr/local/bin/fir p '%s/%s' -T '%s'" % (targerIPA_parth,ipa_filename,fir_api_token))

else:

print("沒(méi)有找到ipa文件")

def _format_addr(s):

name, addr = parseaddr(s)

return formataddr((Header(name, 'utf-8').encode(), addr))

# 發(fā)郵件

def sendEmail():

msg = MIMEText('iOS測(cè)試項(xiàng)目已經(jīng)打包完畢巩梢,請(qǐng)前往:%s 掃一掃即可下載測(cè)試'%fir_URL,'plain','utf-8')

msg['to'] = _format_addr('xx <%s>' % to_addr)

msg['from'] = _format_addr('自動(dòng)打包 <%s>' % from_addr)

msg['subject'] = '新的iOS測(cè)試包已上傳'

try:

server = smtplib.SMTP()

server.set_debuglevel(1)

server.connect(smtp_server)

server.login(from_addr,password)

server.sendmail(msg['from'], msg['to'],msg.as_string())

server.quit()

print '發(fā)送成功'

except Exception, e:

print str(e)

return

def main():

# 清理并創(chuàng)建build目錄

clean_project_mkdir_build()

# 編譯coocaPods項(xiàng)目文件并 執(zhí)行編譯目錄

build_project()

# 打包ipa 并制定到桌面

build_ipa()

# 上傳fir

upload_fir()

# 發(fā)郵件

sendEmail()

# 執(zhí)行

main()

/***************************代碼結(jié)束*******************/

執(zhí)行python腳本:

cd? xx路徑

python? xx.py

PS:? fir 的路徑是絕對(duì)路徑终蒂,需要用which fir 獲取下熟尉,特別是當(dāng)你換了電腦時(shí)膘怕。

再PS:如果發(fā)生xcrun: error: unable to find utility "PackageApplication", not a developer tool or in PATH的問(wèn)題,是Xcode8.2沒(méi)有PackageApplication的原因,可以在網(wǎng)上下載,然后

右鍵 Xcode.app -> 顯示包內(nèi)容 -> Contents -> Developer -> platforms -> iPhoneOS.platform -> Developer -> usr -> bin惕虑,進(jìn)入這個(gè)目錄之后坟冲,將下載的PackageApplication復(fù)制到這個(gè)目錄,然后執(zhí)行:chmod +x PackageApplication溃蔫。

或者sudo xcode-select -switch/Applications/Xcode.app/Contents/Developer/chmod +x/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/PackageApplication健提,就OK了。

=============================================

********本文結(jié)束!**********

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末伟叛,一起剝皮案震驚了整個(gè)濱河市私痹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌统刮,老刑警劉巖紊遵,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異侥蒙,居然都是意外死亡暗膜,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)鞭衩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)学搜,“玉大人,你說(shuō)我怎么就攤上這事论衍∪鹋澹” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵饲齐,是天一觀的道長(zhǎng)钉凌。 經(jīng)常有香客問(wèn)我咧最,道長(zhǎng)捂人,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任矢沿,我火速辦了婚禮滥搭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捣鲸。我一直安慰自己瑟匆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布栽惶。 她就那樣靜靜地躺著愁溜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪外厂。 梳的紋絲不亂的頭發(fā)上冕象,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音汁蝶,去河邊找鬼渐扮。 笑死论悴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的墓律。 我是一名探鬼主播膀估,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼耻讽!你這毒婦竟也來(lái)了察纯?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤针肥,失蹤者是張志新(化名)和其女友劉穎捐寥,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體祖驱,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡握恳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捺僻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乡洼。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖匕坯,靈堂內(nèi)的尸體忽然破棺而出束昵,到底是詐尸還是另有隱情,我是刑警寧澤葛峻,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布锹雏,位于F島的核電站,受9級(jí)特大地震影響术奖,放射性物質(zhì)發(fā)生泄漏礁遵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一采记、第九天 我趴在偏房一處隱蔽的房頂上張望佣耐。 院中可真熱鬧,春花似錦唧龄、人聲如沸兼砖。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)讽挟。三九已至,卻和暖如春丸冕,著一層夾襖步出監(jiān)牢的瞬間耽梅,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工晨仑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留褐墅,地道東北人拆檬。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像妥凳,于是被迫代替她去往敵國(guó)和親竟贯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容