From 696f4e6a94474de94e739b434a3ae19c80d2b555 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Apr 2025 20:13:41 +0000 Subject: [PATCH 1/2] chore(deps-dev): bump vite from 5.1.4 to 5.4.19 in /config-ui Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.1.4 to 5.4.19. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v5.4.19/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.4.19/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-version: 5.4.19 dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- config-ui/package.json | 2 +- config-ui/yarn.lock | 449 +++++++++++++++++++++++++---------------- 2 files changed, 277 insertions(+), 174 deletions(-) diff --git a/config-ui/package.json b/config-ui/package.json index 99d10bf1997..265cd2336a1 100644 --- a/config-ui/package.json +++ b/config-ui/package.json @@ -67,7 +67,7 @@ "lint-staged": "^13.1.0", "prettier": "^2.7.1", "typescript": "^5.1.6", - "vite": "^5.1.4", + "vite": "^5.4.19", "vite-plugin-svgr": "^4.2.0" } } diff --git a/config-ui/yarn.lock b/config-ui/yarn.lock index 2ea91ec1bdc..cf8a137f17f 100644 --- a/config-ui/yarn.lock +++ b/config-ui/yarn.lock @@ -1755,163 +1755,163 @@ __metadata: languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/aix-ppc64@npm:0.19.12" +"@esbuild/aix-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/aix-ppc64@npm:0.21.5" conditions: os=aix & cpu=ppc64 languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/android-arm64@npm:0.19.12" +"@esbuild/android-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm64@npm:0.21.5" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@esbuild/android-arm@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/android-arm@npm:0.19.12" +"@esbuild/android-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm@npm:0.21.5" conditions: os=android & cpu=arm languageName: node linkType: hard -"@esbuild/android-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/android-x64@npm:0.19.12" +"@esbuild/android-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-x64@npm:0.21.5" conditions: os=android & cpu=x64 languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/darwin-arm64@npm:0.19.12" +"@esbuild/darwin-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-arm64@npm:0.21.5" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/darwin-x64@npm:0.19.12" +"@esbuild/darwin-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-x64@npm:0.21.5" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/freebsd-arm64@npm:0.19.12" +"@esbuild/freebsd-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-arm64@npm:0.21.5" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/freebsd-x64@npm:0.19.12" +"@esbuild/freebsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-x64@npm:0.21.5" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-arm64@npm:0.19.12" +"@esbuild/linux-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm64@npm:0.21.5" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-arm@npm:0.19.12" +"@esbuild/linux-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm@npm:0.21.5" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-ia32@npm:0.19.12" +"@esbuild/linux-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ia32@npm:0.21.5" conditions: os=linux & cpu=ia32 languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-loong64@npm:0.19.12" +"@esbuild/linux-loong64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-loong64@npm:0.21.5" conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-mips64el@npm:0.19.12" +"@esbuild/linux-mips64el@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-mips64el@npm:0.21.5" conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-ppc64@npm:0.19.12" +"@esbuild/linux-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ppc64@npm:0.21.5" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-riscv64@npm:0.19.12" +"@esbuild/linux-riscv64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-riscv64@npm:0.21.5" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-s390x@npm:0.19.12" +"@esbuild/linux-s390x@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-s390x@npm:0.21.5" conditions: os=linux & cpu=s390x languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/linux-x64@npm:0.19.12" +"@esbuild/linux-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-x64@npm:0.21.5" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/netbsd-x64@npm:0.19.12" +"@esbuild/netbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/netbsd-x64@npm:0.21.5" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/openbsd-x64@npm:0.19.12" +"@esbuild/openbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/openbsd-x64@npm:0.21.5" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/sunos-x64@npm:0.19.12" +"@esbuild/sunos-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/sunos-x64@npm:0.21.5" conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/win32-arm64@npm:0.19.12" +"@esbuild/win32-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-arm64@npm:0.21.5" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/win32-ia32@npm:0.19.12" +"@esbuild/win32-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-ia32@npm:0.21.5" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.19.12": - version: 0.19.12 - resolution: "@esbuild/win32-x64@npm:0.19.12" +"@esbuild/win32-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-x64@npm:0.21.5" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -2245,93 +2245,142 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.12.0": - version: 4.12.0 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.12.0" +"@rollup/rollup-android-arm-eabi@npm:4.40.1": + version: 4.40.1 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.40.1" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.12.0": - version: 4.12.0 - resolution: "@rollup/rollup-android-arm64@npm:4.12.0" +"@rollup/rollup-android-arm64@npm:4.40.1": + version: 4.40.1 + resolution: "@rollup/rollup-android-arm64@npm:4.40.1" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.12.0": - version: 4.12.0 - resolution: "@rollup/rollup-darwin-arm64@npm:4.12.0" +"@rollup/rollup-darwin-arm64@npm:4.40.1": + version: 4.40.1 + resolution: "@rollup/rollup-darwin-arm64@npm:4.40.1" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.12.0": - version: 4.12.0 - resolution: "@rollup/rollup-darwin-x64@npm:4.12.0" +"@rollup/rollup-darwin-x64@npm:4.40.1": + version: 4.40.1 + resolution: "@rollup/rollup-darwin-x64@npm:4.40.1" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.12.0": - version: 4.12.0 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.12.0" - conditions: os=linux & cpu=arm +"@rollup/rollup-freebsd-arm64@npm:4.40.1": + version: 4.40.1 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.40.1" + conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.12.0": - version: 4.12.0 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.12.0" +"@rollup/rollup-freebsd-x64@npm:4.40.1": + version: 4.40.1 + resolution: "@rollup/rollup-freebsd-x64@npm:4.40.1" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.40.1": + version: 4.40.1 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.40.1" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-musleabihf@npm:4.40.1": + version: 4.40.1 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.40.1" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-gnu@npm:4.40.1": + version: 4.40.1 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.40.1" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.12.0": - version: 4.12.0 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.12.0" +"@rollup/rollup-linux-arm64-musl@npm:4.40.1": + version: 4.40.1 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.40.1" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.12.0": - version: 4.12.0 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.12.0" +"@rollup/rollup-linux-loongarch64-gnu@npm:4.40.1": + version: 4.40.1 + resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.40.1" + conditions: os=linux & cpu=loong64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.40.1": + version: 4.40.1 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.40.1" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-gnu@npm:4.40.1": + version: 4.40.1 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.40.1" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.12.0": - version: 4.12.0 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.12.0" +"@rollup/rollup-linux-riscv64-musl@npm:4.40.1": + version: 4.40.1 + resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.40.1" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-s390x-gnu@npm:4.40.1": + version: 4.40.1 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.40.1" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-gnu@npm:4.40.1": + version: 4.40.1 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.40.1" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.12.0": - version: 4.12.0 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.12.0" +"@rollup/rollup-linux-x64-musl@npm:4.40.1": + version: 4.40.1 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.40.1" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.12.0": - version: 4.12.0 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.12.0" +"@rollup/rollup-win32-arm64-msvc@npm:4.40.1": + version: 4.40.1 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.40.1" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.12.0": - version: 4.12.0 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.12.0" +"@rollup/rollup-win32-ia32-msvc@npm:4.40.1": + version: 4.40.1 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.40.1" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.12.0": - version: 4.12.0 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.12.0" +"@rollup/rollup-win32-x64-msvc@npm:4.40.1": + version: 4.40.1 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.40.1" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -2529,13 +2578,20 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:1.0.5, @types/estree@npm:^1.0.0": +"@types/estree@npm:*, @types/estree@npm:^1.0.0": version: 1.0.5 resolution: "@types/estree@npm:1.0.5" checksum: dd8b5bed28e6213b7acd0fb665a84e693554d850b0df423ac8076cc3ad5823a6bc26b0251d080bdc545af83179ede51dd3f6fa78cad2c46ed1f29624ddf3e41a languageName: node linkType: hard +"@types/estree@npm:1.0.7": + version: 1.0.7 + resolution: "@types/estree@npm:1.0.7" + checksum: d9312b7075bdd08f3c9e1bb477102f5458aaa42a8eec31a169481ce314ca99ac716645cff4fca81ea65a2294b0276a0de63159d1baca0f8e7b5050a92de950ad + languageName: node + linkType: hard + "@types/file-saver@npm:^2.0.5": version: 2.0.7 resolution: "@types/file-saver@npm:2.0.7" @@ -3709,7 +3765,7 @@ __metadata: rehype-raw: ^7.0.0 styled-components: ^6.1.8 typescript: ^5.1.6 - vite: ^5.1.4 + vite: ^5.4.19 vite-plugin-svgr: ^4.2.0 languageName: unknown linkType: soft @@ -4170,33 +4226,33 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.19.3": - version: 0.19.12 - resolution: "esbuild@npm:0.19.12" - dependencies: - "@esbuild/aix-ppc64": 0.19.12 - "@esbuild/android-arm": 0.19.12 - "@esbuild/android-arm64": 0.19.12 - "@esbuild/android-x64": 0.19.12 - "@esbuild/darwin-arm64": 0.19.12 - "@esbuild/darwin-x64": 0.19.12 - "@esbuild/freebsd-arm64": 0.19.12 - "@esbuild/freebsd-x64": 0.19.12 - "@esbuild/linux-arm": 0.19.12 - "@esbuild/linux-arm64": 0.19.12 - "@esbuild/linux-ia32": 0.19.12 - "@esbuild/linux-loong64": 0.19.12 - "@esbuild/linux-mips64el": 0.19.12 - "@esbuild/linux-ppc64": 0.19.12 - "@esbuild/linux-riscv64": 0.19.12 - "@esbuild/linux-s390x": 0.19.12 - "@esbuild/linux-x64": 0.19.12 - "@esbuild/netbsd-x64": 0.19.12 - "@esbuild/openbsd-x64": 0.19.12 - "@esbuild/sunos-x64": 0.19.12 - "@esbuild/win32-arm64": 0.19.12 - "@esbuild/win32-ia32": 0.19.12 - "@esbuild/win32-x64": 0.19.12 +"esbuild@npm:^0.21.3": + version: 0.21.5 + resolution: "esbuild@npm:0.21.5" + dependencies: + "@esbuild/aix-ppc64": 0.21.5 + "@esbuild/android-arm": 0.21.5 + "@esbuild/android-arm64": 0.21.5 + "@esbuild/android-x64": 0.21.5 + "@esbuild/darwin-arm64": 0.21.5 + "@esbuild/darwin-x64": 0.21.5 + "@esbuild/freebsd-arm64": 0.21.5 + "@esbuild/freebsd-x64": 0.21.5 + "@esbuild/linux-arm": 0.21.5 + "@esbuild/linux-arm64": 0.21.5 + "@esbuild/linux-ia32": 0.21.5 + "@esbuild/linux-loong64": 0.21.5 + "@esbuild/linux-mips64el": 0.21.5 + "@esbuild/linux-ppc64": 0.21.5 + "@esbuild/linux-riscv64": 0.21.5 + "@esbuild/linux-s390x": 0.21.5 + "@esbuild/linux-x64": 0.21.5 + "@esbuild/netbsd-x64": 0.21.5 + "@esbuild/openbsd-x64": 0.21.5 + "@esbuild/sunos-x64": 0.21.5 + "@esbuild/win32-arm64": 0.21.5 + "@esbuild/win32-ia32": 0.21.5 + "@esbuild/win32-x64": 0.21.5 dependenciesMeta: "@esbuild/aix-ppc64": optional: true @@ -4246,7 +4302,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 2936e29107b43e65a775b78b7bc66ddd7d76febd73840ac7e825fb22b65029422ff51038a08d19b05154f543584bd3afe7d1ef1c63900429475b17fbe61cb61f + checksum: 2911c7b50b23a9df59a7d6d4cdd3a4f85855787f374dce751148dbb13305e0ce7e880dde1608c2ab7a927fc6cec3587b80995f7fc87a64b455f8b70b55fd8ec1 languageName: node linkType: hard @@ -6599,7 +6655,7 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^3.3.6, nanoid@npm:^3.3.7": +"nanoid@npm:^3.3.6": version: 3.3.7 resolution: "nanoid@npm:3.3.7" bin: @@ -6608,6 +6664,15 @@ __metadata: languageName: node linkType: hard +"nanoid@npm:^3.3.8": + version: 3.3.11 + resolution: "nanoid@npm:3.3.11" + bin: + nanoid: bin/nanoid.cjs + checksum: 3be20d8866a57a6b6d218e82549711c8352ed969f9ab3c45379da28f405363ad4c9aeb0b39e9abc101a529ca65a72ff9502b00bf74a912c4b64a9d62dfd26c29 + languageName: node + linkType: hard + "natural-compare-lite@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare-lite@npm:1.4.0" @@ -6948,6 +7013,13 @@ __metadata: languageName: node linkType: hard +"picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 + languageName: node + linkType: hard + "picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" @@ -6989,14 +7061,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.35": - version: 8.4.35 - resolution: "postcss@npm:8.4.35" +"postcss@npm:^8.4.43": + version: 8.5.3 + resolution: "postcss@npm:8.5.3" dependencies: - nanoid: ^3.3.7 - picocolors: ^1.0.0 - source-map-js: ^1.0.2 - checksum: cf3c3124d3912a507603f6d9a49b3783f741075e9aa73eb592a6dd9194f9edab9d20a8875d16d137d4f779fe7b6fbd1f5727e39bfd1c3003724980ee4995e1da + nanoid: ^3.3.8 + picocolors: ^1.1.1 + source-map-js: ^1.2.1 + checksum: da574620eb84ff60e65e1d8fc6bd5ad87a19101a23d0aba113c653434161543918229a0f673d89efb3b6d4906287eb04b957310dbcf4cbebacad9d1312711461 languageName: node linkType: hard @@ -8066,24 +8138,31 @@ __metadata: languageName: node linkType: hard -"rollup@npm:^4.2.0": - version: 4.12.0 - resolution: "rollup@npm:4.12.0" - dependencies: - "@rollup/rollup-android-arm-eabi": 4.12.0 - "@rollup/rollup-android-arm64": 4.12.0 - "@rollup/rollup-darwin-arm64": 4.12.0 - "@rollup/rollup-darwin-x64": 4.12.0 - "@rollup/rollup-linux-arm-gnueabihf": 4.12.0 - "@rollup/rollup-linux-arm64-gnu": 4.12.0 - "@rollup/rollup-linux-arm64-musl": 4.12.0 - "@rollup/rollup-linux-riscv64-gnu": 4.12.0 - "@rollup/rollup-linux-x64-gnu": 4.12.0 - "@rollup/rollup-linux-x64-musl": 4.12.0 - "@rollup/rollup-win32-arm64-msvc": 4.12.0 - "@rollup/rollup-win32-ia32-msvc": 4.12.0 - "@rollup/rollup-win32-x64-msvc": 4.12.0 - "@types/estree": 1.0.5 +"rollup@npm:^4.20.0": + version: 4.40.1 + resolution: "rollup@npm:4.40.1" + dependencies: + "@rollup/rollup-android-arm-eabi": 4.40.1 + "@rollup/rollup-android-arm64": 4.40.1 + "@rollup/rollup-darwin-arm64": 4.40.1 + "@rollup/rollup-darwin-x64": 4.40.1 + "@rollup/rollup-freebsd-arm64": 4.40.1 + "@rollup/rollup-freebsd-x64": 4.40.1 + "@rollup/rollup-linux-arm-gnueabihf": 4.40.1 + "@rollup/rollup-linux-arm-musleabihf": 4.40.1 + "@rollup/rollup-linux-arm64-gnu": 4.40.1 + "@rollup/rollup-linux-arm64-musl": 4.40.1 + "@rollup/rollup-linux-loongarch64-gnu": 4.40.1 + "@rollup/rollup-linux-powerpc64le-gnu": 4.40.1 + "@rollup/rollup-linux-riscv64-gnu": 4.40.1 + "@rollup/rollup-linux-riscv64-musl": 4.40.1 + "@rollup/rollup-linux-s390x-gnu": 4.40.1 + "@rollup/rollup-linux-x64-gnu": 4.40.1 + "@rollup/rollup-linux-x64-musl": 4.40.1 + "@rollup/rollup-win32-arm64-msvc": 4.40.1 + "@rollup/rollup-win32-ia32-msvc": 4.40.1 + "@rollup/rollup-win32-x64-msvc": 4.40.1 + "@types/estree": 1.0.7 fsevents: ~2.3.2 dependenciesMeta: "@rollup/rollup-android-arm-eabi": @@ -8094,14 +8173,28 @@ __metadata: optional: true "@rollup/rollup-darwin-x64": optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true "@rollup/rollup-linux-arm-gnueabihf": optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true "@rollup/rollup-linux-arm64-gnu": optional: true "@rollup/rollup-linux-arm64-musl": optional: true + "@rollup/rollup-linux-loongarch64-gnu": + optional: true + "@rollup/rollup-linux-powerpc64le-gnu": + optional: true "@rollup/rollup-linux-riscv64-gnu": optional: true + "@rollup/rollup-linux-riscv64-musl": + optional: true + "@rollup/rollup-linux-s390x-gnu": + optional: true "@rollup/rollup-linux-x64-gnu": optional: true "@rollup/rollup-linux-x64-musl": @@ -8116,7 +8209,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: a7398f072cf50804e9bdaf363792d0b7801800640434e7867c10b4e2e7be421ca2dc614ae0fc7392044eaf77d5c3a66f76a6fa2246bef97a7bc55926a8d60982 + checksum: b25c1a20192bc7d6a483c6dc61f93899fed8d6fbdf42a92f843ed3ab0f729485325e5d2e86b7039a0bd1f4c0eb786f5d8f6054b99e7e1f72dfa2206a528f2b4e languageName: node linkType: hard @@ -8341,6 +8434,13 @@ __metadata: languageName: node linkType: hard +"source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 4eb0cd997cdf228bc253bcaff9340afeb706176e64868ecd20efbe6efea931465f43955612346d6b7318789e5265bdc419bc7669c1cebe3db0eb255f57efa76b + languageName: node + linkType: hard + "space-separated-tokens@npm:^2.0.0": version: 2.0.2 resolution: "space-separated-tokens@npm:2.0.2" @@ -9045,19 +9145,20 @@ __metadata: languageName: node linkType: hard -"vite@npm:^5.1.4": - version: 5.1.4 - resolution: "vite@npm:5.1.4" +"vite@npm:^5.4.19": + version: 5.4.19 + resolution: "vite@npm:5.4.19" dependencies: - esbuild: ^0.19.3 + esbuild: ^0.21.3 fsevents: ~2.3.3 - postcss: ^8.4.35 - rollup: ^4.2.0 + postcss: ^8.4.43 + rollup: ^4.20.0 peerDependencies: "@types/node": ^18.0.0 || >=20.0.0 less: "*" lightningcss: ^1.21.0 sass: "*" + sass-embedded: "*" stylus: "*" sugarss: "*" terser: ^5.4.0 @@ -9073,6 +9174,8 @@ __metadata: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: @@ -9081,7 +9184,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: fb8b944c69fd738b412ad10471f01db01ed59b5d7fdf182b836b420b221a8bd5ada74d225a87aaa80cf8d2b693cc4a89ab7c291254a8b4e6faefd93843ebb9d3 + checksum: c15af65f2370b59e674c5fab22d8e05ec5c7f8f0345ed99ffec155c77feb5636b4e0680dbd096a6f06d7c386b259dc0b9c67c4f1ec08486a2f2a677c9ea6971b languageName: node linkType: hard From 2183f3ff09f0eff39d519fe22181b34084422ac3 Mon Sep 17 00:00:00 2001 From: Andy Li Date: Mon, 26 May 2025 14:32:39 -0400 Subject: [PATCH 2/2] feat(dora): add issue lead time metrics calculation [DX-85] --- .github/workflows/build-push-ecr.yml | 118 +++++++++++++ backend/plugins/dora/impl/impl.go | 2 + .../dora/models/issue_lead_time_metric.go | 38 ++++ ...50424_add_issue_lead_time_metrics_table.go | 55 ++++++ .../dora/models/migrationscripts/register.go | 1 + .../tasks/deployment_commits_generator.go | 6 +- .../dora/tasks/deployment_generator.go | 6 +- .../dora/tasks/issue_lead_time_calculator.go | 163 ++++++++++++++++++ .../tasks/prev_deployment_commit_enricher.go | 4 +- backend/plugins/dora/tasks/task_data.go | 61 +++++-- 10 files changed, 436 insertions(+), 18 deletions(-) create mode 100644 .github/workflows/build-push-ecr.yml create mode 100644 backend/plugins/dora/models/issue_lead_time_metric.go create mode 100644 backend/plugins/dora/models/migrationscripts/20250424_add_issue_lead_time_metrics_table.go create mode 100644 backend/plugins/dora/tasks/issue_lead_time_calculator.go diff --git a/.github/workflows/build-push-ecr.yml b/.github/workflows/build-push-ecr.yml new file mode 100644 index 00000000000..becec6c7668 --- /dev/null +++ b/.github/workflows/build-push-ecr.yml @@ -0,0 +1,118 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +name: DevLake Build and Push to ECR +run-name: DevLake build and push to ECR by @${{ github.actor }} + +on: + workflow_dispatch: + push: + branches: + - master + - andy/dx-85 + +permissions: + id-token: write # Required for JWT + contents: read # Required for checkout + +env: + LATEST_TAG: v1.0.2-beta4 + COMMIT_TAG: ${{ github.sha }} + AWS_REGION: us-east-1 + IAM_ROLE_ARN: arn:aws:iam::130726505375:role/github-actions-ecr + ECR: 130726505375.dkr.ecr.us-east-1.amazonaws.com + IMAGE_NAME_SERVER: devlake-server + IMAGE_NAME_CONFIG_UI: devlake-config-ui + +jobs: + build-and-push-server: + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@83b7061638ee4956cf7545a6f7efe594e5ad0247 #v3.5.1 + + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@e1e17a757e536f70e52b5a12b2e8d1d1c60e04ef # v2.0.0 + with: + role-to-assume: ${{ env.IAM_ROLE_ARN }} + role-session-name: github-action-devlake-server-build + aws-region: ${{ env.AWS_REGION }} + + - name: Login to Amazon ECR + id: login-ecr + uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a + with: + registry: ${{ env.ECR }} + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@4b4e9c3e2d4531116a6f8ba8e71fc6e2cb6e6c8c + + - name: Build and push container image + uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 + with: + context: ./backend + push: true + file: ./backend/Dockerfile + tags: | + ${{ env.ECR }}/${{ env.IMAGE_NAME_SERVER }}:${{ env.LATEST_TAG }} + ${{ env.ECR }}/${{ env.IMAGE_NAME_SERVER }}:${{ env.COMMIT_TAG }} + platforms: linux/amd64,linux/arm64 + build-args: | + TAG=${{ github.ref_name }} + SHA=${{ github.sha }} + + build-and-push-config-ui: + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@83b7061638ee4956cf7545a6f7efe594e5ad0247 #v3.5.1 + + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@e1e17a757e536f70e52b5a12b2e8d1d1c60e04ef # v2.0.0 + with: + role-to-assume: ${{ env.IAM_ROLE_ARN }} + role-session-name: github-action-devlake-config-ui-build + aws-region: ${{ env.AWS_REGION }} + + - name: Login to Amazon ECR + id: login-ecr + uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a + with: + registry: ${{ env.ECR }} + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@4b4e9c3e2d4531116a6f8ba8e71fc6e2cb6e6c8c + + - name: Build and push container image + uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 + with: + context: ./config-ui + push: true + file: ./config-ui/Dockerfile + tags: | + ${{ env.ECR }}/${{ env.IMAGE_NAME_CONFIG_UI }}:${{ env.LATEST_TAG }} + ${{ env.ECR }}/${{ env.IMAGE_NAME_CONFIG_UI }}:${{ env.COMMIT_TAG }} + platforms: linux/amd64,linux/arm64 + build-args: | + TAG=${{ github.ref_name }} + SHA=${{ github.sha }} diff --git a/backend/plugins/dora/impl/impl.go b/backend/plugins/dora/impl/impl.go index 24609739811..b584763ce97 100644 --- a/backend/plugins/dora/impl/impl.go +++ b/backend/plugins/dora/impl/impl.go @@ -94,6 +94,7 @@ func (p Dora) SubTaskMetas() []plugin.SubTaskMeta { tasks.EnrichPrevSuccessDeploymentCommitMeta, tasks.EnrichTaskEnvMeta, tasks.CalculateChangeLeadTimeMeta, + tasks.CalculateIssueLeadTimeMeta, tasks.IssuesToIncidentsMeta, tasks.ConnectIncidentToDeploymentMeta, } @@ -160,6 +161,7 @@ func (p Dora) MakeMetricPluginPipelinePlanV200(projectName string, options json. }, Subtasks: []string{ "calculateChangeLeadTime", + "calculateIssueLeadTime", tasks.IssuesToIncidentsMeta.Name, "ConnectIncidentToDeployment", }, diff --git a/backend/plugins/dora/models/issue_lead_time_metric.go b/backend/plugins/dora/models/issue_lead_time_metric.go new file mode 100644 index 00000000000..3d55f8fd67b --- /dev/null +++ b/backend/plugins/dora/models/issue_lead_time_metric.go @@ -0,0 +1,38 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package models + +import ( + "time" +) + +// IssueLeadTimeMetric tracks lead time for issues from in-progress to done +type IssueLeadTimeMetric struct { + ProjectName string `json:"projectName" gorm:"primaryKey;type:varchar(255)"` + IssueId string `json:"issueId" gorm:"primaryKey;type:varchar(255)"` + InProgressDate *time.Time `json:"InProgressDate"` + DoneDate *time.Time `json:"DoneDate"` + + // Lead time in minutes from first 'In Progress' to first 'Done' + InProgressToDoneMinutes *int64 `json:"inProgressToDoneMinutes"` +} + +// TableName specifies the database table name +func (IssueLeadTimeMetric) TableName() string { + return "_tool_dora_issue_lead_time_metrics" +} diff --git a/backend/plugins/dora/models/migrationscripts/20250424_add_issue_lead_time_metrics_table.go b/backend/plugins/dora/models/migrationscripts/20250424_add_issue_lead_time_metrics_table.go new file mode 100644 index 00000000000..67891c58bdd --- /dev/null +++ b/backend/plugins/dora/models/migrationscripts/20250424_add_issue_lead_time_metrics_table.go @@ -0,0 +1,55 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package migrationscripts + +import ( + "time" + + "github.com/apache/incubator-devlake/core/context" + "github.com/apache/incubator-devlake/core/errors" +) + +// Define the actual table structure directly in the migration script +type issueLeadTimeMetric struct { + ProjectName string `gorm:"primaryKey;type:varchar(255)"` + IssueId string `gorm:"primaryKey;type:varchar(255)"` + InProgressDate *time.Time + DoneDate *time.Time + InProgressToDoneMinutes *int64 +} + +// TableName specifies the table name +func (issueLeadTimeMetric) TableName() string { + return "_tool_dora_issue_lead_time_metrics" +} + +type addIssueLeadTimeMetricsTable struct{} + +func (script *addIssueLeadTimeMetricsTable) Up(baseRes context.BasicRes) errors.Error { + db := baseRes.GetDal() + // Use our directly defined model instead of importing from models + return db.AutoMigrate(&issueLeadTimeMetric{}) +} + +func (*addIssueLeadTimeMetricsTable) Version() uint64 { + return 2025042401 +} + +func (*addIssueLeadTimeMetricsTable) Name() string { + return "dora add _tool_dora_issue_lead_time_metrics table" +} diff --git a/backend/plugins/dora/models/migrationscripts/register.go b/backend/plugins/dora/models/migrationscripts/register.go index 6a12d071963..a6ba46b06b4 100644 --- a/backend/plugins/dora/models/migrationscripts/register.go +++ b/backend/plugins/dora/models/migrationscripts/register.go @@ -27,5 +27,6 @@ func All() []plugin.MigrationScript { new(addDoraBenchmark), new(fixDoraBenchmarkMetric), new(adddoraBenchmark2023), + new(addIssueLeadTimeMetricsTable), } } diff --git a/backend/plugins/dora/tasks/deployment_commits_generator.go b/backend/plugins/dora/tasks/deployment_commits_generator.go index 826e177288f..388e4fa784d 100644 --- a/backend/plugins/dora/tasks/deployment_commits_generator.go +++ b/backend/plugins/dora/tasks/deployment_commits_generator.go @@ -103,11 +103,11 @@ func GenerateDeploymentCommits(taskCtx plugin.SubTaskContext) errors.Error { noneSkippedResult, ), } - if data.Options.ScopeId != nil { - clauses = append(clauses, dal.Where(`p.cicd_scope_id = ?`, data.Options.ScopeId)) + if data.ScopeId != "" { + clauses = append(clauses, dal.Where(`p.cicd_scope_id = ?`, data.ScopeId)) // Clear previous results from the project deleteSql := `DELETE FROM cicd_deployment_commits WHERE cicd_scope_id = ? and subtask_name = ?;` - err := db.Exec(deleteSql, data.Options.ScopeId, DORAGenerateDeploymentCommits) + err := db.Exec(deleteSql, data.ScopeId, DORAGenerateDeploymentCommits) if err != nil { return errors.Default.Wrap(err, "error deleting previous cicd_deployment_commits") } diff --git a/backend/plugins/dora/tasks/deployment_generator.go b/backend/plugins/dora/tasks/deployment_generator.go index 0defd4205fe..9a183db80a9 100644 --- a/backend/plugins/dora/tasks/deployment_generator.go +++ b/backend/plugins/dora/tasks/deployment_generator.go @@ -76,13 +76,13 @@ func GenerateDeployment(taskCtx plugin.SubTaskContext) errors.Error { noneSkippedResult, ), } - if data.Options.ScopeId != nil { + if data.ScopeId != "" { clauses = append(clauses, - dal.Where("p.cicd_scope_id = ?", data.Options.ScopeId), + dal.Where("p.cicd_scope_id = ?", data.ScopeId), ) // Clear previous results from the cicd_scope_id deleteSql := `DELETE FROM cicd_deployments WHERE cicd_scope_id = ? and subtask_name = ?;` - err := db.Exec(deleteSql, data.Options.ScopeId, DORAGenerateDeployment) + err := db.Exec(deleteSql, data.ScopeId, DORAGenerateDeployment) if err != nil { return errors.Default.Wrap(err, "error deleting previous deployments") } diff --git a/backend/plugins/dora/tasks/issue_lead_time_calculator.go b/backend/plugins/dora/tasks/issue_lead_time_calculator.go new file mode 100644 index 00000000000..494f47c8e6a --- /dev/null +++ b/backend/plugins/dora/tasks/issue_lead_time_calculator.go @@ -0,0 +1,163 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package tasks + +import ( + "database/sql" + "fmt" + "strconv" + + "github.com/apache/incubator-devlake/core/dal" + "github.com/apache/incubator-devlake/core/errors" + "github.com/apache/incubator-devlake/core/plugin" + "github.com/apache/incubator-devlake/plugins/dora/models" + jiraModels "github.com/apache/incubator-devlake/plugins/jira/models" +) + +// CalculateIssueLeadTimeMeta contains metadata for the CalculateIssueLeadTime subtask. +var CalculateIssueLeadTimeMeta = plugin.SubTaskMeta{ + Name: "calculateIssueLeadTime", + EntryPoint: CalculateIssueLeadTime, + EnabledByDefault: true, + Description: "Calculate issue lead time from first 'In Progress' to first 'Done'", + DomainTypes: []string{plugin.DOMAIN_TYPE_TICKET}, +} + +// CalculateIssueLeadTime calculates the lead time for issues from first 'In Progress' status to 'Done' status. +func CalculateIssueLeadTime(taskCtx plugin.SubTaskContext) errors.Error { + db := taskCtx.GetDal() + logger := taskCtx.GetLogger() + data := taskCtx.GetData().(*DoraTaskData) + + logger.Info("Starting calculateIssueLeadTime task for project %s", data.Options.ProjectName) + + // Delete any old metrics for this project + err := db.Delete( + &models.IssueLeadTimeMetric{}, + dal.Where("project_name = ?", data.Options.ProjectName), + ) + if err != nil { + return errors.Default.Wrap(err, "failed to delete old issue lead time metrics") + } + logger.Info("Deleted old issue lead time metrics for project %s", data.Options.ProjectName) + + // Get the actual _tool_jira_* table names + rawItems := jiraModels.JiraIssueChangelogItems{}.TableName() + rawChgs := jiraModels.JiraIssueChangelogs{}.TableName() + rawIss := jiraModels.JiraIssue{}.TableName() + + // Build the SQL query, filter out null timestamps and use only latest resolution per issue + query := fmt.Sprintf(` + SELECT + c.issue_id AS issue_id, + MIN(CASE WHEN UPPER(TRIM(i.to_string)) IN ('IN PROGRESS', 'INPROGRESS') THEN c.created END) AS in_progress_timestamp, + u.resolution_date AS done_timestamp + FROM %s i + JOIN %s c + ON i.connection_id = c.connection_id + AND i.changelog_id = c.changelog_id + JOIN %s u + ON c.connection_id = u.connection_id + AND c.issue_id = u.issue_id + JOIN _tool_jira_board_issues bi + ON u.connection_id = bi.connection_id + AND u.issue_id = bi.issue_id + JOIN project_mapping pm + ON pm.row_id = CONCAT('jira:JiraBoard:', bi.connection_id, ':', bi.board_id) + AND pm.table = 'boards' + WHERE i.field = 'status' + AND pm.project_name = ? + AND u.resolution_date IS NOT NULL + AND u.resolution_date = ( + SELECT MAX(u2.resolution_date) + FROM %s u2 + WHERE u2.connection_id = u.connection_id + AND u2.issue_id = u.issue_id + ) + GROUP BY c.issue_id, u.resolution_date + HAVING in_progress_timestamp IS NOT NULL + `, rawItems, rawChgs, rawIss, rawIss) + + logger.Info("Executing SQL query for DevLake project: %s", data.Options.ProjectName) + + // Execute query and stream results + rows, err := db.RawCursor(query, data.Options.ProjectName) + if err != nil { + return errors.Default.Wrap(err, "failed to run lead time aggregation query") + } + defer rows.Close() + + rowCount := 0 + logger.Info("Starting to process SQL query results...") + + for rows.Next() { + var ( + rawIssueID uint64 + rawInProgress sql.NullTime + rawDone sql.NullTime + ) + + if scanErr := rows.Scan(&rawIssueID, &rawInProgress, &rawDone); scanErr != nil { + return errors.Default.Wrap(scanErr, "failed to scan lead time row") + } + + logger.Debug("Scanned row: issueID=%d, inProgress=%v, done=%v", rawIssueID, rawInProgress, rawDone) + + // Skip if null timestamps + if !rawInProgress.Valid || !rawDone.Valid { + logger.Debug("Skipping row with null timestamp: issueID=%d", rawIssueID) + continue + } + + start := rawInProgress.Time + end := rawDone.Time + mins := int64(end.Sub(start).Minutes()) + + // Skip negative lead times + if mins < 0 { + logger.Debug("Skipping row with negative lead time: issueID=%d", rawIssueID) + continue + } + + // Create and save the metric + metric := &models.IssueLeadTimeMetric{ + ProjectName: data.Options.ProjectName, + IssueId: strconv.FormatUint(rawIssueID, 10), + InProgressDate: &start, + DoneDate: &end, + InProgressToDoneMinutes: &mins, + } + + logger.Debug("Upserting metric: projectName=%s, issueId=%s, minutes=%d", + metric.ProjectName, metric.IssueId, *metric.InProgressToDoneMinutes) + + if upsertErr := db.CreateOrUpdate(metric); upsertErr != nil { + return errors.Default.Wrap(upsertErr, "failed to upsert issue lead time metric") + } + + rowCount++ + } + + logger.Info("Completed calculateIssueLeadTime task: processed %d records", rowCount) + + if err := rows.Err(); err != nil && err != sql.ErrNoRows { + return errors.Default.Wrap(err, "error iterating lead time rows") + } + + return nil +} diff --git a/backend/plugins/dora/tasks/prev_deployment_commit_enricher.go b/backend/plugins/dora/tasks/prev_deployment_commit_enricher.go index 69c68a9f68a..ef7c507c47a 100644 --- a/backend/plugins/dora/tasks/prev_deployment_commit_enricher.go +++ b/backend/plugins/dora/tasks/prev_deployment_commit_enricher.go @@ -61,9 +61,9 @@ func EnrichPrevSuccessDeploymentCommit(taskCtx plugin.SubTaskContext) errors.Err devops.RESULT_SUCCESS, ), } - if data.Options.ScopeId != nil { + if data.ScopeId != "" { clauses = append(clauses, - dal.Where("dc.cicd_scope_id = ?", data.Options.ScopeId), + dal.Where("dc.cicd_scope_id = ?", data.ScopeId), dal.Orderby("dc.repo_url, dc.environment, dc.finished_date"), ) } else { diff --git a/backend/plugins/dora/tasks/task_data.go b/backend/plugins/dora/tasks/task_data.go index 3beaf339f6b..b49e03a4644 100644 --- a/backend/plugins/dora/tasks/task_data.go +++ b/backend/plugins/dora/tasks/task_data.go @@ -18,8 +18,11 @@ limitations under the License. package tasks import ( + "strings" + "time" + "github.com/apache/incubator-devlake/core/errors" - helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api" + "github.com/apache/incubator-devlake/helpers/pluginhelper/api" ) type DoraApiParams struct { @@ -27,23 +30,61 @@ type DoraApiParams struct { } type DoraOptions struct { - Tasks []string `json:"tasks,omitempty"` - Since string - ProjectName string `json:"projectName"` - ScopeId *string `json:"scopeId,omitempty"` + // options for dora plugin, required when activate dora + ProjectName string `json:"projectName"` + RepoUrl string `json:"repoUrl"` // optional, for locating repo + // Time after which the data represents the real history, like github cloud is 2015-01-01, or the project start date + TimeAfter *time.Time `json:"timeAfter"` + + // Specify the issue statuses that indicate 'In Progress'. Can be multiple comma-separated values. + // e.g., "In Progress,In Development,In Review" + InProgressStatus string `json:"inProgressStatus"` + + // Specify the issue statuses that indicate 'Done'. Can be multiple comma-separated values. + // e.g., "Done,Closed,Resolved" + DoneStatus string `json:"doneStatus"` + + // --- Keep original fields needed by other DORA tasks --- + ScopeConfigId uint64 `json:"scopeConfigId"` + ScopeConfigName string `json:"scopeConfigName"` +} + +func (o *DoraOptions) GetInProgressStatuses() []string { + if o.InProgressStatus == "" { + return []string{} + } + return strings.Split(o.InProgressStatus, ",") +} + +func (o *DoraOptions) GetDoneStatuses() []string { + if o.DoneStatus == "" { + return []string{} + } + return strings.Split(o.DoneStatus, ",") } type DoraTaskData struct { - Options *DoraOptions - DisableIssueToIncidentGenerator bool + Options *DoraOptions + TimeAfter *time.Time + RepoUrl string `json:"repoUrl"` // optional, for locating repo + + // --- Keep fields needed by other DORA tasks --- + ScopeId string `json:"scopeId"` + ScopeName string `json:"scopeName"` + DisableIssueToIncidentGenerator bool `json:"disableIssueToIncidentGenerator"` + + RemoteArgs interface{} // Temporary workaround to let it compile } func DecodeAndValidateTaskOptions(options map[string]interface{}) (*DoraOptions, errors.Error) { var op DoraOptions - err := helper.Decode(options, &op, nil) + err := api.Decode(options, &op, nil) if err != nil { - return nil, errors.Default.Wrap(err, "error decoding DORA task options") + return nil, err + } + // find the scope config if owner/repo is not specified + if op.ProjectName == "" { + return nil, errors.BadInput.New("projectName is required for dora plugin") } - return &op, nil }