最佳实践 | 如何基于GitHub Actions创建 DolphinScheduler Python API的CI/CD?

 点亮 ⭐️ Star · 照亮开源之路

https://github.com/apache/dolphinscheduler

最佳实践 | 如何基于GitHub Actions创建 DolphinScheduler Python API的CI/CD?_第1张图片

01.

最佳实践 | 如何基于GitHub Actions创建 DolphinScheduler Python API的CI/CD?_第2张图片

DolphinScheduler 和 Python API 介绍

Apache DolphinScheduler 是一个分布式、可扩展的工作流调度器平台,具有强大的 DAG 可视化界面。它可以帮助用户更轻松地构建和维护任何规模的工作流。

最佳实践 | 如何基于GitHub Actions创建 DolphinScheduler Python API的CI/CD?_第3张图片

为了满足同一团队中有不同偏好的所有用户,DolphinScheduler 提供了多种创建工作流的方式。最受欢迎的方式是通过 Web UI,非工程师出身也能经过简单的拖放创建工作流。如果您是一名工程师,并且更喜欢以编程的方式定义工作流,那么可以考虑使用其 Python API 或 YAML 文件定义来创建工作流。

PyDolphinScheduler 是 Apache DolphinScheduler 的 Python API,它让用户可以通过 Python 代码定义工作流,也就是 workflow-as-codes。就像使用其他 Python 库一样,你可以在任何你喜欢的编辑器中编写 Python代码,创建 DolphinScheduler 的用户、环境、项目和工作流。有关更多实操示例,可以参考:

DolphinScheduler 能用 Python 脚本编排工作流了!PyDolphinScheduler 简介与使用演示

02.

最佳实践 | 如何基于GitHub Actions创建 DolphinScheduler Python API的CI/CD?_第4张图片

一个简单的 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 的节点,以及节点之间连接的依赖。

最佳实践 | 如何基于GitHub Actions创建 DolphinScheduler Python API的CI/CD?_第5张图片

03.

最佳实践 | 如何基于GitHub Actions创建 DolphinScheduler Python API的CI/CD?_第6张图片

如何触发 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 脚本,这意味着我们必须考虑同步更改代码。否则,bash 脚本会失败,或者我们的一些新工作流将触发失败。

修复的方法很简单,我们可以动态检测特定目录下的 Python 脚本,然后将已有的脚本传递给 Python 解释器,我们可以这样修改我们的脚本

for file in $(find . -name "*.py"); do
    python "$file"
done

也就是说,这是我们触发任何规模的所有 DolphinScheduler Python API 工作流的最终脚本。但实际上会有点不同,因为通过手动触发来部署生产工作流的情况几乎不存在。所以,下一步我们将讨论如何在 CI 中触发我们的工作流。

04

最佳实践 | 如何基于GitHub Actions创建 DolphinScheduler Python API的CI/CD?_第7张图片

在 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-latest
    steps:
      - name: Run my very first GitHub Actions
        run: 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-latest
    steps:
      - name: Check out repository code
        uses: actions/checkout@v3
      - name: Execute
        run: |
          for file in $(find . -name "*.py"); do
            python "$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=""
export PYDS_JAVA_GATEWAY_PORT=""


GitHub Actions 在 YAML 文件中支持 `env` 语法,可以在 github-actions: environment-variables 中看到更多详细信息,我们现在可以将 GitHub Actions 配置更改为

name: Execute Workflows
on:
  push:
    branches:
      - main
jobs:
  execute:
    runs-on: ubuntu-latest
    steps:
      - name: Check out repository code
        uses: actions/checkout@v3
      - name: Execute
        env:
          PYDS_JAVA_GATEWAY_ADDRESS: 
          PYDS_JAVA_GATEWAY_PORT: 
        run: |
          for file in $(find . -name "*.py"); do
            python "$file"
          done

所以,每当我们的主分支有新的提交时,无论是通过合并 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-latest
    steps:
      - name: Check out repository code
        uses: actions/checkout@v3
      - name: Execute
        env:
          PYDS_JAVA_GATEWAY_ADDRESS: 
          PYDS_JAVA_GATEWAY_PORT: 
          PYDS_JAVA_GATEWAY_AUTH_TOKEN: ${{ secrets.YOUR-SECRET-NAME }}
        run: |
          for file in $(find . -name "*.py"); do
            python "$file"
          done


看,不复杂吧?就像是在 GitHub Actions 中使用普通的环境变量。这就是我们从 GitHub Actions 部署工作流程所需要做的全部工作。

05.

最佳实践 | 如何基于GitHub Actions创建 DolphinScheduler Python API的CI/CD?_第8张图片

最后谈谈 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 python3
  python: python3
repos:
  # Python API Hooks
  - repo: https://github.com/pycqa/isort
    rev: 5.10.1
    hooks:
      - id: isort
        name: isort (python)
  - repo: https://github.com/psf/black
    rev: 22.3.0
    hooks:
      - id: black
  - repo: https://github.com/pycqa/flake8
    rev: 4.0.1
    hooks:
      - id: flake8
        additional_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 configuration
        args: [
          --config,
          .flake8
        ]
  - repo: https://github.com/pycqa/autoflake
    rev: v1.4
    hooks:
      - id: autoflake
        args: [
          --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:
      - main
  pull_request:
jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - name: Check out repository code
        uses: actions/checkout@v3
      - name: Install Dependencies
        run: |
          python -m pip install --upgrade pre-commit
      - name: lint
        run: |
          pre-commit install
          pre-commit run --all-files
  execute:
    runs-on: ubuntu-latest
    if: github.event_name == 'push'
    needs: lint
    steps:
      - name: Check out repository code
        uses: actions/checkout@v3
      - name: Execute
        env:
          PYDS_JAVA_GATEWAY_ADDRESS: 
          PYDS_JAVA_GATEWAY_PORT: 
          PYDS_JAVA_GATEWAY_AUTH_TOKEN: ${{ secrets.YOUR-SECRET-NAME }}
        run: |
          for file in $(find . -name "*.py"); do
            python "$file"
          done


有些人可能注意到,除了添加新 job 外,我们还在 `on` 下添加了 `pull_request` 节点,在 `execute` job 下添加了 `if` 节点。因为代码 lint 检查会测试 push 和 pull requests,但我们只想在有新提交到分支 main 时执行工作流。如果我们为 pull requests 创建执行工作流,即使 pull requests 未被访问或未准备好合并,每个 pull requests 提交也都会被执行并部署到我们的生产环境。所以,我们必须设置一个条件来执行工作流。

06.

最佳实践 | 如何基于GitHub Actions创建 DolphinScheduler Python API的CI/CD?_第9张图片

回顾

  • 我们展示了什么是 DolphinScheduler 及其 Python API,GitHub Actions,如何通过 DolphinScheduler Python API 创建我们的第一个工作流,以及 GitHub Actions 中的第一个工作流。

  • 演示了如何基于 GitHub Actions 创建 DolphinScheduler Python API 的 CI/CD。

  • 最后,创建一个 GitHub Actions 来检测代码风格,自动检查我们的 DolphinScheduler Python API 的工作流代码。

参与贡献

随着国内开源的迅猛崛起,Apache DolphinScheduler 社区迎来蓬勃发展,为了做更好用、易用的调度,真诚欢迎热爱开源的伙伴加入到开源社区中来,为中国开源崛起献上一份自己的力量,让本土开源走向全球。

f1f8ace12e1882077ee4673b18a5720d.png

参与 DolphinScheduler 社区有非常多的参与贡献的方式,包括:

efb71bfb69fb5c6f0e1e8e8f7f7422a2.png

贡献第一个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) ,手把手教会您( 贡献者不分水平高低,有问必答,关键是有一颗愿意贡献的心 )。

最佳实践 | 如何基于GitHub Actions创建 DolphinScheduler Python API的CI/CD?_第10张图片

添加社区小助手微信(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?_第11张图片

你可能感兴趣的:(python,github,ci/cd,开发语言)