You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Ansible过滤GitHub标签,优先获取稳定版本?

解决方案

方案一:改进现有HTML抓取逻辑(适配当前代码)

你的现有代码通过抓取GitHub标签页HTML提取标签,但未过滤不稳定版本。可以通过以下步骤实现稳定标签筛选:

  1. 提取页面中所有标签名
  2. 过滤掉包含nightly、git、rc、dev的不稳定标签
  3. 取排序后的第一个标签(GitHub标签页默认按发布时间倒序排列,第一个即为最新稳定版)

修改后的Ansible任务如下:

- name: Get tags
  uri:
    url: https://github.com/project/app/tags
    return_content: true
  register: tag_info
  until: tag_info is not failed
  retries: 10
  delay: 5

- name: Extract all tag names from page content
  set_fact:
    all_tags: "{{ tag_info.content | regex_findall('/project/app/releases/tag/([^&"]+)') }}"

- name: Filter out unstable tags (exclude nightly/git/rc/dev)
  set_fact:
    stable_tags: "{{ all_tags | reject('search', 'nightly|git|rc|dev') | list }}"

- name: Get latest stable tag
  set_fact:
    release: "{{ stable_tags[0] }}"

- name: Build download url
  set_fact:
    download_url: "https://github.com/project/app/releases/download/{{ release }}/my-app.rpm"

关键说明:

  • regex_findall('/project/app/releases/tag/([^&"]+)'):提取所有标签名,匹配/project/app/releases/tag/后的内容,直到遇到&或"结束
  • reject('search', 'nightly|git|rc|dev'):过滤掉包含任意指定关键词的标签,你可以根据需要添加更多关键词(比如beta)

方案二:改用GitHub Releases API(更稳定可靠)

抓取HTML页面容易受GitHub页面结构更新影响,推荐使用GitHub官方API获取结构化的发布数据,默认即可过滤预发布版本:

方式1:直接获取最新正式版

GitHub的/repos/{owner}/{repo}/releases/latest API默认返回最新的正式发布版本(排除预发布版):

- name: Fetch latest stable release via GitHub API
  uri:
    url: https://api.github.com/repos/project/app/releases/latest
    return_content: true
    headers:
      Accept: application/vnd.github.v3+json
  register: latest_release
  until: latest_release is not failed
  retries: 10
  delay: 5

- name: Set latest stable tag
  set_fact:
    release: "{{ latest_release.json.tag_name }}"

- name: Build download url
  set_fact:
    download_url: "https://github.com/project/app/releases/download/{{ release }}/my-app.rpm"

方式2:自定义过滤所有发布版本

如果需要更灵活的过滤规则(比如排除特定预发布标识),可以获取所有发布列表后筛选:

- name: Fetch all releases via GitHub API
  uri:
    url: https://api.github.com/repos/project/app/releases
    return_content: true
    headers:
      Accept: application/vnd.github.v3+json
  register: all_releases
  until: all_releases is not failed
  retries: 10
  delay: 5

- name: Filter stable releases and get latest tag
  set_fact:
    release: "{{ all_releases.json | rejectattr('prerelease', 'equalto', true) | map(attribute='tag_name') | first }}"

- name: Build download url
  set_fact:
    download_url: "https://github.com/project/app/releases/download/{{ release }}/my-app.rpm"

关键说明:

  • API返回的prerelease字段直接标记是否为预发布版本,无需通过标签名正则过滤
  • 若请求频率较高,建议添加Authorization header(携带GitHub token)避免API限流

内容的提问来源于stack exchange,提问作者Blender Fox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 12:42:45