Parfois, il est préférable et/ou obligatoire d'héberger des dizaines d'applications sur un seul serveur. Ne dis pas que c'est « vrai » ou « faux », je dis seulement que cela arrive.

Un inconvénient de cette configuration est que le message d'erreur Waiting for the script in task [TASK ID] to finish as this script requires that no other Octopus scripts are executing on this target at the same time s'affiche chaque fois que plusieurs déploiements sur la même machine sont en cours d'exécution. Il semble qu'Octopus Deploy se bat contre lui-même.

Comment puis-je configurer Octopus Deploy pour qu'il attende la fin d'un déploiement avant de démarrer le suivant ?

2
bwalk2895 19 févr. 2020 à 18:33

2 réponses

Meilleure réponse

Avant de plonger dans la réponse, il est important de comprendre pourquoi ce message apparaît en premier lieu. Chaque fois qu'une étape est exécutée sur une cible de déploiement, le tentacule crée un "Mutex" pour empêcher d'autres projets d'interférer avec lui. L'un des premiers cas d'utilisation était la mise à jour de la métabase IIS lors d'un déploiement. Dans certains cas, les mises à jour simultanées provoqueraient des erreurs aléatoires.

Option 1 : Désactiver le Mutex

Nous avons vu des cas où le mutex est la cause du retard. Le mutex est appliqué par étape, pas par déploiement. Il est courant de voir une situation où il semble qu'Octopus "saute" entre les déploiements. Selon le nombre de déploiements simultanés, cela peut ralentir le déploiement. La pensée naturelle est de désactiver complètement le mutex.

Il est possible de désactiver le mutex en ajoutant la variable OctopusBypassDeploymentMutex et en la définissant sur True. Cette variable peut exister dans un projet spécifique ou dans un ensemble de variables.

By Passing The Tentacle Mutex

Plus de détails sur ce que fait cette variable peuvent être trouvés dans ce document. Si vous désactivez le mutex, veuillez le tester et surveiller tout échec. Pour la plupart, nous ne voyons pas de problèmes de désactivation du mutex, mais cela s'est produit de temps en temps. Cela dépend d'une foule d'autres facteurs tels que le type d'application et la version de Windows.

Option 2 : Tirez parti du déploiement d'une étape de publication

Une autre option consiste à coordonner les projets à l'aide du deploy une étape de libération. Cela fonctionne généralement mieux lorsque les projets déployés font partie de la même suite d'applications. Dans l'exemple de capture d'écran ci-dessous, j'ai cinq projets de "déploiement":

  • Azure Worker IaC
  • Travailleur de base de données IaC
  • IaC des nœuds de calcul Kubernetes
  • Script Worker IaC
  • OctoÉtude

Le projet Unleash the Kraken coordonne les déploiements de ces projets.

Unleash the Kraken

Il le fait en utilisant l'étape Deploy a Release. Tout d'abord, il lance toute l'infrastructure, puis il déploie l'application.

Deploy a Release Step

Cela ne fonctionnera pas aussi bien si le serveur héberge 50 applications disparates.

Option 3 : tirer parti de l'API pour vérifier les déploiements en cours

La dernière option consiste à inclure une étape au début de chaque projet qui atteint l'API pour vérifier les versions actives des cibles de déploiement pour la cible de déploiement. Si un déploiement actif est trouvé, attendez qu'il soit terminé.

Vous pouvez le faire en appuyant sur le point de terminaison https://[YOUR URL]/api/[SPACE ID]/machines/[Machine Id]/tasks?skip=0&name=Deploy&states=Executing%2CCancelling&spaces=[SPACE ID]&includeSystem=false. Cela vous indiquera toutes les tâches actives en cours d'exécution pour une machine spécifique.

Vous pouvez obtenir Machine Id en tirant la valeur de Octopus.Deployment.Machines. Vous pouvez obtenir Space Id en tirant la valeur de Octopus.Space.Id.

Le pseudo-code de cette approche pourrait ressembler à ceci (je n'inclus pas le code réel car vos exigences pourraient être très différentes).

activeDeployments = true

while (activeDeployments)
{
      activeDeployments = false
      foreach(machineId in Octopus.Deployment.Machines)
      {
             activeTasks = https://[YOUR URL]/api/[Octopus.Space.Id]/machines/[Machine Id]/tasks?skip=0&name=Deploy&states=Executing%2CCancelling&spaces=[Octopus.Space.Id]&includeSystem=false

             if (activeTasks.Count > 0)
             {
                      activeDeployments = true
             }
      }

      if (activeDeployments = true)
      {
            Sleep for 5 seconds
      }
}
2
bwalk2895 26 févr. 2020 à 13:45

J'ai eu ce message parce que j'ai appuyé sur la limite des tâches sur le serveur Octopus.

Dans Octopus\Configuration\Nodes, définissez la limite de tâches sur 1 pour avoir 1 déploiement à la fois, même avec des agents sur des serveurs différents. Le message s'affichera en permanence

Ou augmentez simplement cette valeur pour éviter que le message ne se produise.

0
Mariusz 20 mai 2020 à 19:11