如何在 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 打包流程中实现了代码质量的自动化监控,还通过飞书打通了"扫描-反馈-修复"的闭环,极大地提升了团队的代码整洁度。

相关推荐
用户0595401744611 小时前
把 AI Agent 记忆验证从手工比对换成 Pytest + 向量数据库,测试效率提升 10 倍
前端·css
要写代码11 小时前
2026-Css忘掉一切、归零再启-alpha和opacity
前端
光影少年11 小时前
前端如何和蓝牙物联网进行通信和兼容性问题
前端·物联网·掘金·金石计划
星栈11 小时前
我把售后模块砍到只剩 64 行:Rust 全栈 CRM 的 MVP 取舍实录
前端·后端·开源
玉宇夕落11 小时前
懒加载与Suspense的学习
前端
用户17335980753711 小时前
纯前端实现PDF合并、拆分、压缩:技术方案与踩坑记录
前端
工会代表11 小时前
frps配置,以linux服务器以及windows客户端进行远程桌面内网穿透为例。
前端
用户7138742290011 小时前
Promise 与 Async Await 深度解析
前端
董董灿是个攻城狮11 小时前
5分钟入门卷积算法
前端
用户580481700292811 小时前
我用 MCP 给小程序开发做了个 AI 副驾驶,开源了
前端