Danger + Node
#Before we get started
This tutorial continues after “Getting Started” - so you should have seen Danger comment on your PRs.
#“Node App”
A node app could cover anything from an API, to a website, a native app or a hardware project. The rules on these projects tend to come from your larger dev team culture. In Artsy a lot of our rules for applications come from trying to have a similar culture between all projects.
#Assignees
We use a slack bot to let people know when they’ve been assigned to a PR, and so the first rule added to an app is a check that there are assignees to your PR. This is a really simple check:
import { danger, fail, warn } from "danger"
if (!danger.github.pr.assignee) {
fail("This pull request needs an assignee, and optionally include any reviewers.")
}
The danger.pr
object is the JSON provided by GitHub to represent a pull request. So here we’re pulling out the
assignee
key and validating that anything is inside it.
We can make a small improvement to this rule, by allowing someone to declare that a PR is a “work in progress” Danger can allow the build to pass, but will provide feedback that there is no assignee.
import { danger, fail, warn } from "danger"
if (!danger.github.pr.assignee) {
const method = danger.github.pr.title.includes("WIP") ? warn : fail
method("This pull request needs an assignee, and optionally include any reviewers.")
}
Using a function as a variable we can determine whether to fail, or warn based on whether the PR’s title includes the
string "WIP"
.
#PR Messages
In a similar vein, we also want to encourage pull requests as a form of documentation. We can help push people in this direction by not allowing the body of a pull request to be less than a few characters long.
if (danger.github.pr.body.length < 10) {
fail("This pull request needs a description.")
}
This can be expanded to all sorts of checks for example:
- Making sure every PR references an issue, or JIRA ticket.
- Skipping particular rules based on what someone says inside the message. E.g. “This is a trivial PR.” - in Artsy we allow particular hashtags to suppress feedback from danger.
#Results of CI Processes
Let’s assume you’re using CI for running tests or linters.
script:
- yarn lint
- yarn test
- yarn danger ci
If your tool does not have an extra log file output option, you can look at using tee
to copy the text output
into a file for later reading ( so you’d change - yarn lint
to yarn lint | tee 'linter.log'
)
And here’s a really simple check that it contains the word “Failed” and to post the logs into the PR.
import { danger, markdown } from "danger"
import contains from "lodash-contains"
import fs from "fs"
const testFile = "tests-output.log"
const linterOutput = fs.readFileSync(testFile).toString()
if (contains(linterOutput, "Failed")) {
markdown(`These changes failed to pass the linter:
${linterOutput}
`)
}
More mature tools may have a JSON output reporter, so you can parse that file and create your own report for danger to post.
If you build something that is a generic wrapper around a specific linting tool, this is a great place to convert that code into a plugin so that anyone can use it. In this case, Danger effectively is a way of moving these messages into the code review session.
For example:
Got improvements? Help improve this document via sending PRs.