使用Jenkins搭建iOS的CI服务器(二)

来源:互联网 发布:南方专业起名软件 编辑:程序博客网 时间:2024/06/05 06:12
在上一篇文章中介绍了Jenkins的安装,以及完成了一个iOS项目的构建过程。接下来将对Jenkins进行一些简单的配置,以便能够完成ipa文件的发布和部署以及一些构建过程的邮件通知等。
     通过inHouse证书和itms-services协议发布我们IPA包
     生成IPA包后我们可以使用itms-services协议可以在公司内网发布IPA,这样便可以方便测试或感兴趣的人员进行安装,这个过程主要是PLIST文件和HTML下载页面的生成,至于itms-services协议相关的知识,就不在这里介绍了,大家可以百度。我是使用的是Github上牛人已经写好的脚本,github地址是:https://github.com/webfrogs/xcode_shell,这里有好几个脚本,后面我们都将用到,至于脚本内容大家可以看看,里面注释很详细,以下是详细步骤:

     1、下载脚本并做小部分修改:由于作者的脚本是在本地生成plist和html文件后上传到sftp服务器,并且将本地的删除,同时也提供sftp和邮件通知功能,这里我只需要生成plist和html的功能,所以我将没有用到的代码去除了,下面是我修改后的脚本文件内容:



#!/bin/bash

#--------------------------------------------
# 功能:创建符合itms-services协议的发布文件
# 作者:ccf
# E-mail:ccf.developer@gmail.com
# 创建日期:2012/09/24
#--------------------------------------------
# 修改日期:2012/09/27
# 修改人:ccf
# 修改内容:去掉打包的部分脚本,只保留生成协议文件部分,以后此脚本依赖ipa-build脚本生成的内容
#--------------------------------------------
# 修改日期:2013/02/18
# 修改人:ccf
# 修改内容:添加通过sftp上传到服务器的功能
#--------------------------------------------
# 修改日期:2013/02/19
# 修改人:ccf
# 修改内容:添加上传服务器后邮件提醒功能
#--------------------------------------------
# 修改日期:2013/02/27
# 修改人:ccf
# 修改内容:添加更新服务器上工程索引文件功能
#--------------------------------------------

#须配置内容  start


#发布应用的url地址
pulish_url="http://www.baidu.com"



#可配置内容  end




#获取shell文件所在的绝对路径
current_path=$(pwd)
tmp_path=$(dirname $0)
cd $tmp_path
shell_path=$(pwd)
cd $current_path



#参数判断
if [ $# != 2 ] && [ $# != 1 ];then
     echo "Number of params error! Need one params!"
     echo "1.root path of project(necessary)"
     exit
elif [ ! -d $1 ];then
     echo "The param must be a dictionary."
     exit    
    
fi



#工程绝对路径
cd $1
project_path=$(pwd)

#判断所输入路径是否是xcode工程的根路径
ls | grep .xcodeproj > /dev/null
rtnValue=$?
if [ $rtnValue != 0 ];then
     echo "Error!! The param must be the root path of a xcode project."
     exit
fi

#判断是否执行过ipa-build脚本
ls ./build/ipa-build/*.ipa &>/dev/null
rtnValue=$?
if [ $rtnValue != 0 ];then
     echo "Error!! No ipa files exists.Please run the \"ipa-build\" shell script first"
     exit
fi


#build文件夹路径
build_path=${project_path}/build

#切换到tmp文件夹
cd /tmp
#创建临时文件夹
tmpfoldername=ipa_tmp
if [ -d ./${tmpfoldername} ];then
     rm -rf ${tmpfoldername}
fi
mkdir ${tmpfoldername}

cd ${tmpfoldername}
#拷贝ipa到临时文件夹中
cp ${build_path}/ipa-build/*.ipa ./tmp.zip
#将ipa解压
unzip tmp.zip
#app文件中Info.plist文件路径
app_infoplist_path=$(pwd)/Payload/*.app/Info.plist
#取版本号
bundleShortVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" ${app_infoplist_path})
#取build值
bundleVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleVersion" ${app_infoplist_path})
#取bundleIdentifier
bundleIdentifier=$(/usr/libexec/PlistBuddy -c "print CFBundleIdentifier" ${app_infoplist_path})
#取CFBundleName
target_name=$(/usr/libexec/PlistBuddy -c "print CFBundleName" ${app_infoplist_path})
#取CFBundleDisplayName
display_name=$(/usr/libexec/PlistBuddy -c "print CFBundleDisplayName" ${app_infoplist_path})

#删除临时文件夹
cd ..
rm -rf ${tmpfoldername}

#进入到工程build路径下
cd $build_path

#显示名称
ipa_name="${display_name}"

# 直接将文件生成在ipa-build目录下,不再生成到${target_name}目录下

#if [ -d ./$target_name ];then
#     rm -rf $target_name
#fi
#mkdir $target_name

#拷贝ipa
#cp ./ipa-build/*.ipa ./$target_name/${target_name}.ipa
# 拷贝图标
# cp ../Icon@2x.png ./$target_name/${target_name}_logo.png

# 进入到ipa-build目录下
cd ./ipa-build

#ipa下载url
ipa_download_url=${pulish_url}/${target_name}/${target_name}.ipa
#itms-services协议串
ios_install_url="itms-services://?action=download-manifest&url=${pulish_url}/${target_name}/${target_name}.plist"

#生成install.html文件
cat << EOF > index.html
<!DOCTYPE HTML>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>安装此软件</title>
  </head>
  <body>
     <br>
     <br>
     <br>
     <br>
     <p align=center>
          <font size="8">
               <a href="${ios_install_url}">点击这里安装</a>
          </font>
     </p>
    
    </div>
  </body>
</html>
EOF
#生成plist文件
cat << EOF > ${target_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>${ipa_download_url}</string>
               </dict>
               <dict>
                   <key>kind</key>
                   <string>display-image</string>
                   <key>needs-shine</key>
                   <true/>
                   <key>url</key>
                   <string>${pulish_url}/${target_name}/${target_name}_logo.png</string>
               </dict>
            <dict>
                   <key>kind</key>
                   <string>full-size-image</string>
                   <key>needs-shine</key>
                   <true/>
                   <key>url</key>
                   <string>${pulish_url}/${target_name}/${target_name}_logo.png</string>
               </dict>
           </array><key>metadata</key>
           <dict>
               <key>bundle-identifier</key>
               <string>${bundleIdentifier}</string>
               <key>bundle-version</key>
               <string>${bundleVersion}</string>
               <key>kind</key>
               <string>software</string>
               <key>subtitle</key>
               <string>${ipa_name}</string>
               <key>title</key>
               <string>${ipa_name}</string>
           </dict>
       </dict>
   </array>
</dict>
</plist>

EOF

将上述内容保存在项目的目录下,当然你也可以放在其他任何地方,后面在配置Jenkins时,能找到就可以了,如图:

ipa-publisha-fir脚本我将在后面介绍,发布脚本文件准备好后,接下来配置Jenkins,找到之前我们新建的任务,进入到配置页面中,
在构建一栏中的最下面,点击“增加构建步骤”,如图:

在Command一栏中写入以下内容如图:
bash $WORKSPACE/ipa-publish $WORKSPACE/GitlabDemo




保存配置后,执行构建过程,便会在工程的build/ipa-build目录下生成plist和html文件如图:

上述过程已经生成了plist文件,接下来介绍通过FTP将文件上传到服务器上。

     搭建FTP服务器和配置Jenkins的FTP选项:

     Mac新版本默认情况没有开启FTP服务,需要我们手动开启,命令如下:
     
     sudo -s launchctl load -w /System/Library/LaunchDaemons/ftp.plist 

     关闭命令:

     sudo -s launchctl unload -w /System/Library/LaunchDaemons/ftp.plist

     可以使用ftp命令连接本机,用来检测ftp服务器是否正常开启。
     
     如下图进入系统设置界面

然后在系统设置界面找到FTP配置项,配置如下:

Profile Name这是当前配置的名称,hostname则是FTP服务器的地址,因为是本机,我这边填写的是127.0.0.1,Root Repository Path地址建议填写/后面上传文件时可以指定路径,下面两项就是FTP的账号和密码了。点击保存,FTP的配置就算是配置完成了,你也
可以在添加一台FTP服务器,后面你便可以选择使用哪一台服务器。
     下面进入到我们之前的创建的任务的配置模块,然后找到“增加构建后的操作步骤”,选择其中的“Publish artifacts to FTP”


在新界面中填写下面配置:

     FTP site项中,选择刚才我们在系统设置中添加的FTP服务器就可以了,Files to upload则表示要上传的文件,source指要上传的文件的相对路径,相对于Workspace的目录,而且这里必须是相对路径,否则FTP上传将出错。Destination则是服务器上保存文件的目录,我存放在个人目录下,并且以当前任务名称为目录的文件夹下,如果你是需要提供给别人下载,则自己考虑好存储的路径。下面的选项可以查看后面的?的解析。配置完成后保存,然后在执行一次立即构建,Jenkins将从git上更新代码,然后编译并且生成ipa文件,和plist、html文件,文件生成完成后,将会通过FTP插件上传到FTP服务器上。
     通过上面的操作我们现在可以生成ipa、plist等文件,如果后续我们要发布,还需要打架一台https的下载服务器,对于个人或者不想自己搭建https服务器的用户来说,使用第三方的fir.im发布平台是个不错的选择,fir.im是一个APP的发布平台,同时还供了IPA文件上传等一系列接口,具体介绍可以到官网http://fir.im上了解,我这里使用了现成的脚本文件,该脚本可以在官网找到github地址:https://github.com/webfrogs/xcode_shell,该脚本文件需要将fir_token替换成自己的fir_token值,将脚本文件和之前的ipa-publish脚本放在同一个目录下,然后在Execute Shell中添加如下命令:

bash $WORKSPACE/ipa-publish-fir -d $WORKSPACE/GitlabDemo



保存后,进行构建,便可以在fir.im上看到刚才的上传的文件,同时也会在log中,输出短连接地址。


参考资料:

http://blog.csdn.net/leijiantian

http://blog.csdn.net/wangmuming/article/category/2167947

http://webfrogs.me/2013/12/31/jenkins-ios-ci/

http://blog.csdn.net/qs_csu/article/details/9356023

https://github.com/webfrogs/xcode_shell
0 0
原创粉丝点击