如何使用Ansible过滤GitHub标签,优先获取稳定版本?
解决方案
方案一:改进现有HTML抓取逻辑(适配当前代码)
你的现有代码通过抓取GitHub标签页HTML提取标签,但未过滤不稳定版本。可以通过以下步骤实现稳定标签筛选:
- 提取页面中所有标签名
- 过滤掉包含
nightly、git、rc、dev的不稳定标签 - 取排序后的第一个标签(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字段直接标记是否为预发布版本,无需通过标签名正则过滤 - 若请求频率较高,建议添加
Authorizationheader(携带GitHub token)避免API限流
内容的提问来源于stack exchange,提问作者Blender Fox
相关产品推荐
相关产品推荐

