Question

De nombreux programmes incluent un programme de mise à jour automatique, dans lequel le programme recherche occasionnellement des mises à jour en ligne, puis télécharge et applique les mises à jour trouvées. Les bogues de programme sont corrigés, les fichiers de support sont modifiés et les choses sont (généralement) améliorées.

Malheureusement, malgré tous les efforts que je fais, je ne peux trouver aucune information sur ce processus. Il semble que les programmes de mise à jour automatique mis en œuvre aient été propriétaires ou non considérés comme importants.

Il semble assez facile de mettre en œuvre le système qui recherche les mises à jour sur un réseau et les télécharge si elles sont disponibles. Cette partie de la mise à jour automatique changera considérablement d'une mise en œuvre à l'autre. La question est de savoir quelles sont les différentes approches d'application des applications . Juste en téléchargeant des fichiers et en remplaçant les anciens par de nouveaux, en exécutant un script de migration qui a été téléchargé, en réparant des parties du système, etc.? Les concepts sont préférés, mais des exemples en Java, C, Python, Ruby, Lisp, etc. seraient appréciés.

Était-ce utile?

La solution

Je pense que "langage agnostique" va être un facteur limitant ici. Les applications ont tellement de formes et de tailles qu’il n’ya pas de solution unique. J'ai implémenté plusieurs programmes de mise à jour automatique dans plusieurs langues, et aucune n’était similaire.

La philosophie la plus générale est que l’application vérifie auprès de certains lieux de résidence (adresse Web, requête Web, emplacement du réseau d’entreprise, etc.) pour demander si sa version est actuelle ou quelle est la version la plus récente. Si la réponse appelle une mise à jour, ce processus sera différent pour chaque situation.

Une alternative populaire consiste à inviter l’emplacement personnel à exécuter un script lors du lancement de l’application. Le script peut vérifier la version, télécharger des mises à jour si nécessaire et demander des informations sur l'utilisation, par exemple.

Nous pouvons probablement mieux vous aider si vous réduisez les paramètres.

UPDATE: L’approche du "correctif" Cela dépend également de la nature de l’application, et la diversité est très grande ici. Si vous avez un seul fichier exécutable, par exemple, il est probablement plus pratique de remplacer l'exécutable. Si votre application contient plusieurs fichiers, vous devez rechercher des moyens de réduire le nombre de fichiers remplacés. Si votre application est hautement personnalisée ou paramétrée, vous devez vous efforcer de minimiser les efforts de reconfiguration. Si votre application utilise du code interprété (telle qu'une application VBA Excel ou une application MS Access MDB), vous pourrez peut-être remplacer certaines parties du code. Dans une application Java, il suffit parfois de remplacer un fichier JAR, voire un sous-ensemble du contenu du fichier JAR. Vous aurez également besoin d'un moyen de reconnaître la version actuelle du client et de la mettre à jour correctement. Je pourrais continuer encore et encore, mais j'espère que vous voyez ce que je veux dire à propos de la diversité. C’est l’une des nombreuses fois où la meilleure réponse commence habituellement par "Eh bien, ça dépend ...!" C’est pourquoi tant de réponses incluent "Veuillez affiner les paramètres".

Autres conseils

Veillez également à prendre en compte les implications en termes de sécurité liées à la suppression d'informations sur la mise à jour, ainsi que les fichiers binaires de la mise à jour eux-mêmes.

Avez-vous confiance en la source du téléchargement? Vous téléphonez peut-être à la maison pour obtenir votre mise à jour, mais que se passe-t-il s'il y a un homme au milieu qui redirige vers un serveur malveillant? Une connexion sécurisée HTTPS ou similaire peut aider, mais il est recommandé de vérifier les bits que vous téléchargez éventuellement en vérifiant la signature numérique.

D'abord, vous avez besoin d'un fichier sur le site Web d'accueil de votre application avec la dernière version. La meilleure façon, à mon avis, d’avoir une table SQL spéciale pour cette tâche et de la remplir automatiquement après la publication de la nouvelle version / de la construction de nuit complète. Votre application crée un nouveau fil qui demande un lien http intégré à la version et se compare au courant. Dans .NET, vous pouvez utiliser un code comme celui-ci:

Version GetLatestVersion() {
HttpWebRequestrequest = (HttpWebRequest)WebRequest.Create(new Uri(new Uri(http://example.net), "version.txt));
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (request.HaveResponse)
{
  StreamReader stream = new StreamReader(response.GetResponseStream(), Encoding.Default);
  return new Version(stream.ReadLine());
}
else
{
  return null;
}
}

Version latest = GetLatestVersion();
Version current = new Version(Application.ProductVersion);
if (current < latest)
{
  // you need an update
}
else
{
  // you are up-to-date
}

Dans cet exemple, version.php ne contient qu'une chaîne simple, telle que 1.0.1.0.

Autre astuce que je peux donner: comment télécharger une mise à jour. J'aime beaucoup l'idée suivante: dans les ressources de votre application, il existe une chaîne de code CLR que vous compilez à la volée (à l'aide de CodeDom) dans un dossier temporaire, l'application principale l'appelle et se ferme. Updater lit les arguments, les paramètres ou le registre et télécharge les nouveaux modules. Et appelle l'application principale qui supprime tous les fichiers temporaires. Fait!

(Mais ici, tout est à propos de .NET)

Les solutions les plus simples (utilisées par de nombreux programmes) exécutent le programme de désinstallation de la version précédente et le programme d’installation du nouveau (éventuellement, en ignorant les questions auxquelles l’utilisateur a déjà répondu, comme le CLUF). Le seul problème est que la nouvelle version doit pouvoir lire les options de configuration de l'ancienne version.

De plus, sous Windows, vous ne pouvez pas supprimer un fichier exécutable en cours d'utilisation. Par conséquent, vous voudrez probablement supprimer un petit exécutable dans le dossier Temp, qui exécute l'ensemble du processus, puis le supprime à la fin de l'instance de la nouvelle version qui a été lancée (ou tout simplement enregistrez-la pour qu'elle soit supprimée lors du prochain redémarrage ).

La méthode la plus simple consiste à demander à votre programme d’interroger un serveur (site Web) pour savoir s’il existe une mise à jour. En cas de mise à jour, vous pouvez afficher un message à l’utilisateur lui demandant de télécharger une version plus récente et fournissant un lien.

Une solution alternative plus complexe serait de créer un petit service Windows (ou démon Unix) qui vérifie périodiquement s'il existe des mises à jour. Ce service peut télécharger la mise à jour et lancer le programme d'installation.

L’architecture générale repose sur le fait que vous contrôlez un serveur central qui connaît la dernière version et où l’obtenir. Ensuite, les programmes interrogent le serveur. Je ne vais pas inclure d’exemple de code car il est très défendant sur le serveur et le format que vous choisissez. Ce n'est pas si difficile que ça.

Ce n’est pas vraiment une réponse complète, mais plutôt un exemple de mécanisme de mise à jour automatique que j’ai récemment mis en place. La situation est un peu différente de la tradition des applications utilisateur de type Firefox, car c’était un outil interne utilisé au travail.

En gros, c'est un petit script qui gère une file de branches Subversion à construire et à emballer dans un programme d'installation. Il lit un petit fichier où les noms des branches sont écrits, prend le premier, le réécrit à la fin du fichier et lance le processus de construction, qui implique l’appel de plusieurs scripts. La configuration de chaque branche à construire est écrite dans un fichier .INI, stocké dans un référentiel Subversion avec l'outil lui-même.

Cet outil fonctionnant sur plusieurs ordinateurs, je voulais un moyen de le mettre à jour automatiquement sur tous les ordinateurs dès que j'ai apporté une modification à l'outil lui-même ou aux scripts de configuration.

La façon dont j'ai implémenté la procédure était simple: lorsque je lance l'outil, il devient une "coque externe". Cette coque extérieure fait 2 choses très simples:

  • svn update sur lui-même et sur les fichiers de configuration
  • se relance à nouveau, cette fois en tant que "shell interne", celui qui gère réellement une configuration (puis se ferme à nouveau).

Ce système très simple de mise à jour moi-même dans une boucle nous a très bien servis depuis quelques mois maintenant. C'est très élégant, car il est autonome: le programme de mise à jour automatique est le programme lui-même. Parce que " coque extérieure " (la partie de mise à jour automatique) est si simple, peu importe qu’elle ne profite pas des mises à jour comme la "coque interne". (qui est exécuté à chaque fois à partir du fichier source mis à jour).

Une chose qui n’a pas vraiment été mentionnée est que vous devriez sérieusement considérer que l’utilisateur exécutant votre programme n’a peut-être pas suffisamment de privilèges pour le mettre à jour. Cela devrait être assez commun au moins pour les utilisateurs professionnels, probablement moins pour les utilisateurs particuliers.

Je travaille toujours avec un compte limité (auto-imposé) pour des raisons de sécurité. Cela me fait chier de constater que la plupart des auto-programmes de mise à jour se contentent de supposer que je m'exécute en tant qu'administrateur. manière de réaliser la mise à jour autre que de fermer le programme et de le réexécuter dans un contexte administratif. La plupart ne cachent même pas la mise à jour téléchargée et doivent tout refaire.

Il serait bien mieux que le système de mise à jour automatique demande simplement les informations d'identification de l'administrateur en cas de besoin et poursuive la tâche.

La mise à jour automatique étant un scénario courant, la plupart des langues disposent d'au moins un package pour la prendre en charge. (Ci-dessous, je liste certains des paquets disponibles.)

L’une des bonnes idées est la distribution ClickOnce pour .NET, c’est un programme d’installation qui met en sandbox votre application et l’installe dans le contexte de l’utilisateur, donc aucun droit d’administrateur n’est requis. Vous pouvez configurer ClickOnce dans votre publication pour vérifier les mises à jour que chaque application démarre.

Java dispose de Java Web Start , qui offre les mêmes fonctionnalités. type de fonctionnalité pour les applets java.

Delphi a publié de nombreux articles sur la mise à jour automatique, Torry a dressé une liste des composants WebUpdate , par exemple, GoUpdater semble avoir un très large éventail de fonctionnalités.

Ils utilisent tous un partage de site Web / réseau pour rechercher une nouvelle version, puis récupèrent un correctif ou un fichier d'installation complet et l'exécutent. Vous devez donc essayer de trouver un package intéressant pour votre application, afin d’éviter les problèmes liés au développement et à la maintenance de votre propre solution.

Dans un paramètre Java-Webstart, vous démarrez un fichier JNLP qui déclenche ensuite le téléchargement des fichiers Jar nécessaires à l'exécution de l'application. Webstart Everytime vérifie s'il existe des versions plus récentes des fichiers JAR et les téléchargera en remplacement des versions mises en cache localement. Avec un outil nommé jardiff, vous ne créerez que des diffs vers les nouveaux jars et vous les distribuerez via le serveur (par exemple, vous ne recevrez qu'une mise à jour).

Avantages:

  • toujours à jour

Inconvénients:

  • vous avez besoin d’un serveur d’application (tomcat, JBoss) pour pouvoir distribuer les fichiers
  • vous avez besoin d'une connexion Internet pour pouvoir utiliser l'application

La lecture de la réponse de Carl Seleborgs m’a donné quelques idées sur l’utilité d’un dépôt de code générique.

svn est fourni avec un outil appelé svnsync, qui se comporte en quelque sorte comme une exportation svn tout en gardant une trace de la révision actuelle de votre exportation.

Quelqu'un pourrait utiliser ce système pour extraire uniquement les fichiers modifiés de la révision réelle de l'utilisateur.

En réalité, vous aurez un référentiel avec les fichiers binaires compilés, et l'exécution de svnsync ne récupérera que les fichiers binaires modifiés. Il pourrait également être en mesure de fusionner des modifications locales dans des fichiers de configuration textuels avec de nouvelles options de configuration.

La fonction d’installation d’un correctif dans un programme est l’une des fonctions de base d’un programme d’installation. Le logiciel d’installation est documenté à de nombreux endroits, mais généralement, installation par installation: il s'agit du programme d'installation de Microsoft . (avec Install Shield Extensions), Ruby gems , fichiers .jar Java , les différents systèmes de gestion de paquets Linux ( RPM , Apt-get ) et autres.

Ce sont tous des systèmes complexes qui résolvent le problème du programme de correction en général, mais pour des systèmes légèrement différents. Pour décider de ce qui vous convient le mieux, déterminez le système auquel votre application ressemble le plus. Rouler soi-même, c'est bien, mais regarder ces systèmes est un point de départ.

Vous pouvez écrire un module interne de votre application pour effectuer des mises à jour. Vous pouvez écrire une mini application externe pour effectuer des mises à jour.

Regardez également la technologie de compilation .NET à la volée, elle permet de créer une telle mini-application à la volée à la demande. Par exemple, http://fly.sf.net/

Je vais assumer la réponse pour Windows.

Cette méthode semble bien fonctionner.

Dans le programme d'installation, faites:
1. Créez un service de démarrage manuel exécuté en tant que LocalSystem qui, une fois démarré, effectue la mise à jour puis s’arrête.
2. Modifiez les autorisations du service afin que tous les utilisateurs puissent démarrer le service (si tous les utilisateurs doivent pouvoir mettre à jour leurs droits d'administrateur sans préavis).
3. Modifiez le programme principal pour vérifier les mises à jour au démarrage à l'aide d'un mécanisme simple. S'il détecte une mise à jour, indiquez si l'utilisateur souhaite l'appliquer.
4. Si l'utilisateur accepte la mise à jour, démarrez le service.

Si l'architecture le permet, créez un moyen de surveiller la mise à jour en cours d'exécution.

Si votre logiciel est à source ouverte et ciblez Linux ou les développeurs. Il est intéressant d’installer votre logiciel en tant que dépôt Git. Et le faire tirer de temps en temps ou à chaque fois que la branche stable est lancée.

Cela est particulièrement facile lorsque votre application est gérée via npm, sbt, mavan, stack, elm-package ou similaire.

Si vous recherchez une solution de mise à jour logicielle multiplate-forme, consultez www.updatenode.com .

Quelques faits saillants:

  • gratuit pour les projets Open Source
  • multiplate-forme & amp; Outil client de mise à jour Open Source
  • déjà localisé pour les langues les plus importantes
  • facile à intégrer et à manipuler
  • plate-forme de gestion basée sur le cloud pour définir et gérer les mises à jour
  • prend également en charge l'affichage de messages (informer sur les nouveaux événements, produits, etc.)
  • l'interface Web est ouverte (vous pouvez créer votre propre client à l'aide du service)
  • de nombreuses statistiques d'utilisation, telles que les systèmes d'exploitation utilisés, l'emplacement géographique, l'utilisation de la version, etc.
  • Mises à jour de l'API Android pour les applications mobiles

Essayez-le.

BTW, je fais partie de l'équipe de développement pour le client open source. :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top