ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Apache Airflow Atlassian Jira Provider 版本演进全解析:从 SDK 迁移到异步通知的变更日志深度解读

Apache Airflow Atlassian Jira Provider 版本演进全解析:从 SDK 迁移到异步通知的变更日志深度解读 Apache Airflow Atlassian Jira Provider 版本演进全解析从 SDK 迁移到异步通知的变更日志深度解读【免费下载链接】airflowApache Airflow - A platform to programmatically author, schedule, and monitor workflows项目地址: https://gitcode.com/GitHub_Trending/ai/airflowapache-airflow-providers-atlassian-jira是 Apache Airflow 官方维护的社区 Provider用于将 Jira 问题跟踪系统接入 Airflow 工作流。本文以该 Provider 的官方变更日志providers/atlassian/jira/docs/changelog.rst为骨架结合仓库内 Hook、Operator、Sensor、Notifier 的实际源码与测试用例完整梳理从 1.0.0 到 3.3.5 的版本演进脉络重点解读两次重大破坏性变更2.0.0 SDK 迁移与 3.0.0 弃用清理以及 JiraNotifier、异步 Jira Hook 等核心功能的引入过程帮助读者理解版本差异、规避升级风险并掌握基于当前版本3.3.5编写 DAG 的实战方式。Provider 现状概览版本、依赖与支持范围截至当前仓库快照Atlassian Jira Provider 的最新版本为 3.3.5对应状态为ready、生命周期production见 providers/atlassian/jira/provider.yaml。安装方式与版本要求该 Provider 支持在现有 Airflow 安装之上通过 pip 安装pip install apache-airflow-providers-atlassian-jira根据 providers/atlassian/jira/docs/index.rst 中的依赖声明当前版本的硬性要求如下PIP 包版本要求apache-airflow2.11.0apache-airflow-providers-common-compat1.10.1apache-airflow-providers-http无显式版本约束atlassian-python-api3.41.10注意两个关键约束最低 Airflow 版本 2.11.0这一要求自 3.3.0 版本起引入对应变更条目 “Bump minimum Airflow version in providers to Airflow 2.11.0 (#58612)”并在后续版本延续。升级到 3.3.x 前请确认你的 Airflow 版本不低于 2.11。atlassian-python-api依赖演进变更日志记录了该底层 SDK 依赖的多次调整——2.5.1 曾收紧为3.41.6“Limit atlassian-python-api to 3.41.6”2.6.1 调整为3.41.10“Bump minimum version of atlassian-python-api3.41.10”随后 2.5.1 又改为宽松约束“Use lax atlassian-python-api limitation”。当前约束为3.41.10即采用宽松的下限约束策略。版本基线回顾变更日志显示Provider 的版本号演进与其要求的最低 Airflow / Python 版本密切相关版本关键基线变更1.0.0Provider 初始版本1.1.0最低 Airflow 提升到 2.3.02.0.0底层 SDK 迁移重大变更见下节2.2.0 / 2.4.0 / 2.6.0 / 2.7.0 / 3.1.0 / 3.3.0最低 Airflow 依次提升到 2.5 / 2.6 / 2.7 / 2.8 / 2.10 / 2.112.1.1放弃 Python 3.7 支持3.1.1放弃 Python 3.9 支持3.3.2新增 Python 3.14 支持从源码结构看Provider 的版本要求通过 providers/atlassian/jira/pyproject.toml 与 providers/atlassian/jira/provider.yaml 维护providers/atlassian/jira/src/airflow/providers/atlassian/jira/get_provider_info.py 负责在运行时向 Airflow 注册这些元数据。2.0.0 重大变更底层 SDK 从jira迁移到atlassian-python-api2.0.0 是 Atlassian Jira Provider 历史上影响面最大的一次变更变更日志中的描述值得逐句解读MigratedJiraprovider from AtlassianJiraSDK toatlassian-python-apiSDK.Jiraprovider doesnt supportvalidateandget_server_infoin connection extra dict. Changed the return type ofJiraHook.get_connto return anatlassian.Jiraobject instead of ajira.Jiraobject.变更带来的三个具体影响JiraHook.get_conn()的返回类型改变从jira.Jira变为atlassian.Jira。这意味着任何在 DAG 中直接调用hook.get_conn()并依赖旧 SDK 方法的代码都需要适配新 SDK 的方法签名与返回结构。Connection 的 extra 字段不再支持validate与get_server_info这两个旧 SDK 特有的连接参数被移除迁移时若连接配置中存在这两个字段需要清理。JiraOperator的参数语义改变变更日志明确警告——由于底层 SDK 更换JiraOperator现在必须按照atlassian-python-api的约定传入jira_method与jira_method_args参数。源码中的实际体现在 operators/jira.py 中可以看到JiraOperator通过getattr(resource, self.method_name)(**self.jira_method_args)动态调用atlassian.Jira客户端上的任意方法例如create_issue、update_issue_field等class JiraOperator(BaseOperator): template_fields: Sequence[str] (jira_method_args,) def __init__( self, *, jira_method: str, jira_conn_id: str jira_default, jira_method_args: dict | None None, result_processor: Callable | None None, get_jira_resource_method: Callable | None None, **kwargs, ) - None: ...执行流程对应execute方法要点若传入get_jira_resource_methodjira_method会在该函数或另一个JiraOperator返回的资源对象上执行从而直接调用atlassian-python-apiJira SDK 中资源级方法未提供时方法在JiraHook创建的顶层客户端上执行返回结果为 dict 时jira_result.get(id)会被推送到 XComkey 为id供下游任务使用可选的result_processor回调接收(context, jira_result)并对结果做进一步处理。同步地2.1.1 的 Bug Fix “Fix: JiraOperator support any return response from Jira client (#31672)” 放宽了JiraOperator对返回值的约束使其能兼容atlassian-python-api返回的非 dict 响应进一步验证了 SDK 迁移后返回值多样性的适配。Hook 层源码解读同步JiraHook与异步JiraAsyncHook变更日志的 Misc 部分多次提到 Hook 架构层面的演进例如 3.1.1 “Move BaseHook implementation to task SDK”、3.0.2 “Move BaseNotifier to Task SDK”、2.0.1 修复jira_method_args缺失场景等。当前 hooks/jira.py 中并存两个 Hook同步JiraHookclass JiraHook(BaseHook): default_conn_name jira_default conn_type jira conn_name_attr jira_conn_id hook_name JIRA def __init__( self, jira_conn_id: str default_conn_name, proxies: Any | None None, api_root: str rest/api, api_version: str | int 2, ) - None:default_conn_name jira_default意味着不显式指定连接时默认使用jira_default连接api_root默认rest/api、api_version默认2对应 Jira 经典的 REST API v2 路径get_conn()依据 Connection 配置实例化atlassian.Jira客户端并从 Connection 的 extra 字段读取verifySSL 校验开关通过get_connection_form_widgets()与get_ui_field_behaviour()自定义 Airflow 连接管理界面的表单提供 “Verify SSL” 布尔开关并隐藏schema、extra字段对应变更日志 2.5.0 “Add jira connection docs and UI form (#36458)”。异步JiraAsyncHook异步 Hook 继承自HttpAsyncHook对应变更日志 3.2.0 的功能条目 “feat: add async jira notifier (#56326)”。它以异步 HTTP 方式与 Jira 交互async def create_issue(self, fields: str | dict) - ClientResponse: path self.get_resource_url(issue) ... async with aiohttp.ClientSession(**session_kwargs) as session: return await super().run( sessionsession, endpointpath, datajson.dumps({fields: fields}), headersself.default_headers, )get_resource_url负责拼接{api_root}/{api_version}/{resource}形式的资源 URL。测试用例位于 tests/unit/atlassian/jira/hooks/test_jira.py其中通过AIRFLOW_CONN_JIRA_DEFAULT环境变量注入连接host 为https://localhost/jira/、extra 含{verify: false, project: AIRFLOW}验证了连接解析与客户端构建逻辑。JiraNotifier 的引入与异步化失败自动建单变更日志中与通知相关的里程碑有两条2.3.0 “Add Jira Notifier implementation (#35397)” 与 3.2.0 “feat: add async jira notifier (#56326)”。当前实现位于 notifications/jira.py。核心参数与模板字段class JiraNotifier(BaseNotifier): template_fields (description, summary, project_id, issue_type_id, labels) def __init__( self, *, jira_conn_id: str JiraHook.default_conn_name, proxies: Any | None None, api_version: str | int 2, api_root: str rest/api, description: str, summary: str, project_id: int, issue_type_id: int, labels: list[str] | None None, **kwargs, ):description问题正文内容summary问题标题project_id问题所属项目 IDissue_type_id问题类型 ID如 Bug、Task、Storylabels为问题附加的标签列表全部核心字段均为模板字段可在其中使用 Jinja 模板引用 DAG 上下文变量如{{ dag.dag_id }}、{{ ti.task_id }}。_get_fields()方法构造 Jira 建单所需的标准字段结构notify()同步通过JiraHook的create_issue与async_notify()异步通过JiraAsyncHook的create_issue分别对应两条执行路径。实战用法DAG/Task 级失败回调官方 How-to 指南providers/atlassian/jira/docs/notifications/jira-notifier-howto-guide.rst给出了完整示例通过send_jira_notification即JiraNotifier的别名挂接到 DAG 级或 Task 级的on_failure_callback实现工作流失败自动创建 Jira 问题from datetime import datetime from airflow import DAG from airflow.providers.standard.operators.bash import BashOperator from airflow.providers.atlassian.jira.notifications.jira import send_jira_notification with DAG( test-dag, start_datedatetime(2023, 11, 3), on_failure_callback[ send_jira_notification( jira_conn_idmy-jira-conn, descriptionFailure in the Dag {{ dag.dag_id }}, summaryAirflow Dag Issue, project_id10000, issue_type_id10003, labels[airflow-dag-failure], ) ], ): BashOperator( task_idmytask, on_failure_callback[ send_jira_notification( jira_conn_idmy-jira-conn, descriptionThe task {{ ti.task_id }} failed, summaryAirflow Task Issue, project_id10000, issue_type_id10003, labels[airflow-task-failure], ) ], bash_commandfail, retries0, )该示例同时展示了 DAG 级与 Task 级两种接入方式DAG 失败与单个 Task 失败会分别创建带不同描述与标签的 Jira 问题。3.2.0 引入的异步路径意味着在支持 Async 的执行环境中可选用async_notify提升通知效率。3.0.0 破坏性变更弃用 API 全面清理3.0.0 的变更日志明确声明“All deprecated classes, parameters and features have been removed from the Atlassian Jira provider package.”该 Provider 包中所有弃用的类、参数与功能均已被移除并给出了唯一的破坏性变更条目Removed the use of theverifyextra parameters as astrfromJiraHook. Useverifyextra parameters as aboolinstead.即Jira Connection 的 extra 字段中verify参数不再接受字符串类型必须使用布尔值。这与当前源码中verify extra_options.get(verify, verify)的读取方式以及get_connection_form_widgets中BooleanField(lazy_gettext(Verify SSL), defaultTrue)的表单定义完全一致——在 Airflow UI 的连接配置表单中“Verify SSL” 选项默认开启True对应 provider.yaml 中conn-fields.verify声明的 boolean 类型与默认值true。升级到 3.0.0 及以上版本时需检查历史连接配置将字符串形式的verify如false改为布尔值false。JiraSensor基于轮询的问题监控虽然变更日志中 Sensor 相关条目较少但 sensors/jira.py 提供了两个开箱即用的传感器属于 Provider 能力的重要组成部分JiraSensor通用监控器接收method_name与method_params在poke()中调用atlassian.Jira客户端的指定方法可通过result_processor回调把结果转换为布尔判定作为传感器成功条件。JiraTicketSensor面向单个 ticket 的专用监控器参数为ticket_id、field、expected_value。它内部调用issue方法并默认使用issue_field_checker判定当字段值为 list 时检查expected_value是否在列表中为字符串或带name的 dict 时进行忽略大小写的比对其余类型输出 warning 并返回None继续轮询。ticket_id被声明为模板字段支持 Jinja 动态注入。连接配置从 Airflow UI 到代码依据 providers/atlassian/jira/docs/connections.rstJira Connection 的默认连接 ID 为jira_default与JiraHook.default_conn_name一致需要配置的字段包括字段说明HostJira 主机地址须包含协议 scheme如https://your-jira.example.comPort连接 Jira 使用的端口Login用于 Jira API 认证的用户名Password该用户的密码Verify SSL连接 Jira API 时是否校验 SSL默认True其中 “Verify SSL” 是 2.5.0 版本通过 “Add jira connection docs and UI form (#36458)” 引入的连接 UI 表单能力底层由JiraHook.get_connection_form_widgets()提供。在测试中可以看到连接也支持通过环境变量AIRFLOW_CONN_conn_id以 JSON 形式注入见 tests/unit/atlassian/jira/hooks/test_jira.py便于本地与 CI 环境使用。完整版本时间线1.0.0 → 3.3.5 要点速览综合变更日志全部版本条目整理如下时间线仅列出正式收录于 Changelog 的变更版本类型核心内容1.0.0—Provider 初始版本1.1.0Misc最低 Airflow 版本提升到 2.3.02.0.0Breaking从 Atlassian Jira SDK 迁移到atlassian-python-apiSDKget_conn()返回类型改变移除 extra 中validate/get_server_infoJiraOperator改用jira_method/jira_method_args2.0.1Bug Fix修复jira_method_args未提供时的处理2.1.0Misc最低 Airflow 版本提升到 2.42.1.1Bug Fix / MiscJiraOperator支持 Jira 客户端任意返回类型放弃 Python 3.72.2.0Misc最低 Airflow 版本提升到 2.52.3.0Feature新增 Jira Notifier 实现2.4.0Misc最低 Airflow 版本提升到 2.6.02.5.0Feature新增 Jira Connection 文档与 UI 表单2.5.1Miscatlassian-python-api依赖约束调整先3.41.6后放宽2.6.0Misc最低 Airflow 版本提升到 2.7.02.6.1Misc加速airflow_version导入最低atlassian-python-api提升到3.41.102.7.0Misc最低 Airflow 版本提升到 2.8.02.7.1MiscBash Operator 移入 Standard provider依赖调整3.0.0Breaking移除全部弃用功能verifyextra 参数必须为布尔值最低 Airflow 2.9.03.0.1Misc升级 flit 至 3.11.03.0.2MiscBaseNotifier移入 Task SDK3.1.0Misc最低 Airflow 版本提升到 2.103.1.1MiscBaseHook实现移入 task SDK放弃 Python 3.9使用 Task SDK 的BaseSensorOperator3.1.2Misc新增 Python 3.13 支持清理 mypy 与类型忽略3.2.0Feature / Misc / Doc新增异步 Jira Notifier迁移到common.compat3.2.1Misc符合 ASF 要求的发行版改造3.3.0Misc最低 Airflow 版本提升到 2.11.03.3.1Misc更新版权声明3.3.2Misc新增 Python 3.14 支持3.3.3MiscHook 元数据改为从 YAML 加载不再导入 Hook 类3.3.4Misc为 flit 构建的 pyproject.toml 添加显式[tool.flit.sdist]段3.3.5Misc修复嵌套 provider 包的连接字段检查崩溃从这条时间线可以清晰看到 Provider 的三大演进主线底层 SDK 现代化2.0.0 迁移、后续持续适配、与 Airflow 核心架构同步BaseHook/BaseNotifier/BaseOperator 陆续迁移到 task SDK、common.compat兼容层见 3.0.2、3.1.1、3.2.0、3.3.3 条目、通知能力增强2.3.0 引入 Notifier、3.2.0 引入异步版本。升级迁移建议结合上述变更日志与源码面向不同版本的用户给出如下建议从 2.x 升级到 3.x重点处理两处破坏性变更——(1) 将 Jira Connection extra 中的verify改为布尔类型(2) 确认 Airflow 版本 ≥ 2.11.03.3.x 要求。其余弃用 API 已在 3.0.0 被移除历史 DAG 中若仍引用旧参数需同步调整。从 1.x 升级到 2.x核心工作集中在 SDK 迁移——检查自定义代码中对JiraHook.get_conn()返回值的调用是否兼容atlassian.JiraJiraOperator需按新参数约定重写为jira_methodjira_method_args清理 Connection extra 中的validate、get_server_info。充分利用通知能力若尚未使用 Jira Notifier可在 DAG 级与 Task 级on_failure_callback中接入send_jira_notification参考 jira-notifier-howto-guide.rst实现失败问题的自动化创建与跟踪。总结Apache Airflow Atlassian Jira Provider 的变更日志providers/atlassian/jira/docs/changelog.rst完整记录了该 Provider 从 1.0.0 到 3.3.5 的演进轨迹一次彻底的 SDK 迁移2.0.0、一轮弃用清理3.0.0、通知能力的引入与异步化2.3.0、3.2.0以及持续与 Airflow 核心架构task SDK、common.compat、Python/Airflow 版本矩阵保持同步的工程化迭代。理解这条时间线不仅有助于评估升级风险也能帮助开发者更好地使用 hooks/jira.py、operators/jira.py、sensors/jira.py、notifications/jira.py 这四类核心组件将 Jira 无缝嵌入 Airflow 的数据管道与运维告警体系。【免费下载链接】airflowApache Airflow - A platform to programmatically author, schedule, and monitor workflows项目地址: https://gitcode.com/GitHub_Trending/ai/airflow创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表