Есть ли способ получить последний тег данного репо с помощью github API v3
Я относительно новичок в github api, и я изо всех сил стараюсь получить последний тег данного репо.
Q: Зачем мне это нужно?
A: В качестве QA я отвечаю за тестирование и выпуск в LIVE, а нашей команде принадлежит около 40 артефактов (repos in github). Я хочу создать инструмент, который перечисляет проекты, которые совершают после этого последнего тега. Чтобы я мог более эффективно управлять релизами.
Подходим к делу.
В соответствии с Github api, чтобы получить все теги репо-сообщения,
GET /repos/:owner/:repo/tags
Но это дает полный список тегов, которые имеет репо.
Есть ли простой способ найти последний тег без повторения всех доступных тегов из вышеупомянутого вызова api?
Если у меня есть итерация по каждому тегу, чтобы найти последний тег (основанный на отметке времени каждого тега), который явно не будет эффективным способом сделать это, так как время будет увеличиваться, число тегов будет увеличиваться, и поскольку я хотите повторить тот же процесс, по крайней мере, для более чем 10 репозиториев.
Любая помощь будет высоко оценена.
Большое спасибо заранее
Ответы
Ответ 1
GitHub не имеет API для извлечения последнего тега, поскольку он имеет для получение последней версии. Это может быть потому, что теги могут быть произвольными строками, не обязательно semvers, но это не очень оправдание, поскольку теги имеют метки времени, а GitHub выполняет сортировку тегов лексикографически при их возврате через Tags API.
В любом случае, чтобы получить последний тег, вам нужно вызвать этот API, а затем отсортировать теги в соответствии с правилами semver. Поскольку эти правила нетривиальны (см. Пункт 11 в этой ссылке), лучше использовать библиотеку semver (портирован для браузера).
var gitHubPath = 'iDoRecall/selection-menu'; // example repo
var url = 'https://api.github.com/repos/' + gitHubPath + '/tags';
$.get(url).done(function (data) {
var versions = data.sort(function (v1, v2) {
return semver.compare(v2.name, v1.name)
});
$('#result').html(versions[0].name);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://rawgit.com/hippich/bower-semver/master/semver.min.js"></script>
<p>Latest tag: <span id="result"></span></p>
Ответ 2
В качестве альтернативы GitHub API вы можете рассмотреть простой скрипт, упомянутый в "Есть ли простой способ" git describe
"удаленного репозитория?" (source, by svnpenn
):
#!/usr/bin/awk -f
BEGIN {
if (ARGC != 2) {
print "git-describe-remote.awk https://github.com/stedolan/jq"
exit
}
FS = "[ /^]+"
while ("git ls-remote " ARGV[1] "| sort -Vk2" | getline) {
if (!sha)
sha = substr($0, 1, 7)
tag = $3
}
while ("curl -s " ARGV[1] "/releases/tag/" tag | getline)
if ($3 ~ "commits")
com = $2
printf com ? "%s-%s-g%s\n" : "%s\n", tag, com, sha
}
Это извлекает тег (и не только), без необходимости клонировать репо.
Примечание: как прокомментировано ниже Джоэлсом Эльфом, убедитесь, что /usr/bin/awk
ссылается на gawk
, а не на mawk
.
Ответ 3
Вы можете получить последнюю версию на https://api.github.com/repos/$org/$repo/releases/latest
Если вы хотите просто имя тега, вы можете попробовать что-то вроде этого:
curl https://api.github.com/repos/$org/$repo/releases/latest -s | jq .name -r
Ответ 4
Используя GraphQL API v4, вы можете получить последний тег по алфавиту или по дате фиксации. Например, по дате фиксации (например, тег, указывающий на последнюю фиксацию):
{
repository(owner: "bertrandmartel", name: "caipy-dashboard") {
refs(refPrefix: "refs/tags/", first: 1, orderBy: {field: TAG_COMMIT_DATE, direction: DESC}) {
edges {
node {
name
target {
oid
... on Tag {
message
commitUrl
tagger {
name
email
date
}
}
}
}
}
}
}
}
проверить его в проводнике
Обратите внимание, что если тег является легким тегом, не будет поля tagger
или message
. Вы также можете использовать field: ALPHABETICAL
для последнего тега в алфавитном порядке.
Если вы хотите получить последний тег создан (который может отличаться от тега, который указывает на самый последний фиксатор или последний тег в алфавитном порядке), это возможно только для аннотированный тег, так как их дата создания хранится и будет доступна в поле tagger
.
Чтобы получить последний созданный тег, вы получите все теги и фильтруете самую последнюю дату в поле data.repository.refs.edges.node.target.tagger.date
в ответе на следующий запрос:
{
repository(owner: "google", name: "gson") {
refs(refPrefix: "refs/tags/", first: 100, orderBy: {field: TAG_COMMIT_DATE, direction: DESC}) {
edges {
node {
name
target {
oid
... on Tag {
commitUrl
tagger {
date
}
}
}
}
}
}
}
}
проверить его в проводнике