Ansible github_packages

Posted

技术标签:

【中文标题】Ansible github_packages【英文标题】: 【发布时间】:2021-04-15 19:47:26 【问题描述】:

可以从 GitHub 存储库获得两个版本(二进制版本和包版本),如下所示:

我想使用 Ansible 从我的 GitHub 存储库中检索包发布

我在 Ansible 文档上进行了一些搜索,发现了一个集合 community.general.github_release,但这提供了最新的 Release 存储库二进制文件,而不是 Package Releases

如果有人知道可以从 GitHub 获取 Package Releases 的集合,可以提供帮助吗?

感谢任何帮助。谢谢

【问题讨论】:

【参考方案1】:

您可以使用Github GraphQL API(如this question和this one所示)如:

  #
  # Tasks that may be included in an Ansible playbook or role depending on your needs
  #

  # Some variables to define to identify your repository
  # They may be set as playbook or role variables as well
  # You'll need a Bearer token (see https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token)
  - set_fact:
      bearer_token: YOUR_BEARER_TOKEN
      repository_name: repository-name
      repository_owner: repository-owner

  - name: Retrieve packages for repository
    uri:
      url: https://api.github.com/graphql
      method: POST
      body: '"query":
          "query  repository(name: \" repository_name \", owner: \" repository_owner \") 
            packages(first:10)  nodes  name, packageType, latestVersion 
              version, files(first:100)  nodes  url  
              
          
        "'
      headers:
        Content-Type: application/json
        Accept: "application/vnd.github.packages-preview+json"
        Authorization: "bearer  bearer_token "
    register: github_packages_json

这将提供如下输出:

  
    "json": 
        "data": 
            "repository": 
                "packages": 
                    "nodes": [
                        
                            "latestVersion": 
                                "files": 
                                    "nodes": [
                                        
                                            "url": "https://pkg.githubusercontent.com/xxx/some-url"
                                        ,
                                        
                                            "url": "https://pkg.githubusercontent.com/xxx/another-url"
                                        
                                    ]
                                ,
                                "version": "my-package-1.2.3"
                            ,
                            "name": "my-package",
                            "packageType": "DOCKER"
                        
                    ]
                
            
        
    ,

根据packageType,您可能需要执行不同的操作。例如,DOCKERpackageType 将要求您拉取图像,例如:

  - name: pull docker
    shell: docker pull docker.pkg.github.com/ repository_owner | lower / repository_name / docker_image_name : docker_image_version 
    vars:
      docker_image_name: " github_packages_json.json.data.repository.packages.nodes[0].name "
      docker_image_version: " github_packages_json.json.data.repository.packages.nodes[0].latestVersion.version "

【讨论】:

graphQL 方法看起来确实很有前途(比我基于 GitHub API 的答案还要多)。赞成。 @Pierre B. 谢谢,我会对此进行测试并告诉你。那是您提供的 ANsible 剧本对吗? 刚刚测试过,效果很好!非常感谢您。 感谢@VonC 和 Mervin,不客气!乐意效劳。这是一套可能包含在剧本或角色中的任务,我将对其进行编辑以强调这一点【参考方案2】:

community.general.github_release Ansible 角色是ansible-collections/community.general 代码的一部分。

它的源代码source_control/github/github_release.py 显示正在使用github3.py,这是使用GitHub 的REST API 的库。 具体来说,latest_release 端点 (code here) 使用 GET /repos/owner/repo/releases/latest REST API。

但是,对于github3.py(由 Ansible 角色使用),“包发布”是 an asset,您可以在 github3.repos.release.Release 中找到 ID:@987654330 @会给你所有的assets id。

因此,您需要编写一个类似于latest_release 的角色,使用latest_release 返回的版本来调用github3.repos.release.Release,获取资产ID 并使用asset(asset_id) 下载您需要的角色

【讨论】:

我没有编写自定义角色的经验,但我会在其中看到。非常感谢 我真的不认为这是正确的。 “资产”只能从“发行版”中获得。这些是您将在每个“版本”中看到的文件。如果没有发布(如问题使用的示例中),则 API 将简单地返回一个空数组,并且无法继续进行。也许我错了,但据我所知,对 packages 的 API 访问(这是一个相对较新的功能)仅在 Github v4 GraphQL API 中可用(也是一个相对 新功能)。 @NotTheDr01ds 确实可能:我对docs.github.com/en/github/administering-a-repository/… 中的资产一词感到困惑。 docs.github.com/en/rest/reference/repos#releases 中没有提到“包”。

以上是关于Ansible github_packages的主要内容,如果未能解决你的问题,请参考以下文章

ansible使用

Ansible之ansible.cfg

ansible源码解读

ansible总结

Linux系统之Ansible的基本介绍

Ansible之路——第五章:Ansible的几个命令