整個流程是Jenkins設(shè)置自動定時運行腳本,打包生成ipa文件和plist文件,成功之后,自動發(fā)送釘釘消息給測試人員,測試人員打開下載地址,OTA安裝。
環(huán)境:macOS10.12.5,Xcode 8.3.3,ruby2.4.0,java1.8.0
第一步:搭建Jenkins
第二步:自動打包
自動打包用的是一個自動打包的腳本:PPAutoPackageScript ,GitHub地址:https://github.com/jkpang/PPAutoPackageScript
PPAutoPackageScript在本地的用法見GitHub,作者寫了詳細(xì)的使用方法。整體來說沒有難度,按步驟來就行。先把腳本里面需要自己修改的部分,修改完成之后,測試打包沒問題,再繼續(xù)下一步。
注意:Xcode證書管理部分不要設(shè)置自動管理,否則會報錯
第三步:OTA分發(fā)部分
OTA分發(fā),我是在本地搭建的服務(wù)器,目前OTA分發(fā)只支持Https,所以需要OpenSSL自制證書。后面有具體方法,先搭建服務(wù)器。
啟動服務(wù)器
macOS 自帶apache服務(wù),所以終端輸入 sudo apachectl start ,瀏覽器輸入http://127.0.0.1,如果出現(xiàn)It Works!,OK,服務(wù)器啟動成功。
修改配置
服務(wù)器默認(rèn)目錄"/Library/WebServer/Documents/",編輯"/etc/apache2/httpd.conf ",找到
DocumentRoot "/Library/WebServer/Documents"
<Directory "/Library/WebServer/Documents">
改為你想作為服務(wù)器根目錄的路徑。
其他修改如下圖:

OpenSSL自制證書
生成服務(wù)器的私鑰
mkdir /private/etc/apache2/ssl
cd /private/etc/apache2/ssl
sudo openssl genrsa -out server.key 1024
生成簽署申請
sudo openssl req -new -key server.key -out server.csr
(需要輸入多個項目,其中Common Name為服務(wù)器的域名或IP)
生成CA私鑰
sudo openssl genrsa -out ca.key 1024
用CA的私鑰產(chǎn)生CA的自簽署證書
sudo openssl req -new -x509 -days 365 -key ca.key -out ca.crt
創(chuàng)建demoCA
sudo mkdir demoCA
cd demoCA
mkdir newcerts
創(chuàng)建文件index.txt和serial,serial內(nèi)容為01,index.txt為空(index.txt必須為空,否則后報錯)
返回ssl文件夾
sudo openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key
目前為止生成了server.crt,server.key,ca.crt文件,位置分別為"/private/etc/apache2/ssl/server.crt","/private/etc/apache2/ssl/server.key",ca.crt 放在文件根目錄(也就是前面DocumentRoot文件夾中)。
配置服務(wù)器的SSL服務(wù)
編輯/private/etc/apache2/httpd.conf,去掉下面幾個項目的注釋(去掉前面的‘#’)
LoadModule ssl_module libexec/apache2/mod_ssl.so
LoadModule socache_shmcb_module libexec/apache2/mod_socache_shmcb.so
Include /private/etc/apache2/extra/httpd-ssl.conf
Include /private/etc/apache2/extra/httpd-vhosts.conf
編輯/private/etc/apache2/extra/httpd-ssl.conf
修改下面兩項的路徑,改為剛才ssl證書存放的路徑,如下:
SSLCertificateFile "/private/etc/apache2/ssl/server.crt"
SSLCertificateKeyFile "/private/etc/apache2/ssl/server.key"
編輯/private/etc/apache2/extra/httpd-vhosts.conf
文件末尾添加:
<VirtualHost *:443>
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile /private/etc/apache2/ssl/server.crt
SSLCertificateKeyFile /private/etc/apache2/ssl/server.key
ServerName 192.168.1.35(服務(wù)器的IP)
DocumentRoot "同上面的DocumentRoot路徑"
</VirtualHost>
添加完之后
sudo apachectl configtest
有問題按照提示開啟相關(guān)服務(wù),沒問題的話重啟服務(wù)器
sudo apachectl restart
到此就可以https訪問服務(wù)器了。
編寫OTA安裝需要的plist文件,以及服務(wù)器頁面
在服務(wù)器的根目錄(DocumentRoot目錄)下,新建plist文件,命名為manifest.plist文件根據(jù)自己的情況修改,兩個圖片地址可要可不要,文件模版如下:
<?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>items</key>
<array>
<dict>
<key>assets</key>
<array>
<dict>
<key>kind</key>
<string>software-package</string>
<key>url</key>
<string>https://192.168.1.35/pay.ipa</string>
</dict>
<dict>
<key>kind</key>
<string>display-image</string>
<key>url</key>
<string>https://192.168.1.35/pay57.png</string>
</dict>
<dict>
<key>kind</key>
<string>full-size-image</string>
<key>url</key>
<string>https://192.168.1.35/pay512.png</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>打包的bundleidentifier</string>
<key>bundle-version</key>
<string>app版本號</string>
<key>kind</key>
<string>software</string>
<key>title</key>
<string>app名稱</string>
</dict>
</dict>
</array>
</dict>
</plist>
plist文件創(chuàng)建后,再新建index.html,要包含app的下載地址和SSL證書的下載地址,其他部分自己寫,下載地址如下:
<a href="itms-services://?action=download-manifest&url=https://192.168.1.35/manifest.plist">appName</a>
<a >安裝SSL證書</a>
到目前為止,所有電腦上的設(shè)置結(jié)束了,可以把第二步測試生成的adhoc版app和ca.crt 文件,放在服務(wù)區(qū)根目錄下,測試一下OTA安裝是否可用。
測試:
手機跟電腦在同一個局域網(wǎng)內(nèi),手機訪問服務(wù)器的頁面,先點擊安裝SSL證書,安裝證書,然后在設(shè)置——>通用——>描述文件,設(shè)置剛才安裝的證書為信任。接下來最重要的一步,設(shè)置——>通用——>關(guān)于本機,最下面的證書信任設(shè)置,再次設(shè)置信任。這個時候再返回網(wǎng)頁才能下載安裝app。否則會出現(xiàn)"無法連接***"。測試沒有問題,進行下一步。
第四步:所有流程串起來
這一步需要把Jenkins和OTA分發(fā)服務(wù)器,釘釘連通,整個流程走通
PPAutoPackageScript 腳本除了作者建議修改的部分外,我們還需要根據(jù)需求稍作修改。
首先,修改輸出ipa路徑,改為服務(wù)器的根目錄,如圖:

這樣輸出的ipa文件直接就在根目錄,不需要再復(fù)制ipa文件到根目錄下,路徑要和plist文件里的下載路徑一樣。但是還有一個問題,plist文件中,bundle-identifier還好,一個項目中基本上不會修改,但是版本號會經(jīng)常變。我的解決方法比較笨,直接重新生成plist文件,在腳本ipa文件輸出成功之后打開輸出目錄之前(open $export_path,這一步的前面)添加如下代碼,僅供參考:
cd $export_path
cat << EOF > manifest.plist
<...>
<key>url</key>
<string>https://192.168.1.35/App/v$bundle_version/${ipa_name}.ipa</string>
<...>
<dict>
<key>bundle-identifier</key>
<string>打包的bundleidentifier</string>
<key>bundle-version</key>
<string>$bundle_version</string>
<key>kind</key>
<string>software</string>
<key>title</key>
<string>$scheme_name</string>
<...>
EOF
<...>部分跟前面的plist模版一樣,不再重復(fù),可以直接復(fù)制模版修改。這里的下載路徑包括腳本里的export_path也即輸出路徑,根據(jù)自己的需求修改,如果是直接生成在根目錄下,https://192.168.1.35/${ipa_name}.ipa這樣寫,生成的新ipa文件會覆蓋舊的。我這里是讓它每次根據(jù)版本號輸出到不同的文件夾。
腳本文件修改完畢之后,登陸Jenkins,進入之前建的項目中,點擊配置,在釘釘通知消息這一步的前面增加構(gòu)建步驟,如圖:

第一行是打開腳本所在的位置,第二行運行腳本。
OK,保存,返回項目點擊立即構(gòu)建。測試沒有問題之后,再在配置里面設(shè)置定時構(gòu)建,語法點擊輸入框后面的問號有參考。
以上就是整個全部流程,自己正在用,網(wǎng)上好多步驟不完整或是比較老,出現(xiàn)錯誤參考每一步的注意部分,特別要注意iOS10 出現(xiàn)無法連接到***的錯誤?。?!。有錯誤的地方請指正,互相交流。