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

相关推荐
AprChell6 分钟前
低代码设计器和低代码设计引擎架构综述
前端·vue.js·低代码
Hilaku12 分钟前
Node.js 还能再战十年?给你一个不换引擎的理由
前端·javascript·程序员
颜进强20 分钟前
AI性能参数-截断、延迟与流式输出
前端·后端·ai编程
spmcor27 分钟前
React 架构师之路:Next.js 全栈革命(第八篇)
前端·react.js
英勇无比的消炎药27 分钟前
TinyRobot 源码深度分析:OpenTiny 的 AI 对话组件库
前端·vue.js·github
假如让我当三天老蒯29 分钟前
React基础、进阶(学习用)
前端·react.js·面试
风骏时光牛马31 分钟前
HTML十大经典实战代码案例合集
前端
weedsfly33 分钟前
前端必知必会:从 IIFE 到 ESM,模块化到底在解决什么?
前端·javascript
笨鸟飞不快40 分钟前
从单个服务到集群:一次完整的性能排查复盘
java·前端
禅思院1 小时前
Vite vs Webpack 深度对比:从启动原理到生产构建,一篇就够了
前端·架构·前端框架