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
,您可能需要执行不同的操作。例如,DOCKER
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 "
【讨论】:
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的主要内容,如果未能解决你的问题,请参考以下文章