在 iOS 研发流程中,代码质量的自动化检查是不可或缺的一环。本文将详细介绍如何利用 Fastlane 和自定义脚本,在 Jenkins 打包过程中无缝接入 SwiftLint,并将扫描结果实时反馈至飞书。
第一章:Fastlane 与 SwiftLint 脚本的协同执行
1. Fastfile 的核心作用
在我们的 CI/CD 流程中,Fastlane 扮演着"指挥官"的角色,Fastfile 是用ruby写的脚本。其中定义了不同的打包流水线(Lanes),如 dev(开发包)和 hoc(测试包)。在这些流水线中,我们插入了 run_swiftlint_scan_and_report 任务:
ruby
# Fastfile 示例片段
lane :dev do |options|
# ... 前置准备 ...
cocoapods
# 执行 SwiftLint 扫描并获取报告 URL
swiftlint_report_url = run_swiftlint_scan_and_report
# 将扫描结果链接追加到更新描述中
description = append_swiftlint_line_to_description(description, swiftlint_report_url)
# ... 开始打包 ...
end
run_swiftlint_scan_and_report 的具体实现都封装在swiftlint-report.sh 脚本中。
2. swiftlint-report.sh 脚本解析
为了让扫描过程更健壮,我们编写了专用的 Shell 脚本 scripts/swiftlint-report.sh。它的主要职责包括:
- 自动寻找二进制文件 :脚本会按优先级搜索本地路径、Homebrew 路径以及 Pods 目录下的
swiftlint可执行文件,swiftlint就是最终执行静态扫描的可执行文件,这是从github下载的。 - 智能匹配配置文件 :优先使用环境变量指定的配置,若无则自动关联项目根目录或 Jenkins 工作区(WORKSPACE)下的
.swiftlint.yml,该文件主要负责解释执行哪些扫描、放弃哪些扫描,以及定制不同rule的参数。 - 生成 HTML 报告 :通过执行
swiftlint lint --reporter html,将swiftlint枯燥的命令行输出转化为直观的网页报告。
3. 执行逻辑
当 Fastlane 调用该脚本时,它会在打包机的桌面(Desktop)目录下为每个 Jenkins Job 创建独立的子目录,并生成 swiftlint-report.html。
第二章:扫描结果从打包机到飞书的自动化推送
生成报告只是第一步,如何让开发者第一时间看到结果才是关键。
1. 报告上传至飞书云空间
在 Fastfile 中,我们定义了 feishu_publish_swiftlint_report_to_drive 方法。它会调用另一个核心脚本 scripts/feishu-swiftlint-upload.sh,利用飞书开放平台的 API,将本地生成的 HTML 报告上传至指定的飞书云空间文件夹。
- 分片上传:支持大文件上传,确保报告完整性。
- 获取公开链接:上传成功后,脚本会返回一个外网可访问的飞书文档链接。
2. 飞书机器人通知
获取到报告 URL 后,Fastfile 中的 send_feishu_swiftlint_notification 方法会通过飞书群机器人的 Webhook 发送一条卡片或文本消息:
ruby
# 飞书通知内容示例
text_body = "代码扫描:#{report_link}"
这样,每当 Jenkins 完成一次静态扫描,相关的开发群就会收到一条包含报告链接的消息,点击即可查看详细的违规代码行号及修复建议。
第三章:SwiftLint 扫描配置详解
我们的代码规范定义在项目根目录的 .swiftlint.yml 中,这是一份结合了团队实践与行业标准的深度定制配置。
1. 规则筛选
- opt_in_rules (开启规则) :我们开启了超过 100 项可选规则,包括
closure_spacing(闭包空格)、collection_alignment(集合对齐)等,力求代码风格的高度统一。 - disabled_rules (禁用规则) :针对部分过于严苛或与现有架构冲突的规则进行了屏蔽,例如
force_unwrapping(强制解包,在某些已知安全的场景下允许使用)和cyclomatic_complexity(圈复杂度,部分业务逻辑确实复杂时放宽限制)。
2. 路径过滤
为了提高扫描效率并减少干扰,我们明确排除了第三方库和子模块:
yaml
excluded:
- Pods
- Submodules
第四章:自定义规则
如果swiftlint的规则不能满足需求,还可以进行自定义,参考 SwiftLint接入及自定义规则开发总结
通过这套方案,我们不仅在 Jenkins 打包流程中实现了代码质量的自动化监控,还通过飞书打通了"扫描-反馈-修复"的闭环,极大地提升了团队的代码整洁度。