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

相关推荐
weixin_382395233 小时前
为小工厂量身打造:本地部署的物料管理系统带缺料计算
前端·制造
__zRainy__3 小时前
解决pnpm v10+不自动构建
前端·pnpm·工程化
猫猫不是喵喵.4 小时前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~5 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华6 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子8 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅8 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni8 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学10 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端