iOS使用Tomcat + Jenkins自动构建ipa且生成二维码

概述

本文描述使用Tomcat + Jenkins一步步实现iOS一键生成ipa安装包和二维码扫码安装. 公司频繁打包测试的可以用此方法极大提高效率.

一. 安装Java JDK

Jenkins依赖了Java环境,所以在安装Jenkins前,要确保mac系统要安装了Java

  1. 终端命令查看mac电脑是否安装了java sdk, 输入查看java 版本的命令行:
    **注意**: 必须安装jdk 8---jdk 11 之间的版本, 版本太高的话就启动不来jenkins
java --version
//新电脑会报 "No Java runtime present, requesting install"
  1. 安装Java JDK网址: Java SDK, 安装包下载完直接安装即可.
  • (如果你下载有pkg安装包, 可以通过命令行: open /Library/Java/JavaVirtualMachines 打开需要安装到java jdk的目录 把jdk解压包放里面去)

二. 安装Tomcat

    1. 解压安装在资料库的目录下:例如:/Users/XXX(个人电脑名称)/Library, 如果Library文件被系统隐藏了,
      可以命令显示所有隐藏文件
defaults write com.apple.finder AppleShowAllFiles TRUE(回车)
killall Finder(回车)
//第一行告诉 Finder 显示所有文件,无论隐藏标志是如何设置的。第二行停止并重新启动 Finder,因此更改将生效。

如果需要隐藏文件, 则输入以下命令

defaults write com.apple.finder AppleShowAllFiles FALSE(回车)
killall Finder(回车)
image.png
    1. cd进入Tomcat 的bin目录下
  • 4.然后输入./startup.sh,这里可能出现permission denied错误,需要增加权限sudo chmod 755 Library/Tomcat/bin/*.sh, 最终为下图所示则启动完成。

    1. 在当前bin目录下, 启动Tomcat, 启动命令是 ./startup.sh. ......关闭tomcat命令是 ./shutdown.sh
    1. 在浏览器打开:localhost:8080 ,打开界面如下:


      image
    1. 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开机自动启动
  1. 修改startup.sh文件的打开方式为终端


    Xnip2020-12-16_19-57-27.jpg
  2. 系统偏好设置 - 用户与群组 - 中的登录项, 添加startup.sh文件


    Xnip2020-12-16_19-58-31.jpg

    以上设置完成后, 就能开机自动开启tomcat了.

三. 安装Jenkins

注意 **jenkins会自动安装在root目录下, 安装完后请把它重置放在你的用户目录下, 这样才能有权限执行 **

image

这里需要我们输入Jenkins的密码, 这个安装密码保存在我们安装jenkins的目录下,
输入下面这句命令行: 进入jenkins的安装目录, 由于secrets文件夹是保密了的不可以读写, 需要你查看此文件夹的简介, 然后修改为可以读. 密码就在secrets文件夹里面的initialAdminPassword文件里面, initialAdminPassword文件也是受保护的需要你修改可读写属性.

打开initialAdminPassword文件复制里面的密码, 粘贴到浏览器上面的输入框, 出现下面插件图示,

image.png

直接下一步
560

如果没出现上面图示, 刷新一下页面就会出现. 这里需要等待20分钟左右...看你们公司网速吧...
这里尽量多安装你所需要的插件, 如果这里不安装, 后面需要你手动查询安装

安装成功后, 输入个人账户, 这个是你登录jenkins的管理用户


image.png
  • jenkins算是启动成功了!
    tomcat启动成功后,打开浏览器访问http://localhost:8080/jenkins即可进入jenkins配置页面
    image.png

把项目运行在Jenkins的工作目录下, 先在本地能确保项目能跑起来buildsuccess

注意 **jenkins会自动安装在root目录下, 安装完后请把它重置放在你的用户目录下, 这样才能有权限执行 **

image.png

四. 配置Jenkins

  • 配置好的页面长成这样, 先给大家看看最终效果, 然后再一步步分解比较容易理解


    image.png

配置过程如下:

1. 创建新项目

image.png

2. 进入新项目, 在Jenkins页面左侧点击Configure配置环境

image.png

3. 配置 general, general是配置打包显示的界面, 包括分支列表选项, 服务器选项等等.

image.png

注意, 如果找不到Git Parameter选项, 请回到Jenkins的管理界面, 安装这个插件, 其他选项找不到, 也可以使用这个方法
image.png

image.png

4. 配置 Source Code Management , 也就是git分支的管理

image.png
  • 配置ssh, 这里主要是gitlab拉取代码的授权, 至于怎样生成SSH请查看我的文章: https://www.jianshu.com/p/7bce93f452b5

    image.png

  • id_rsa 文件里面的内容记得要copy 全部 !!!

    image.png

  1. 配置打包的环境名称:


    image.png

5. 打包执行脚本的配置: 这里的配置太重要了, 稍不小心就打包失败 !!!

image.png
  • 相关脚本配置和解析:

  1. 修改工程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} 
  1. 开始构建打包
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}

  1. 构建完成,创建对应的配置文件以及二维码
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

  1. 创建二维码, 这个看你们项目需求吧, 非必要.
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}/
  1. 上传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
  1. 编译完成后的动作


    image.png
archive/${BUILD_NUMBER}/*.ipa, archive/${BUILD_NUMBER}/*.jpg, archive/${BUILD_NUMBER}/**/Jimu.app.dSYM

五. 最终打出来的ipa包 和 二维码

image.png

六. 二维码扫码安装配置这个看你们项目需求吧, 非必要.

  • 用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/

image

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-support

5. 用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

***记得证书的存放路径要和下面的扫码安装页面的证书下载路径对应起来, 否则会找不到相对于的证书下载

八. 扫码下载安装ipa包

  • 现在需要配置的是扫码后展示的页面还有点击下载ipa包安装到手机上

  • 扫码展示的页面如下:


    image.png
  • 扫码页面需要的素材放在tomcat工作目录webapps下新建的"newfold"文件夹内,download.html 文件是扫码页面, 其他是相对于的素材. 注意上面提到的构建shell脚本里面, 要对应到你的目录, 否则不能找到对应的二维码或者素材


    image.png
  • download.html文件内容: 注意这个文件里面需要修改你的打包电脑的IP, 下载证书和下载ipa包都需要去定位到你的打包电脑IP

    image.png

    image.png

<!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文件找到相对应的素材, 方便个人修改维护作用.

image.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342