用Python編寫IOS工程的自動編譯指令碼

2021-06-19 13:21:21 字數 3513 閱讀 6502

折騰了一周,終於用python語言寫好了專案工程的自動編譯指令碼,雖然最終指令碼只有200多行**,但中間遇到的一些問題還是折磨了我一番, 好了, 現在把過程記錄下來, 以便加深自己的印象, 也可供需要的人參考.

一.目標

我寫這個指令碼是要做到下面幾個目標:

1.每次編譯都從伺服器更新最新**;

2.每次編譯要自動修改info.plist裡的bundle version;

二. 開發環境

我是在mac下用python開發的, 其實直接用shell指令碼也行, 我是為了操作一些檔案更方便, 編輯器用的sublime text 2.

三. 前提條件

開發證書和發布證書請先安裝好, 工程配置裡新增distribution項(複製release), 並配置好對應的發布證書.

四. check out工程**.

def svncheckout(self):

print "svn checkout start"

os.system('rm -frd %s'%codedir)

os.system('mkdir %s'%codedir)

os.system('svn checkout %s --username %s --password %s --non-interactive %s'\

%(svnpath,svnusername,svnpassword,codedir))

if os.path.exists('%s/yourproject'%codedir) == false:

msg = 'checkout code failed'

print msg

self.buildsucceed = false

return false

else:

os.chdir(lifesearchbuild.codedir)

return true

需要匯入os模組, os.system()方法是執行shell命令的, **中, codedir變數是check out**後存放的本地目錄, builderrordescription是我定義的乙個列表, 用來記錄錯誤的資訊的, 供後面傳送郵件使用(編譯失敗時).

五. 修改bundle version

def modifybundleversion(self,newbundleversion):

os.system('/usr/libexec/plistbuddy -c "set:cfbundleversion %s" %s'%(newbundleversion,infoplistfilepath))

其中infoplistfilepath是你check out**後工程裡info.plist檔案的路徑. newbundleversion需要你自己定義乙個規則, 保證和上次編譯的包的version是遞增的就行, 編譯完成後也需要持久化到本地, 以便下次做遞增計算.

六. 編譯工程

有了**後, 就開始用xcodebuild命令來編譯工程, 編譯debug版的**如下:

def build_debug(self):

print "build debug start"

os.system('rm -frd build')

os.system('xcodebuild clean -configuration debug')

os.system('xcodebuild -configuration debug')

os.system('mkdir payload')

os.system('zip -r %s payload'%debugipaname)

os.system('rm -frd build')

os.system('rm -frd payload')

else:

self.buildsucceed = false

**中ipanamelist是我定義的乙個列表, 用來儲存編好的包名字的, 以便後續上傳伺服器時使用.

七. 上傳到伺服器

我用到了ftp命令, **如下:

def uploadtoftp(self):

if len(self.ipanamelist) == 0:

self.buildsucceed = false

print "no ipas to upload"

return

os.system('''

ftp -niv %s << eof

user %s %s

binmkdir %s/%s

cd %s/%s

lcd %s

mput %s

byeeof'''%(ftpaddress,

ftpusername,

ftppassword,

self.buildversion,

self.buildversion,

codedir,

' '.join(self.ipanamelist)))

其實大家不用細看這段**, 這是我專案裡直接拷貝過來的, 只要大家能用ftp命令上傳到自己的伺服器就行了.

八. 郵件通知

發郵件用到了smtplib, 我的郵件內容需是html格式的, 我就不直接拷貝我專案裡的**了, 寫個例子**如下:

smtp = smtplib.smtp('mail.yourcompany.com')

smtp.login(emailsenderusername, emailsenderpassword)

msg = mimemultipart()

msg['to'] = ";".join(emailaddresslist)

msg['from'] = emailsender

msg['subject']= "test mail"

text = "build successful

"body = mimetext("%s"%text,_subtype='html',_charset='utf-8')

msg.attach(body)

smtp.sendmail(msg['from'], emailaddresslist, msg.as_string())

smtp.quit()

九. dailybuild

編譯指令碼弄好後, 可以手動執行編譯, 也可以新增計畫任務來每日定時編譯, 這就用到了crontab, 如果你想每天早上8點執行自動編譯指令碼, 則編輯crontab如下:

0 8 * * * python build.py >buildlog.txt
buildlog.txt檔案用來記錄日誌.

注意!!用crontab的時候, 證書的問題折磨了我整整一天, 因為在crontab, 證書無法讀取到, 導致簽名失敗, 上網查了大量的文章, 好像跟crontab無法讀取到使用者化境變數有關, 不過, 最終我的解決辦法倒是很簡單, 就是開啟鑰匙串, 把證書從"登入"裡拷貝到"系統"裡就可以了.

ok, 完了, 希望對大家有幫助.

用 Python 編寫網路爬蟲 筆記

每個 都應該提供 api,然而這是不可能的 即使提供了 api,往往也會限速,不如自己找介面 robots.txt 中可能會有陷阱 sitemap 中可能提供了重要的鏈結 乙個簡便方法是使用 site example.com 查詢,然而這種方法對於大戰不適用 builtwith 模組 pip ins...

用python來編寫TSP問題

import math from os import path import numpy as np import matplotlib.pyplot as plt class tspinstance 設計乙個類,實現從檔案讀入乙個旅行商問題的例項 檔案格式為 city number best kn...

用python編寫串列埠測試指令碼

用python編寫串列埠測試指令碼 最近接到了乙個測試硬體的內容,有大概十臺左右,給了乙個串列埠測試的文件,讓我來測硬體,測試的前兩天使用的手工測試,實在有點麻煩,晚上加班寫了個指令碼來簡單的自動執行一下。import serial.tools.list ports import time impo...