Gradle 与 GitHub 在供应链安全方面达成合作
Gradle 很高兴宣布与 GitHub 建立技术合作伙伴关系,重点关注多个领域,首先是供应链安全和开发者体验。通过此次合作,我们将建立组织之间的直接联系,并计划在 GitHub 和 Gradle 之间进行集成合作,以促进 Gradle 用户之间的最佳安全实践。
作为此次合作的一部分,第一个发布的功能是用于 Gradle 的依赖项提交 GitHub Action,它可以配置为自动将依赖项提交到 GitHub 的依赖项图,帮助用户更好地了解其应用程序并接收 Dependabot 警报。
此次合作将改善 Gradle 和 GitHub 生态系统中许多用户的体验。GitHub 是全球领先的 AI 驱动的开发者平台,用于构建、扩展和交付安全软件,拥有超过 2.84 亿个公共存储库。Gradle 构建工具是 Android 应用程序开发的默认构建系统,是 GitHub 上使用最广泛的 JVM 构建系统,也是 GitHub 平台上公共和私有存储库中最常用的构建系统之一。
“Gradle 是 GitHub 用户中最常用的构建工具之一,我们很高兴继续与他们合作,以提高 Gradle 社区的供应链安全性。这些对 Gradle 构建操作的更新将帮助数百万 GitHub 用户通过更好地了解其依赖项来提高其应用程序的安全性。” - GitHub 高级产品经理 Jon Janego
易受攻击的依赖项问题
易受攻击的项目依赖项对软件生态系统构成重大风险。对于开发人员来说,快速检测来自直接和传递依赖项的潜在漏洞至关重要。对于包括 Gradle 在内的许多现代构建系统来说,帮助开发人员管理其依赖项并保护供应链和最终用户是一个优先事项。
Gradle 构建工具提供高级安全功能,例如 依赖项验证 和其他工具来 保护项目完整性。GitHub 提供了许多 安全功能 来解决此问题,包括 Dependabot 警报,它检测存储库是否使用具有已知漏洞的依赖项,并通知维护者。但是,直到最近,Dependabot 警报和 Gradle 构建工具之间的一流集成才缺失。
依赖项管理是一个难题。一些简单的依赖项报告方法试图解析构建文件以确定依赖项版本;但是,这仅适用于最简单的情况,因为依赖项版本可能会受到许多因素的影响。例如,冲突解决可能会导致使用与构建源中声明的版本不同的版本。在 Gradle 的情况下,插件和各种依赖项管理功能也会影响依赖项版本。此外,依赖项也可以在不同的 桶 中以及跨多个子项目声明。今天的公告介绍了一种解决此挑战的新方法。
宣布新的依赖项提交操作
用于 Gradle 的 依赖项提交操作 现在已准备好供使用 GitHub 或 GitHub Enterprise 实例的用户广泛采用。您可以在 GitHub Actions 市场 上找到它。
Gradle 依赖提交操作是一个官方的开源 GitHub 操作,它可以生成 Gradle 项目中依赖项的完整准确信息,并将其上传到 GitHub。这些信息允许维护人员在 GitHub 中查看其项目的依赖项,并在检测到漏洞依赖项时收到通知。
启用该操作后,依赖项将显示在项目的依赖关系图视图中。
当检测到漏洞依赖项时,项目管理员和维护人员可以通过 Dependabot 警报自动收到通知。漏洞依赖项也会显示在项目的“安全 > 漏洞警报 > Dependabot”视图中。
Gradle 依赖提交操作提供了一种可靠的方法来检查 Gradle 项目中的依赖项,并获取有关发现的漏洞的警报。我们强烈建议您在项目中启用它。由于这只需要一个简单的 GitHub 操作配置,让我们看看如何做到这一点…
如何使用依赖提交操作
依赖提交操作已准备好广泛采用,我们建议所有 GitHub 上的 Gradle 项目都使用它。要使用依赖提交操作,请按照 自述文件 中的步骤操作。
对于基本用法,您需要在存储库的 .github/workflows/ 目录中创建一个简单的 YAML 文件,例如 .github/workflows/dependency-submission.yml
name: Dependency Submission
on:
push:
branches: [ "main" ]
permissions:
contents: write
jobs:
dependency-submission:
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: 'temurin'
# change if your project requires a different Java version
java-version: '17'
- name: Generate and submit dependency graph
uses: gradle/actions/dependency-submission@v3
您可以在 此处 查看此 GitHub 工作流的实时示例。GitHub 定义的源文件可以在 .github/workflows/dependency-submission.yml 中找到。执行第一次推送或手动触发依赖提交后,您将能够看到以下构建输出
您可以在 依赖提交操作文档 中找到更高级的配置和设置。
依赖提交操作的工作原理
将 Gradle 构建工具、GitHub 依赖关系图和 Dependabot 警报集成在一起的关键挑战是,考虑到底层依赖关系管理引擎的所有复杂性,以其正确版本提供项目中使用的所有依赖关系。
为了提供完整且准确的依赖版本,Gradle 的依赖提交操作应用了 一个专门的插件 并运行一个小的 Gradle 构建,以解析所有项目依赖项。这意味着提交的依赖版本与项目实际使用的版本完全相同。该操作在单独的工作流步骤中调用,但仍将受益于 设置 Gradle 操作 提供的优化,并且还可以使用 构建缓存。
每当运行依赖提交工作流时,GitHub 依赖关系图都会更新项目的最新依赖关系版本。这使得依赖数据在存储库的Insights > Dependency graph 选项卡中可见,并使 Dependabot 安全警报可见,并为任何新的漏洞发送相关的通知。
获取帮助和分享反馈
我们创建了一个专门的频道用于问答和讨论。加入我们 Gradle 社区 Slack 的 #github-integrations
频道,以获取有关启用依赖提交操作和修复项目中漏洞的帮助。我们也欢迎您在该频道中提供任何反馈!
如果您想报告缺陷,请使用 Gradle 操作存储库上的 GitHub 问题。在那里,您还可以订阅新版本发布公告。
下一步
通过这种 GitHub 集成,Gradle 将帮助开发人员处理易受攻击的依赖项,但我们的目标不止于此。我们计划继续扩展功能并添加更多功能和 UX 改进。
为了加速采用,Gradle 构建工具工程团队将向选定的开源项目提交拉取请求,以启用该操作,从 Gradle 社区插件开始。
我们还希望帮助维护者更快地集成依赖项修复(包括传递依赖项的修复),并且我们正在贡献以使这更容易,方法是使用 Dependabot 安全更新。
了解更多
- gradle/actions - Gradle 的官方 GitHub 操作,包括依赖提交操作。
- gradle/github-dependency-submission-demo - 处理易受攻击的依赖项的工作示例和教程。
- 关于供应链安全 - 了解有关 GitHub 依赖关系图、Dependabot 警报和依赖关系审查的更多信息。