自动化 NPM 包安全修复与 CI 上的重复任务
在 Node.js 上开发时,我们团队使用了很多开源的 NPM 包。它们中的每一个都有其为您的项目带来的优点和缺点。在本文中,我们将讨论: 用于漏洞测试 NPM 依赖项的免费选项 用于运行定期检查的无人机 CI 配置 使用固定包创建自动拉取请求 NPM 审计等 当我们谈论漏洞审计时,首先想到的就是 NPM 审计工具。此工具使用公开可用的漏洞目录来检查您的项目并提出库版本更新以修复发现的任何问题。您
在 Node.js 上开发时,我们团队使用了很多开源的 NPM 包。它们中的每一个都有其为您的项目带来的优点和缺点。在本文中,我们将讨论:
-
用于漏洞测试 NPM 依赖项的免费选项
-
用于运行定期检查的无人机 CI 配置
-
使用固定包创建自动拉取请求
NPM 审计等
当我们谈论漏洞审计时,首先想到的就是 NPM 审计工具。此工具使用公开可用的漏洞目录来检查您的项目并提出库版本更新以修复发现的任何问题。您可以在官方NPM 博客中阅读更多信息。
另一个仍然使用开箱即用可用选项的免费报告是 npm outdated。此报告使用命令检查注册表来查看当前是否有任何已安装的软件包已过时。这些信息不一定对日常工作有用,但从长远来看很有用,所以你不太想简单地放弃一个项目。
$ npm outdated
Package Current Wanted Latest Location
glob 5.0.15 5.0.15 6.0.1 test-outdated-output
nothingness 0.0.3 git git test-outdated-output
npm 3.5.1 3.5.2 3.5.1 test-outdated-output
local-dev 0.0.3 linked linked test-outdated-output
once 1.3.2 1.3.3 1.3.3 test-outdated-output
进入全屏模式 退出全屏模式
自动化 npm 过时报告
这些工具非常有用,当然,自动报告会更好。为此,我们使用Drone CI(免费和开源)和新功能 Cron Jobs 来设置重复任务。但是,您可以自由使用您喜欢的任何其他 CI,它们可能会支持相同的功能。对于那些不熟悉 Drone CI 的人,请在此处阅读我的入门文章。
由于 Drone CI 支持多个流水线,因此每个报告都有自己的流水线,不会影响主要的流水线。如需更广泛的了解,请在此处查看示例。同时,让我们从 npm outdated 开始。
kind: pipeline
name: npm outdated
steps:
- name: outdated
image: node:10-alpine
commands:
- npm outdated
- name: slack_notification
image: plugins/slack
settings:
webhook: https://hooks.slack.com/services/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
template: >
NPN detected outdated packages at *{{repo.name}}* for *{{build.branch}}* branch.
Report available by the link {{build.link}}
when:
status:
- failure
trigger:
cron: [ weekly ]
进入全屏模式 退出全屏模式
我们认为 yaml 语法本身就很好。第一步,我们使用 node:10-alpine 作为基础镜像并运行 npm outdated。在第二步中,仅当有需要更新的内容时才会执行 Slack 通知(npm outdated exited with error exit code)。要获取 Slack webhook URL,请访问此页面
在最新的几行中,整个管道由标记为“过时”的 Cron 作业触发。对于我们的项目,我们将这项工作设置为每周执行一次,因为我们不打算在每次发布新版本时都更新包。
要在 Drone 中定义任务,请转到项目 -> 设置。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--rqQlh6HD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws。 com/i/hf3icfj8rdh56sgkruoo.png)
通过这个界面,您可以选择作业的名称(用于管道过滤)、分支和间隔,可以是每小时、每天、每周、每月或每年。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--8_soy9Ru--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws。 com/i/ec3bp3kmrrwmx5bu5tve.png)
自动 npm 审计和修复 PR 创建
npm audit 命令将检查您的应用程序是否存在漏洞,并在需要时将软件包更新到当前版本的任何版本。该管道与前一个管道非常相似,但有一个涉及 PR 创建的额外步骤。
kind: pipeline
name: npm audit
steps:
- name: audit
image: node:10-alpine
commands:
- set -o pipefail && npm audit --force 2>&1 | tee audit.log
- name: audit fix
image: node:10-alpine
commands:
- npm audit fix
when:
status:
- failure
- name: create_fix_pr
image: lnikell/github-hub:2.11.2
environment:
GITHUB_TOKEN:
from_secret: github_token
commands:
- git config --global user.email "email@example.com"
- git config --global user.name "example"
- git checkout -b drone/npm-audit-fix-${DRONE_BUILD_NUMBER}
- git add package.json package-lock.json
- git commit -m 'npm audit fix'
- git push origin drone/npm-audit-fix-${DRONE_BUILD_NUMBER}
- hub pull-request -m "[Security] NPM Audit Fix" -m "$(cat audit.log | tail -2)" -m "${DRONE_BUILD_LINK}"
when:
status:
- failure
- name: slack_notification
image: plugins/slack
settings:
webhook: https://hooks.slack.com/services/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
template: >
NPN detected vulnerable packages at *{{repo.name}}* for *{{build.branch}}* branch.
Report available by the link {{build.link}}
when:
status:
- failure
进入全屏模式 退出全屏模式
第一步,我们使用相同的 node:10-alpine 镜像并运行 NPM 审计。我们还保存了一个包含结果的 audit.log 文件,以便稍后输出到 PR。如果在 npm 审计期间发现了易受攻击的包,则下一步将失败,触发 nmp 审计修复过程并创建拉取请求。
-name: audit fix
image: node:10-alpine
commands:
- npm audit fix
when:
status:
- failure
进入全屏模式 退出全屏模式
为了创建拉取请求,我们使用 hub——处理 Github API 的命令行工具。我们需要生成一个 Github Personal Token 以将其用于 API 调用。转到此页面并创建一个新的:https://github.com/settings/tokens
[](https://res.cloudinary.com/practicaldev/image/fetch/s--KI_3kqMK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws。 com/i/el4882i4ecq1uxs6lh5i.png)
选择“repo”权限范围,然后将生成的令牌添加到 Drone 中的秘密,名称为“github_token”。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--LvwbLlbN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws。 com/i/kxi2csgitp97mb88bmnt.png)
这在下面的步骤中用作环境变量。
- name: create_fix_pr
image: lnikell/github-hub:2.11.2
environment:
GITHUB_TOKEN:
from_secret: github_token
commands:
- git config --global user.email "lnikell@gmail.com"
- git config --global user.name "drone"
- git checkout -b drone/npm-audit-fix-${DRONE_BUILD_NUMBER}
- git add package.json package-lock.json
- git commit -m 'npm audit fix'
- git push origin drone/npm-audit-fix-${DRONE_BUILD_NUMBER}
- hub pull-request -m "[Security] NPM Audit Fix" -m "$(cat audit.log | tail -2)" -m "${DRONE_BUILD_LINK}"
when:
status:
- failure
进入全屏模式 退出全屏模式
在这一步中,我们声明创建分支的模式,并使用 audit.log 中的最后两行创建一个拉取请求。这给了我们一个很好的 PR:
[](https://res.cloudinary.com/practicaldev/image/fetch/s--VVkT-ywF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3。 amazonaws.com/i/d0efbo8r24jgxvji68l3.png)
最后,我们需要查看管道的触发部分。由于您只想将这些检查作为 Cron 作业的一部分执行,因此您需要添加以下内容:
trigger:
cron: [ name_of_the_job ]
进入全屏模式 退出全屏模式
但是,请记住,您仍然需要考虑您的主要管道。为了防止它在 Cron 任务期间运行,您必须使用 exclude 选项,如下所示:
trigger:
cron:
exclude: [ name_of_the_job ]
进入全屏模式 退出全屏模式
查看一个示例,为您提供所有管道的有用概述**这里**。
结论
这只是 CI 上的重复任务如何对您构建、测试和修复有用的一个示例。您只需设置一次,每天/每周都会通知您项目的安全性。我们在示例中使用的方法应该很容易适应 Travis CI 或 Gitlab;如果您这样做,请在此处分享您的管道。
如果你喜欢这篇文章,请订阅我的Twitter或DEV.TO页面。
更多推荐
所有评论(0)