概述
本文描述使用Tomcat + Jenkins一步步实现iOS一键生成ipa安装包和二维码扫码安装. 公司频繁打包测试的可以用此方法极大提高效率.
一. 安装Java JDK
Jenkins依赖了Java环境,所以在安装Jenkins前,要确保mac系统要安装了Java
- 终端命令查看mac电脑是否安装了java sdk, 输入查看java 版本的命令行:
**注意**: 必须安装jdk 8---jdk 11 之间的版本, 版本太高的话就启动不来jenkins
java --version
//新电脑会报 "No Java runtime present, requesting install"
- 安装Java JDK网址: Java SDK, 安装包下载完直接安装即可.
- (如果你下载有pkg安装包, 可以通过命令行: open /Library/Java/JavaVirtualMachines 打开需要安装到java jdk的目录 把jdk解压包放里面去)
二. 安装Tomcat
- 去Tomcat官网下载一个包安装在电脑上http://tomcat.apache.org/, 我下载的tomcat 8版本
- 去Tomcat官网下载一个包安装在电脑上http://tomcat.apache.org/, 我下载的tomcat 8版本
- 解压安装在资料库的目录下:例如:/Users/XXX(个人电脑名称)/Library, 如果Library文件被系统隐藏了,
可以命令显示所有隐藏文件
- 解压安装在资料库的目录下:例如:/Users/XXX(个人电脑名称)/Library, 如果Library文件被系统隐藏了,
defaults write com.apple.finder AppleShowAllFiles TRUE(回车)
killall Finder(回车)
//第一行告诉 Finder 显示所有文件,无论隐藏标志是如何设置的。第二行停止并重新启动 Finder,因此更改将生效。
如果需要隐藏文件, 则输入以下命令
defaults write com.apple.finder AppleShowAllFiles FALSE(回车)
killall Finder(回车)
- cd进入Tomcat 的bin目录下
4.然后输入
./startup.sh
,这里可能出现permission denied错误,需要增加权限sudo chmod 755 Library/Tomcat/bin/*.sh
, 最终为下图所示则启动完成。- 在当前bin目录下, 启动Tomcat, 启动命令是
./startup.sh
. ......关闭tomcat命令是./shutdown.sh
- 在当前bin目录下, 启动Tomcat, 启动命令是
-
在浏览器打开:localhost:8080 ,打开界面如下:
-
- Tomcat的目录结构及作用
|- bin:存放tomcat的命令。例如启动和关闭等等
|- conf:存放tomcat的配置信息。其中server.xml文件是核心的配置文件。
|-lib:支持tomcat软件运行的jar包。其中还有技术支持包,如servlet,jsp
|-logs:运行过程的日志信息
|-temp:临时目录
|-webapps:共享资源目录。web应用目录。(注意不能以单独的文件进行共享)
|-work:tomcat的运行目录。jsp运行时产生的临时文件就存放在这里
|- WebRoot :web应用的根目录
|-静态资源(html+css+js+image+vedio)
|-WEB-INF:固定写法。
|-classes:(可选)固定写法。存放class字节码文件
|-lib:(可选)固定写法。存放jar包文件。
|-web.xml
注意
1)WEB-INF目录里面的资源不能通过浏览器直接访问
2)如果希望访问到WEB-INF里面的资源,就必须把资源配置到一个叫web.xml的文件中。
-
8 设置tomcat开机自动启动
-
修改startup.sh文件的打开方式为终端
-
系统偏好设置 - 用户与群组 - 中的登录项, 添加startup.sh文件
以上设置完成后, 就能开机自动开启tomcat了.
三. 安装Jenkins
注意 **jenkins会自动安装在root目录下, 安装完后请把它重置放在你的用户目录下, 这样才能有权限执行
**
-
把解压的war放入Tomcat的webapps的目录下:
-
- 3、在浏览器输入网址 http://localhost:8080/jenkins/ jenkins启动中, 出现如下页面:
这里需要我们输入Jenkins的密码, 这个安装密码保存在我们安装jenkins的目录下,
输入下面这句命令行: 进入jenkins的安装目录, 由于secrets
文件夹是保密了的不可以读写, 需要你查看此文件夹的简介, 然后修改为可以读. 密码就在secrets
文件夹里面的initialAdminPassword
文件里面,initialAdminPassword
文件也是受保护的需要你修改可读写属性.
打开initialAdminPassword
文件复制里面的密码, 粘贴到浏览器上面的输入框, 出现下面插件图示,
直接下一步
如果没出现上面图示, 刷新一下页面就会出现. 这里需要等待20分钟左右...看你们公司网速吧...
这里尽量多安装你所需要的插件, 如果这里不安装, 后面需要你手动查询安装
安装成功后, 输入个人账户, 这个是你登录jenkins的管理用户
- jenkins算是启动成功了!
tomcat启动成功后,打开浏览器访问http://localhost:8080/jenkins即可进入jenkins配置页面
把项目运行在Jenkins的工作目录下, 先在本地能确保项目能跑起来buildsuccess
注意 **jenkins会自动安装在root目录下, 安装完后请把它重置放在你的用户目录下, 这样才能有权限执行
**
四. 配置Jenkins
-
配置好的页面长成这样, 先给大家看看最终效果, 然后再一步步分解比较容易理解
配置过程如下:
1. 创建新项目
2. 进入新项目, 在Jenkins页面左侧点击Configure
配置环境
3. 配置 general, general是配置打包显示的界面, 包括分支列表选项, 服务器选项等等.
注意, 如果找不到Git Parameter选项, 请回到Jenkins的管理界面, 安装这个插件, 其他选项找不到, 也可以使用这个方法
4. 配置 Source Code Management , 也就是git分支的管理
-
配置ssh, 这里主要是gitlab拉取代码的授权, 至于怎样生成SSH请查看我的文章: https://www.jianshu.com/p/7bce93f452b5
-
id_rsa 文件里面的内容记得要copy 全部 !!!
-
配置打包的环境名称:
5. 打包执行脚本的配置: 这里的配置太重要了, 稍不小心就打包失败 !!!
-
相关脚本配置和解析:
- 修改工程plist文件里面的版本号
#修改版本号,build号
# 2020.3.27号修改为: 去掉设置版本号选项,直接使用工程中的版本号
file_path=${PWD}/Configs/Environment/$server.xcconfig
echo "使用Jenkins自增编号 ${BUILD_NUMBER}"
#${file_path}: 文件名 , “”: mac专用, ‘s/before/after/g’ : 修改并且保存
sed -i "" 's/APP_BUILD_NUMBER = .*/APP_BUILD_NUMBER = '"${BUILD_NUMBER}"'/g' ${file_path}
- 开始构建打包
echo "开始自动化构建"
echo "${PWD}" #/Users/ubtech/jenkins/workspace/Jimu
archive_path=${PWD}/archive/${BUILD_NUMBER} #/Users/ubtech/jenkins/workspace/Jimu/archive/9
archive_file_name=${archive_path}/Jimu.xcarchive #/Users/ubtech/jenkins/workspace/Jimu/archive/9/Jimu.xcarchive
workspace_path=${PWD}/Jimu/Jimu.xcworkspace #/Users/ubtech/jenkins/workspace/Jimu/Jimu/Jimu.xcworkspace
#install cocoapods
cd Jimu
#更新Blockly仓库,确保能够找到最新的版本
pod repo update
pod install
#加密编译参数V2.3.0版本(更新于2019.7.4 Glen)
SWIFTFLAG="-Xllvm -ipo -Xllvm -ipo-percentage=80 -Xllvm -ipo-loop=1 \
-Xllvm -transform-operator-identically -Xllvm -split-basic-block"
if [ "$configuration" = 'Inhouse' ]; then
#/Users/ubtech/jenkins/workspace/Jimu/export/ExportOptionsInHouse.plist
export_options_path=${WORKSPACE}/export/ExportOptionsInHouse.plist
echo "开始打InHouse版本的包"
elif [ "$configuration" = 'Debug' ]; then
export_options_path=${WORKSPACE}/export/ExportOptionsInHouse.plist
echo "开始打Debug版本的包"
elif [ "$configuration" = 'Release' ]; then
echo "关闭FileShare"
/usr/libexec/PlistBuddy -c 'Set:UIFileSharingEnabled bool false' ${PWD}/Jimu/Info.plist
export_options_path=${WORKSPACE}/export/ExportOptionsAppStore.plist
echo "开始打Release版本的包"
fi
configuration=$configuration$server
if $encryption; then
#加密归档
xcodebuild -toolchain "cn.ijiami.obf" -workspace ${workspace_path} -scheme Jimu \
-configuration ${configuration} OTHER_SWIFT_FLAGS="${SWIFTFLAG}" \
archive -archivePath ${archive_file_name}
else
#不加密归档
xcodebuild -workspace ${workspace_path} -scheme Jimu -configuration ${configuration} \
archive -archivePath ${archive_file_name}
fi
#导出ipa包
xcodebuild -exportArchive -archivePath ${archive_file_name} -exportPath ${archive_path} \
-exportOptionsPlist ${export_options_path}
- 构建完成,创建对应的配置文件以及二维码
echo "构建完成,创建对应的配置文件以及二维码"
# 到这里,在archive/自增编号/目录下存在两个文件:Jimu.ipa和Jimu.xcarchive
#重命名 【分支名_证书配置_服务器配置_构建自增编号】
name=${branch##*/}_${configuration}_${server}_${BUILD_NUMBER}
# 2020.3.27更新,使用本地服务器存储plist文件
# 重命名
mv ${PWD}/archive/${BUILD_NUMBER}/Jimu.ipa ${PWD}/archive/${BUILD_NUMBER}/$name.ipa
# 移动到apache目录下
cp ${PWD}/archive/${BUILD_NUMBER}/$name.ipa /Users/ubtech/Library/Tomcat/webapps/Jimu/ipa/$name.ipa
echo "创建对应的配置文件以及二维码"
#cd /Users/max/Sites/Jimu/ipa Users/ubtech/jenkins/workspace/Jimu/archive/9
cd /Users/ubtech/Library/Tomcat/webapps/Jimu/ipa
#复制配置文件,生成当前版本的配置文件
cp Jimu.plist $name.plist
full_path=https:\/\/10.10.62.23:8080\/Jimu\/ipa\/${name}.ipa
#修改ipa包下载路径 修改plist文件的url
/usr/libexec/PlistBuddy -c 'Set items:0:assets:0:url '"${full_path}"'' $name.plist
- 创建二维码,
这个看你们项目需求吧, 非必要.
echo "创建二维码"
name=${branch##*/}_${configuration}_${server}_${BUILD_NUMBER}
url="http://10.10.62.23:8080/Jimu/download.html?version=$name"
myqr $url -n $name.jpg -d ./archive/${BUILD_NUMBER}/
- 上传dSYM文件到bugly进行分析,
这个看你们项目需求吧, 非必要.
if $uploadDYSMFile; then
echo "上传dSYM文件到bugly进行分析"
#dSYM文件路径
name="jimu"_${branch##*/}_${configuration}_${server}_${BUILD_NUMBER}
path=${PWD}/archive/${BUILD_NUMBER}/Jimu.xcarchive/dSYMs
dsymFilePath=${path}/Jimu.app.dSYM
#将dSYM文件压缩成zip文件
zip -q -r -o ${path}/Jimu.app.dSYM.zip ${dsymFilePath}
zipFilePath=${path}/Jimu.app.dSYM.zip
#根据bundle id 确定bugly平台的appKey和appId
if [ "$configuration" = 'Inhouse' ]; then
appid="5e31ae0d11"
appkey="91927657-0c29-4c2e-8d7a-4248891a53ae"
bundleId="com.ubtechinc.jimu2s"
else
appid="47342e2edb"
appkey="a1166164-edb1-4f46-956e-0e871fbd0c1d"
bundleId="com.ubtechinc.jimu"
fi
#读取版本号
plistFilePath=${PWD}/archive/${BUILD_NUMBER}/Jimu.xcarchive/Info.plist
version=$(/usr/libexec/PlistBuddy -c "Print ApplicationProperties:CFBundleShortVersionString" ${plistFilePath})
buildNumber=$(/usr/libexec/PlistBuddy -c "Print ApplicationProperties:CFBundleVersion" ${plistFilePath})
productVersion="${version}(${buildNumber})"
echo "读取版本号结果: ${productVersion}"
echo "开始上传dSYM文件"
curl -k "https://api.bugly.qq.com/openapi/file/upload/symbol?app_key=${appkey}&app_id=${appid}" \
--form "api_version=1" --form "app_id=${appid}" \
--form "app_key=${appkey}" --form "symbolType=2" \
--form "bundleId=${bundleId}" \
--form "productVersion=${productVersion}" \
--form "fileName=Jimu.app.dSYM.zip" \
--form "file=@${zipFilePath}" --verbose ||true
echo "上传dSYM文件结束"
fi
-
编译完成后的动作
archive/${BUILD_NUMBER}/*.ipa, archive/${BUILD_NUMBER}/*.jpg, archive/${BUILD_NUMBER}/**/Jimu.app.dSYM
五. 最终打出来的ipa包 和 二维码
六. 二维码扫码安装配置这个看你们项目需求吧, 非必要.
- 用MyQR生成动态二维码
- 直接使用pip安装myqr, 终端输入命令
pip install myqr
, 首先发现系统没有安装pip, 需要先安装pip, 然后发现系统的python是2.7的版本, 过低安装不了, 提示需要3.8以上的, 更新系统的 python到3.8版本就可以了. 然后指定用pip3安装myqr, 就能顺利安装myqr.
1.下载python: https://www.python.org/downloads/release/python-381/
2、安装python 3.8.1
下载好的pkg文件进行安装,安装完成之后,python 3.8.1的默认安装路径如下:执行:
open /Library/Frameworks/Python.framework/Versions/3.8
即为安装目录3、修改profile文件
open ~/.bash_profile
此时会弹出.bash_profile文件,在最后面加入:
alias python="/Library/Frameworks/Python.framework/Versions/3.8/bin/python3.8" 保存即可
然后重启下配置文件:
source ~/.bash_profile
4、验证python版本
python --version
如果报以下警告, 则需要更新pip3:pip3 install --upgrade pip
WARNING: You are using pip version 19.2.3, however version 20.1.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
samdeiMac:~ sam$ pip install --upgrade pip
DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support5. 用pip3安装myqr:
pip3 install myqr
顺利完成运行:
myqr www.baidu.com -n aaa.jpg -d /Users/sam/Desktop/aaaaa
这句命令的意思是生成一个二维码, 存放路径是 /Users/sam/Desktop/aaaaa 文件夹内, 扫码得到的内容是www.baidu.com , 二维码名称是aaa.jpg
运行成功显示:
samdeiMac:~ sam$ myqr www.baidu.com -n aaa.jpg -d /Users/sam/Desktop/aaaaa
line 16: mode: byte
Succeed!
七. Mac上tomcat使用https
- 由于下载安装ipa包需要Https证书, 以下介绍如果让tomcat支持https
1. 服务端证书的生成:
打开mac上的终端,我在/Users/用户名/资源库/Tomcat/webapps/下创建了一个CA文件夹专门放证书.
使用keytool为Tomcat生成证书,生成一个名称叫做“tomcat.keystore”的证书,使用“RSA”加密,口令为“password”,过期时间为100年,使用如下命令生成:
keytool -genkey -v -alias tomcat -keyalg RSA -keystore /Users/用户名/资源库/Tomcat/webapps/CA/tomcat.keystore -validity 36500
- 证书相关设置篇幅有点长, 请参考博客: https://blog.csdn.net/weixin_30237281/article/details/99499275
还有: https://blog.csdn.net/qq_33264648/article/details/63683660
来设置就好了.
***记得证书的存放路径要和下面的扫码安装页面的证书下载路径对应起来, 否则会找不到相对于的证书下载
八. 扫码下载安装ipa包
现在需要配置的是扫码后展示的页面还有点击下载ipa包安装到手机上
-
扫码展示的页面如下:
-
扫码页面需要的素材放在tomcat工作目录webapps下新建的"newfold"文件夹内,download.html 文件是扫码页面, 其他是相对于的素材. 注意上面提到的构建shell脚本里面, 要对应到你的目录, 否则不能找到对应的二维码或者素材
-
download.html文件内容:
注意这个文件里面需要修改你的打包电脑的IP, 下载证书和下载ipa包都需要去定位到你的打包电脑IP
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Jimu App</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="description" content="Charisma, a fully featured, responsive, HTML5, Bootstrap admin template.">
<meta name="author" content="Muhammad Usman">
</head>
<style>
#nav { width:100%; height: 100%; position:absolute; background-color:rgba(2, 1, 1, 0.73);}
</style>
<body style="margin:0px;padding:0px;">
<div id="nav" style="display: none;">
<div style="margin-top: 20%;text-align:center;font-size:19px;color: #FFF;">
请点击右上角的设置,在safari中打开。
</div>
</div>
<div id="jimuLog" style="text-align:center;padding-top:7%;">
<img src="jimuLog.png" />
</div>
<div style="text-align:center;margin-top: 7%;">
<a style="display:block" href="https://10.10.62.23:8443/CA/tomcat.cer">下载证书</a>
</div>
<div onclick="download();" style="margin: 0 auto;vertical-align:middle;text-align:center;margin-top: 7%;border:1px solid black;border-radius:10px;line-height:50px;font-size:25px;max-width:50%;min-width:30%;">
下载IPA包
</div>
</body>
<script type="text/javascript">
var search = window.location.search
var version = search.split('=')[1]
function download(){
window.location.href="itms-services://?action=download-manifest&url=https://10.10.62.23:8443/Jimu/ipa/"+version+".plist";
}
// function isMicromessenger(){
var ua = navigator.userAgent.toLowerCase();
if (ua.match(/MicroMessenger/i) == "micromessenger") {
// document.getElementById("playDiv").innerHTML="请点击右上角的设置,在safari中打开。";
document.getElementById("nav").style.display="";
}else{
//window.location.href="itms-services://?action=download-manifest&url=https://coding.net/u/knights24/p/UBTPlist/git/raw/master/JimuPro/"+version+".plist";
window.location.href="itms-services://?action=download-manifest&url=https://10.10.62.23:8443/Jimu/ipa/"+version+".plist";
}
// }
</script>
</html>
plist文件的配置
: 方便.html文件找到相对应的素材, 方便个人修改维护作用.