Подтвердить что ты не робот

Есть ли способ получить последний тег данного репо с помощью github API v3

Я относительно новичок в github api, и я изо всех сил стараюсь получить последний тег данного репо.

Q: Зачем мне это нужно?

A: В качестве QA я отвечаю за тестирование и выпуск в LIVE, а нашей команде принадлежит около 40 артефактов (repos in github). Я хочу создать инструмент, который перечисляет проекты, которые совершают после этого последнего тега. Чтобы я мог более эффективно управлять релизами.

Подходим к делу.

В соответствии с Github api, чтобы получить все теги репо-сообщения,

GET /repos/:owner/:repo/tags

Но это дает полный список тегов, которые имеет репо.

Есть ли простой способ найти последний тег без повторения всех доступных тегов из вышеупомянутого вызова api?

Если у меня есть итерация по каждому тегу, чтобы найти последний тег (основанный на отметке времени каждого тега), который явно не будет эффективным способом сделать это, так как время будет увеличиваться, число тегов будет увеличиваться, и поскольку я хотите повторить тот же процесс, по крайней мере, для более чем 10 репозиториев.

Любая помощь будет высоко оценена.

Большое спасибо заранее

4b9b3361

Ответ 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
              }
            }
          }
        }
      }
    }
  }
}

проверить его в проводнике