Jenkins持續(xù)化集成,自動打包,OTA分發(fā)

整個流程是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ù)器根目錄的路徑。
其他修改如下圖:


截圖1.png

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路徑.png

這樣輸出的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)建步驟,如圖:

增加構(gòu)建步驟.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容