Чи є посилання на GitHub для завантаження файлу в останньому випуску сховища?


137

Використовуючи функцію випуску GitHub , можна надати посилання для завантаження певної версії опублікованого програмного забезпечення. Однак кожен раз, коли робиться реліз, gh-сторінку також потрібно оновлювати.

Чи є спосіб отримати посилання на певний файл будь-якої останньої версії програмного забезпечення?

наприклад, це буде статичне посилання:

https://github.com/USER/PROJECT/releases/download/v0.0.0/package.zip

Мені б хотілося щось таке:

https://github.com/USER/PROJECT/releases/download/latest/package.zip

ПРИМІТКА. Різниця між цим питанням та останньою версією GitHub полягає в тому, що це запитання спеціально просить отримати доступ до файлу, а не сторінки останнього випуску GitHub


1
Це Github на сьогодні підтримує в основному (з незначною різницею у форматі URL). Див stackoverflow.com/questions/24987542 / ...
wisbucky

Відповіді:


38

Кілька років пізно, але я просто здійснив просту перенаправлення на підтримку https://github.com/USER/PROJECT/releases/latest/download/package.zip. Це має бути перенаправлено на останній тег package.zipвипуску. Сподіваюся, це зручно!


2
Документовано на help.github.com/en/articles/linking-to-releases : Якщо ви хочете зв’язатись безпосередньо із завантаженням свого останнього активу випуску, ви можете зв’язатись з / власником / ім'ям / релізами / останнім / завантаженням / активом -name.zip
Ліам

4
Однак було б корисно, якби ця функція працювала з перейменованими назвами активів.
Ліам

3
Зверніть увагу , що порядок перемикається .../releases/latest/download/...проти .../releases/download/v0.0.0/.... Ви не можете просто замінити v0.0.0їх latestна місці.
wisbucky

2
@Joshua Peek Можливо, ви можете розширити це, щоб розширити "ОСТАННІЙ" у ​​назві ресурсу, щоб він був рядком версії? Це зробило б корисним для активів, що мають назви номерів версій.
jwatt

А як щодо завантаження останнього вихідного коду? Як називається актив у такому випадку?
skd

59

Рішення для Linux, щоб отримати посилання для завантаження останнього випуску (працює лише у тому випадку, якщо у випуску є лише один актив)

curl -s https://api.github.com/repos/boxbilling/boxbilling/releases/latest | grep browser_download_url | cut -d '"' -f 4

7
Ще одна додаткова помилка в конвеєрі знайде файл для вашої дистрибуції та архітектури. Для атомного редактора тексту на 64-розрядному Ubuntu:curl -s https://api.github.com/repos/atom/atom/releases | grep browser_download_url | grep '64[.]deb' | head -n 1 | cut -d '"' -f 4
варильні панелі

3
Більше немає браузера_download_url. Ви можете використовувати tarball_url зараз. curl -s https://api.github.com/repos/git-ftp/git-ftp/releases | grep tarball_url | head -n 1 | cut -d '"' -f 4
Майкель

4
@maikel grepping для браузера_download_url все ще працює для мене.
Лео Лам

@ léo-lam Ви праві. Тільки якщо у вас немає активів, ви можете використовувати tarball_url, щоб отримати вихідний код.
maikel

Ви можете завантажити лише останню версію, щоб уникнути | head -n 1 api.github.com/repos/boxbilling/boxbilling/releases/latest
ya.teck

29

Ви можете зробити запит ajax, щоб отримати URL-адресу завантаження останньої версії за допомогою API GitHub Releases . Він також показує, коли він був випущений та кількість завантажень:

function GetLatestReleaseInfo() {
  $.getJSON("https://api.github.com/repos/ShareX/ShareX/releases/latest").done(function(release) {
    var asset = release.assets[0];
    var downloadCount = 0;
    for (var i = 0; i < release.assets.length; i++) {
      downloadCount += release.assets[i].download_count;
    }
    var oneHour = 60 * 60 * 1000;
    var oneDay = 24 * oneHour;
    var dateDiff = new Date() - new Date(asset.updated_at);
    var timeAgo;
    if (dateDiff < oneDay) {
      timeAgo = (dateDiff / oneHour).toFixed(1) + " hours ago";
    } else {
      timeAgo = (dateDiff / oneDay).toFixed(1) + " days ago";
    }
    var releaseInfo = release.name + " was updated " + timeAgo + " and downloaded " + downloadCount.toLocaleString() + " times.";
    $(".download").attr("href", asset.browser_download_url);
    $(".release-info").text(releaseInfo);
    $(".release-info").fadeIn("slow");
  });
}

GetLatestReleaseInfo();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a class="download" href="https://github.com/ShareX/ShareX/releases/latest">Download</a>
<p class="release-info"></p>

Вам важливо встановити URL-адресу кнопки за замовчуванням на сторінку випусків (наприклад, https://github.com/ShareX/ShareX/releases/latest ), тому якщо браузер не підтримує ajax (або javascript) або занадто повільний для отримати URL-адресу, кнопка завантаження все одно працюватиме.

Коли запит Ajax завершиться, URL-адреса цієї кнопки автоматично зміниться на URL-адресу прямого завантаження.

Редагувати:

Я також створив сторінку завантажень, на якій показано кілька релізів, які ви можете знайти тут: https://getsharex.com/downloads/

Вихідний код його: https://github.com/ShareX/sharex.github.io/blob/master/js/downloads.js


Класно. Чи знаєте ви, чому це може не працювати? curl -s https://api.github.com/repos/DataTables/DataTables/releases/latest
Вольте

Тому що у вас немає жодного випуску. Перевірте: api.github.com/repos/DataTables/DataTables/releases
Jaex

Funky ... github.com/DataTables/DataTables/releases демонструє купу випусків. Там має бути якась неоднозначність.
Вольте

Ні, це лише теги. Випусків немає.
MrD

2
github.com/jquery/jquery/releases вони не мають жодних версій. Це просто теги версій.
Jaex

15

З командного рядка, що використовує curlі jq, отримує перший файл останнього випуску:

curl -s https://api.github.com/repos/porjo/staticserve/releases/latest | \
  jq --raw-output '.assets[0] | .browser_download_url'

1
jq --raw-outputце більш чистий спосіб скинути цитати. Якщо ви хочете лише найновіше, це дешевше взяти .../releases/latestта скинути .[0] | . Але отримання всіх релізів дозволяє запити на кшталт jq '.[] | .assets[] | .browser_download_url | select(endswith(".deb"))'...
Бені Чернявський-Паскін

Завдяки Бені, я розширив це для захоплення останньої Докер-COMPOSE, curl --silent "https://api.github.com/repos/docker/compose/releases/latest" | jq --arg PLATFORM_ARCH "$(echo `uname -s`-`uname -m`)" -r '.assets[] | select(.name | endswith($PLATFORM_ARCH)).browser_download_url' | xargs sudo curl -L -o /usr/local/bin/docker-compose --url . Закінченням було магія, і використання арки дозволяє мені ігнорувати файли what.sha256, які зазвичай присутні без цього |head -n 1.
dragon788

8

Ще одне рішення Linux з використанням curl і wget для завантаження одного бінарного файлу зі сторінки останнього випуску

curl -s -L https://github.com/bosun-monitor/bosun/releases/latest | egrep -o '/bosun-monitor/bosun/releases/download/[0-9]*/scollector-linux-armv6' | wget --base=http://github.com/ -i - -O scollector

Пояснення:

curl -s -L це мовчки завантажувати останню версію HTML (після наступного перенаправлення)

egrep -o '...' використовує регулярний гекс для пошуку потрібного файлу

wget --base=http://github.com/ -i - перетворює відносний шлях від конвеєра до абсолютної URL-адреси

і -O scollectorвстановлює потрібне ім'я файлу.

можливо, зможете додати -N до завантаження лише у випадку, якщо файл новітній, але S3 видав помилку 403 Заборонено.


3
Моя мета - зробити посилання на веб-сайті, який завжди вказує на останню версію. Команда linux цього не дозволить.
Крістіан Рондо

1
Це те, що я шукав, але ви повинні переконатися, що у вас є правильні символи втечі для макіяжів та точок під час використання grep.
Т. Томас

@TdotThomas спасибі, ось натяк, який мені знадобився для номерів релізів semver, щоб уникнути періодів, \.наприклад, потрібні 2.2.0/download/[0-9\.]*/
Jeff Puckett

Ні, це не так. Немає втечі. Але я б припустив необов'язковий vпрефікс, як тег v0.11.0. Просто введіть curl -s -L https://github.com/bosun-monitor/bosun/releases/latest | egrep -o '/bosun-monitor/bosun/releases/download/[v]?[0-9.]*/scollector-linux-armv6' | wget --base=http://github.com/ -i - -O scollectorсвій CLI, і він відмінно працює. Дякую, Грег !!
MS Berends

7

Як зазначалося раніше, jq корисний для цього та інших API REST .

tl; dr - детальніше нижче

Якщо припустити, що ви хочете випустити macOS :

URL=$( curl -s "https://api.github.com/repos/atom/atom/releases/latest" \
   | jq -r '.assets[] | select(.name=="atom-mac.zip") | .browser_download_url' )
curl -LO "$URL"

Рішення для випуску атомів

Зауважте, що кожне репо може мати різні способи забезпечення бажаного артефакту, тому я продемонструю для добре себе подібного атома .

Опублікуйте назви активів, опублікованих

curl -s "https://api.github.com/repos/atom/atom/releases/latest" \
    | jq -r '.assets[] | .name'

atom-1.15.0-delta.nupkg
atom-1.15.0-full.nupkg
atom-amd64.deb
...

Отримайте URL-адресу для завантаження потрібного ресурсу

Нижче atom-mac - мій бажаний актив через jqselect(.name=="atom-mac.zip")

curl -s "https://api.github.com/repos/atom/atom/releases/latest" \
    | jq -r '.assets[] | select(.name=="atom-mac.zip") | .browser_download_url'

https://github.com/atom/atom/releases/download/v1.15.0/atom-mac.zip

Завантажте артефакт

curl -LO "https://github.com/atom/atom/releases/download/v1.15.0/atom-mac.zip"

jq Ігровий майданчик

jq синтаксис може бути важким. Ось майданчик для експериментів із jqвищезазначеним: https://jqplay.org/s/h6_LfoEHLZ

Безпека

Вам слід вжити заходів для забезпечення дійсності завантаженого артефакту через sha256sum та gpg , якщо це можливо.


7

Рішення за допомогою (внутрішнього) wget, щоб отримати вміст HTML, відфільтруйте його до zip-файлу (з egrep), а потім завантажте zip-файл (із зовнішнім wget).

wget https://github.com/$(wget https://github.com/<USER>/<PROJECT>/releases/latest -O - | egrep '/.*/.*/.*zip' -o)

6

Просто скористайтеся однією з URL-адрес нижче, щоб завантажити останню версію: (наприклад, взяли URL-адреси з проекту бокс-рахунків): https://api.github.com/repos/boxbilling/boxbilling/releases

Завантажте останню версію як zip: https://api.github.com/repos/boxbilling/boxbilling/zipball

Завантажте останню версію у вигляді тарболу: https://api.github.com/repos/boxbilling/boxbilling/tarball

Клацніть один з URL-адрес, щоб миттєво завантажити останню версію. Як я писав ці рядки, це зараз: boxbilling-boxbilling-4.20-30-g452ad1c [.zip / .tar.gz]

ОНОВЛЕННЯ: Знайдено інший URL-адрес у моїх логінах (див. Приклад вище) https://codeload.github.com/boxbilling/boxbilling/legacy.tar.gz/master


4
це
репост

5

Неможливо за підтримкою GitHub станом на 2018-05-23

Зв’язався з support@github.com 2018-05-23 з повідомленням:

Чи можете ви просто підтвердити, що немає жодного способу, крім того, що возитися з API?

і вони відповіли:

Дякуємо, що звернулися. Ми рекомендуємо використовувати API для отримання останньої версії, оскільки такий підхід стабільний, задокументований і не підлягає зміні незабаром:

https://developer.github.com/v3/repos/releases/#get-the-latest-release

Я також буду продовжувати відстежувати це за адресою: https://github.com/isaacs/github/isissue/658

Рішення Python без будь-яких залежностей

Міцний і портативний:

#!/usr/bin/env python3

import json
import urllib.request

_json = json.loads(urllib.request.urlopen(urllib.request.Request(
    'https://api.github.com/repos/cirosantilli/linux-kernel-module-cheat/releases/latest',
     headers={'Accept': 'application/vnd.github.v3+json'},
)).read())
asset = _json['assets'][0]
urllib.request.urlretrieve(asset['browser_download_url'], asset['name'])

Дивитися також:

Також врахуйте попередні випуски

/latestне бачить попередніх релізів, але це легко зробити, оскільки /releasesспочатку показує останній:

#!/usr/bin/env python3

import json
import urllib.request

_json = json.loads(urllib.request.urlopen(urllib.request.Request(
    'https://api.github.com/repos/cirosantilli/linux-kernel-module-cheat/releases',
     headers={'Accept': 'application/vnd.github.v3+json'},
)).read())
asset = _json[0]['assets'][0]
urllib.request.urlretrieve(asset['browser_download_url'], asset['name'])

3

На довідковій сторінці " Пов’язання до випусків " згадується кнопка "Останній реліз", але це не отримує посилання на завантаження.

https://github.com/reactiveui/ReactiveUI/releases/latest

Для цього вам потрібно спочатку отримати найновіший тег (як зазначено в " URL-адресі GitHub для останнього випуску файлу для завантаження ? "):

latestTag=$(git describe --tags `git rev-list --tags --max-count=1`)

curl -L https://github.com/reactiveui/ReactiveUI/releases/download/$latestTag/ReactiveUI-$latestTag.zip

2
Це все ще потребує натискання нової версії gh-pagesгілки щоразу, коли робиться новий реліз; мета полягає в тому, щоб стати статичне посилання, яке я можу використовувати, щоб просто "звернутися до останньої версії". На даний момент найкращим моїм варіантом є лише звернення до сторінки випусків.
Крістіан Рондо

@ChristianRondeau Я згоден. Я не бачив ніде в API способу прямого посилання на "останню" архів випусків повного URL-адреси.
VonC

Все-таки дякую за пораду; якщо кращих відповідей не буде, я, мабуть, в кінцевому підсумку буду сценарій для оновлення gh-сторінок за допомогою вашого сценарію.
Крістіан Рондо

2

у PHP - переадресація на завантаження останнього випуску. Просто надіньте свій веб-простір

<?php

/**
 * Download latest release from github release articats
 * License: Public Domain
 */

define('REPO', 'imi-digital/iRobo');

$opts = [
    'http' => [
        'method' => 'GET',
        'header' => [
            'User-Agent: PHP'
        ]
    ]
];

$context = stream_context_create($opts);

$releases = file_get_contents('https://api.github.com/repos/' . REPO . '/releases', false, $context);
$releases = json_decode($releases);

$url = $releases[0]->assets[0]->browser_download_url;

header('Location: ' . $url);

2

Якщо ви хочете скористатися просто, curlви можете спробувати з -w '%{url_effective}'цим роздрукувати URL-адресу після ланцюга переадресації (з наступним згортанням, якщо ви посилаєтесь на нього -L). Так, наприклад

curl -sLo /dev/null -w '%{url_effective}' https://github.com/github-tools/github/releases/latest

виходи https://github.com/github-tools/github/releases/tag/v3.1.0.


2

Тепер Github підтримує статичні посилання для завантаження окремих файлів з останнього випуску: https://help.github.com/en/articles/linking-to-releases

https://github.com/USER/PROJECT/releases/latest/download/package.zip

Таку ж відповідь був уже відправив за 6 місяців до: stackoverflow.com/questions/24987542 / ...
wisbucky

Дякую за те, що я звернув це на увагу @wisbucky, я відхилив це тоді, оскільки це звучало як власна реалізація від розробника, а не хтось із StackOverflow!
Крістіан Рондо

2

Як і більшість відвідувачів цього питання, я був абсолютно розчарований тим, що знайшов спосіб повністю автоматизувати завантаження ОСНОВНОГО версійного випуску або репо в Github. Перевага цього рішення полягає в тому, що вам не потрібно вказувати жоден номер випуску чи тегу - він просто захопить НАЙКРАЩІЙ .

Я провів тестування з використанням наступних користувачів Github & repo:

" f1linux " = Користувач Github
" pi-ap " = Repo

Довільна назва каталогів, в яку зберігається репо, задається у:

--one-top-level="pi-ap"

Пряме:

Використовуючи інструменти " Веб-розробник " Firefox (3 бари у верхньому правому куті), у розділі " Мережа ", який я знайшов, я https://api.github.comпереспрямовувався https://codeload.github.com, тож, переконуючись curlдо, tarя зміг схопити останню версію репо, і зберегти її до передбачуваного імені. ним можна керувати:

curl https://codeload.github.com/f1linux/pi-ap/legacy.tar.gz/master | tar xzvf - --one-top-level="pi-ap" --strip-components 1

Прямі:

Після того, як я домігся повністю автоматизованих завантажень останнього версійного випуску за допомогою Прямої URL-адреси, я звернув увагу на те, щоб досягти того ж з перенаправленням Github:

curl -L https://api.github.com/repos/f1linux/pi-ap/tarball | tar xzvf - --one-top-level="pi-ap" --strip-components 1

Кращий спосіб:

Однак, зауважте, згідно коментаря Вона нижче, що INDIRECT є кращим методом

Подальша перевірка:

Щоб переконатись, що мої результати були відтворені для інших репонованих репортажів Github, ті ж тести були успішно виконані для doctlінструментарію api інструментів Digital Ocean (саме з цього і почалося все вправу!):

І DIRECT, і INDIRECT працюють в тій же формі, що і вище, просто змінюючи ім’я користувача & repo:

Пряме:

curl https://codeload.github.com/digitalocean/doctl/legacy.tar.gz/master | tar xzvf - --one-top-level="doctl" --strip-components 1 

Прямі:

curl -L https://api.github.com/repos/digitalocean/doctl/tarball | tar xzvf - --one-top-level="doctl" --strip-components 1

Цікаво. Отримано. Я не знав про codeload, хоча з допомогою API - як і раніше рекомендується: stackoverflow.com/a/60198721/6309
VonC

Спочатку я зіткнувся з горем із перенаправленням, і, як зазначалося у відповіді, інструменти "Веб-розробник" Firefox змусили мене йти правильним шляхом. Але не міг зупинитися на цьому, довелося змусити його працювати з перенаправленням. Дякуємо за підсумки - найбільше зобов’язані!
F1Linux

1
@VonC Просто додав ваші відгуки до відповіді. Я про це абсолютно не знав. Дякуємо, що вказали на це!
F1Linux

1

Я хочу завантажити випуски з README.mdфайлу в описі сховища. Там я не можу виконати JavaScript.

Я можу додати такі посилання на файл README або сторінки github для всіх моїх сховищ:

  • https://niccokunzmann.github.io/download_latest/<USER>/<REPOSITORY>/<FILE>
    Завантажує останній файл випуску із сховища.
  • https://niccokunzmann.github.io/download_latest/<FILE>
    Це працює, тому що встановлено посилання JavaScript, і репозиторій, який потрібно завантажити, визначається через document.referrer. Таким чином, посилання також буде працювати для вилок.

Ви можете знайти вихідний код тут , виделкою або просто скористатися моїм репо.


1
Це досить розумна ідея :) вона не працюватиме при спільному використанні посилань або використанні curl або лайків, але цю ідею можна зробити на сторінках github проекту.
Крістіан Рондо

1
Оскільки це можливо як веб-сайт JavaScript, можна також написати службу, яка переспрямовує. download-service.com/organization/repository/artifact
Користувач

0

У випадку, якщо репо використовує лише теги замість випуску - пор. jQuery - рішення, які базуються на одній URL-адресі, не працюють.

Натомість потрібно запитувати всі теги, сортувати їх та будувати URL-адресу для завантаження. Я реалізував таке рішення для мови Go та jQuery repo: Посилання на Github .

Можливо, це комусь допомагає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.