在上一篇文章中介绍了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
将上述内容保存在项目的目录下,当然你也可以放在其他任何地方,后面在配置Jenkins时,能找到就可以了,如图:
#--------------------------------------------
# 功能:创建符合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中,输出短连接地址。