[Bug][CircleCI] collectJobs and collectWorkflows collect on_hold workflows again on every run, so the raw tables grow without a limit
メンテナーはふだん 2 日以内に返信
評価
この issue はまだ評価されていません。
説明
Search before asking
- I had searched in the issues and found no similar issues.
What happened
The CircleCI plugin collects the same jobs and workflows again on every incremental run, without a limit. The raw tables _raw_circleci_api_jobs and _raw_circleci_api_workflows grow every day, and the circleci task gets slower every day.
Both collectors have a "collect unfinished details" step:
| Subtask | Input query | Statuses |
|---|---|---|
collectJobs |
UnfinishedJobsInputClauses (backend/plugins/circleci/tasks/job_collector.go) |
running, not_running, queued, on_hold |
collectWorkflows |
CollectUnfinishedDetails.BuildInputIterator (backend/plugins/circleci/tasks/workflow_collector.go) |
running, on_hold, failing |
These queries have no age limit. A CircleCI approval job (type: approval) that nobody approves stays on_hold for ever, and its workflow stays on_hold too. So DevLake collects all jobs of such a workflow again on every run, for ever. The set of these workflows only grows.
The step runs with Incremental: true (helpers/pluginhelper/api/api_collector_stateful.go), so the collector only adds rows to the raw table. The old rows for the same jobs stay.
Environment
| DevLake version | v1.0.3-beta14 (the code is the same on main at 351d86738) |
| Plugin | circleci |
| Database | MySQL 8.4 |
| CircleCI | CircleCI Cloud (circleci.com API v2) |
| Trigger | Nightly blueprint (incremental, skipCollectors=false), 2 CircleCI projects |
Data from our instance
- 14,356 workflows are
on_holdand 810 arefailing. They were created from February to November 2026. The jobs that stayon_holdare approval jobs that nobody approved (for examplehold-deploy,hold-tests,start-development). - One nightly run added 166,536 rows to
_raw_circleci_api_jobs:
| Source of the raw rows | Rows | Workflows |
|---|---|---|
| "unfinished details" step | 166,508 | 14,866 |
| new workflows | 28 | 4 |
_raw_circleci_api_jobshas about 9.3M rows (10.3 GB) for about 248k jobs. It grows by about 160k rows per day, also on weekends.extractJobsreads the full raw table on every run (see #9305), so thecirclecitask takes 3–8 hours per run.
What do you expect to happen
DevLake should collect an unfinished workflow again only for a limited time after it was created. The raw tables should grow only with new CI activity.
How to reproduce
- Use a CircleCI project with a workflow that has an approval job (
type: approval). - Trigger the workflow and do not approve the job.
- Add the project to a blueprint and run the blueprint (incremental) several times.
- Each run adds all jobs of that workflow to the raw table again:
SELECT url, COUNT(*) FROM _raw_circleci_api_jobs GROUP BY url ORDER BY 2 DESC LIMIT 10;
-- the same /v2/workflow/<id>/job URL appears once per run
Anything else
Proposed fix (plan of attack)
In UnfinishedJobsInputClauses and in the workflow collector's unfinished-details iterator, select only workflows created in a lookback window:
dal.Where("... AND created_date >= ?", time.Now().AddDate(0, 0, -lookbackDays))
- Compute the date in Go, so the query works on MySQL and PostgreSQL.
- Use a default of 30 days. It can be an option if maintainers prefer.
- For the job query, join the workflow table (or use the job's workflow
created_date) to apply the window.
Data that supports a 30-day window: in our instance, 99.6% of approved workflows got their approval within 14 days. All approvals except 1 of about 1,860 came within 30 days.
Rejected alternatives
- Do not treat
on_holdas a final status. A workflow that gets its approval later would then never be collected again, so its deploy jobs after the approval would be missing from DORA deployments. - Delete the previous raw rows of the same input before collecting it again. This needs a change in the framework collector and is more complex.
I can start work on a PR for this if the DevLake maintainers approve this approach.
Version
v1.0.3-beta14
Are you willing to submit PR?
- Yes I am willing to submit a PR!
Code of Conduct
- I agree to follow this project's Code of Conduct
- 主要言語
- Go
- スター
- 3.2k
- フォーク
- 832
- 平均マージ
- 1日 21時間
- マージ済み PR(30日)
- 77
環境構築
このプロジェクトの開発コンテナを、あなたの GitHub アカウントでブラウザ上に起動します。
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドなし
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
apache/devlake のほかの issue
-
[Bug][Jira] collectWorklogs requests every page without startAt, so each page returns the same worklogs (raw table grows quadratically)対応中かも @RyoKusnadi が 1 日前に担当しました。 オープンtype/bug
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
apache/devlake#9323 · コメント 1 件 ·
メンテナーはふだん 2 日以内に返信
-
[Bug][linker] LinkPrToIssue never matches lowercase issue keys (e.g. in branch names)対応中かも @VictorColomb が 3 日前に担当しました。 オープンtype/bug
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
apache/devlake#9283 · コメント 1 件 · リアクション 1 件 · 担当者 1 名 ·
メンテナーはふだん 2 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 60/100
メンテナーはふだん 2 日以内に返信
-
[Bug][Tempo] GET /connections/{id}/teams always fails to decode the teams page, and remote scope search only sees the first 50 teams対応中かも @ShivamSharma43 が 1 日前に担当しました。 オープン
難易度 3/5 1〜2日 初心者へのやさしさ 25/100
メンテナーはふだん 2 日以内に返信
-
[Bug][Tempo] A team scope's pipeline adds every Tempo team as a scope and resets their scope config対応中かも @ShivamSharma43 が 1 日前に担当しました。 オープン
難易度 4/5 3〜5日 初心者へのやさしさ 25/100
メンテナーはふだん 2 日以内に返信
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
masahitojp/mariamem#108 ·
メンテナーはふだん 1 日以内に返信
-
[Bug] Pod detail shows CPU usage ten times too high, and throws on decimal memory suffixes対応中かも @RaphaelFakhri が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
メンテナーはふだん 11 日以内に返信
-
tsuru_app_cname and tsuru_app_router don't handle removal outside terraform対応中かも @lbarrosby が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
-
contributor-friendly good-first-issue lang:go
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
irbis-sh/zen-desktop#870 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
メンテナーはふだん 1 日以内に返信