2

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

GitHub SS

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

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

如果他们知道可以从 GitHub 获取 Package Releases 的集合,任何人都可以提供帮助吗?

感谢任何帮助。谢谢

4

2 回答 2

2

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

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

但是,对于github3.py(由 Ansible 角色使用)而言, “包发布”是一种资产,其 ID 可以在 a 中找到github3.repos.release.Release:这original_assets将为您提供所有资产 id

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

于 2021-01-16T12:18:30.170 回答
2

您可以使用Github GraphQL API(如this questionthis 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您可能需要执行不同的操作。例如,aDOCKER packageType将要求您拉取图像,例如:

  - 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 }}"

于 2021-01-19T10:02:27.167 回答