jenkins+xcode+svn+nginx+https自簽名

1.前言

也沒什么原因就是想搭建來玩一下,所以就這樣吧。如果非要找一個理由那就是:測試別老是催了??。

2.主要實現功能

  • 動態拉取SVN最新代碼
  • 生成ipa文件
  • 生成plist文件
  • ipa、plist自動上傳本地nginx服務器
  • 郵件反饋,生成下載鏈接、鏈接二維碼、自動安裝
  • nginx服務器安裝與配置
  • https證書自簽名

3.環境安裝

homebrew安裝【用來傻瓜式安裝Jenkins 、nginx等等】

<pre><code>ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
</code></pre>

Jenkins安裝

<pre><code>brew install jenkins
</code></pre>

jenkins (啟動)httpProt端口號是8888,你可以修改成任意的??

<pre><code>jenkins --httpPort=8888
</code></pre>

  • http://localhost:8080(瀏覽器輸入默認 8080)
  • /Users/apple(電腦用戶名)/.jenkins(brew安裝jenkins位置
  • ${WORKSPACE} 值為 /Users/apple(電腦用戶名)/.jenkins/jobs/qiniuTest(job名稱)/workspace/)

nginx安裝

<pre><code>brew install nginx
</code></pre>

  • Nginx默認的是8080端口,因為我們還要安裝tomcat服務,所以修改nginx的端口為9000,順便可以設置一下“開啟目錄瀏覽功能”。
    在本地目錄下面,找到【nginx.conf】這個文件,修改其內容<pre><code>/usr/local/etc/nginx</pre>
    </code>
    也可以用vim修改其內容
    <code>sudo vim /usr/local/etc/nginx/nginx.conf
    </code>
9FEDF0F0-DFDC-4112-A829-9313B713E0CE.png
  • 每次修改nginx.conf配置以后都要執行以下命令檢查配置文件是否正確 <code> <pre>nginx -t</pre></code>當出現以下提示則表示正確:<code> <pre>nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful</pre>
    </code>* 給予管理員權限:<code><pre>
    sudo chown root:wheel /usr/local/opt/nginx/bin/nginx
    sudo chmod u+s /usr/local/opt/nginx/bin/nginx</pre>
    </code>* 加入launchctl啟動控制<code><pre>
    mkdir -p ~/Library/LaunchAgents
    cp /usr/local/opt/nginx/homebrew.mxcl.nginx.plist ~/Library/LaunchAgents/
    launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist
    </pre></code>* 啟動 nginx <code><pre>
    $ sudo nginx #打開 nginx
    $ nginx -s reload|reopen|stop|quit #重新加載配置|重啟|停止|退出 nginx
    $ nginx -t #測試配置是否有語法錯誤
    </pre></code>* 啟動成功
    6624FC4A-76F9-431E-9FA7-70369E144875.png

https自簽名證書

  • 生成服務器的私鑰 <code><pre>openssl genrsa -out server.key 1024 </code></pre>
  • 生成簽署申請(注意除Common Name以外可以為空,Common Name必須為服務器的ip或域名) <code><pre>openssl req -new -key server.key -out server.csr </code></pre>
  • 生成CA私鑰 <code><pre>openssl genrsa -out ca.key 1024 </code></pre>
  • 利用CA的私鑰產生CA的自簽署證書<code><pre>openssl req -new -x509 -days 365 -key ca.key -out ca.crt </code></pre>
  • 在當前目錄創建demoCA,里面創建文件index.txt和serial,serial內容為01,index.txt為空,以及文件夾newcerts <code><pre>openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key </code></pre>
  • 這樣,生成了的文件中有 server.crt,server.key, ca.crt <pre>server.crt,server.key, ca.crt</pre>* 開啟nginx https 【把上面的證書拷貝到nginx的目錄下,并且編輯nginx.conf文件】<code><pre>/usr/local/etc/nginx </code></pre>
11E8B0E2-8AFD-48E6-9ED8-380E4C847A80.png
  • 拷貝ca.crt到服務器目錄下以備用戶信任安裝
    <pre>/usr/local/var/www #可以在該目錄下新建一文件夾,放入ca.crt文件</code></pre>
  • 訪問https 信任自簽名證書
3CA95A96-2060-460B-BEE4-350327E6809D.png
  • 到這里服務器的工作已經搭建完畢

4.Jenkins配置

安裝Jenkins插件

<code>
1.Subversion Plug-in(svn)
2.Xcode integration(Xcode)
3.Environment Injector Plugin(自定義全局變量)
4.Email Extension Plugin(郵件)
</code>

系統設置(系統管理–系統設置)##

  • 配置當前的一些環境變量(用于下面局域網內部下載用)
109CDA8B-ED8E-4D12-8896-F8CD55645FE2.png
  • xcodebuilder 證書配置
C8BAC7F2-C981-4C61-8D5F-A06388EA0404.png

<code> <pre>
需填寫的內容:

  • Keychain Name:iPhone Distribution: *(dis證書常用名)
  • Keychain path:${HOME}/Library/Keychains/login.keychain(dis證書路徑)
  • Keychain password:*
  • Add to keychain search path after build:Yes
  • Default keychain:iPhone Distribution: *
    </code></pre>
  • Jenkins ip及管理員郵箱配置
5B2895A7-9BBF-42EC-B395-A6080807796E.png

<pre><code>
需填寫的內容:

  • Jenkins URL (該IP地址填寫本機的,這樣內部局域網其他的機器便可訪問了,后面發郵件有用)
  • 系統管理員地址 (填寫自己的郵箱地址)
    </pre></code>
  • Jenkins 通知郵箱的配置
F55B516C-AE68-4411-889F-D31CEBC5678D.png

<pre><code>
需填寫的內容:
-把上面的選項按照自己的需要填寫好,發送一下測試郵件,測試是否配置正確。
</pre></code>

5.新建項目

A789E158-6172-475F-AE4C-C7677A4CD45A.png

<pre><code>
需填寫的內容:

  • 項目名稱。
  • 項目類型:自由風格的
  • 如果之前有現成的項目,可以填寫:[Copy from ]拷貝所有的配置,就不用重新填寫一遍了
    </pre></code>
  • 填寫SVN信息
0006F2C1-82C2-49E8-B696-9250028C2247.png

<pre><code>需填寫的內容:

  • Repository URL :創庫路徑
  • Credentials:憑證(可點擊旁邊的add來增加)用戶名/密碼
  • Check-out Strategy :用 svn update 命令,每次打包均拉取最新的
    </pre></code>
  • 填寫構建信息(Xcodebuilder)
7DD1CEEA-276E-4D98-A21B-2B0A25FED0C2.png

725006B9-A25B-4F57-BAD5-1D89C412B717.png

<pre><code>需填寫的內容:

  • +General build settings: Target:為集成的Target名稱 targetName
  • +勾選“Clean before build?” Configution:Release(Debug/Release按需求可選)
  • +勾選“Pack application and build ipa?” ipa filename pattern:targetName_${SHORT_VERSION}(target名稱_version版本)
  • +Output directory:${WORKSPACE}/build/${BUILD_NUMBER}/
  • +Code signing & OS X keychain options: 在系統Xcode Builder(鑰匙串設置)已配置
  • +Advanced Xcode build options: 勾選“Clean test reports?”
  • +Build output directory:${WORKSPACE}/build/${BUILD_NUMBER}/
    </pre></code>
  • 填寫證書信息(Xcodebuilder)
8047EFA6-E702-4640-81C8-6473464AA070.png

<pre><code>需填寫的內容:

  • +Sign IPA at build time:在building的時候自簽名
  • +Unlock Keychain: 選擇證書 【在系統Xcode Builder(鑰匙串設置)已配置】
    </pre></code>
  • 增加腳本(Execute shell)
83A65511-C705-44CF-B7F0-49DA6518AD14.png

<pre><code>需填寫的內容:

export PlistURL=172.17.8.67 #該地址是生成給手機端安裝plist文件的地址
export OUTPUT=/usr/local/Cellar/nginx/1.10.2_1/html/${PLIST_NAME}_${BUILD_NUMBER}#導出路徑,打包完成后會拷貝相應的包到nginx的服務器目錄上,供下載使用

cd "${WORKSPACE}/build/${BUILD_NUMBER}"

for file in "*.ipa"
do
PLIST_NAME=echo $file
done

PLIST_NAME=${PLIST_NAME%.*}

echo "[PLIST_NAME=======]:"$PLIST_NAME

cd "${WORKSPACE}/build"
echo "PLIST_NAME=$PLIST_NAME" > jenkinsUserGlobal.properties

##########生成plist
cat << EOF > ${WORKSPACE}/build/${BUILD_NUMBER}/$PLIST_NAME.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>items</key>
<array>
<dict>
<key>assets</key>
<array>
<dict>
<key>kind</key>
<string>software-package</string>
<key>url</key>
<string>https://${PlistURL}/${PLIST_NAME}_${BUILD_NUMBER}/${PLIST_NAME}.ipa</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>com.ucsmy.GZNSBank1</string>
<key>bundle-version</key>
<string>1</string>
<key>kind</key>
<string>software</string>
<key>title</key>
<string>$PLIST_NAME</string>
</dict>
</dict>
</array>
</dict>
</plist>
EOF

cd /usr/local/Cellar/nginx/1.10.2_1/html

mkdir ${PLIST_NAME}_${BUILD_NUMBER}

cd "${WORKSPACE}/build/${BUILD_NUMBER}"

cp -r ${WORKSPACE}/build/${BUILD_NUMBER}/$PLIST_NAME.ipa $OUTPUT

cp -r ${WORKSPACE}/build/${BUILD_NUMBER}/$PLIST_NAME.plist $OUTPUT

echo "拷貝成功"

##########生成html
cat << EOF > $OUTPUT/$PLIST_NAME.html
<html>
<body>

<script>
    var url = "https://${PlistURL}/${PLIST_NAME}_${BUILD_NUMBER}/${PLIST_NAME}.plist";
    window.location = "itms-services://?action=download-manifest&url=" + url;
</script>
    <h1>${PLIST_NAME} 安裝中...</h1>
</body>

<html>
EOF
</pre></code>

  • 導出全局環境變量
C5A90B21-29C4-413A-8104-53A1E0DA7574.png

<pre><code>需填寫的內容:
【將在Execute shell中生成項目名稱變量放入 Properties File Path中】
Properties File Path:${WORKSPACE}/build/jenkinsUserGlobal.properties
</pre></code>

  • 構建完畢后-發送郵件
FFB57A57-DE0F-4C7A-A290-1970C040E7F0.png
689F3431-9DB9-434E-98C9-15EEFDD6E8C9.png

<pre><code>需填寫的內容:

  • Project Recipient List: 郵件接收人(多個時用”,“分割)
  • Project Reply-To List:$DEFAULT_REPLYTO
  • Content Type:選擇”HTML(text/html)“
  • Default Subject:${PROJECT_NAME}構建通知:第${BUILD_NUMBER}次持續集成${PLIST_NAME}構建${BUILD_STATUS}
  • Triggers :觸發器 ,成功發送給誰,失敗發送給誰,點擊高級進行設置
  • Default Content:
    <code><pre>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次構建日志</title>
    </head>

<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"
ffset="0">
<table width="95%" cellpadding="0" cellspacing="0"
style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
<tr>
<td><h2>
<font color="#0000FF">構建結果 - ${BUILD_STATUS}</font>
</h2></td>
</tr>
<tr>
<td><h2>
<font color="#FF0000">安裝證書: <a href="https://${LOCAl_IP}/yanghui/ca.crt">安裝https信任證書(首次需要)</a></font>
</h2></td>
</tr>
<tr>
<td><h2>
<font color="#FF0000">App下載鏈接: <a href="itms-services://?action=download-manifest&url=https://${LOCAl_IP}/${PLIST_NAME}${BUILD_NUMBER}/${PLIST_NAME}.plist">itms-services://?action=download-manifest&url=https://${LOCAl_IP}/${PLIST_NAME}${BUILD_NUMBER}/${PLIST_NAME}.plist</a></font>
</h2></td>
</tr>
<tr>
<td><h2>
<font color="#FF0000">App自動安裝: <a href="https://${LOCAl_IP}/${PLIST_NAME}_${BUILD_NUMBER}/${PLIST_NAME}.html">請用原生瀏覽器打開</a></font>
</h2></td>
</tr>

    <tr>
           <td><h2>
                  <font color="#FF0000">二維碼圖片:</font>
           </h2></td>
    </tr>
    <tr>
            <td>
                ![](http://qr.liantu.com/api.php?text=https://${LOCAl_IP}/${PLIST_NAME}_${BUILD_NUMBER}/${PLIST_NAME}.html)
            </td>
    </tr>
    <tr>
        <td><br />
        <b><font color="#0B610B">構建信息</font></b>
        <hr size="2" width="100%" align="center" /></td>
    </tr>
    <tr>
        <td>
            <ul>
                <li>項目名稱 : ${PROJECT_NAME}</li>
                <li>構建編號 : 第${BUILD_NUMBER}次構建</li>
                <li>SVN 版本: ${SVN_REVISION}</li>
                <li>觸發原因: ${CAUSE}</li>
                <li>構建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
                <li>構建  Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li>
                <li>工作目錄 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>
                <li>項目  Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>
                <li>App安裝包目錄 Url: <a href="https://${LOCAl_IP}/${PLIST_NAME}_${BUILD_NUMBER}/">https://${LOCAl_IP}/${PLIST_NAME}_${BUILD_NUMBER}/</a></li>
            </ul>
        </td>
    </tr>
    <tr>
        <td><b><font color="#0B610B">Changes Since Last
                    Successful Build:</font></b>
        <hr size="2" width="100%" align="center" /></td>
    </tr>
    <tr>
        <td>
            <ul>
                <li>歷史變更記錄 : <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a></li>
            </ul> ${CHANGES_SINCE_LAST_SUCCESS,reverse=true, format="Changes for Build #%n:<br />%c<br />",showPaths=true,changesFormat="<pre>[%a]<br />%m</pre>",pathFormat="    %p"}
        </td>
    </tr>
    <tr>
        <td><b>Failed Test Results</b>
        <hr size="2" width="100%" align="center" /></td>
    </tr>
    <tr>
        <td><pre
                style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">$FAILED_TESTS</pre>
            <br /></td>
    </tr>
    <tr>
        <td><b><font color="#0B610B">構建日志 (最后 100行):</font></b>
        <hr size="2" width="100%" align="center" /></td>
    </tr>
    <tr>
        <td><textarea cols="80" rows="30" readonly="readonly"
                style="font-family: Courier New">${BUILD_LOG, maxLines=100}</textarea>
        </td>
    </tr>
</table>

</body>
</html></code></pre>
</pre></code>

  • 多環境支持
    1.在配置那里選擇參數化構建
570BEEFD-B6D9-4CA8-BDDF-F7FE17A68DC7.png

2.在Xcode配置那里Target填寫${Environment}或者Xcode Schema File:${Environment}
(xcode里面需要配置多schema或者多target)


B6B39EE5-3ADD-4EB0-A184-569621E37521.png

3.構建的時候選擇相應的環境

A7D9DBB2-3636-4C89-ADF8-7CABB9EA4764.png
  • 完成
9E434653-ACDF-422D-8CD3-D548F64F55AB.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,048評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,414評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,169評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,722評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,465評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,823評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,813評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,000評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,554評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,295評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,513評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,722評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,125評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,430評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,237評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,482評論 2 379

推薦閱讀更多精彩內容

  • Nginx是一個輕量級的,高性能的Web服務器以及反向代理和郵箱 (IMAP/POP3)代理服務器。它運行在UNI...
    零一間閱讀 2,236評論 0 12
  • 基礎概念介紹:秘鑰/證書/https握手/CA相關概念crt證書: 只含有公鑰p12證書: 是包含證書(含公鑰...
    liangxifeng833閱讀 5,689評論 0 10
  • 服務器https配置 配置https操作說明文檔 1、查看服務器環境配置(tomcat和apache合并使用) 2...
    南京楊小兵閱讀 8,895評論 0 9
  • 大海如此的平靜 我投下一粒石子 希望能激起一絲漣漪 然而,沒有 它的分量不夠 天如此的冷 我劃一根火柴取暖 還是刺...
    清澤閱讀 223評論 6 3
  • 本章為測試管理問題中的非功能性測試問題
    灼灼2015閱讀 754評論 0 0