Closed3

Danger JSでGitHubリポジトリのPull Requestをチェックする

3w36zj63w36zj6

Workflowの作成

https://danger.systems/js/guides/getting_started#including-danger

イベントのアクティビティは用途によって変更する。

https://docs.github.com/ja/github-ae@latest/actions/using-workflows/events-that-trigger-workflows#pull_request

ワークフローを追加したら、ブランチ保護の設定のRequire status checks to pass before mergingでDangerをRequiredに指定するとよい。

Nodeベース

Dockerベース

実行が遅いので非推奨。

https://zenn.dev/3w36zj6/scraps/9904aa97d5eff9

.github/workflows/danger.yml
name: Danger JS
on:
  pull_request:
    types: [opened, synchronize, reopened, edited]

jobs:
  build:
    name: Danger JS
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Danger
        uses: danger/danger-js@11.2.8
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          DANGER_DISABLE_TRANSPILATION: true
3w36zj63w36zj6

dangerfile.ts

プロジェクトのルートにdangerfile.tsを作成する。DSLなどは以下を参照。

https://danger.systems/js/reference

以下はPull Requestについて、タイトルにConventional CommitsのPrefixが付与されていないときにfailする例と本文にIssueのcloseが書かれていないときにwarnする例。

dangerfile.ts
import { danger, fail, warn } from "danger"

const title = danger.github.pr.title
const body = danger.github.pr.body

const checkTitle = () => {
  const allowedPrefixList = ["chore", "docs", "feat", "fix", "perf", "refactor", "style", "test"]
  const allowTitleRegex = new RegExp(`^(${allowedPrefixList.join("|")})(\\(([\\w$.* -]*)\\))?: (.+)(?:\\n|$)`, "g")
  if (!allowTitleRegex.test(title)) {
    fail(
      `PRのタイトルが不正です: \`${title}\`\n次のいずれかのPrefixを使用してください: \n${allowedPrefixList
        .map((prefix) => {
          return `\`${prefix}: \``
        })
        .join(" ")}\n例: \`feat: ユーザーの削除機能を追加\``,
    )
  }
}

const checkCloseIssue = () => {
  if (
    !/\[bot\]$/.test(danger.github.pr.user.login) &&
    !/(close|closes|closed|fix|fixes|fixed|resolve|resolves|resolved)\s+(#\d+|https:\/\/github\.com\/[\w.-]+\/[\w.-]+\/issues\/\d+)/i.test(
      body,
    )
  ) {
    warn("このPRが解決するIssueへのリンクを記載してください。\n例: `close #123`")
  }
}

checkTitle()
checkCloseIssue()
このスクラップは2023/09/17にクローズされました