最佳实践 | 如何基于GitHub Actions创建 DolphinScheduler Python API的CI/CD?
?點亮????Star · 照亮開源之路
https://github.com/apache/dolphinscheduler
01.
DolphinScheduler 和 Python API 介紹
Apache DolphinScheduler 是一個分布式、可擴展的工作流調度器平臺,具有強大的 DAG 可視化界面。它可以幫助用戶更輕松地構建和維護任何規模的工作流。
為了滿足同一團隊中有不同偏好的所有用戶,DolphinScheduler 提供了多種創建工作流的方式。最受歡迎的方式是通過 Web UI,非工程師出身也能經過簡單的拖放創建工作流。如果您是一名工程師,并且更喜歡以編程的方式定義工作流,那么可以考慮使用其 Python API 或 YAML 文件定義來創建工作流。
PyDolphinScheduler 是 Apache DolphinScheduler 的 Python API,它讓用戶可以通過 Python 代碼定義工作流,也就是 workflow-as-codes。就像使用其他 Python 庫一樣,你可以在任何你喜歡的編輯器中編寫 Python代碼,創建 DolphinScheduler 的用戶、環境、項目和工作流。有關更多實操示例,可以參考:
DolphinScheduler 能用 Python 腳本編排工作流了!PyDolphinScheduler 簡介與使用演示
02.
一個簡單的 Python API 示例
我們做了一個名為教程(tutorial)的示例來介紹 Python API 這個開箱即用的工具,其中包括基本概念,以及用最少的代碼創建和運行我們第一個工作流的方法,可以在 https://github.com/apache/dolphinscheduler-sdk-python/blob/main/src/pydolphinscheduler/examples/tutorial.py 中查看更詳細的代碼。DolphinScheduler 及其 Python API 的核心概念是 DAG,在 Python API 中調用工作流。
下圖可以更形象地說明這個概念。每個 DAG 包含多個節點和節點之間的連接,如名為 A、B、C 等的節點,以及它們之間的鏈接。在 Python API 中,任務代表 DAG 的節點,以及節點之間連接的依賴。
03.
如何觸發 Python API 工作流程
01
單個工作流
當我們已經了解了 Python API 的基本概念,且看過了它的示例,那么我們如何觸發并運行它來完成我們的工作呢?為了讓它更 pythonic,你可以像其他 Python 腳本一樣運行它,在終端輸入一個簡單的命令:
python tutorial.py
強大的 PyDolphinScheduler 可以幫你搞定所有設置并創建一個新的工作流,之后你可以在 DolphinScheduler web UI 中看到這個新的工作流。
02
多個工作流
如果我有多個包含多個工作流程的文件,該如何觸發它們?是的,你可能已經想到了,你可以一個一個觸發,就像我們觸發單條一樣。我們可以這樣完成:
python workflow1.py python workflow2.py python workflow3.py ... python workflowN.py
我們可以將上述所有命令添加到一個 bash 腳本中,之后,我們只需要執行 bash 腳本
它雖然很有用,但是當一些工作流添加或刪除時,我們也必須更改 bash 腳本,這意味著我們必須考慮同步更改代碼。否則,bash 腳本會失敗,或者我們的一些新工作流將觸發失敗。
修復的方法很簡單,我們可以動態檢測特定目錄下的 Python 腳本,然后將已有的腳本傳遞給 Python 解釋器,我們可以這樣修改我們的腳本
for file in $(find . -name "*.py"); dopython "$file" done?也就是說,這是我們觸發任何規模的所有 DolphinScheduler Python API 工作流的最終腳本。但實際上會有點不同,因為通過手動觸發來部署生產工作流的情況幾乎不存在。所以,下一步我們將討論如何在 CI 中觸發我們的工作流。
04
在 GitHub Action中觸發
在本節中,我們將通過 CI 觸發我們的工作流程,以 GitHub Action 為例,其他 CI 工具也差不多。
01
什么是 GitHub Action
GitHub Actions 讓我們可以輕松實現所有軟件工作流程的自動化,現在是用全球流行的 CI/CD。直接從 GitHub 構建、測試和部署代碼。按照你的需求進行代碼審查、分支管理和問題分類。隨著 GitHub 的流行和開源項目的發展,GitHub Action 目前非常流行。你可以在 GitHub 操作文檔[https://github.com/features/actions]中查看更多詳細信息。這是 GitHub Action 的 hello world
name: GitHub Actions Demo on:push:branches:- main jobs:hello-world:runs-on: ubuntu-lateststeps:- name: Run my very first GitHub Actionsrun: echo "🎉 Hello World."你可以將其保存為 YAML 文件,并放在你的項目中,路徑為 .github/workflows/hello.yaml,讓 GitHub 知道你是想要干什么。之后,每次提交并將其推送到名為 main 的分支時,名為 `hello.yaml` 的配置文件將被觸發,它只會執行一個操作,執行 bash 命令并回顯“🎉 Hello World. “ 到 GitHub 操作控制臺。
02
組合 GitHub Action 以觸發多個工作流
在上面的示例中,你可能已經意識到 GitHub Actions 可以運行 bash 命令。而我們的工作流批量觸發腳本也是一個 bash 腳本。要通過 GitHub Actions 觸發,我們可以更改我們的 GitHub Actions 示例中的命令。
name: Execute Workflows on: push:branches:- main jobs:execute:runs-on: ubuntu-lateststeps:- name: Check out repository codeuses: actions/checkout@v3- name: Executerun: |for file in $(find . -name "*.py"); dopython "$file"done它只能觸發工作流并將其部署到運行主機的 GitHub Actions。DolphinScheduler 集群在自托管服務器上或AWS 等云服務上,而不是 GitHub Actions,所以我們必須告訴 bash 腳本將我們的代碼提交到 DolphinScheduler 集群而不是 GitHub Actions 服務器上。幸運的是,DolphinScheduler Python API 提供了三種對用戶很友好的配置更改方法。我建議通過 bash 在 GitHub 操作期間更改環境變量,這很簡單
# Modify Java Gateway Address export PYDS_JAVA_GATEWAY_ADDRESS="<YOUR-STATIC-IP-RUN-DOLPHINSCHEDULER-API-SERVER>" export PYDS_JAVA_GATEWAY_PORT="<PORT-RUN-DOLPHINSCHEDULER-API-SERVER>"
GitHub Actions 在 YAML 文件中支持 `env` 語法,可以在 github-actions: environment-variables 中看到更多詳細信息,我們現在可以將 GitHub Actions 配置更改為
所以,每當我們的主分支有新的提交時,無論是通過合并 PR 生成還是從本地推送,它都會觸發并將我們在 DolphinScheduler Python API 中定義的所有工作流部署到你的 DolphinScheduler 集群部署的位置。
在還未發布的版本中,我們為 DolphinScheduler Python API 添加了一個用于身份驗證的新機制令牌,這意味著當我們嘗試從 Python API 連接到 DolphinScheduler 時,下一個版本必須添加一個令牌,參見 https://github.com /apache/dolphinscheduler-sdk-python/pull/13 了解更多詳情。此外,我們強烈建議我們的用戶打開令牌身份驗證以確保連接安全。就像其他配置一樣,令牌也可以通過 bash 通過環境變量更改[https://dolphinscheduler.apache.org/python/3.1.0/config.html#by-bash]。
但是當我們啟用和打開令牌時如何從 GitHub Actions 觸發呢?在這種情況下,我們需要用 GitHub Encrypted secrets[https://docs.github.com/en/actions/security-guides/encrypted-secrets]來解決。用戶可以按照鏈接中的步驟操作為你的存儲庫,創建你的第一個安全機密,記得牢記你的 secret 名稱,在 GitHub Actions 配置中會用到
name: Execute Workflows on:push:branches:- main jobs:execute:runs-on: ubuntu-lateststeps:- name: Check out repository codeuses: actions/checkout@v3- name: Executeenv:PYDS_JAVA_GATEWAY_ADDRESS: <YOUR-STATIC-IP-RUN-DOLPHINSCHEDULER-API-SERVER>PYDS_JAVA_GATEWAY_PORT: <PORT-RUN-DOLPHINSCHEDULER-API-SERVER>PYDS_JAVA_GATEWAY_AUTH_TOKEN: ${{ secrets.YOUR-SECRET-NAME }}run: |for file in $(find . -name "*.py"); dopython "$file"done
看,不復雜吧?就像是在 GitHub Actions 中使用普通的環境變量。這就是我們從 GitHub Actions 部署工作流程所需要做的全部工作。
05.
最后談談 CI
DolphinScheduler Python API 腳本是一個 Python 腳本,因此它是 Python 語言的 CI,包括 black、Pylint、flake8、sort、autoflake 等。如果你選擇使用 Python API 來創建和維護工作流,而不是通過 Web UI,我相信每個人都有自己偏好的代碼格式和樣式檢查工具。我之所以在 CD 之后再談 CI,是因為這是一個可選項。如果你有自己喜歡的其他選擇,可以直接本節。但如果沒有,我接下來會分享一下我喜歡用的東西和 Python API lint。
首先,我更喜歡使用預提交[https://pre-commit.com/],它會在每次 Git 提交時運行,很有用,因為我可以在把代碼推送到遠程之前檢測到一些簡單但經常被忽視的細節。預提交需要一個配置文件,我想分享 Python API 自身使用的代碼樣式和 lint 代碼,可以在 https://github.com/apache/dolphinscheduler-sdk-python/blob/ 查看更多詳細信息 main/.pre-commit-config.yaml
default_stages: [commit, push] default_language_version:# force all python hooks to run python3python: python3 repos:# Python API Hooks- repo: https://github.com/pycqa/isortrev: 5.10.1hooks:- id: isortname: isort (python)- repo: https://github.com/psf/blackrev: 22.3.0hooks:- id: black- repo: https://github.com/pycqa/flake8rev: 4.0.1hooks:- id: flake8additional_dependencies: ['flake8-docstrings>=1.6','flake8-black>=0.2',]# pre-commit run in the root, so we have to point out the full path of configurationargs: [--config,.flake8]- repo: https://github.com/pycqa/autoflakerev: v1.4hooks:- id: autoflakeargs: [--remove-all-unused-imports,--ignore-init-module-imports,--in-place]它不會運行復雜的檢查,而是簡單的檢查,可以盡量快地完成預提交。詳情如下:
isort:自動對 Python 導入進行排序
black:自動格式化 Python 代碼
autoflake:自動刪除 pyflakes 報告未使用的導入和未使用的變量
flake8:檢測其他代碼和文檔
pre-commit 可用于本地檢查,你也可以通過在現有名為 execute 的 job 之前添加一個新 job,在 GitHub Actions 中運行它。
name: Execute Workflows on:push:branches:- mainpull_request: jobs:lint:runs-on: ubuntu-lateststeps:- name: Check out repository codeuses: actions/checkout@v3- name: Install Dependenciesrun: |python -m pip install --upgrade pre-commit- name: lintrun: |pre-commit installpre-commit run --all-filesexecute:runs-on: ubuntu-latestif: github.event_name == 'push'needs: lintsteps:- name: Check out repository codeuses: actions/checkout@v3- name: Executeenv:PYDS_JAVA_GATEWAY_ADDRESS: <YOUR-STATIC-IP-RUN-DOLPHINSCHEDULER-API-SERVER>PYDS_JAVA_GATEWAY_PORT: <PORT-RUN-DOLPHINSCHEDULER-API-SERVER>PYDS_JAVA_GATEWAY_AUTH_TOKEN: ${{ secrets.YOUR-SECRET-NAME }}run: |for file in $(find . -name "*.py"); dopython "$file"done
有些人可能注意到,除了添加新 job 外,我們還在 `on` 下添加了 `pull_request` 節點,在 `execute` job 下添加了 `if` 節點。因為代碼 lint 檢查會測試 push 和 pull requests,但我們只想在有新提交到分支 main 時執行工作流。如果我們為 pull requests 創建執行工作流,即使 pull requests 未被訪問或未準備好合并,每個 pull requests 提交也都會被執行并部署到我們的生產環境。所以,我們必須設置一個條件來執行工作流。
06.
回顧
我們展示了什么是 DolphinScheduler 及其 Python API,GitHub Actions,如何通過 DolphinScheduler Python API 創建我們的第一個工作流,以及 GitHub Actions 中的第一個工作流。
演示了如何基于 GitHub Actions 創建 DolphinScheduler Python API 的 CI/CD。
最后,創建一個 GitHub Actions 來檢測代碼風格,自動檢查我們的 DolphinScheduler Python API 的工作流代碼。
參與貢獻
隨著國內開源的迅猛崛起,Apache DolphinScheduler 社區迎來蓬勃發展,為了做更好用、易用的調度,真誠歡迎熱愛開源的伙伴加入到開源社區中來,為中國開源崛起獻上一份自己的力量,讓本土開源走向全球。
參與 DolphinScheduler 社區有非常多的參與貢獻的方式,包括:
貢獻第一個PR(文檔、代碼)?我們也希望是簡單的,第一個PR用于熟悉提交的流程和社區協作以及感受社區的友好度。
社區匯總了以下適合新手的問題列表:https://github.com/apache/dolphinscheduler/issues/5689
非新手問題列表:https://github.com/apache/dolphinscheduler/issues?q=is%3Aopen+is%3Aissue+label%3A%22volunteer+wanted%22
如何參與貢獻鏈接:https://dolphinscheduler.apache.org/zh-cn/community/development/contribute.html
來吧,DolphinScheduler開源社區需要您的參與,為中國開源崛起添磚加瓦吧,哪怕只是小小的一塊瓦,匯聚起來的力量也是巨大的。
參與開源可以近距離與各路高手切磋,迅速提升自己的技能,如果您想參與貢獻,我們有個貢獻者種子孵化群,可以添加社區小助手微信(Leonard-ds) ,手把手教會您( 貢獻者不分水平高低,有問必答,關鍵是有一顆愿意貢獻的心 )。
添加社區小助手微信(Leonard-ds)?
添加小助手微信時請說明想參與貢獻。
來吧,開源社區非常期待您的參與。
< 🐬🐬?>
更多精彩推薦
?DolphinScheduler 登陸 AWS AMI 應用市場!
?DolphinScheduler 機器學習工作流預測今年 FIFA 世界杯冠軍大概率是荷蘭!
?手把手教你上手Apache DolphinScheduler機器學習工作流
?突破單點瓶頸、挑戰海量離線任務,Apache Dolphinscheduler在生鮮電商領域的落地實踐
?名額已排到10月 | Apache DolphinScheduler Meetup分享嘉賓繼續火熱招募中
?【Meetup講師】您有一張社區認證講師證書未領取,點擊領取!
?DolphinScheduler 登上開源熱力榜 Top30!云原生推動的開源技術棧大重構正在進行
我知道你在看喲
總結
以上是生活随笔為你收集整理的最佳实践 | 如何基于GitHub Actions创建 DolphinScheduler Python API的CI/CD?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cocos2d-x 欢乐捕鱼游戏总结
- 下一篇: Python量化交易05——基于多因子选