[GitHub] Dependabot Grouped version updates ではどのような metadata が取得できるのか確認してみた

2023.08.18

こんにちは、CX 事業本部 Delivery 部の若槻です。

下記の記事で紹介されている通り、GitHub Dependabot によりオープンされた Pull Request トリガーのワークフロー実行では、dependabot/fetch-metadata アクションにより更新の metadata が取得でき、その結果を元に所定のセマンティックバージョニングの更新の Pull Request を自動マージさせるといった運用が可能です。

今回は、Dependabot の Grouped version updates の場合にはどのような metadata が取得できるのか、気になったので確認してみました。

試してみた

次のような Dependabot コンフィグで試してみます。3 つの Version update group を定義しています。

.github/dependabot.yml

version: 2
updates:
  - package-ecosystem: npm
    directory: /
    schedule:
      interval: daily
    groups:
      aws-sdk-group:
        patterns:
          - '@aws-sdk/*'
      types-group:
        patterns:
          - '@types/*'
      hoge-group:
        patterns:
          - luxon
          - typescript

ワークフローは次のようになります。dependabot/fetch-metadataにより取得した metadata を出力しています。

.github/workflows/dependabot_metadata.yml

on: pull_request_target

jobs:
  dependabot:
    runs-on: ubuntu-latest
    permissions:
      pull-requests: read
    if: ${{ github.event.pull_request.user.login == 'dependabot[bot]' }}
    steps:
      - name: Dependabot metadata
        id: dependabot-metadata
        uses: dependabot/fetch-metadata@v1
      - name: Echo Dependabot metadata
        run: |
          echo "${{ toJSON(steps.dependabot-metadata.outputs) }}"

通常のバージョンアップデート

まずどのグループにも該当しない、通常のバージョンアップデートの場合です。

package.json

{
  "dev-dependencies": {
-    "constructs": "10.2.67"
+    "constructs": "10.2.69"
  }
}

出力結果は次のようになりました。

{
    "updated-dependencies-json": "[{\"dependencyName\":\"constructs\",\"dependencyType\":\"direct:production\",\"updateType\":\"version-update:semver-patch\",\"directory\":\"/\",\"packageEcosystem\":\"npm_and_yarn\",\"targetBranch\":\"main\",\"prevVersion\":\"10.2.67\",\"newVersion\":\"10.2.69\",\"compatScore\":0,\"maintainerChanges\":false,\"dependencyGroup\":\"\",\"alertState\":\"\",\"ghsaId\":\"\",\"cvss\":0}]",
    "dependency-names": "constructs",
    "dependency-type": "direct:production",
    "update-type": "version-update:semver-patch",
    "directory": "/",
    "package-ecosystem": "npm_and_yarn",
    "target-branch": "main",
    "previous-version": "10.2.[6](https://github.com/cm-rwakatsuki/cdk_sample_app/actions/runs/5881816116/job/15951061148?pr=79#step:3:6)[7](https://github.com/cm-rwakatsuki/cdk_sample_app/actions/runs/5881816116/job/15951061148?pr=79#step:3:7)",
    "new-version": "10.2.6[9](https://github.com/cm-rwakatsuki/cdk_sample_app/actions/runs/5881816116/job/15951061148?pr=79#step:3:9)",
    "compatibility-score": "0",
    "maintainer-changes": "false",
    "dependency-group": "",
    "alert-state": "",
    "ghsa-id": "",
    "cvss": "0"
  }

整理した内容は以下の通りです。これらの情報を Grouped version updates の場合と比較してみます。

名前 説明
updated-dependencies-json 省略 依存関係の情報
dependency-names constructs 依存関係の名前
dependency-type direct:production 依存関係のタイプ
update-type version-update:semver-patch 更新された semver タイプ
previous-version 10.2.67 更新後のバージョン
new-version 10.2.69 更新前のバージョン
dependency-group - グループ名

Grouped version updates(単一の依存関係が更新)

次に、types-group グループに該当する単一の依存関係の更新の場合です。

package.json

{
  "dev-dependencies": {
-    "@types/node": "20.4.7",
+    "@types/node": "20.5.0",
  }
}

出力結果は次のようになりました。

{
    "updated-dependencies-json": "[{\"dependencyName\":\"@types/node\",\"dependencyType\":\"direct:development\",\"updateType\":\"version-update:semver-minor\",\"directory\":\"/\",\"packageEcosystem\":\"npm_and_yarn\",\"targetBranch\":\"main\",\"prevVersion\":\"\",\"newVersion\":\"\",\"compatScore\":0,\"maintainerChanges\":false,\"dependencyGroup\":\"types-group\",\"alertState\":\"\",\"ghsaId\":\"\",\"cvss\":0}]",
    "dependency-names": "@types/node",
    "dependency-type": "direct:development",
    "update-type": "version-update:semver-minor",
    "directory": "/",
    "package-ecosystem": "npm_and_yarn",
    "target-branch": "main",
    "previous-version": "",
    "new-version": "",
    "compatibility-score": "0",
    "maintainer-changes": "false",
    "dependency-group": "types-group",
    "alert-state": "",
    "ghsa-id": "",
    "cvss": "0"
  }

整理した内容は以下の通りです。通常のバージョンアップデートの場合と差分としては、prevVersionnewVersion が値なしになっています。

名前 通常との差分
updated-dependencies-json 省略 prevVersion と newVersion が値なし
dependency-names @types/node -
dependency-type direct:development -
update-type version-update:semver-minor -
previous-version - 値なし
new-version - 値なし
dependency-group types-group グループ名あり

Grouped version updates(複数の依存関係が更新、update-type が同じ)

次に、aws-sdk-group グループに該当する複数の依存関係の更新の場合です。更新する semver は同じとなります。

package.json

{
  "dependencies": {
-    "@aws-sdk/client-lambda": "3.385.0",
-    "@aws-sdk/client-cognito-identity": "3.385.0",
+    "@aws-sdk/client-lambda": "3.391.0",
+    "@aws-sdk/client-cognito-identity": "3.391.0",
  }
}

出力結果は次のようになりました。

{
    "updated-dependencies-json": "[{\"dependencyName\":\"@aws-sdk/client-lambda\",\"dependencyType\":\"direct:production\",\"updateType\":\"version-update:semver-minor\",\"directory\":\"/\",\"packageEcosystem\":\"npm_and_yarn\",\"targetBranch\":\"main\",\"prevVersion\":\"\",\"newVersion\":\"\",\"compatScore\":0,\"maintainerChanges\":false,\"dependencyGroup\":\"aws-sdk-group\",\"alertState\":\"\",\"ghsaId\":\"\",\"cvss\":0},{\"dependencyName\":\"@aws-sdk/client-cognito-identity\",\"dependencyType\":\"direct:production\",\"updateType\":\"version-update:semver-minor\",\"directory\":\"/\",\"packageEcosystem\":\"npm_and_yarn\",\"targetBranch\":\"main\",\"prevVersion\":\"\",\"newVersion\":\"\",\"compatScore\":0,\"maintainerChanges\":false,\"dependencyGroup\":\"aws-sdk-group\",\"alertState\":\"\",\"ghsaId\":\"\",\"cvss\":0}]",
    "dependency-names": "@aws-sdk/client-lambda, @aws-sdk/client-cognito-identity",
    "dependency-type": "direct:production",
    "update-type": "version-update:semver-minor",
    "directory": "/",
    "package-ecosystem": "npm_and_yarn",
    "target-branch": "main",
    "previous-version": "",
    "new-version": "",
    "compatibility-score": "0",
    "maintainer-changes": "false",
    "dependency-group": "aws-sdk-group",
    "alert-state": "",
    "ghsa-id": "",
    "cvss": "0"
  }

整理した内容は以下の通りです。通常のバージョンアップデートの場合との差分としては、prevVersionnewVersion が値なしになっており、またdependency-names にはカンマ区切りで複数の依存関係が含まれています。update-type は 2 つの更新のものである semver-minor となっています。

名前 通常との差分
updated-dependencies-json 省略 prevVersion と newVersion が値なし。複数の依存関係の更新の情報が含まれている
dependency-names @aws-sdk/client-lambda, @aws-sdk/client-cognito-identity カンマ区切りで複数の依存関係
dependency-type direct:production -
update-type version-update:semver-minor -
previous-version - 値なし
new-version - 値なし
dependency-group aws-sdk-group グループ名あり

Grouped version updates(複数の依存関係が更新、update-type が異なる)

次に、hoge-group グループに該当する複数の依存関係の更新の場合です。ただし、更新する semver は異なっています。

package.json

{
  "dev-dependencies": {
-    "typescript": "5.1.5"
+    "typescript": "5.1.6"
  }
  "dependencies": {
-    "luxon": "2.5.2"
+    "luxon": "3.4.0"
  }
}

出力結果は次のようになりました。

{
    "updated-dependencies-json": "[{\"dependencyName\":\"luxon\",\"dependencyType\":\"direct:production\",\"updateType\":\"version-update:semver-major\",\"directory\":\"/\",\"packageEcosystem\":\"npm_and_yarn\",\"targetBranch\":\"main\",\"prevVersion\":\"\",\"newVersion\":\"\",\"compatScore\":0,\"maintainerChanges\":false,\"dependencyGroup\":\"hoge-group\",\"alertState\":\"\",\"ghsaId\":\"\",\"cvss\":0},{\"dependencyName\":\"typescript\",\"dependencyType\":\"direct:development\",\"updateType\":\"version-update:semver-patch\",\"directory\":\"/\",\"packageEcosystem\":\"npm_and_yarn\",\"targetBranch\":\"main\",\"prevVersion\":\"\",\"newVersion\":\"\",\"compatScore\":0,\"maintainerChanges\":false,\"dependencyGroup\":\"hoge-group\",\"alertState\":\"\",\"ghsaId\":\"\",\"cvss\":0}]",
    "dependency-names": "luxon, typescript",
    "dependency-type": "direct:production",
    "update-type": "version-update:semver-major",
    "directory": "/",
    "package-ecosystem": "npm_and_yarn",
    "target-branch": "main",
    "previous-version": "",
    "new-version": "",
    "compatibility-score": "0",
    "maintainer-changes": "false",
    "dependency-group": "hoge-group",
    "alert-state": "",
    "ghsa-id": "",
    "cvss": "0"
  }

整理した内容は以下の通りです。通常のバージョンアップデートの場合との差分としては、prevVersionnewVersion が値なしになっており、またdependency-names にはカンマ区切りで複数の依存関係が含まれています。update-type は 2 つの更新のうち大きい方の semver の値が指定されています。

名前 通常との差分
updated-dependencies-json 省略 prevVersion と newVersion が値なし。複数の依存関係の更新の情報が含まれている
dependency-names luxon, typescript カンマ区切りで複数の依存関係
dependency-type direct:production -
update-type version-update:semver-major 大きい方の semver の値が指定されている
previous-version - 値なし
new-version - 値なし
dependency-group hoge-group グループ名あり

結論

  • Grouped version updates で、update-type が異なる複数の依存関係の更新の場合は、metadata から取得されるのは大きい方の semver の update-type となる
  • これにより「メジャーバージョンアップデートされる依存関係が 1 つ以上含まれる場合は、自動マージをさせたくない」という場合に、update-type で判定することができる

おわりに

Dependabot Grouped version updates ではどのような metadata が取得できるのか確認してみました。

update-type含め Grouped version updates の場合は、通常の場合に比べて細かい差分があるようなので、metadata を利用する場合は意識しておくと良さそうです。

以上