前言
新到公司的時(shí)候發(fā)現(xiàn)公司還在使用傳統(tǒng)的手動(dòng)打包測試方式涤伐,所以利用自己的閑暇時(shí)間開發(fā)了一個(gè) iOS 打包平臺(tái)潮改,經(jīng)過不斷改良向拆,現(xiàn)在公司在使用新一款的打包平臺(tái),測試人員可以輕松完成打包工作偏陪。我目前也在重新構(gòu)建平臺(tái)抢呆,發(fā)布開源版本。
本系列文章記錄完整的 iOS 打包平臺(tái)搭建過程笛谦,文章列表記錄如下:
iOS自動(dòng)打包平臺(tái)搭建:一 概述
iOS自動(dòng)打包平臺(tái)搭建:二 模塊(組件)化開發(fā)
[iOS自動(dòng)打包平臺(tái)搭建:三 Master/Slave架構(gòu)
iOS自動(dòng)打包平臺(tái)搭建:四 打包腳本(待完成)
iOS自動(dòng)打包平臺(tái)搭建:五 內(nèi)網(wǎng)OTA(待完成)
iOS自動(dòng)打包平臺(tái)搭建:附 安卓打包(待完成)
什么是Master/Slave架構(gòu)
Master/Slave相當(dāng)于Server和agent的概念抱虐。Master提供web接口讓用戶來管理job和slave,job可以運(yùn)行在master本機(jī)或者被分配到slave上運(yùn)行饥脑。一個(gè)master可以關(guān)聯(lián)多個(gè)slave用來為不同的job或相同的job的不同配置來服務(wù)恳邀。[摘自網(wǎng)絡(luò)]
為什么用到Master/Slave架構(gòu)
其實(shí)之前對這種架構(gòu)并不是很熟,但因?yàn)楣緵]有閑置Mac可以用來搭建服務(wù)器灶轰,打包平臺(tái)的服務(wù)只能在Linux系統(tǒng)的一臺(tái)服務(wù)器運(yùn)行谣沸,而眾所周知 iOS 的打包只能在 Mac 上進(jìn)行,所以要實(shí)現(xiàn) iOS 的打包功能只能在服務(wù)器發(fā)布命令后笋颤,將打包指令傳遞給 Mac 去執(zhí)行乳附,在這個(gè)過程中服務(wù)器就是一個(gè) Master,而執(zhí)行打包操作的 Mac 就是 Slave,其關(guān)系如下圖所示许溅。
怎么實(shí)現(xiàn)
關(guān)于 Master/Slave 架構(gòu)的實(shí)現(xiàn),我選擇使用 ssh秉版,因?yàn)檫@是一種很簡單的方式贤重,并且在 Mac 、 Linux 系統(tǒng)中都是默認(rèn)安裝的清焕,后來才注意到 Jenkins 也是 Master/Slave 架構(gòu),它有提供幾種方案,展示如下
對其他的方式有興趣的朋友可以研究下忱辅,我們繼續(xù)說 ssh 方式榆芦。
我在本地(localhost)新建一個(gè)用戶 ipack,在終端輸入 ssh ipack@localhost
:
$ ssh ipack@localhost
Password:
系統(tǒng)會(huì)提示輸入密碼粥惧,輸入對應(yīng)的密碼 123456 键畴,提示成功后就已經(jīng)算是可以搭建 Master/Slave 的橋梁了。
因?yàn)槲覀兪且?Master ssh 遠(yuǎn)程登錄到 Slave突雪,并不是同一臺(tái)主機(jī)的兩個(gè)用戶起惕,另外我們是不希望 Master 在登錄到 Slave 的時(shí)候輸入密碼的,所以接下來將面對兩個(gè)問題:
- 能否登錄到其他主機(jī)咏删?
- 能否免密登錄惹想?
能否登錄到其他主機(jī)?
答案是肯定的督函,但是因?yàn)?Mac 系統(tǒng)的安全設(shè)置嘀粱,需要開啟共享設(shè)置,如下
注意:要設(shè)置允許所用用戶訪問辰狡。
能否免密登錄锋叨?
免密登錄也是可以實(shí)現(xiàn)的,在 Master 生成公鑰和私鑰搓译,然后將公鑰保存在 Slave 即可完成悲柱。具體如下:
在 Master 執(zhí)行 ssh-keygen -t rsa
,默認(rèn)會(huì)在 /Users/<User Name>/.ssh/
目錄下生成兩個(gè)文件些己,一個(gè)是私鑰(id_rsa
) 豌鸡,一個(gè)是公鑰(id_rsa.pub
)。將公鑰文件上傳到 Slave 的 ~/.ssh/ 目錄段标,然后重命名為 authorized_keys
涯冠。
至此,對于普通發(fā)行版的 Linux 已經(jīng)可以正常免密碼登錄了逼庞,但是在 Mac 上是不行的蛇更, Mac 上 sshd 一般默認(rèn)是沒有打開免密登錄選項(xiàng)的,需要手動(dòng)開啟。
在 Slave 上編輯文件 /etc/ssh_config
(需要 root 權(quán)限)派任,如果沒有就新建一個(gè)砸逊,在行尾添加一行
PubkeyAuthentication yes
如果不出意外,現(xiàn)在是可以免密連接到 Slave 的掌逛。
執(zhí)行命令
現(xiàn)在已經(jīng)可以從 Master 登錄到 Slave 师逸,并且已經(jīng)可以執(zhí)行操作,但也僅限于在終端中輸入命令豆混,而我們需要的是能登錄能執(zhí)行操作的一條命令篓像,查閱很多資料找到一條線索,ssh 的 -t
參數(shù)皿伺。
-t Force pseudo-tty allocation. This can be used to execute arbitrary screen-based programs on a remote machine, which can be very useful, e.g. when implementing menu services. Multiple -t options force tty allocation, even if ssh has no local tty.
就是可以提供一個(gè)遠(yuǎn)程服務(wù)器的虛擬tty終端员辩,加上這個(gè)參數(shù)我們就可以在遠(yuǎn)程服務(wù)器的虛擬終端上輸入自己的提權(quán)密碼了,示例如下:
ssh -t -p $port $user@$ip 'cmd'
可以發(fā)現(xiàn)它的后面可以拼接 cmd
鸵鸥,也就是說可以預(yù)先在 Slave 上配置好腳本文件奠滑,然后在上述命令中執(zhí)行這個(gè)腳本文件就可以達(dá)到我們的目的。
具體實(shí)現(xiàn)
根據(jù)以上的信息脂男,要實(shí)現(xiàn)在 Slave 執(zhí)行 iOS 打包操作有兩種實(shí)現(xiàn)方案:
- 提前部署好打包腳本文件养叛,然后通過 ssh 執(zhí)行
- 腳本部署在 Master,每次打包從 Mater 下拉宰翅,
sh -c "$(curl -fsSL <URL>.sh)"
這里對我采用提前部署好弃甥,部署腳本部分展示如下:
# 授權(quán)
if [ ! -d ${USER_DIR}/.ssh ];
then
mkdir -p ${USER_DIR}/.ssh
fi
cat << EOF > ${USER_DIR}/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQAB....
EOF
# 生成plist文件
cat << EOF > ${BASE_DIR}/Plist/options.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>compileBitcode</key>
<false/>
<key>method</key>
<string>ad-hoc</string>
</dict>
</plist>
EOF
# 獲取iOS打包腳本
cd ${BASE_DIR}/Scripts
curl -o archive.sh ${URL}'/scripts/archive-ios.sh'
chmod +x archive.sh
# 獲取iOS模塊升級腳本
curl -o update-component.sh ${URL}'/scripts/update-component-ios.sh'
chmod +x update-component.sh
從腳本中可以看到獲取打包和升級模塊的部分,是從服務(wù)端下拉腳本到本地汁讼,并修改執(zhí)行權(quán)限淆攻。有了這兩個(gè)腳本文件,在 Master 收到打包命令的時(shí)候就可以調(diào)用 Slave 的這個(gè)腳本執(zhí)行打包操作了嘿架。
總結(jié)
本文主要針對用到的 Master/Slave 進(jìn)行說明瓶珊,因?yàn)橄鄬唵危院芏嗟胤讲⑽凑归_說明耸彪,如發(fā)現(xiàn)錯(cuò)誤或有任何疑問歡迎留言交流伞芹。
更多內(nèi)容請?jiān)L問 http://blog.makaiwen.com