안녕하세요!
다시 한 번 이 달의 PR(PR of the Month) 을 투표할 시간이 돌아왔습니다
요즘 저는 e2e 테스트 리뷰할 것이 많이 쌓이고 있어서..(혹시 관심있으신 분이 계시다면 많관부… 아직 개선이나 추가할 부분이 많습니다!!)
다른 곳은 못보고 있었는데 이번 달에도 정말 대단한 PR들이 많이 올라왔네요!!!
이번 달 이달의 PR 후보 는 다음과 같습니다:
PR#59430: Add static checker for preventing to increase DAG version
main ← wjddn279:add-static-checker-for-dag-parsing
열림 06:45AM - 15 Dec 25 UTC
## Motivation
We observed that when runtime-varying values are used as argume… nts in DAG or Task constructors in Airflow, the DAG version increases infinitely. [slack](https://apache-airflow.slack.com/archives/CCQ7EGB1P/p1763408409990439?thread_ts=1763078254.725439&cid=CCQ7EGB1P) https://github.com/apache/airflow/issues/55768#issuecomment-3360876034
Checking for DAG version increments at runtime is difficult. The most accurate detection method would be to parse the DAG object twice and compare if values differ. However, this would nearly double the DAG parsing execution time.
Therefore, I add a feature that exposes DAG warnings for these cases through AST-based static analysis before parsing in the dag-processor. While it cannot cover 100% of DAG usage patterns, it can cover most cases and has minimal performance impact (since `ast.parse` [already runs](https://github.com/apache/airflow/blob/main/airflow-core/src/airflow/dag_processing/processor.py#L514) on every DAG parse).
## Logic of static check
The logic for detecting problematic situations through static check is as follows (I named this issue "runtime-varying"):
1. Statically analyze a single DAG file through `ast.parse`.
2. Traverse each node and check the following:
- Has a variable been assigned a runtime-varying value? → This is to check if that variable is passed as an argument to a DAG or Task instance.
```python
from datetime import datetime
import random as rd
start_date = datetime.now() # checked as tainted value
random_value = f"random_{rd.randint(1,1000)" # checked as tainted value
default_args = {'start_date': start_date} # checked as tainted value
```
3. Check if the object is a DAG or Task declaration statement, and verify if runtime-varying variables or function calls are passed as arguments.
- Check if it's a DAG declaration statement → We categorized DAG object definitions into 3 cases:
```python
from airflow import DAG
from airflow.decorators import dag
dag = DAG(dag_id='dag_id, default_args=default_args) # DAG object definition imported from airflow module
with DAG(dag_id='dag_id, default_args=default_args) as dag: # Defined as context manager in with statement
@dag(dag_id='dag_id, default_args=default_args) # Defined via dag decorator
```
- Check if it's a Task declaration statement → This case can be categorized into 2 types:
```python
task1 = PythonOperator(task_id='task_id', dag=dag) # When the DAG object checked above is passed as an argument
with DAG(dag_id='dag_id, default_args=default_args) as dag:
task2 = PythonOperator(task_id='task_id') # Function calls inside the with block where DAG context manager is declared
```
The cases covered by static checks are described in detail in the unit test code.
## User Notification for Static Check Errors
I considered that static check failures are not severe enough to cause DAG parsing to fail, so I added them to DAG warnings. Warnings are added to DAGs generated from the DAG file and displayed in the UI as shown below. There seems to be an issue where `\n` characters in messages are ignored when displayed in the UI, which we plan to fix in a future PR.
<img width="1700" height="750" alt="image" src="https://github.com/user-attachments/assets/f151199a-fbd2-4f2e-b407-f7f03214724f" />
## future work
If this PR is merged, the following items are planned for future work:
- Merge the existing `ast.parse` with the `ast.parse` executed in this subprocess.
- Fix the UI that displays DAG warnings.
- Make DAG warnings more visible by displaying them in the DAG list as well.
- Document the cases where DAG version increases infinitely and the coverage scope of this static check.
---
**^ Add meaningful description above**
Read the **[Pull Request Guidelines](https://github.com/apache/airflow/blob/main/contributing-docs/05_pull_requests.rst#pull-request-guidelines)** for more information.
In case of fundamental code changes, an Airflow Improvement Proposal ([AIP](https://cwiki.apache.org/confluence/display/AIRFLOW/Airflow+Improvement+Proposals)) is needed.
In case of a new dependency, check compliance with the [ASF 3rd Party License Policy](https://www.apache.org/legal/resolved.html#category-x).
In case of backwards incompatible changes please leave a note in a newsfragment file, named `{pr_number}.significant.rst` or `{issue_number}.significant.rst`, in [airflow-core/newsfragments](https://github.com/apache/airflow/tree/main/airflow-core/newsfragments).
Dag 버전이 의도치 않게 증가하는 것을 방지하기 위한 static checker를 추가한 PR입니다.
PR#59239: Enable triggerer queues
main ← DataDog:zg/support-triggerer-queues
열림 02:24PM - 09 Dec 25 UTC
---
Closes: https://github.com/apache/airflow/issues/33818
Partially address… es / related: https://github.com/apache/airflow/issues/59871
## What?
* Adds optional support for task-based trigger queue assignment, which allows a given triggerer to consume from a user-configured subset of triggers, based on their origin tasks' `queue` value.
* Adds an optional `--queues` CLI option to the triggerer, to constrain a triggerer to only consume Triggers from a given list of task queues.
* Adds a new `triggerer.queues_enabled` config entry, which when set to `True` enables the trigger queue feature (`False` by default).
* Adds a `queue` column to the `trigger` table, which is set automatically by the task runner when `triggerer.queues_enabled` is set to True.
* Adds relevant documentation updates for this new feature.
## Why?
* AIP-67 (multi-tenancy support), to enable team-specific triggerer assignment.
* More generally, and not necessarily specific to multi-tenancy use-cases, to allow for other triggerer assignment strategies in an HA setup.
## Testing
* Tested the example HITL dag in docker-compose; once with `triggerer.queues_enabled=False` and once with `triggerer.queues_enabled=True` to ensure deferrable tasks worked in either setup.
* standard collection of `breeze` and `prek` testing commands
* Ran `uv run --group docs build-docs --autobuild` to check the new doc section rendering.
## Note on event-based triggers and async Callbacks
Following from the helpful discussion [here](https://github.com/apache/airflow/pull/59239#discussion_r2645289748), this PR aims to assign a trigger's `queue` from its deferring task's `queue`. As such, this PR does not add any triggerer assignment controls for event-based triggers or `TriggererCallback`-based triggers. This was done intentionally both to keep this PR's scope reasonable, and because the latter 2 types of triggers do not necessarily have a relation to a singular task / task queue. If it is preferred, I'm happy to create a followup issue for adding queue support in these types of triggers. I've also made sure to make this explicit in the user documentation, and added details in the docs on how to use this feature without disrupting any potential usage of event-based or callback-based triggers.
Triggerer에 큐(queue) 기능을 활성화하여 실행 유연성을 높인 PR입니다.
PR#60241: Add virtualization to grid view
main ← astronomer:virtualize-grid
열림 09:33PM - 07 Jan 26 UTC
Virtualize the grid view to improve rendering performance on very large dags.
…
Before (10 dag runs with 1000 tasks):
<img width="321" height="251" alt="Screenshot 2026-01-07 at 4 32 40 PM" src="https://github.com/user-attachments/assets/14ca8afb-52c8-4f7a-956f-3f5e3a99a1d4" />
After (10 dag runs with 1000 tasks):
<img width="317" height="248" alt="Screenshot 2026-01-07 at 4 55 05 PM" src="https://github.com/user-attachments/assets/1cba04e2-a7c9-48e8-8a3f-3b0d658980bb" />
Results go from unusable to slow. I'll look for other improvements in follow up PRs. Notably some of the API calls still take 1-3 seconds.
---
**^ Add meaningful description above**
Read the **[Pull Request Guidelines](https://github.com/apache/airflow/blob/main/contributing-docs/05_pull_requests.rst#pull-request-guidelines)** for more information.
In case of fundamental code changes, an Airflow Improvement Proposal ([AIP](https://cwiki.apache.org/confluence/display/AIRFLOW/Airflow+Improvement+Proposals)) is needed.
In case of a new dependency, check compliance with the [ASF 3rd Party License Policy](https://www.apache.org/legal/resolved.html#category-x).
In case of backwards incompatible changes please leave a note in a newsfragment file, named `{pr_number}.significant.rst` or `{issue_number}.significant.rst`, in [airflow-core/newsfragments](https://github.com/apache/airflow/tree/main/airflow-core/newsfragments).
Grid View에 virtualization을 적용해 대규모 Dag에서도 UI 성능을 개선한 PR입니다.
PR#59747: Add breeze k8s dev command for hot-reloading DAGs and core sources
main ← nailo2c:feat-40005-add_breeze_k8s_dev_command
열림 09:47AM - 23 Dec 25 UTC
Closes: #40005
# Why
Based on my experience resolving k8s-related bugs, it… 's quite inconvenience to build and upload a k8s image when I only make a small change.
# How
After some research, I decided integrate [Skaffold](https://github.com/GoogleContainerTools/skaffold) into `breeze k8s` to improve the development experience.
I added a new command, `breeze k8s dev`, to sync Airflow source code to K8s pods in seconds.
# What
### 1. `/dags` folder synchronization
https://github.com/user-attachments/assets/81d9b20f-821b-48ec-a2be-f5a018670699
### 2. Airflow Core synchronization
#### 2.1. Scheduler
Exec into the pod with `kubectl exec -n airflow -c scheduler -it airflow-scheduler-0 -- /bin/bash`, and modify the log message to "Starting the scheduler [hot-reload]":
https://github.com/apache/airflow/blob/ee5e21bb8a286addf4571b45e19d8d30cb24f8dc/airflow-core/src/airflow/jobs/scheduler_job_runner.py#L1184
Use the following command to verify the synchronization: `grep -n "Starting the scheduler" airflow-core/src/airflow/jobs/scheduler_job_runner.py`
<img width="1068" height="145" alt="截圖 2025-12-24 下午11 30 58" src="https://github.com/user-attachments/assets/32a37ce2-4977-4d63-8d8b-2d28cd244255" />
#### 2.2. Triggerer
I used `kubectl logs -n airflow -l component=triggerer -c triggerer -f` to observe the logs. After I modified the file at `airflow-core/src/airflow/jobs/triggerer_job_runner.py`, the logs showed:
```console
2025-12-23T02:04:41.298585Z [info ] Detected changes: {(<Change.deleted: 3>, '/opt/airflow/airflow-core/src/airflow/cli/commands/dag_processor_command.py'), (<Change.added: 1>, '/opt/airflow/airflow-core/src/airflow/cli/commands/dag_processor_command.py')} [airflow.cli.hot_reload] loc=hot_reload.py:187
2025-12-23T02:04:41.304871Z [info ] Reloading... [airflow.cli.hot_reload] loc=hot_reload.py:188
```
<img width="1335" height="550" alt="triggerer" src="https://github.com/user-attachments/assets/5ed86dcf-358e-4a7b-9056-804abf7bb2e8" />
#### 2.3. Dag-Processor
I used `kubectl logs -n airflow -l component=dag-processor -c dag-processor -f` to observe the logs. After I modified the file at `airflow-core/src/airflow/cli/commands/dag_processor_command.py`, the logs showed:
```console
2025-12-23T02:04:40.964319Z [info ] Detected changes: {(<Change.deleted: 3>, '/opt/airflow/airflow-core/src/airflow/cli/commands/dag_processor_command.py'), (<Change.added: 1>, '/opt/airflow/airflow-core/src/airflow/cli/commands/dag_processor_command.py')} [airflow.cli.hot_reload] loc=hot_reload.py:187
2025-12-23T02:04:40.970835Z [info ] Reloading... [airflow.cli.hot_reload] loc=hot_reload.py:188
```
<img width="1319" height="572" alt="dag-processor" src="https://github.com/user-attachments/assets/e0dc1be9-1aa2-47b4-b731-b0a448cbcfe8" />
Breeze 환경에서 Kubernetes 기반 개발 시 DAG와 코어 소스를 핫 리로드할 수 있는 dev 커맨드를 추가한 PR입니다.
PR#55894: Add bundle_path temporarily to sys.path during DagBag parsing
main ← simi:dagbag-syspath
열림 03:47PM - 19 Sep 25 UTC
- removes ad-hoc bundle_path addition and moves it to one central place in DagBa… g parsing logic
- when DagBag is initialized with bundle_path, bundle_path is temporarily added into sys.path during parsing (and removed after)
- if already present, nothing happens
- fixes https://github.com/apache/airflow/issues/53617
- makes docs at https://airflow.apache.org/docs/apache-airflow/stable/administration-and-deployment/modules_management.html#built-in-pythonpath-entries-in-airflow up-to-date again (could be worth to update how this process works, since it is different, but result - our dag folder is in sys.path when needed - is the same)
This fixes various entrypoints to DAGs where path wasn't updated like various cli DAG commands like `airflow dags test`.
I have tested various entrypoints locally - using full Airflow deployment, using local standalone airflow, running DAGs thru UI, running DAGs thru CLI, serializing DAGs thru processor, serializing DAGs thru CLI.
/cc @potiuk
DagBag 파싱 과정에서 bundle_path를 일시적으로 sys.path에 추가해 문제를 해결한 PR입니다.
이 달의 PR은 PR 댓글에 #protm 이 있거나 추천을 통해서 선정됩니다.
만약 추천하고 싶은 PR이 있다면 메일링 리스트로 넣어주시면 됩니다!
투표는 1월 30일(금) 오전 10시 PST 에 마감되며,
우승 PR은 다음 Airflow 뉴스레터에 소개될 예정입니다.
투표에 참여하고 싶으신 분들은 아래 링크에서 댓글로 참여해보세요!
https://lists.apache.org/thread/j5hkg74rkrpr27d6v0c15nvssm7v93xr
2개의 좋아요
stats
1월 27, 2026, 6:20오전
2
e2e 리뷰가 어떤것인가요?
무튼 멋진 PR들이 많네요..! 저도 언젠가 apache/airflow 프로젝트에 기여해보고 싶습니다
다만 생각보다 이슈에 붙는 할당? 경쟁이 치열해서 고민이네요.
제가 링크를 첨부하질 않았었네요 ㅎㅎ
e2e 테스트는 Playwright를 사용해서,
실제 사용자 관점에서 웹 서버의 주요 흐름과 UI 동작이 기대한 대로 동작하는지를 보장하기 위한 테스트인데요.
단위 테스트나 통합 테스트로는 놓치기 쉬운 웹서버(프론트엔드 백엔드) 간 연동 이슈를 잡아내는 데 중요한 역할을 하는 작업이예요
열림 06:57AM - 04 Dec 25 UTC
kind:feature
kind:meta
area:UI
### Description
This issue tracks UI e2e test scenarios implementation, followi… ng the Playwright framework added in #[58548](https://github.com/apache/airflow/pull/58548) and CI workflow in [#58901.](https://github.com/apache/airflow/pull/58901)
### Use case/motivation
Currently, we have limited UI e2e test coverage. Adding comprehensive tests will help:
- Catch UI regressions before they reach users
- Ensure new UI changes don't break existing functionality
## Progress Summary
| Metric | Value |
|--------|-------|
| Test Cases | **40** |
| Spec Files | **7** |
| Page Objects | **8** |
| Browsers Tested | Chromium, Firefox, WebKit |
| Total Tests | **120** (40 × 3 browsers) |
---
## Test Count by Section
| Section | Spec File | Tests | Page Object |
|---------|-----------|:-----:|-------------|
| Home Dashboard | `home-dashboard.spec.ts` | 7 | `HomePage.ts` |
| DAGs List | `dags-list.spec.ts` | 3 | `DagsPage.ts` |
| DAG Runs | `dag-runs.spec.ts` | 6 | `DagRunsPage.ts` |
| DAG Tasks Tab | `dag-tasks.spec.ts` | 6 | `DagsPage.ts` |
| DAG Audit Log | `dag-audit-log.spec.ts` | 5 | `EventsPage.ts` |
| Assets | `asset.spec.ts` | 8 | `AssetListPage.ts` |
| Backfills | `backfill.spec.ts` | 5 | `BackfillPage.ts` |
| **Total** | **7 files** | **40** | **8 classes** |
---
### Scenarios as per Pages
**Authentication & Welcome**
- [x] AUTH-001: Login with valid credentials
- [ ] AUTH-002: Logout
- [x] HOME-001: [Verify dashboard metrics display](https://github.com/apache/airflow/issues/59306)
- [ ] HOME-002: Navigate between sections
**DAGs List /dags**
- [ ] DAGS-001: [Verify DAGs list displays](https://github.com/apache/airflow/issues/59307)
- [x] DAGS-002: Trigger DAG
- [ ] DAGS-003: Search DAGs
- [ ] DAGS-004: Add DAG to favorites
- [ ] DAGS-006: Remove DAG from favorites
- [x] DAGS-007: [Verify pagination works](https://github.com/apache/airflow/issues/59308)
**DAG Runs /dag_runs**
- [x] DAGRUNS-001: [Verify all DAG runs display](https://github.com/apache/airflow/issues/59309)
- [ ] DAGRUNS-002: Verify run details display
- [ ] DAGRUNS-003: Clear DAG run
- [ ] DAGRUNS-004: Verify run status changes
**Task Instances /task_instances**
- [ ] TASKS-001: [Verify all task instances display](https://github.com/apache/airflow/issues/59357)
- [ ] TASKS-002: Verify task details display
- [ ] TASKS-003: [Verify task logs display](https://github.com/apache/airflow/issues/59528)
- [ ] TASKS-004: Mark task success
- [ ] TASKS-005: Mark task failed
- [ ] TASKS-006: Clear task instance
**DAG Detail - Overview /dags/:dagId**
- [ ] DAG-001: Verify DAG overview displays
- [ ] DAG-002: Verify task graph displays
- [ ] DAG-003: [Verify grid view displays](https://github.com/apache/airflow/issues/59539)
- [ ] DAG-004: Switch between graph and grid
- [ ] DAG-005: Click task in graph
**DAG Detail - Runs Tab**
- [ ] DAG-006: [Verify runs for specific DAG](https://github.com/apache/airflow/issues/59541)
**DAG Detail - Tasks Tab**
- [x] DAG-007: [Verify Tasks tab functionality](https://github.com/apache/airflow/issues/59543)
**DAG Detail - Calendar Tab**
- [ ] DAG-008: [Verify calendar tab functionality ](https://github.com/apache/airflow/issues/59544)
**DAG Detail - Code Tab**
- [ ] DAG-009:[ Verify DAG source codetab functionality](https://github.com/apache/airflow/issues/59546)
**DAG Detail - Details Tab**
- [x] DAG-010: [Verify DAG details tab](https://github.com/apache/airflow/issues/59555)
**DAG Detail - Backfills Tab**
- [x] DAG-011: [Verify backfills list displays](https://github.com/apache/airflow/issues/59592)
- [x] DAG-012: [Create backfill with all reprocess behaviour](https://github.com/apache/airflow/issues/59593)
- [ ] DAG-013: [Pause & Stop backfill](https://github.com/apache/airflow/issues/59594)
**DAG Detail - Events Tab**
- [x] DAG-014: [Verify DAG audit log ](https://github.com/apache/airflow/issues/59684)
**Assets**
- [x] ASSET-001: [Verify assets list displays](https://github.com/apache/airflow/issues/59929)
- [ ] ASSET-002: [Verify asset details display](https://github.com/apache/airflow/issues/59930)
**Audit Logs /events**
- [ ] BROWSE-001: [Verify audit logs display](https://github.com/apache/airflow/issues/59931)
**XComs**
- [ ] BROWSE-003: [Verify XComs list displays](https://github.com/apache/airflow/issues/59358)
**Required Actions**
- [ ] BROWSE-004: [Verify required actions display](https://github.com/apache/airflow/issues/59934)
**Variables**
-[ ] ADMIN-001: [Verify Variables Page functionality](https://github.com/apache/airflow/issues/60565)
**Pools**
- [ ] ADMIN-002: [Verify Pools Page functionality ](https://github.com/apache/airflow/issues/60565)
**Connections**
- [ ] ADMIN-003: [Verify Connections Page functionality ](https://github.com/apache/airflow/issues/60569)
**Providers**
- [ ] ADMIN-004: [Verify Providers Page functionality](https://github.com/apache/airflow/issues/60570)
**Plugins**
- [ ] ADMIN-005 [Verify Plugins Page functionality ](https://github.com/apache/airflow/issues/60571)
**Configuration**
- [ ] ADMIN-006: [Verify Configuration Page functionality ](https://github.com/apache/airflow/issues/60572)
### Related issues
_No response_
### Are you willing to submit a PR?
- [ ] Yes I am willing to submit a PR!
### Code of Conduct
- [x] I agree to follow this project's [Code of Conduct](https://github.com/apache/airflow/blob/main/CODE_OF_CONDUCT.md)
기본적으로 여기 리스트업이 되어있는데요!
여기 있는 것을 어사인 받거나, 아직 테스트가 불안정한 부분이 많아서 그 부분을 리팩토링 해도 좋습니다.
3개의 좋아요