Existe-t-il un lien vers GitHub pour télécharger un fichier dans la dernière version d'un référentiel?

137

En utilisant la fonction Release de GitHub , il est possible de fournir un lien pour télécharger une version spécifique du logiciel publié. Cependant, chaque fois qu'une version est faite, la page gh doit également être mise à jour.

Existe-t-il un moyen d'obtenir un lien vers un fichier spécifique de la dernière version d'un logiciel?

par exemple, ce serait un lien statique:

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

Ce que je voudrais, c'est quelque chose comme:

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

REMARQUE: la différence entre cette question et la dernière version de GitHub est que cette question demande spécifiquement l'accès au fichier, pas la dernière page de version de GitHub

Christian Rondeau
la source
1
Ceci est maintenant pris en charge nativement par Github (avec une légère différence dans le format de l'URL). Voir stackoverflow.com/questions/24987542/…
wisbucky

Réponses:

38

Quelques années de retard, mais je viens de mettre en place une simple redirection vers le support https://github.com/USER/PROJECT/releases/latest/download/package.zip. Cela devrait redirigés vers la dernière tagged package.zipactif communiqué. J'espère que c'est pratique!

Joshua Peek
la source
2
Documenté sur help.github.com/en/articles/linking-to-releases : Si vous souhaitez
Liam
4
Cependant, il serait utile que cette fonctionnalité fonctionne avec les noms d'actifs versionnés.
Liam
3
Notez que l'ordre est .../releases/latest/download/...inversé .../releases/download/v0.0.0/.... Vous ne pouvez pas simplement remplacer v0.0.0par latesten place.
wisbucky
2
@Joshua Peek Peut-être pourriez-vous étendre cela pour développer "LATEST" dans le nom de l'actif pour qu'il devienne la chaîne de version? Cela le rendrait utile pour les actifs avec des numéros de version dans leur nom.
jwatt
Qu'en est-il du téléchargement du dernier code source? Quel est le nom de l'actif dans ce cas?
skd le
59

Solution Linux pour obtenir le lien de téléchargement de la dernière version des actifs (fonctionne uniquement si la version ne contient qu'un seul élément)

curl -s https://api.github.com/repos/boxbilling/boxbilling/releases/latest | grep browser_download_url | cut -d '"' -f 4
Putna
la source
7
Un grep supplémentaire dans le pipeline trouvera le fichier pour votre distribution et votre architecture. Pour l' éditeur de texte atom sur Ubuntu 64 bits:curl -s https://api.github.com/repos/atom/atom/releases | grep browser_download_url | grep '64[.]deb' | head -n 1 | cut -d '"' -f 4
hobs
3
Il n'y a plus de browser_download_url. Vous pouvez utiliser tarball_url maintenant. curl -s https://api.github.com/repos/git-ftp/git-ftp/releases | grep tarball_url | head -n 1 | cut -d '"' -f 4
maikel
4
@maikel grepping pour browser_download_url fonctionne toujours pour moi.
Léo Lam
@ léo-lam Vous avez raison. Juste si vous n'avez pas d'actifs, vous pouvez utiliser tarball_url pour obtenir le code source.
maikel
Vous ne pouvez charger que la dernière version pour éviter | head -n 1 api.github.com/repos/boxbilling/boxbilling/releases/latest
ya.teck
29

Vous pouvez faire une requête ajax pour obtenir l'URL de téléchargement de la dernière version à l'aide de l' API des versions de GitHub . Il montre également quand il a été publié et le nombre de téléchargements:

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>

Il est important que vous définissiez l'URL du bouton par défaut sur la page des versions (comme https://github.com/ShareX/ShareX/releases/latest ), donc si le navigateur ne prend pas en charge ajax (ou javascript) ou est trop lent à obtenir l'URL, le bouton de téléchargement fonctionnera toujours.

Lorsque la requête Ajax se termine, l'URL de ce bouton se transforme automatiquement en une URL de téléchargement direct.

Éditer:

J'ai également créé une page de téléchargements qui montre plusieurs versions que vous pouvez trouver ici: https://getsharex.com/downloads/

Code source de celui-ci: https://github.com/ShareX/sharex.github.io/blob/master/js/downloads.js

Jaex
la source
Cool. Savez-vous pourquoi cela ne fonctionne pas? curl -s https://api.github.com/repos/DataTables/DataTables/releases/latest
Volte du
Parce que tu n'as aucune libération. Vérifiez: api.github.com/repos/DataTables/DataTables/releases
Jaex
Funky ... github.com/DataTables/DataTables/releases montre un tas de versions. Il doit y avoir là une certaine ambiguïté.
Volte
Non, ce ne sont que des balises. Il n'y a pas de communiqués.
MrD
2
github.com/jquery/jquery/releases ils n'ont aucune version. Ce ne sont que des balises de version.
Jaex
15

Depuis la ligne de commande en utilisant curlet jq, récupère le premier fichier de la dernière version:

curl -s https://api.github.com/repos/porjo/staticserve/releases/latest | \
  jq --raw-output '.assets[0] | .browser_download_url'
IanB
la source
1
jq --raw-outputest un moyen plus propre de supprimer les citations. Si vous ne voulez que le dernier, il est moins cher de récupérer .../releases/latestet de déposer le fichier .[0] | . Mais récupérer toutes les versions permet des requêtes comme jq '.[] | .assets[] | .browser_download_url | select(endswith(".deb"))'...
Beni Cherniavsky-Paskin
Merci Beni, j'étendu sur ce point pour saisir la dernière docker-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 . Le endswith était la magie et l'utilisation de l'arc me permet d'ignorer les fichiers what.sha256 qui sont généralement présents sans faire |head -n 1.
dragon788
8

Une autre solution Linux utilisant curl et wget pour télécharger un seul fichier binaire à partir de la dernière page de version

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

Explication:

curl -s -L consiste à télécharger silencieusement la dernière version HTML (après la redirection suivante)

egrep -o '...' utilise regex pour trouver le fichier souhaité

wget --base=http://github.com/ -i - convertit le chemin relatif du pipeline en URL absolue

et -O scollectordéfinit le nom de fichier souhaité.

peut être en mesure d'ajouter -Nau téléchargement uniquement si le fichier est plus récent mais que S3 donnait une erreur 403 Forbidden.

Greg Bray
la source
3
Mon objectif est de créer un lien sur un site Web qui pointe toujours vers la dernière version. Une commande linux ne permettra pas cela.
Christian Rondeau
1
C'est ce que je cherchais mais vous devez vous assurer d'avoir les bons caractères d'échappement pour les jokers et les points lors de l'utilisation de grep.
T. Thomas
@TdotThomas merci, c'est l'indice dont j'avais besoin pour que les numéros de version semver échappent aux périodes, \.par exemple 2.2.0 nécessaires/download/[0-9\.]*/
Jeff Puckett
Non, ce n'est pas le cas. Pas de caractère d'échappement. Mais je voudrais supposer une option vcomme préfixe, comme une étiquette v0.11.0. Entrez simplement 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 scollectordans votre CLI et cela fonctionne parfaitement. Merci Greg !!
MS Berends
7

Comme indiqué précédemment, jq est utile pour cela et d'autres API REST .

tl; dr - plus de détails ci-dessous

En supposant que vous vouliez la version 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"

Solution pour les versions atomiques

Notez que chaque dépôt peut avoir différentes manières de fournir l'artefact souhaité, donc je vais démontrer pour un bon comportement comme atom .

Obtenez les noms des actifs publiés

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
...

Obtenez l'URL de téléchargement de l'élément souhaité

Ci - dessous atom-mac est mon atout souhaité via 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

Téléchargez l'artefact

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

jq Playground

La syntaxe jq peut être difficile. Voici un terrain de jeu pour expérimenter ce qui jqprécède: https://jqplay.org/s/h6_LfoEHLZ

Sécurité

Vous devez prendre des mesures pour garantir la validité de l'artefact téléchargé via sha256sum et gpg , si possible.

Mike D
la source
7

Une solution utilisant (un wget interne) pour obtenir le contenu HTML, filtrez-le pour le fichier zip (avec egrep) puis téléchargez le fichier zip (avec le wget externe).

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

Utilisez simplement l'une des URL ci-dessous pour télécharger la dernière version: (a pris les URL du projet boxbilling par exemple): https://api.github.com/repos/boxbilling/boxbilling/releases

Téléchargez la dernière version en zip: https://api.github.com/repos/boxbilling/boxbilling/zipball

Téléchargez la dernière version en tarball: https://api.github.com/repos/boxbilling/boxbilling/tarball

Cliquez sur l'une des URL pour télécharger instantanément la dernière version. Au moment où j'ai écrit ces lignes, c'est actuellement: boxbilling-boxbilling-4.20-30-g452ad1c [.zip / .tar.gz]

MISE À JOUR: J'ai trouvé une autre URL dans mes fichiers journaux (réf. À l'exemple ci-dessus) https://codeload.github.com/boxbilling/boxbilling/legacy.tar.gz/master

Lahmizzar
la source
4
ce sont des repos pas des communiqués
Wobbles
5

Pas possible selon le support GitHub à partir du 23/05/2018

Contacté [email protected] le 23/05/2018 avec le message:

Pouvez-vous simplement confirmer qu'il n'y a pas d'autre moyen que de jouer avec l'API actuellement?

et ils ont répondu:

Merci d'avoir contacté. Nous vous recommandons d'utiliser l'API pour récupérer la dernière version, car cette approche est stable, documentée et n'est pas sujette à changement de sitôt:

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

Je continuerai également à suivre cela sur: https://github.com/isaacs/github/issues/658

Solution Python sans aucune dépendance

Robuste et portable:

#!/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'])

Voir également:

Pensez également aux pré-versions

/latestne voit pas les pré-versions, mais c'est facile à faire car /releasesmontre la dernière en premier:

#!/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'])
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
la source
3

La page d'aide Liens vers les versions mentionne un bouton "Dernière version", mais cela ne vous donne pas de lien de téléchargement.

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

Pour cela, vous devez d'abord obtenir la dernière balise (comme mentionné dans " URL GitHub pour la dernière version du fichier à télécharger ? "):

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

curl -L https://github.com/reactiveui/ReactiveUI/releases/download/$latestTag/ReactiveUI-$latestTag.zip
VonC
la source
2
Cela nécessite toujours de pousser une nouvelle version de la gh-pagesbranche chaque fois qu'une nouvelle version est faite; l'objectif est d'avoir un lien statique que je puisse utiliser pour simplement "faire référence à la dernière version". Pour le moment, ma meilleure option est de simplement consulter la page des versions.
Christian Rondeau
@ChristianRondeau Je suis d'accord. Je n'ai vu nulle part dans l'API un moyen de référencer directement l'URL complète de l'archive de la "dernière" version.
VonC
Encore, merci pour le tuyau; si aucune meilleure réponse n'est fournie, je finirai probablement par faire un script pour mettre à jour gh-pages en utilisant votre script.
Christian Rondeau
2

en PHP - redirigez vers la dernière version de téléchargement. Mettez simplement sur votre espace web

<?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);
Alex
la source
2

Si vous voulez utiliser juste, curlvous pouvez essayer avec -w '%{url_effective}'qui imprime l'URL après une chaîne de redirection (suivie de curl si vous l'invoquez avec -L). Donc, par exemple

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

sorties https://github.com/github-tools/github/releases/tag/v3.1.0.

Mapio
la source
2

Github prend désormais en charge les liens statiques pour télécharger des fichiers individuels à partir de la dernière version: https://help.github.com/en/articles/linking-to-releases

https://github.com/USER/PROJECT/releases/latest/download/package.zip
Kaloyan Raev
la source
La même réponse a déjà été publiée 6 mois auparavant: stackoverflow.com/questions/24987542/…
wisbucky
Merci d'avoir porté cela à mon attention @wisbucky, je l'ai ensuite rejeté car cela ressemblait à une implémentation personnalisée d'un développeur, pas de quelqu'un de StackOverflow!
Christian Rondeau
2

Comme la plupart des visiteurs de cette question, j'étais absolument frustré de trouver un moyen d'automatiser entièrement le téléchargement de la DERNIÈRE version versionnée ou d'un repo dans Github. L'avantage de cette solution est que vous n'avez pas besoin de spécifier de numéro de version ou de tag, il récupérera simplement le DERNIER .

J'ai effectué mes tests en utilisant l'utilisateur et le référentiel Github suivants:

" f1linux " = Utilisateur Github
" pi-ap " = Repo

Le nom de répertoire arbitraire dans lequel le dépôt est enregistré est défini dans:

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

DIRECT:

En utilisant les outils " Développeur Web " de Firefox (3 barres dans le coin supérieur droit), dans la section " Réseau ", j'ai trouvé que je https://api.github.comredirigeait vers https://codeload.github.com, donc en acheminant le curlvers, tarj'ai pu récupérer le dernier repo versionné et l'enregistrer sous un nom prévisible. il pourrait être opéré sur:

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

INDIRECT:

Après avoir réalisé des téléchargements entièrement automatisés de la dernière version versionnée à l'aide d'une URL DIRECTE , j'ai concentré mon attention sur la même chose avec la redirection de Github:

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

Méthode préférée:

Cependant, veuillez noter que selon le commentaire de Von ci-dessous, INDIRECT est la méthode préférée

Validation supplémentaire:

Pour m'assurer que mes résultats étaient reproductibles avec d'autres dépôts Github versionnés, les mêmes tests ont été exécutés avec succès pour la doctlboîte à outils api de Digital Ocean (ce qui a en fait commencé tout l'exercice!):

Les deux DIRECT et INDIRECT travail en utilisant la même forme que ci - dessus, juste changer le nom d' utilisateur et repo:

DIRECT:

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

INDIRECT:

curl -L https://api.github.com/repos/digitalocean/doctl/tarball | tar xzvf - --one-top-level="doctl" --strip-components 1
F1Linux
la source
Intéressant. J'ai voté pour. Je n'étais pas au courant du chargement de code, bien que l'utilisation de l'API soit toujours recommandée: stackoverflow.com/a/60198721/6309
VonC
J'ai eu du chagrin avec la redirection au départ et comme indiqué dans la réponse, les outils "Développeur Web" de Firefox m'ont mis sur la bonne voie. Je ne pouvais pas m'arrêter là, je devais le faire fonctionner avec la redirection. Merci pour le vote positif - le plus obligé!
F1Linux
1
@VonC Je viens d'ajouter vos commentaires à la réponse. J'ignorais totalement cela. Merci de l'avoir signalé!
F1Linux
1

Je souhaite télécharger les versions du README.mdfichier dans la description du référentiel. Là, je ne peux pas exécuter JavaScript.

Je peux ajouter des liens comme ceux-ci au fichier README ou aux pages github pour tous mes référentiels:

  • https://niccokunzmann.github.io/download_latest/<USER>/<REPOSITORY>/<FILE>
    Télécharge le dernier fichier de version à partir du référentiel.
  • https://niccokunzmann.github.io/download_latest/<FILE>
    Cela fonctionne car le référent JavaScript est défini et le référentiel à télécharger est déterminé document.referrer. Ainsi, le lien fonctionnera également pour les fourches.

Vous pouvez trouver le code source ici , fork ou simplement utiliser mon repo.

Utilisateur
la source
1
C'est une idée assez intelligente :) cela ne fonctionnera pas lors du partage de liens ou de l'utilisation de curl ou des likes, mais cette idée peut être faite dans les pages github du projet.
Christian Rondeau
1
Puisque cela est possible en tant que site Web JavaScript, on peut également écrire un service qui effectue une redirection. download-service.com/organization/repository/artifact
Utilisateur
0

Dans le cas où le dépôt n'utilise que des balises au lieu de release - cf. jQuery - les solutions basées sur une URL ne fonctionnent pas.

Au lieu de cela, vous devez interroger toutes les balises, les trier et construire l'URL de téléchargement. J'ai implémenté une telle solution pour le langage Go et le repo jQuery: Link to Github .

Peut-être que cela aide quelqu'un.

SommerIngénierie
la source