最佳实践 | 如何基于GitHub Actions创建 DolphinScheduler Python API的CI/CD?
?點(diǎn)亮????Star · 照亮開源之路
https://github.com/apache/dolphinscheduler
01.
DolphinScheduler 和 Python API 介紹
Apache DolphinScheduler 是一個(gè)分布式、可擴(kuò)展的工作流調(diào)度器平臺(tái),具有強(qiáng)大的 DAG 可視化界面。它可以幫助用戶更輕松地構(gòu)建和維護(hù)任何規(guī)模的工作流。
為了滿足同一團(tuán)隊(duì)中有不同偏好的所有用戶,DolphinScheduler 提供了多種創(chuàng)建工作流的方式。最受歡迎的方式是通過 Web UI,非工程師出身也能經(jīng)過簡單的拖放創(chuàng)建工作流。如果您是一名工程師,并且更喜歡以編程的方式定義工作流,那么可以考慮使用其 Python API 或 YAML 文件定義來創(chuàng)建工作流。
PyDolphinScheduler 是 Apache DolphinScheduler 的 Python API,它讓用戶可以通過 Python 代碼定義工作流,也就是 workflow-as-codes。就像使用其他 Python 庫一樣,你可以在任何你喜歡的編輯器中編寫 Python代碼,創(chuàng)建 DolphinScheduler 的用戶、環(huán)境、項(xiàng)目和工作流。有關(guān)更多實(shí)操示例,可以參考:
DolphinScheduler 能用 Python 腳本編排工作流了!PyDolphinScheduler 簡介與使用演示
02.
一個(gè)簡單的 Python API 示例
我們做了一個(gè)名為教程(tutorial)的示例來介紹 Python API 這個(gè)開箱即用的工具,其中包括基本概念,以及用最少的代碼創(chuàng)建和運(yùn)行我們第一個(gè)工作流的方法,可以在 https://github.com/apache/dolphinscheduler-sdk-python/blob/main/src/pydolphinscheduler/examples/tutorial.py 中查看更詳細(xì)的代碼。DolphinScheduler 及其 Python API 的核心概念是 DAG,在 Python API 中調(diào)用工作流。
下圖可以更形象地說明這個(gè)概念。每個(gè) DAG 包含多個(gè)節(jié)點(diǎn)和節(jié)點(diǎn)之間的連接,如名為 A、B、C 等的節(jié)點(diǎn),以及它們之間的鏈接。在 Python API 中,任務(wù)代表 DAG 的節(jié)點(diǎn),以及節(jié)點(diǎn)之間連接的依賴。
03.
如何觸發(fā) Python API 工作流程
01
單個(gè)工作流
當(dāng)我們已經(jīng)了解了 Python API 的基本概念,且看過了它的示例,那么我們?nèi)绾斡|發(fā)并運(yùn)行它來完成我們的工作呢?為了讓它更 pythonic,你可以像其他 Python 腳本一樣運(yùn)行它,在終端輸入一個(gè)簡單的命令:
python tutorial.py
強(qiáng)大的 PyDolphinScheduler 可以幫你搞定所有設(shè)置并創(chuàng)建一個(gè)新的工作流,之后你可以在 DolphinScheduler web UI 中看到這個(gè)新的工作流。
02
多個(gè)工作流
如果我有多個(gè)包含多個(gè)工作流程的文件,該如何觸發(fā)它們?是的,你可能已經(jīng)想到了,你可以一個(gè)一個(gè)觸發(fā),就像我們觸發(fā)單條一樣。我們可以這樣完成:
python workflow1.py python workflow2.py python workflow3.py ... python workflowN.py
我們可以將上述所有命令添加到一個(gè) bash 腳本中,之后,我們只需要執(zhí)行 bash 腳本
它雖然很有用,但是當(dāng)一些工作流添加或刪除時(shí),我們也必須更改 bash 腳本,這意味著我們必須考慮同步更改代碼。否則,bash 腳本會(huì)失敗,或者我們的一些新工作流將觸發(fā)失敗。
修復(fù)的方法很簡單,我們可以動(dòng)態(tài)檢測特定目錄下的 Python 腳本,然后將已有的腳本傳遞給 Python 解釋器,我們可以這樣修改我們的腳本
for file in $(find . -name "*.py"); dopython "$file" done?也就是說,這是我們觸發(fā)任何規(guī)模的所有 DolphinScheduler Python API 工作流的最終腳本。但實(shí)際上會(huì)有點(diǎn)不同,因?yàn)橥ㄟ^手動(dòng)觸發(fā)來部署生產(chǎn)工作流的情況幾乎不存在。所以,下一步我們將討論如何在 CI 中觸發(fā)我們的工作流。
04
在 GitHub Action中觸發(fā)
在本節(jié)中,我們將通過 CI 觸發(fā)我們的工作流程,以 GitHub Action 為例,其他 CI 工具也差不多。
01
什么是 GitHub Action
GitHub Actions 讓我們可以輕松實(shí)現(xiàn)所有軟件工作流程的自動(dòng)化,現(xiàn)在是用全球流行的 CI/CD。直接從 GitHub 構(gòu)建、測試和部署代碼。按照你的需求進(jìn)行代碼審查、分支管理和問題分類。隨著 GitHub 的流行和開源項(xiàng)目的發(fā)展,GitHub Action 目前非常流行。你可以在 GitHub 操作文檔[https://github.com/features/actions]中查看更多詳細(xì)信息。這是 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 文件,并放在你的項(xiàng)目中,路徑為 .github/workflows/hello.yaml,讓 GitHub 知道你是想要干什么。之后,每次提交并將其推送到名為 main 的分支時(shí),名為 `hello.yaml` 的配置文件將被觸發(fā),它只會(huì)執(zhí)行一個(gè)操作,執(zhí)行 bash 命令并回顯“🎉 Hello World. “ 到 GitHub 操作控制臺(tái)。
02
組合 GitHub Action 以觸發(fā)多個(gè)工作流
在上面的示例中,你可能已經(jīng)意識(shí)到 GitHub Actions 可以運(yùn)行 bash 命令。而我們的工作流批量觸發(fā)腳本也是一個(gè) bash 腳本。要通過 GitHub Actions 觸發(fā),我們可以更改我們的 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它只能觸發(fā)工作流并將其部署到運(yùn)行主機(jī)的 GitHub Actions。DolphinScheduler 集群在自托管服務(wù)器上或AWS 等云服務(wù)上,而不是 GitHub Actions,所以我們必須告訴 bash 腳本將我們的代碼提交到 DolphinScheduler 集群而不是 GitHub Actions 服務(wù)器上。幸運(yùn)的是,DolphinScheduler Python API 提供了三種對(duì)用戶很友好的配置更改方法。我建議通過 bash 在 GitHub 操作期間更改環(huán)境變量,這很簡單
# 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 中看到更多詳細(xì)信息,我們現(xiàn)在可以將 GitHub Actions 配置更改為
所以,每當(dāng)我們的主分支有新的提交時(shí),無論是通過合并 PR 生成還是從本地推送,它都會(huì)觸發(fā)并將我們?cè)?DolphinScheduler Python API 中定義的所有工作流部署到你的 DolphinScheduler 集群部署的位置。
在還未發(fā)布的版本中,我們?yōu)?DolphinScheduler Python API 添加了一個(gè)用于身份驗(yàn)證的新機(jī)制令牌,這意味著當(dāng)我們嘗試從 Python API 連接到 DolphinScheduler 時(shí),下一個(gè)版本必須添加一個(gè)令牌,參見 https://github.com /apache/dolphinscheduler-sdk-python/pull/13 了解更多詳情。此外,我們強(qiáng)烈建議我們的用戶打開令牌身份驗(yàn)證以確保連接安全。就像其他配置一樣,令牌也可以通過 bash 通過環(huán)境變量更改[https://dolphinscheduler.apache.org/python/3.1.0/config.html#by-bash]。
但是當(dāng)我們啟用和打開令牌時(shí)如何從 GitHub Actions 觸發(fā)呢?在這種情況下,我們需要用 GitHub Encrypted secrets[https://docs.github.com/en/actions/security-guides/encrypted-secrets]來解決。用戶可以按照鏈接中的步驟操作為你的存儲(chǔ)庫,創(chuàng)建你的第一個(gè)安全機(jī)密,記得牢記你的 secret 名稱,在 GitHub Actions 配置中會(huì)用到
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
看,不復(fù)雜吧?就像是在 GitHub Actions 中使用普通的環(huán)境變量。這就是我們從 GitHub Actions 部署工作流程所需要做的全部工作。
05.
最后談?wù)?CI
DolphinScheduler Python API 腳本是一個(gè) Python 腳本,因此它是 Python 語言的 CI,包括 black、Pylint、flake8、sort、autoflake 等。如果你選擇使用 Python API 來創(chuàng)建和維護(hù)工作流,而不是通過 Web UI,我相信每個(gè)人都有自己偏好的代碼格式和樣式檢查工具。我之所以在 CD 之后再談 CI,是因?yàn)檫@是一個(gè)可選項(xiàng)。如果你有自己喜歡的其他選擇,可以直接本節(jié)。但如果沒有,我接下來會(huì)分享一下我喜歡用的東西和 Python API lint。
首先,我更喜歡使用預(yù)提交[https://pre-commit.com/],它會(huì)在每次 Git 提交時(shí)運(yùn)行,很有用,因?yàn)槲铱梢栽诎汛a推送到遠(yuǎn)程之前檢測到一些簡單但經(jīng)常被忽視的細(xì)節(jié)。預(yù)提交需要一個(gè)配置文件,我想分享 Python API 自身使用的代碼樣式和 lint 代碼,可以在 https://github.com/apache/dolphinscheduler-sdk-python/blob/ 查看更多詳細(xì)信息 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]它不會(huì)運(yùn)行復(fù)雜的檢查,而是簡單的檢查,可以盡量快地完成預(yù)提交。詳情如下:
isort:自動(dòng)對(duì) Python 導(dǎo)入進(jìn)行排序
black:自動(dòng)格式化 Python 代碼
autoflake:自動(dòng)刪除 pyflakes 報(bào)告未使用的導(dǎo)入和未使用的變量
flake8:檢測其他代碼和文檔
pre-commit 可用于本地檢查,你也可以通過在現(xiàn)有名為 execute 的 job 之前添加一個(gè)新 job,在 GitHub Actions 中運(yùn)行它。
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` 節(jié)點(diǎn),在 `execute` job 下添加了 `if` 節(jié)點(diǎn)。因?yàn)榇a lint 檢查會(huì)測試 push 和 pull requests,但我們只想在有新提交到分支 main 時(shí)執(zhí)行工作流。如果我們?yōu)?pull requests 創(chuàng)建執(zhí)行工作流,即使 pull requests 未被訪問或未準(zhǔn)備好合并,每個(gè) pull requests 提交也都會(huì)被執(zhí)行并部署到我們的生產(chǎn)環(huán)境。所以,我們必須設(shè)置一個(gè)條件來執(zhí)行工作流。
06.
回顧
我們展示了什么是 DolphinScheduler 及其 Python API,GitHub Actions,如何通過 DolphinScheduler Python API 創(chuàng)建我們的第一個(gè)工作流,以及 GitHub Actions 中的第一個(gè)工作流。
演示了如何基于 GitHub Actions 創(chuàng)建 DolphinScheduler Python API 的 CI/CD。
最后,創(chuàng)建一個(gè) GitHub Actions 來檢測代碼風(fēng)格,自動(dòng)檢查我們的 DolphinScheduler Python API 的工作流代碼。
參與貢獻(xiàn)
隨著國內(nèi)開源的迅猛崛起,Apache DolphinScheduler 社區(qū)迎來蓬勃發(fā)展,為了做更好用、易用的調(diào)度,真誠歡迎熱愛開源的伙伴加入到開源社區(qū)中來,為中國開源崛起獻(xiàn)上一份自己的力量,讓本土開源走向全球。
參與 DolphinScheduler 社區(qū)有非常多的參與貢獻(xiàn)的方式,包括:
貢獻(xiàn)第一個(gè)PR(文檔、代碼)?我們也希望是簡單的,第一個(gè)PR用于熟悉提交的流程和社區(qū)協(xié)作以及感受社區(qū)的友好度。
社區(qū)匯總了以下適合新手的問題列表:https://github.com/apache/dolphinscheduler/issues/5689
非新手問題列表:https://github.com/apache/dolphinscheduler/issues?q=is%3Aopen+is%3Aissue+label%3A%22volunteer+wanted%22
如何參與貢獻(xiàn)鏈接:https://dolphinscheduler.apache.org/zh-cn/community/development/contribute.html
來吧,DolphinScheduler開源社區(qū)需要您的參與,為中國開源崛起添磚加瓦吧,哪怕只是小小的一塊瓦,匯聚起來的力量也是巨大的。
參與開源可以近距離與各路高手切磋,迅速提升自己的技能,如果您想?yún)⑴c貢獻(xiàn),我們有個(gè)貢獻(xiàn)者種子孵化群,可以添加社區(qū)小助手微信(Leonard-ds) ,手把手教會(huì)您( 貢獻(xiàn)者不分水平高低,有問必答,關(guān)鍵是有一顆愿意貢獻(xiàn)的心 )。
添加社區(qū)小助手微信(Leonard-ds)?
添加小助手微信時(shí)請(qǐng)說明想?yún)⑴c貢獻(xiàn)。
來吧,開源社區(qū)非常期待您的參與。
< 🐬🐬?>
更多精彩推薦
?DolphinScheduler 登陸 AWS AMI 應(yīng)用市場!
?DolphinScheduler 機(jī)器學(xué)習(xí)工作流預(yù)測今年 FIFA 世界杯冠軍大概率是荷蘭!
?手把手教你上手Apache DolphinScheduler機(jī)器學(xué)習(xí)工作流
?突破單點(diǎn)瓶頸、挑戰(zhàn)海量離線任務(wù),Apache Dolphinscheduler在生鮮電商領(lǐng)域的落地實(shí)踐
?名額已排到10月 | Apache DolphinScheduler Meetup分享嘉賓繼續(xù)火熱招募中
?【Meetup講師】您有一張社區(qū)認(rèn)證講師證書未領(lǐng)取,點(diǎn)擊領(lǐng)取!
?DolphinScheduler 登上開源熱力榜 Top30!云原生推動(dòng)的開源技術(shù)棧大重構(gòu)正在進(jìn)行
我知道你在看喲
總結(jié)
以上是生活随笔為你收集整理的最佳实践 | 如何基于GitHub Actions创建 DolphinScheduler Python API的CI/CD?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cocos2d-x 欢乐捕鱼游戏总结
- 下一篇: linux shell编程学习--日志工