codecamp

将 SARIF 文件上传到 GitHub

您可以将 SARIF 文件从第三方静态分析工具上传到 GitHub,并且在仓库中看到 代码扫描 来自这些工具的警报。

拥有仓库写入权限的人可从第三方工具上传 代码扫描 数据。

注意:代码扫描 目前处于测试阶段,可能会更改。 要申请访问测试版,请加入等待列表

关于 代码扫描 的 SARIF 文件上传

要上传第三方工具的结果,您必须使用静态分析结果交换格式 (SARIF) 2.1.0 格式。 更多信息请参阅“关于代码扫描的 SARIF 支持”。

GitHub 将在仓库中显示来自上传的 SARIF 文件的 代码扫描 警报。 更多信息请参阅“管理来自 代码扫描 的警报”。

要查看第三方 SARIF 文件的结果,您必须使用 GitHub 操作 流程将 SARIF 文件上传到 GitHub。 SARIF 文件可通过在用于上传文件的 GitHub 操作 工作流程中运行的 SARIF 兼容分析工具生成。 或者,当文件生成为仓库外部的构件时, 您可以直接将 SARIF 文件推送到仓库,并使用工作流程上传 SARIF 文件。

通过 GitHub 操作 上传 代码扫描 分析

要将第三方 SARIF 文件上传到 GitHub,需要 GitHub 操作 工作流程。 更多信息请参阅“关于 GitHub 操作”和“配置工作流程”。

您的工作流需要使用 upload-sarif 操作,该操作包含可用于配置上传的输入参数。 您将要使用的主要输入参数是 sarif-file,它会配置要上传的文件或 SARIF 文件的目录。 目录或文件路径相对于仓库的根目录。 更多信息请参阅 upload-sarif 操作

upload-sarif 操作可配置为在 push and scheduled 事件发生时运行。 有关 GitHub 操作 事件的更多信息,请参阅“触发工作流程的事件”。

如果您的 SARIF 文件不含 partialFingerprints,则 upload-sarif 操作将为您计算 partialFingerprints 字段,并尝试防止重复警报。 GitHub 仅当仓库同时包含 SARIF 文件和静态分析中使用的源代码时才能创建 partialFingerprints。 有关防止重复警报的更多信息,请参阅“关于代码扫描的 SARIF 支持”。

在存储库外部生成的 SARIF 文件的工作流程示例

您可以创建一个新的工作流程,以在将 SARIF 文件提交到仓库后上传它们。 这在 SARIF 文件生成为仓库外部的构件时很有用。

只要提交被推送到仓库,此示例工作流程就会运行。 该操作使用 partialFingerprints 属性来确定是否发生了更改。 除了推送提交时运行之外,工作流程还预定每周运行一次。 更多信息请参阅“触发工作流程的事件”。

此工作流上传位于仓库根目录中的 results.sarif 文件。 有关创建工作流程文件的更多信息,请参阅“配置工作流程”。

或者,您也可以修改此工作流程以上传 SARIF 文件的目录。 例如,您可以将所有 SARIF 文件放在仓库根目录中的 sarif-output 目录中,并将操作的输入参数 sarif_file 设置为 sarif-output

name: "Upload SARIF"


## Run workflow each time code is pushed to your repository and on a schedule.
## The scheduled workflow runs every at 00:00 on Sunday UTC time.
on:
  push:
  schedule:
  - cron: '0 0 * * 0'


jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    # This step checks out a copy of your repository.
    - name: Checkout repository
      uses: actions/checkout@v2
    - name: Upload SARIF file
      uses: github/codeql-action/upload-sarif@v1
      with:
        # Path to SARIF file relative to the root of the repository
        sarif_file: results.sarif

运行 ESLint 分析工具的示例工作流程

如果将第三方 SARIF 文件生成为持续集成 (CI) 工作流程的一部分,您可以将 upload-sarif 操作添加为运行 CI 测试后的一个步骤。 如果您还没有 CI 工作流程,可以使用 GitHub 操作 模板创建一个。 更多信息请参阅“从预配置的工作流程模板开始”。

只要提交被推送到仓库,此示例工作流程就会运行。 该操作使用 partialFingerprints 属性来确定是否发生了更改。 除了推送提交时运行之外,工作流程还预定每周运行一次。 更多信息请参阅“触发工作流程的事件”。

工作流程显示了将 ESLint 静态分析工具作为工作流程中一个步骤运行的示例。 Run ESLint 步骤运行 ESLint 工具,输出 results.sarif 文件。 然后,工作流程使用 upload-sarif 操作将 results.sarif 文件上传到 GitHub。 有关创建工作流程文件的更多信息,请参阅“配置工作流程”。

name: "ESLint analysis"


## Run workflow each time code is pushed to your repository and on a schedule.
## The scheduled workflow runs every at 00:00 on Sunday UTC time.
on:
  push:
  schedule:
  - cron: '0 0 * * 0'


jobs:
  build:
    steps:
    - uses: actions/checkout@v2
    - name: Run npm install
      run: npm install
    # Runs the ESlint code analysis
    - name: Run ESLint
      # eslint exits 1 if it finds anything to report
      run: node_modules/.bin/eslint build docs lib script spec-main -f node_modules/@microsoft/eslint-formatter-sarif/sarif.js -o results.sarif || true
    # Uploads results.sarif to GitHub repository using the upload-sarif action
    - uses: github/codeql-action/upload-sarif@v1
      with:
        # Path to SARIF file relative to the root of the repository
        sarif_file: results.sarif

延伸阅读

GitHub 管理来自代码扫描的警报
GitHub 对代码扫描的 SARIF 支持
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

GitHub 身份验证

在 GitHub 上管理订阅和通知

在 GitHub 上管理活动的订阅

GitHub 组织和团队

GitHub 管理对组织仓库的 Git 访问

GitHub 计费和付款

GitHub 使用议题和拉取请求进行协作

GitHub 在具有代码质量功能的仓库上进行协作

管理在 GitHub 上的工作

GitHub 建立强大的社区

GitHub 管理仓库

GitHub 自定义 GitHub 工作流程

在 GitHub Marketplace 中购买并安装应用程序

通过 GitHub Jobs 寻找人才

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }