![[GitHub] Dependabot Grouped version updates ではどのような metadata が取得できるのか確認してみた](https://devio2023-media.developers.io/wp-content/uploads/2023/12/dependabot_1200_630-1.png)
[GitHub] Dependabot Grouped version updates ではどのような metadata が取得できるのか確認してみた
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、CX 事業本部 Delivery 部の若槻です。
下記の記事で紹介されている通り、GitHub Dependabot によりオープンされた Pull Request トリガーのワークフロー実行では、dependabot/fetch-metadata アクションにより更新の metadata が取得でき、その結果を元に所定のセマンティックバージョニングの更新の Pull Request を自動マージさせるといった運用が可能です。
今回は、Dependabot の Grouped version updates の場合にはどのような metadata が取得できるのか、気になったので確認してみました。
試してみた
次のような Dependabot コンフィグで試してみます。3 つの Version update group を定義しています。
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 を出力しています。
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) }}"
通常のバージョンアップデート
まずどのグループにも該当しない、通常のバージョンアップデートの場合です。
{
  "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 グループに該当する単一の依存関係の更新の場合です。
{
  "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"
  }
整理した内容は以下の通りです。通常のバージョンアップデートの場合と差分としては、prevVersion と newVersion が値なしになっています。
| 名前 | 値 | 通常との差分 | 
|---|---|---|
| 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 は同じとなります。
{
  "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"
  }
整理した内容は以下の通りです。通常のバージョンアップデートの場合との差分としては、prevVersion と newVersion が値なしになっており、また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 は異なっています。
{
  "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"
  }
整理した内容は以下の通りです。通常のバージョンアップデートの場合との差分としては、prevVersion と newVersion が値なしになっており、また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 を利用する場合は意識しておくと良さそうです。
以上












