こんにちは、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"
}
整理した内容は以下の通りです。通常のバージョンアップデートの場合と差分としては、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 は同じとなります。
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"
}
整理した内容は以下の通りです。通常のバージョンアップデートの場合との差分としては、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 は異なっています。
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"
}
整理した内容は以下の通りです。通常のバージョンアップデートの場合との差分としては、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 を利用する場合は意識しておくと良さそうです。
以上