Repository navigation
Conversation
ColtenOuO
force-pushed
the
Colten_contribution
branch
3 times, most recently
from
October 7, 2026 10:20
0b66131 to
671e3fd
Compare
Author
|
cc @jason810496 , @Lee-W |
ColtenOuO
force-pushed
the
Colten_contribution
branch
from
October 7, 2026 10:24
671e3fd to
ed2aa27
Compare
chia7712
reviewed
Oct 7, 2026
|
|
||
| 我以前是一個專注在競技程式的人,自己的 side-project 大概也就 2-3 個,對一些 framwork 或技術可以說是知道一些但不能說精通。開源一直是我很想要踏入的圈子,原因其實很單純,~~因為可以跟別人說你現在使用的 xxx 專案有自己的程式碼感覺很帥~~。 | ||
|
|
||
| 大約在兩年前想加入開源這個圈子,一個算啟蒙的點應該是因為我的室友哲佑在大一的時候開始在 Airflow 上貢獻覺得很帥氣 (當然他本人也是很帥),第二是以前當成大莊坤達老師的助教時有一次慶功宴剛好邀請嘉平老大回來對大家的專題進行評分,那也是我第一次聽到源來是你這個社群。大家在聚餐中講了好多好多技術,但我對那些東西其實懵懵懂懂的,大家常常掛在嘴上說的知名開源專案我可以說是完全不知道那些在幹嘛,更不用說提到的那些技術了。其實也是那時候更意識到自己在這個圈子是很苗小的,程式競賽帶給我的就是思考的樂趣以及演算法與資料結構的知識,在真正的實務上我其實根本什麼都不會。雖然帶著一點點的失落,但「誠實面對自己」是很重要的,所以我開始把踏入開源這個圈子放在心裡。我覺得我總有一天一定會開始嘗試離開自己的舒適圈的。 |
Member
There was a problem hiding this comment.
一個算啟蒙的點應該是因為我的室友哲佑在大一的時候開始在 Airflow 上貢獻覺得很帥氣
其實是大二大三才開始
我也希望我是大一就開始 ...
因為可以跟別人說你現在使用的 xxx 專案有自己的程式碼感覺很帥
全對 這是目前我覺得開最適合貢獻開源的理由 就覺得很帥
目前還沒空細看
等 CoC EU 完應該差不多有空細看
感謝!
ColtenOuO
force-pushed
the
Colten_contribution
branch
from
October 7, 2026 19:50
ed2aa27 to
47cccf2
Compare
ColtenOuO
force-pushed
the
Colten_contribution
branch
from
October 7, 2026 19:53
47cccf2 to
082a14d
Compare
chia7712
approved these changes
Oct 20, 2026
jason810496
approved these changes
Oct 20, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.


Apache Airflow 開源貢獻紀錄 by ColtenOuO(2026-04 ~ 2026-10-07)
已合併的 PR 分類
前言 (含一些個人心得)
考量到可能會有人翻這裡的東西來參閱加上我自己算是今年 3 月第一次加入開源的人所以寫下自己的一些小心得希望有助於幫助到後面的人,雖然我自己不是強者,但相信剛加入的人一定也會遇到跟我類似的問題,希望能帶給這些人一些啟發。
個人心得 (文筆不好請見諒)
我以前是一個專注在競技程式的人,自己的 side-project 大概也就 2-3 個,對一些 framwork 或技術可以說是知道一些但不能說精通。開源一直是我很想要踏入的圈子,原因其實很單純,
因為可以跟別人說你現在使用的 xxx 專案有自己的程式碼感覺很帥。大約在兩年前想加入開源這個圈子,一個算啟蒙的點應該是因為我的室友哲佑在大一的時候開始在 Airflow 上貢獻覺得很帥氣 (當然他本人也是很帥),第二是以前當成大莊坤達老師的助教時有一次慶功宴剛好邀請嘉平老大回來對大家的專題進行評分,那也是我第一次聽到源來是你這個社群。大家在聚餐中講了好多好多技術,但我對那些東西其實懵懵懂懂的,大家常常掛在嘴上說的知名開源專案我可以說是完全不知道那些在幹嘛,更不用說提到的那些技術了。其實也是那時候更意識到自己在這個圈子是很苗小的,程式競賽帶給我的就是思考的樂趣以及演算法與資料結構的知識,在真正的實務上我其實根本什麼都不會。雖然帶著一點點的失落,但「誠實面對自己」是很重要的,所以我開始把踏入開源這個圈子放在心裡。我覺得我總有一天一定會開始嘗試離開自己的舒適圈的。
在 2025 年時自己偶爾就常常湧上一個想要正式跨入開源圈的第一步,但都節節敗退。後來我自己想了一下原因其實可以歸納出以下幾點 (我認為這也是第一次接觸開源的人一定會碰到的)
我必須老實承認我自己也是一個很需要成就感驅使我不斷做下去的人,在新手期沒有任何成就感真的太容易感到挫敗,覺得自己不適合踏入這樣的圈子。
從現在的我看來我覺得我很認同嘉平老大所說的「開源在前期是很容易沒有任何成果的,即使花費的時間已經一兩個月也很正常」
但今年 3 月的時候我自己翻程式碼找到第一個貢獻 Airflow 的 PR 後開啟了我大量的開源動力 (不知道大家還記不記得自己第一個 PR 被 merged 的那種熱血)。另外也因為時代的改變,現在有比較厲害的 AI 工具輔助,遇到不懂的東西往往可以很快找到答案,AI 甚至也可以幫忙找有哪些適合貢獻的地方。因此我開始藉由 AI 工具的輔助發了不少 PR,但在一個月後我開始思考一個很重要的問題。
這些 PR 讓我學到了什麼?
嗯,答案是,沒學到什麼。
那我不就只是一個刷 PR 數字的白痴嗎?想想自己為什麼會想要加入開源這個圈子,不就是為了想要在技術能力上有所提升嗎?那我幹嘛做一些沒有意義的 PR?
在思考到這一點後我開始轉變我「使用 AI 的方式」。對,我還是會用 AI 輔助我寫程式,但我的用法更專注在:
找到更有意義的 PR (所以每一個問題我都會開始自己先看過然後評估,不是無腦做,做了之後也會每一行程式碼自己都非常了解,才讓 PR 發出去)
那也是因為這個轉變我必須親自讓自己去下場讀懂每一個問題發生的原因以及實際造成的影響,我也感覺是從這個轉變開始我才「真正」慢慢的有開始了解 Airflow 的運作原理以及相關 model 彼此的依賴關係。
後來也因為做的 PR 影響面開始比較大,PR 開始常常有比較多回饋,從這些回饋中我真的學到很多以前自己寫專案學不到的東西。這些幫忙 review PR 的人對大型專案有一定的經驗,很多事情不是說想改就改或能動就好。因為一個小改動影響的是好幾萬的使用者,甚至是企業級的用戶。所以是需要非常小心的。每一個 review 的過程我都從中偷到了許多大型專案維護上的相關知識,自己真的從這些地方學到不少東西。
在最近幾個月我也開始意識到我幫別人 code review 所需要花費的時間完全遠大於自己做一個 PR。現在生 code 變得很廉價,code review 變得越來越重要。幫別人 code review 你就需要懂別人寫的每一行程式碼的用途是什麼。也是因為這樣我在 review 的過程中讓自己對專案有更多的理解,所以我也蠻推薦除了發 PR 之外可以多去 code review 的。
後來做一做哲佑就問我要不要加入源來適你,猶豫了一下後覺得自己做開源太無聊了跟大家一起討論才好玩所以就加入了 (一開始不加入其實是擔心自己太菜,在裡面發表一些很笨的發言感覺很抽象,但其實這個社群對新手非常友善及包容,甚至可以用「愛」來說)
講了很多流水帳的東西,但總結一下想要跟大家分享從我自己親身經歷得到的一些東西:
對了,我講這些都是真實的,你從最底下把我的 PR 往回看就可以發現我以前的 PR 的品質真的很差... 到後面才比較有點樣子,希望用這個真實的例子讓大家有所警惕 (希望有啦)。
預計接下來的大目標
重點成果
效能
SELECT *的峰值記憶體從 1,121 MiB 降到 219 MiB,耗時從 4.20 秒降到 0.05 秒(#73384)。正確性
HttpOperator在 deferrable 模式下做分頁,只會回傳最後一頁,前面的頁面會直接被扔了(#72388)。可能沒有使用者在用吧。airflow connections test連線失敗時 exit code 仍是 0(#72548)。SQLToolset(allowed_tables=[])會讓 agent 看到所有資料表,這不是預期中的行為(#73381)。API 規格:用 5 個 PR 修正十多個端點在 OpenAPI spec 中與實際行為不一致的 HTTP 狀態碼。依 spec 自動產生的 SDK client 因此能正確處理這些回應。
考古一些古老 issue,把它解了:
我人工搶 issue 搶的比機器人還快,這個 bug 其實應該是面向企業級的用戶,一般使用者應該很難碰到。Month: October 2026(10/01 ~ 10/07)
Summary: PR: 1, Code Review: 0, Issue Triage: —, Dev List: —
PR
core|測試GET /dags、GET /dags/{id}、GET /dags/{id}/details、PATCH /dags/{id}、PATCH /dags、DELETE /dags/{id}補上帶有 deadline alert 的 Dag 的測試,共 7 個測試方法。Month: September 2026
Summary: PR: 14, Code Review: 21, Issue Triage: —, Dev List: —
PR
Core
core|效能get_data_dependencies())原本在 BFS 迴圈中,對每個 producer / consumer task 各查一次 DB。改成每一輪 BFS 收集所有 task key,再用一次tuple_(dag_id, task_id).in_(...)批次查詢。Tip
一直很想搜集到 3.4.0 的徽章,剛好這個 PR 不好 backport,所以就被扔到 3.4.0 了。
core|新功能[api] ssl_ciphers設定與airflow api-server --ssl-ciphers參數,uvicorn 和 gunicorn 兩種 server backend 都支援。OpenSSL 無法解析的 cipher list 會在啟動時直接報錯,不會等到 bind socket 時才丟出不太好理解的SSLError。Tip
做 PR 71645 的過程中,自己也有特別注意向下兼容的設計問題,很開心這個 PR 一次就被 approved : )
Fix airflow connections test returning success exit code on failure(#72548)
core|Bug 修正airflow connections test連線失敗時只印出 "Connection failed!",exit code 卻是 0。改成失敗時SystemExit(1),與同函式其他失敗路徑一致。$?判斷連線是否正常,原本會把失敗當成成功。Fix airflow plugins and dags pause printing prose with --output json(#73270)
core|Bug 修正airflow plugins和airflow dags pause/unpause在查無結果時會先印一段固定文字,忽略--output json/yaml。改成交給AirflowConsole.print_as輸出[]。jq或 YAML parser 的自動化腳本在結果為空時會解析失敗。修正後與其他 list 類 CLI 指令及文件描述一致。Render the database ERD as a searchable Mermaid diagram instead of an image(#72006)
core + provider-fab + provider-edge3|文件erDiagram。Fix flaky bundle version lock concurrency tests(#72572)
core|測試BundleVersionLock併發測試原本用固定的sleep(0.1),改成確定性的同步機制,讓測試更穩定。Fix test_get_task_states_with_task_group_id_and_task_id to actually cover its name(#72294)
core|測試task_group_id和task_ids,實際卻只帶了前者,所以其實根本沒測試到。補上task_ids。GET /task-instances/states的「task group ∪ task_ids」聯集分支原本沒有被任何測試覆蓋,現在有了。airflow-ctl
airflow-ctl|效能BaseOperations.execute_list合併所有分頁後,又對已驗證過的物件做了一次model_dump()+model_validate()。移除這段多餘的往返。airflowctl ... list指令都可以被這個改進影響。Provider:common-ai
Stop DataFusionToolset from materializing full results for a capped query(#73384)
provider-common-ai|效能改了什麼:
DataFusionToolset的query工具最多只回傳max_rows筆,卻先把整個查詢結果轉成 Python dict 再截斷。改成在 DataFusion 層加上LIMIT max_rows + 1。影響:3M 筆、65 MiB 的 parquet 檔實測:
SELECT *ORDER BY版本:下一個 common-ai 版本。
Reject empty allowed_tables in SQLToolset instead of allowing all tables(#73381)
provider-common-ai|Bug 修正(防護機制)SQLToolset(allowed_tables=[])原本被當成None(不限制),結果 agent 可以看到並查詢所有資料表。改成空 list 直接丟出ValueError,並在 changelog 註明行為變更。Variable.get或設定檔),一旦結果是空的,原本會默默的關掉整個資料表白名單。修正後改成在 Dag import 時就失敗。Reject non-string prompts in LLMFileAnalysisOperator before reading files(#71734)
provider-common-ai|Bug 修正TypeError。改成在execute()一開始就檢查,錯誤訊息會指出應改用multi_modal=True。Add require_approval preflight check to @task.llm_schema_compare(#71688)
provider-common-ai|Bug 修正@task.llm_schema_compare補上其他三個 LLM decorator 都有的 preflight 檢查。Tip
其實應該不會有使用者這麼奇怪用圖片去做 schema compare,但我認為只要使用者可以在系統上做出這種事,那我們就應該要確保專案給出的錯誤訊息是正確的。
provider-common-ai|文件LLMBranchOperator、LLMSQLQueryOperator、LLMSchemaCompareOperator、LLMFileAnalysisOperator的文件和 docstring 補上usage_limits(token、請求數、工具呼叫次數、費用上限),並統一連到同一個說明段落。Provider:http
provider-http|Bug 修正execute_complete()丟掉了paginate_async()已彙整好的所有頁面結果,改用只含當前頁的結果覆蓋。另外修正原本的回歸測試:它的 assertion 被contextlib.suppress(TaskDeferred)跳過,所以永遠不會執行。HttpOperator改成deferrable=True的 Dag,原本會遺失最後一頁以外的所有資料,也不會報錯。這是會直接造成資料錯誤的 bug。Code Review 重點
這個月做了 21 次 code review。
update_mask由所有 entity 共用,某個 entity 沒提供extra時,會被set_extra(None)清掉既有資料。__version__沒有升版。rolling upgrade 期間新舊 worker 會用不同方式解讀同一份資料,這也會影響 trigger kwargs。建議升到 v3 並依版本分流處理。Month: August 2026
Summary: PR: 18, Code Review: 33, Issue Triage: —, Dev List: —
PR
Core
Reduce memory used when deleting a Dag with a large history(#71185)
core|效能改了什麼:
delete_dag的每個 bulk delete 都強制使用 SQLAlchemy 的synchronize_session="fetch",會把每一筆被刪除列的主鍵讀回 Python,但 session 裡其實沒有物件需要同步。改用預設的"auto"策略。影響:200,000 筆、資料表形狀同
task_instance的實測:SELECT歷史越長的 Dag,刪除時 API server 的記憶體壓力越大,這個問題已經解決了。
版本:Airflow 3.3.2
Reduce memory used when deleting queued asset events(#71917)
core|效能"fetch"問題從兩個刪除 queued asset event 的端點移除。Fix N+1 query in bulk update for Variables and Pools(#71918)
core|效能BulkVariableService和BulkPoolService的 bulk update 先批次查一次,卻把結果丟掉,再逐筆重新查詢。改成重用已查到的 ORM 物件,與connections.py的設計一致。Return 404 from task state store endpoints for unknown task instances(#70983)
core|Bug 修正204。改成回傳404,並讓 6 個端點的 OpenAPI 宣告與實際行為一致。Document HTTP statuses that API routes raise but never declared(#71011)
core|OpenAPI 規格修正Remove the unreachable 404 from the create Variable endpoint(#71245)
core|OpenAPI 規格修正404分支,而且在 create 端點回 404 本身就不合理。移除它,同時保持 mypy 型別檢查通過。Document the 409 from XCom create and drop a duplicated condition(#70992)
core|OpenAPI 規格修正409 Conflict,並移除一段重複巢狀的if not dag_run。Complete the Traditional Chinese UI translations(#71019)
core|新功能(i18n)Fix inverted docstring for config write hide_sensitive option(#71623)
core (shared)|文件AirflowConfigParser.write()的 docstring 寫錯了參數名稱,而且描述的行為和實作相反(說「包含」敏感值,實際是「隱藏」)。Fix stale TypeScript SDK docs on bundle metadata and packing setup(#72115)
core|文件airflow-metadata.yamlsidecar,而且缺少安裝apache-airflow-ts-sdk和選用的 peer dependencyesbuild的步驟。Provider:common-ai
Add test_connection support to LangChainHook and LlamaIndexHook(#71841)
provider-common-ai|新功能test_connection()。為它們補上,做法與PydanticAIHook相同:只解析 model 設定,不發出真正的 API 呼叫。Let the agent retry on a rejected DataFusion query instead of failing(#71445)
provider-common-ai|Bug 修正DataFusionToolset遇到SQLSafetyError(例如 LLM 產生的 SQL 有語法錯誤)時直接讓 task 失敗。改成丟出ModelRetry,讓 agent 自行修正。SQLToolset的行為一致。LLM 只是打錯字時,不會再讓整個 task 失敗。Document LLMFileAnalysisOperator's inherited LLM and HITL parameters(#71856)
provider-common-ai|文件model_id、system_prompt、agent_params和 Human-in-the-Loop 審核參數的文件,並新增一個require_approval範例 Dag。Add LLMSchemaCompareOperator to the common-ai operator index table(#71738)
provider-common-ai|文件LLMSchemaCompareOperator。Add prek hook to catch operators missing from common-ai docs index(#71783)
provider-common-ai|CIcheck-common-ai-operators-indexprek hook,自動檢查每個 operator 都有出現在文件索引表中。Provider:cncf-kubernetes
provider-cncf-kubernetes|文件is_async參數說明。CI / 開發工具
Fix misspelled variable in CI migration test DB manager export(#71334)
CI|程式品質DB_MANGERS拼字錯誤。這個錯誤讓EXTERNAL_DB_MANAGERS一直是空值,CI 卻都會通過。Fix stale flag name in Airflow translations agent skill(#71332)
開發工具|文件--remove-extra更新為--remove-unused。Code Review 重點
這個月在別人的 PR 上送出 33 次 review。
skip_if_cascade_blocked參數與既有的 NOT EXISTS guard 在結構上重複,建議沿用既有機制,並指導 PR 標題的規範。(Request changes)buffer[newline_pos + 1:]會建立新物件,原本的註解描述有誤,建議用memoryview減少一次中間複製。DAG.cli()crash)、#71767(deadline 診斷)等。Month: July 2026
Summary: PR: 4, Code Review: 0, Issue Triage: —, Dev List: —
PR
Provider:amazon
provider-amazon|Bug 修正EcsRunTaskOperator在deferrable=True且 container log 送到另一個 region 時,trigger 會用 ECS 的 region 去讀 CloudWatch log。為TaskDoneTrigger新增log_region_name,預設 fallback 到region_name,所以已序列化的舊 trigger 不受影響。Provider:neo4j
provider-neo4j|Bug 修正cypher/sql參數是否有提供的檢查移回__init__,屬於 #70503 追蹤的一系列 revert。render_template_as_native_obj=True時,有提供的參數可能 render 成None而被誤判為缺少。修正後,寫錯參數會在 Dag import 階段就報錯,不必等每個 task instance 執行時才失敗。Provider:common-ai
Fix LLMSQLQueryOperator not stripping single-line markdown code fences(#70137)
provider-common-ai|Bug 修正```SELECT 1```)時,反引號沒有被移除,會直接送進 SQL 驗證與執行。補上單行情況的處理。Support .txt files in LLMFileAnalysisOperator(#70431)
provider-common-ai|新功能LLMFileAnalysisOperator原本拒絕.txt檔,沒有副檔名的檔案反而可以用。把txt加入支援格式,包含 gzip。DocumentLoaderOperator及官方範例 Dag 中使用的.txt輸入一致。Month: June 2026
Summary: PR: 0, Code Review: 0, Issue Triage: —, Dev List: —
為了畢業讀期末考,抱歉了開源。
Month: May 2026
Summary: PR: 14, Code Review: 0, Issue Triage: —, Dev List: —
PR
Core
Fix N+1 query pattern in bulk pool delete endpoint(#66222)
core|效能categorize_pools()一次查出所有 pool,卻丟掉結果,在迴圈中逐一重查。改成重用已查到的物件。Fix N+1 query in bulk task instance delete endpoint(#67304)
core|效能(task_id, map_index)」的分支裡逐筆重新查詢。改成重用_categorize_task_instances已載入的對照表。Avoid rebuilding option filter sets per iteration in update_config CLI(#66369)
core|效能airflow config update在每次迴圈中重建 4 個小寫 list 再做in判斷。改成在迴圈外預先建好 set。Avoid rebuilding callback field list on every serialization loop(#66343)
core|效能serialized_objects.py)有 4 處重複的 callback 欄位 list comprehension,每次迴圈都重建。提升為模組層級的 frozenset 常數。Convert RUNTIME_VARYING_CALLS to frozenset(#66306)
core|效能Convert STATES_SENT_DIRECTLY to frozenset(#66317)
core (task-sdk)|效能Fix GET /pools list endpoint incorrectly documenting 404 in OpenAPI spec(#67570)
core|OpenAPI 規格修正GET /pools一定回傳一個集合(可能為空),不可能回 404。從 spec 中移除錯誤的 404 宣告。Fix GET /auth/login missing 400 in OpenAPI spec(#67571)
core|OpenAPI 規格修正/auth/login在next重導 URL 不安全時會回 400,但 spec 沒有宣告。補上宣告,並改用status.HTTP_400_BAD_REQUEST常數。Make Pool model session parameter keyword-only(#66967)
core|程式品質Pool.create_or_update_pool()和Pool.delete_pool()的session改成 keyword-only,並移除函式內的session.commit()。Use contextlib.suppress instead of try-except-pass and re-enable SIM105(#66193)
core|程式品質Use shared Zulu datetime formatter in remaining FastAPI tests(#66439)
core|測試 / 程式品質isoformat().replace("+00:00", "Z")換成共用 helper。Provider
Use contextlib.suppress instead of try-except-pass and re-enable SIM105(#66178)
provider(跨 6 個)|程式品質try-except-pass改寫為contextlib.suppress。Iterate file objects directly instead of calling readlines()(#66291)
provider-google + dev|程式品質for line in f.readlines()改成for line in f)。Enable PT007 rule to apache.kafka Provider test(#66147)
provider-apache-kafka|程式品質Month: April 2026(04/07 ~ 04/30)
Summary: PR: 2, Code Review: 0, Issue Triage: —, Dev List: —
PR
core|程式品質Client.create_pool的錯誤訊息用字,與 codebase 其他地方一致。Tip
這是我的第一個 Airflow PR :)
provider-amazon|程式品質備註