web-dev-qa-db-fra.com

Comment empêcher certains travaux Jenkins de s'exécuter simultanément?

J'ai quelques emplois qui utilisent une ressource partagée (base de données), ce qui peut parfois entraîner l'échec des générations dans le cas (rare) où les travaux sont déclenchés simultanément. 

Par exemple, pour les tâches A à E, peut-on spécifier que A et C ne doivent jamais être exécutés simultanément ?

Hormis la ressource susmentionnée, les constructions sont indépendantes les unes des autres (pas par exemple dans une relation amont/aval).

Une méthode "brutale" serait de limiter le nombre d'exécuteurs à un, mais ce n'est évidemment pas idéal si la plupart des tâches peuvent être exécutées simultanément et que les ressources informatiques ne manquent pas.

58
Jonik

Il y a actuellement 2 façons de le faire:

  • Utilisez le plug-in Throttle Builds simultanés .
  • Configurez ces tâches pour qu'elles s'exécutent sur un esclave n'ayant qu'un seul exécutant.
37
sti

Le plugin Locks and Latch ici devrait vous aider.

Cette question est probablement une dupe de Comment puis-je m'assurer qu'un seul emploi d'une catégorie donnée se présente simultanément à Hudson?

13
pwan

C'est une vieille question, mais le sujet peut toujours être pertinent, en particulier lors de l'exécution de tests d'application sur Jenkins.

Le plugin Lockable Resources vous permet de définir des ressources verrouillables pouvant être utilisées par les générations. Si votre construction nécessite une ressource, elle prend le verrou. Si une deuxième génération nécessite la même ressource (qui est alors déjà verrouillée), elle sera mise en file d'attente pour que la ressource soit libre.

Bien que les documents utilisent des ordinateurs ou des imprimantes comme exemples de ressources verrouillables, l'exemple de base de données ci-dessus devrait également fonctionner.

Contrairement au plugin Locks and Latch mentionné dans les réponses de 2012, ce package semble être actuellement mis à jour (actuellement ~ 2016).

3
Konstantin A. Magg

Jetez un coup d'œil au External Resource Dispatcher Jenkins, qui a été publié pour la première fois en novembre 2012. Ce nouveau plugin (relativement) semble couvrir exactement ce cas d'utilisation.

2
Marnix Klooster

N.B. vous n'avez pas besoin de matériel physique ou virtuel pour un esclave/nœud, vous pouvez configurer des "esclaves" qui s'exécutent sur le serveur maître.

Gérer Jenkins> Gérer les nœuds> Nouveau nœud 

et faire un "esclaves stupides" chacun avec son propre répertoire racine.

Créez quelques esclaves, exécutez-les lorsque le serveur démarre, puis vous avez essentiellement créé des pools d'exécuteurs.

Vous pourriez avoir, disons ...

db - un seul exécutant dans votre cas . compile - limite en fonction du matériel ou du nombre de processeurs . scripts - compte de nombreux exécutants pour tous les petits travaux pour lesquels Jenkins est doué.

0
teknopaul

Ancienne question, et si cela fonctionnera pour votre application, je ne peux pas être sûr, car vous n'avez pas mentionné les détails de votre application. Cependant, je souhaitais ajouter la manière dont j'ai géré cela dans notre suite de tests d'applications Rails. 

La configuration de la base de données de notre application (database.yml) ne se trouve pas dans le référentiel source. Au lieu de cela, il réside dans /var/lib/configs/uniquing_database.yml sur le VM qui exécute notre instance Jenkins. 

L’une des étapes de notre processus de construction consiste à copier ce fichier de configuration dans l’espace de travail du projet: 

cp /var/lib/jenkins/configs/myapp_unique_database.yml config/database.yml

et cette config prend en compte les informations relatives aux espaces de travail et aux numéros de build exposés dans l'environnement par Jenkins afin de créer une base de données portant un nom unique pour ce travail et son exécution spécifique: 

test:
  adapter: postgresql
  encoding: unicode
  Host: 127.0.0.1
  port: 5432
  database: myapp_test<%= ENV['JOB_NAME'].split('/').last %><%= ENV['BUILD_NUMBER'] %>

Le reste de notre construction se déroule sans que l'on sache qu'il est exécuté dans une base de données distincte. Enfin, à la fin de notre construction, nous nous assurons de supprimer cette base de données afin d'éviter que de nombreuses bases de données de test ne polluent le système de fichiers: 

Rails_ENV=test bundle exec rake db:drop
0
Yoopergeek