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阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349

推荐阅读更多精彩内容

  • Nginx是一个轻量级的,高性能的Web服务器以及反向代理和邮箱 (IMAP/POP3)代理服务器。它运行在UNI...
    零一间阅读 2,192评论 0 12
  • 基础概念介绍:秘钥/证书/https握手/CA相关概念crt证书: 只含有公钥p12证书: 是包含证书(含公钥...
    liangxifeng833阅读 5,614评论 0 10
  • 服务器https配置 配置https操作说明文档 1、查看服务器环境配置(tomcat和apache合并使用) 2...
    南京杨小兵阅读 8,821评论 0 9
  • 大海如此的平静 我投下一粒石子 希望能激起一丝涟漪 然而,没有 它的分量不够 天如此的冷 我划一根火柴取暖 还是刺...
    清泽阅读 215评论 6 3
  • 本章为测试管理问题中的非功能性测试问题
    灼灼2015阅读 740评论 0 0