在前面的文章中已经详细介绍过Jenkins、Sonarqube的安装、配置及使用,对于Web端的代码质量管理通常相对容易,Jenkins配套Sonarqube很方便就能搞定。但是对于移动端来说,尤其iOS,集成和使用的复杂性会大幅提高,目前网络上有一些介绍的方法,但实际操作的过程中会存在很多坑。本篇文章,就带大家详细实操移动端代码质量扫描与安全检测评估。 一、代码质量扫描 Android的Sonarqube相对简单,这里不做过多介绍,重点介绍iOS的代码质量扫描。iOS代码质量扫描的核心是如何支持ObjectiveC和Swift的扫描。SonarQubeCommunity社区版免费开源,一般来说,社区版就符合大多数开发者的需求,针对大多数语言都可以免费扫描。然而对于iOS,社区版不支持ObjectiveC和Swift的扫描,因此网络上有单身做了相应的开源插件sonarswift来实现iOS的代码扫描。sonarswift的github地址为https:github。comIdeansonarswift,根据官方文档使用该插件的前提是要安装SonarQube、SonarQubeScanner、xcpretty、SwiftLint、Tailor、slather、lizard、OCLint。SonarQube和SonarQubeScanner在前面的文章中已经详细介绍过了,其他几个依赖我们一次介绍下。 (1)xcpretty安装 xcpretty是格式化xcodebuild输入的工具,使用ruby开发,安装命令如下: gitclonehttps:github。comBackelitexcpretty。gitcdxcprettygitcheckoutfixdurationoffailedtestsworkaroundgembuildxcpretty。gemspecsudogeminstallbothxcpretty0。2。2。gem (2)SwiftLint安装 SwiftLint是一个用于强制检查Swift代码风格和规定的一个工具,基本上以RayWenderlichsSwift代码风格指南为基础。 安装命令如下: brewinstallswiftlint (3)Tailor安装 Tailor是一个用于苹果的Swift编程语言编写的源代码的静态分析和lint工具。安装命令如下: brewinstalltailor (4)slather安装 slather为Xcode项目生成测试覆盖率报告并将其连接到CI。安装命令如下: sudogeminstallnusrlocalbinslather (5)lizard安装 Lizard是一个可扩展的圈复杂度分析插件,适用于许多编程语言,包括CC(不需要所有头文件或Java导入)。安装命令如下: sudopip3installlizard (6)OCLint安装 OCLint是一种静态代码分析工具,用于通过检查C、C和ObjectiveC代码来提高质量并减少缺陷。 安装命令如下: brewinstalloclint (7)下载并安装完上述依赖后,通过https:github。comIdeansonarswift下载jar文件,并将下载的jar文件放到本地SonarQube安装目录的插件目录下,通常为usrlocalCellarsonarqubexxxlibexecextensionsplugins目录下。这时在SonarQube安装目录的bin目录下执行。sonarstart,可能会报错导致SonarQube无法启动。原因是如果SonarQube的版本是9以上,官方的sonarswift的jar为0。4。6版本,导致无法启动,需要在另一个分支上找适配的版本:https:github。comestebanhiguitadsonarswiftreleases,下载0。4。7版本即可。 (8)在iOS项目的根目录下创建sonarproject。properties和runsonarswift。sh两个文件。 1)其中sonarproject。properties为SonarQube相关的配置文件,可以直接拷贝https:raw。githubusercontent。comBackelitesonarswiftmastersonarproject。properties,然后根据自己的项目做相应的配置修改,其中比较关键的如下: 项目使用的语言sonar。languageswiftProjectdescription源代码目录sonar。sourcesXXXDestinationSimulatortorunsurefireAsstringexpectedindestinationargumentofxcodebuildcommandExamplesonar。swift。simulatorplatformiOSSimulator,nameiPhone6,OS9。2指定模拟器,这里会有一个坑,为了配合runsonarswift。sh这个脚本,此处是必填项,可能存在找不到相应模拟器的问题,我们在runsonarswift。sh这个文件中做相应修改。sonar。swift。simulatorplatformiOSSimulator,nameiPhone13,OS15。0指定工程名或者空间名sonar。swift。projectXXX。xcodeprojsonar。swift。workspaceXXX。xcworkspace配置Schemesonar。swift。appSchemeXXX 2)下载https:raw。githubusercontent。comBackelitesonarswiftmastersonarswiftpluginsrcmainshellrunsonarswift。sh的runsonarswift。sh文件,并修改其中的内容将buildfortesting和destinationSimulator去掉buildCmd(XCODEBUILDCMDclean) echonBuildingextractingXcodeprojectinformationif〔〔workspaceFile!〕〕;thenbuildCmd(workspaceworkspaceFile)elsebuildCmd(projectprojectFile)fibuildCmd(schemeappScheme)runCommandxcodebuild。log{buildCmd〔〕} 这样就不会出现找不到模拟器的问题,完美解决。 (9)执行iOS代码扫描 启动SonarQube,在项目根目录下执行bashrunsonarswift。shnounittestsv命令,根据sonarproject。properties的配置,会自动进行代码扫描,扫描完成后在SonarQube即可看到相应的报告。 二、安全检测评估 移动端安全检测我们采用MobSF,移动安全框架(MobSF)是一个智能化、一体化的开源移动应用(AndroidiOS)自动测试框架,能够对iOS和Android应用进行静态和动态分析(动态分析目前只支持Android)。MobSF可以有效、快速地对应用APK和IPA文件及压缩的源代码进行审计分析。MobSF的安装和使用参照官方文档https:mobsf。github。iodocszhcn。安装和使用以MAC为例。 (1)安装git,或者直接通过github上下载压缩包 sudoaptgetinstallgit (2)安装Python sudoaptgetinstallpython3。8 注意MAC电脑上默认安装有安装Python,需要修改环境变量以便切换到python3。 (3)安装JDK8 sudoaptgetinstallopenjdk8jdk (4)安装以下依赖 sudoaptinstallpython3devpython3venvpython3pipbuildessentiallibffidevlibssldevlibxml2devlibxslt1devlibjpeg8devzlib1gdevwkhtmltopdf 依赖包括xml解析、pdf生成等插件。 (5)安装MobSF gitclonehttps:github。comMobSFMobileSecurityFrameworkMobSF。gitcdMobileSecurityFrameworkMobSF。setup。sh (6)运行MobSF 。run。sh127。0。0。1:8000 (7)运行MobSF 在浏览器中,打开http:localhost:8000访问MobSFWeb界面。 三、Jenkins集成sonarswift和MobSF 由于MobSF需要上传APK或IPA,因此需要在使用MobSF框架前将相应的包打包出来备用。采用Jenkins实现代码扫描和安全检测自动化有两种方式,一种是在Jenkins中新建两个任务,分别进行代码扫描、编译打包和安全检测;另一种方式是同一个任务中设置依赖,先进行代码扫描、编译打包,然后再进行安全检测,我们以第一种方式为例。 (1)代码扫描、编译打包 新建一个自由风格的Jenkins项目,常规的配置代码获取等在之前的文章中有介绍,这里不再赘述。 上图中的两个runsonarswift。sh和build。sh均位于iOS项目的根目录,build。sh为命令行编译打包的脚本,可以参考网上的相关文章进行编写。在构建步骤执行这两个步骤后就能将sonarswift扫描的结果呈现到SonarQube上,并且打包出来ipa。 (2)安全检测 1)在Jenkins中新建一个Pipeline项目,在构建触发器选择依赖上一个编译打包的工程。 2)MobSF启动后访问http:127。0。0。1:8000apidocs,获取RESTAPIKey。 3)在Pipeline项目配置中添加脚本 脚本内容如下: pipeline{agentanystages{stage(Analysis){steps{script{echostartUpload上传应用包defAUTHKEYMobSF的RESTAPIKeyuploadcmdcurlFfileipa文件所在的具体路径http:localhost:8000apiv1uploadHAuthorization:{AUTHKEY}uploadresultshlabel:UploadBinary,returnStdout:true,script:uploadcmd}}}}} 4)执行Jenkins任务,构建完成后ipa包直接上传到MobSF平台作静态分析。