如何在 Jenkins 打包流程中接入 SwiftLint 自动化扫描

在 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接入及自定义规则开发总结

swiftLint自带规则说明

通过这套方案,我们不仅在 Jenkins 打包流程中实现了代码质量的自动化监控,还通过飞书打通了"扫描-反馈-修复"的闭环,极大地提升了团队的代码整洁度。

相关推荐
wuxianda10302 小时前
uniapp项目上架苹果商店4.3a被拒,3天极速解决方案2026.5.8
前端·人工智能·flutter·uni-app·ios上架·苹果上架·苹果4.3a
前端毕业班2 小时前
前端"枚举"管理指南
前端·javascript
yuandiv2 小时前
告别"薛定谔的测试":Flaky Test 全链路治理实战
前端
明月_清风2 小时前
Claude Code 保姆级入门教程:零基础到 AI 编程高手,看这一篇就够了
前端·后端·claude
ricardo19733 小时前
手写一个虚拟列表,万级数据滚动 FPS 稳定 60 帧
前端
小KK_3 小时前
新手必看:一篇文章带你搞懂JavaScript作用域
前端
万邦科技Lafite3 小时前
如何通过 item_search_img API 接口获取淘宝商品信息
java·前端·数据库
AlbertZein3 小时前
干了三年全栈才悟到:TS + React 这套组合,真不是堆技术堆出来的
前端
化为五月3 小时前
我把 Hermes 接进了飞书,结果卡在“能发消息但就是不回”
前端