背景描述根据项目需求,现需要在团队内部搭建一个统一的打包平台,实现iOS和Android项目的打包。而且,为了方便团队内部分发测试包,希望打包完成后可以生成一个二维码,测试用户(产品、运营、测试等)可以直接安装测试包用手机扫描二维码后。这个需求有一定的普遍性,基本上所有开发APP的团队都可能会用到。因此,我将实现需求的整个过程整理形成了这篇文章,真正做到了零基础学习,即飞即飞,开箱即用,希望能对大家有所帮助。GitHub地址:https://github.com/debugtalk/JenkinsTemplateForApp首先给大家展示一下平台搭建完成后的整体效果:平台主要实现三个功能:定时查看GitHub仓库,是否有更新,然后自动执行构建和打包;构建成功后,生成基于ipa/apk的二维码,并在历史构建列表中显示各个版本的二维码,手机扫描二维码直接安装对应版本;在构建结果页面显示当前的构建工件(Artifact,如.ipa、.app、.apk、info.plist等),供有需要的用户下载。接下来,本文开始详细介绍平台建设的完整实施过程。安装JenkinsJenkins依赖Java运行环境,所以需要先安装Java。安装Jenkins有多种方式,可以运行对应系统类型的安装包,可以通过docker获取镜像,也可以直接运行war包。我个人更喜欢直接运行war包。下载jenkins.war后,运行以下命令启动Jenkins。$nohupjava-jarjenkins_located_pa??th/jenkins.war--httpPort=88&如果不指定httpPort,Jenkins默认端口为8080Jenkins插件Jenkins有很多插件,可以实现各种功能的扩展。对于搭建的iOS/Android持续集成打包平台,我使用了如下插件。GITpluginSSHCredentialsPluginGitChangelogPlugin:获取仓库提交的commitlogbuild-name-setter:用于修改Build名称描述setterplugin:用于修改Build描述信息,在描述中添加QRCode(二维码)informationPost-BuildScriptPlug-in:编译完成后通过执行脚本实现一些额外的功能。Xcodeintegration:iOS-specific(optional)Gradleplugin:Android-specific(optional)安装方法也比较简单,直接在Jenkins插件管理页面搜索上面的插件,点击安装即可。创建项目(Job)在Jenkins中,构建项目是以工作的形式存在的,因此需要为每个项目创建一个工作。有时,一个项目中可能有多个分支同时在开发中。为了单独构建它们,您还可以为每个分支创建一个作业。创建作业的方式有很多种,这次你只需要创建一个Freestyle项目类型即可。Mainpage->NewItem->Freestyleproject对于一个持续集成打包平台,每个打包包含4个步骤:触发构建,拉取代码,执行构建,构建后处理。相应的,每个Job也对应了这几项的配置。配置Git代码仓库要构建项目,就必须配置项目的代码仓库。由于我们的项目目前托管在GitHub的私有仓库中,所以这里需要配置Git。在【源代码管理】配置栏下,如果之前成功安装了GIT插件,会出现Git选项。配置Git代码仓库时,必须配置三项:仓库URL地址(RepositoryURL)、仓库权限验证方式(Credentials)、当前作业需要构建的代码分支(Branchestobuild).配置RepositoryURL时,您可以选择HTTPSURL或SSHURL。但需要注意的是,Credentials必须与RepositoryURL对应,也就是说:如果RepositoryURL是HTTPSURL形式,那么Credentials必须使用GitHub用户名和密码的验证方式;并且,如果在GitHub中启用了2FA(双因素认证),那么你还需要在GitHub中创建一个Personalaccesstoken,并在输入密码的时候输入这个Personalaccesstoken作为密码。如果RepositoryURL是SSHURL形式,需要在Jenkins所在服务器上创建SSH密钥对,并将公钥添加到GitHub的SSH密钥中,然后在填写Credentials时选择SSHUsernamewithprivatekey验证方式,填写创建SSH密钥对时设置的GitHubUsername、SSH私钥和Passphrase。如果对Git权限验证的概念还比较模糊,可以参考《深入浅出Git权限校验》。配置Branches构建时,可以使用多种形式,包括分支名(branchName)、tagName、commitId等,其中分支名的形式用得最多。例如,如果构建master分支,则填写refs/heads/master,如果构建develop分支,则填写refs/heads/develop。除了以上关于Git的强制配置项,有时可能需要根据项目的实际情况修改Jenkins的默认配置项。一种常见的情况是修改克隆的配置。在Jenkins的默认配置中,克隆代码时会拉取代码的所有历史版本,默认超时时间只有10分钟。导致在一些项目中,由于本身代码量大,历史版本较多,网络环境不是特别好,Jenkins无法在10分钟内拉取所有代码。它将自动终止(错误状态代码143)。这种问题的解决方法也很简单,有两种思路,要么少拉代码(不获取历史版本),要么增加超时时间。对应的配置在Advancedclonebehaviors中:Shallowclone:检查后不获取历史版本;克隆和提取操作的超时时间(以分钟为单位):配置后覆盖默认超时时间。配置buildtrigger代码仓库配置完成,表示Jenkins可以访问GitHub代码仓库,可以成功拉取代码。Jenkins什么时候执行构建?这就需要配置buildtriggerstrategy,即buildtrigger。配置项位于[BuildTriggers]栏中。触发器支持多种类型,常用的有:BuildperiodicallyBuildbasedonsubmissions(BuildwhenachangepushedtoGitHub)定期检测代码更新,如果有更新就构建(PollSCM)Buildtriggers的选择是复合的选项。如果选择了多个类型,则在其中一个类型满足施工条件时执行施工工作。如果没有选择所有类型,JenkinsJob不会进行自动构建,但是可以通过手动点击【BuildNow】触发构建。定时器(Schedule)的格式简述如下:MINUTEHOURDOMMONTHDOWMINUTE:小时内的分钟数(0-59)HOUR:一天中的小时数(0-23)DOM:月份中的第几天(1-31)MONTH:月份(1-12)DOW:星期几(0-7),其中0和7是星期日。通常,您需要指定多个值。这种情况下,可以使用如下操作符(优先级从上到下):*适配所有有效值,如果某一项没有指定,则用*填充;M-N适应取值范围,例如7-9表示7/8/9都满足;M-N/Xor*/X:使用X作为区间;A,B,C:枚举多个值。另外,为了避免多个任务同时触发构建,H字符可以与指定时间段结合使用。添加H字符后,Jenkins会随机选择指定时间段内的一个时间点作为开始时间,然后加上设定的时间间隔,计算后续的时间点。直到下一个周期,Jenkins会再次随机选择一个时间点作为开始时间,以此类推。为了方便理解,这里举几个例子:H/15****:表示每15分钟一班,开始时间不定,本小时可能是:07,:22,:37,:52,下一个小时可能是:03,:18,:33,:48;H(0-29)/10****:表示前半小时每10分钟一班,开始时间不确定,本小时可能是:04,:14,:24,下一个小时可能是:09,:19,:29;H23**1-5:工作日每晚23:00-23:59的某个时刻;配置构建模式触发策略配置完成后,Jenkins会自动按照设置的策略执行构建。但是如何执行build操作需要我们通过配置build方法来设置。常用的构建方式是根据构建对象的具体类型安装相应的插件,然后采用相应的构建方式。比如构建Android应用,安装Gradle插件后,可以选择InvokeGradlescript,然后使用Gradle构建;如果是构建iOS应用,安装Xcode集成插件后,可以选择Xcode,然后选择Xcode进行构建。这种方式的优点是操作简单,UI直观,在场景不复杂的情况下可以快速满足需求。但缺点是依赖于插件已有的功能。如果场景比较复杂,单个插件可能无法满足需求,需要安装其他插件。而且有些插件可能会存在一些问题,比如对某些操作系统版本或者XCode版本的兼容性不好,出现问题的时候我们会比较被动。我个人更喜欢另一种方式,就是自己写一个打包脚本,在脚本中自定义实现所有的构建功能,然后在ExecuteShell中执行。这种方式更加灵活,可以满足各种场景的构建需求,出现问题后可以快速自我修复。另外,对于iOS应用的构建,还有一点需要额外注意,就是开发者证书的配置。如果使用Xcode集成插件进行构建,配置会比较复杂。需要在Jenkins中导入开发证书,填写多个配置项。但是,使用打包脚本构建时,情况要简单得多。只要在运行Jenkins的电脑上安装了开发者证书,并且打包命令在Shell中正常运行,那么在Jenkins中执行打包脚本是没有问题的。构建后处理构建完成后,生成的编译工件(ipa/apk)将位于指定目录。但是,如果想直接安装手机中的ipa/apk文件,就比较麻烦了。不仅分发测试包时需要传输几十兆的安装包,体验安装时还需要通过数据线将手机连接电脑。进行连接,然后使用PP助手或豌豆荚等工具进行安装。目前比较优雅的一种方式是使用蒲公英(pgyer)或者fir.im等平台,将ipa/apk文件上传到平台,然后平台生成二维码,然后只需要分发二维码链接,体验用户通过手机扫描二维码即可实现快捷安装,效率得到了极大的提升。上传安装包文件并生成二维码。不管是Dandelion还是fir.im,都有对应的Jenkins插件。安装插件后,您可以在Post-build上传安装包。除了使用Jenkins插件,fir.im还支持命令上传,Dandelion也支持HTTPPost接口上传。个人比较推荐使用命令或者接口上传的方式,在构建脚本中调用。灵活性是一方面,更大的好处是上传失败可以重试,这在网络环境不是很稳定的情况下是极其必要的。Jenkins上传安装包成功后,pgyer/fir.im平台会生成一张二维码图片,并在响应中返回图片的URL链接地址。有一个URL链接可以显示二维码图像。如何在Jenkins项目的历史构建列表中显示二维码图片?这里需要另外一个插件,descriptionsetter插件。安装插件后,在【Post-buildActions】栏会多出一个descriptionsetter函数,可以在构建完成后设置当前构建的描述信息。这些描述信息不仅会显示在构建页面上,还会显示在历史构建列表中。在这个前提下,似乎可以在历史构建列表中显示二维码图像。直观的做法是使用HTML的img标签,将
