Question

Je me déplace mes tests en continu sur un serveur dédié (test automatique ralentit mon ordinateur portable locale trop). Ce que je voudrais est mon serveur de test (ce qui arrive à courir CruiseControl.rb) à obtenir en permanence mes derniers (engagés) changements par Git - idéalement, sans aucun changement à mon flux de travail. Je suis le seul développeur qui travaille sur ce projet.

Avant d'obtenir le serveur de test, j'avais:

  • Mon ordinateur portable comme mon principal système de développement
  • branches multiples dans mon référentiel local.
  • Une copie de travail locale, en montrant l'une des branches. Je passe entre les branches souvent (généralement de nouvelles fonctionnalités).
  • Un compte GitHub, auquel je pousse souvent les branches locales à miroir branches isolées. (Ceci est la plupart du temps pour une sauvegarde hors site, je ne suis pas le partage de code pour mon projet en cours). J'essaie de pousser à GitHub au moins à la fin de chaque journée de travail, bien que je l'oublie de temps en temps.

Je voudrais garder tout cela intact. En plus de cela, j'ai maintenant:

  • Le serveur de test
  • ... en cours d'exécution CruiseControl.rb
  • Un clone de mon dépôt portable sur mon serveur de test. (Actuellement, il est pas le clonage GitHub)
  • Une copie de travail local sur le serveur de test, à partir duquel CC construit / test.
  • Cette copie de travail pointe vers une branche Git particulière (bien sûr)

J'ai essayé d'avoir mon serveur de test obtenir automatiquement quelle que soit la branche je travaille sur mon ordinateur portable copie de travail et construire à partir de cela. (Ce imiterait contrôle continu de test automatique sans manger des ressources système).

Ce que j'ai essayé sans succès:

  • git origine checkout / HEAD: ce obtient les fichiers bien mais se casse CruiseControl parce qu'il n'aime pas la copie de travail « de branchements »
  • .
  • git checkout -b --track a_branch origine / a_branch: cela fonctionne très bien pour obtenir des fichiers, et CC aime, mais il colle le serveur de test à une branche particulière. Lors de la commutation des branches sur l'ordinateur portable, je vais arrêter efficacement tester mon travail actuel.
  • git checkout -b --track my_testing_branch origine / HEAD: cela devient aussi les fichiers constrution, mais il souffre du même problème que la commande ci-dessus. Création d'une branche d'origine / HEAD obtient seulement la tête de la branche « par défaut », il est donc aussi collante.

Est-il possible que je peux obtenir un bon système de contrôle continu à distance (avec ou sans branches git) qui ne comporte pas de changements majeurs à mon flux de travail?

Était-ce utile?

La solution

Une autre option est d'écrire un crochet qui informe le serveur de test du nouveau code pour tirer . En particulier, un crochet de post-commit est probablement un meilleur itinéraire. , Chaque fois que vous vous engagez alors vous pouvez informer le serveur de test de ce qu'il faut tirer et de quelle branche.

Autres conseils

Vous pourriez avoir une branche de test dédié sur lequel vous fusionnez votre travail de branche en cours.
Vous pouvez forcer remplacer le contenu de cette branche avec la validation de la branche de travail en cours (voir les nôtres de fusion git, qu'en « leur » question ).

Ensuite, sur le serveur de CI, vous initialisez avec:

 $ git fetch laptopRepo
 $ git checkout -b testingBranch laptopRepo/testingBranch

Il implique une première étape sur le côté portable pour publier des travaux en cours pour tester.

Ce n'est pas la plus grande solution, mais c'est quelque chose ...

Le serveur de test peut fonctionner git remote show origin pour voir quelle branche est active sur votre ordinateur portable. Par exemple,

$ git remote show origin
* remote origin
  Fetch URL: blade:/var/scratch/code
  Push  URL: blade:/var/scratch/code
  HEAD branch: foo
  Remote branches:
    foo tracked
    bar tracked
    qux tracked

Ainsi, le référentiel d'origine est actuellement sur la branche foo.

Je ne l'ai pas vu une commande de bas niveau qui vous donnera directement que si vous pourriez avoir à analyser dehors de ce (peut-être quelqu'un aura une meilleure façon). Exemple,

$ b=$(git remote show origin | grep "HEAD branch" | awk -F: '{print $2}')
$ echo $b
foo

Maintenant, puisque origin/foo agira similaire à origin/HEAD (pas branche locale) et votre CruiseControl ne crée que que vous ne devriez pas probablement juste une branche locale sur la machine d'essai et simplement dur réinitialiser le dernier emplacement:

$ b=$(git remote show origin | grep "HEAD branch" | awk -F: '{print $2}')
$ git reset --hard origin/$b

Note, ce qui est légèrement fragile puisque HEAD me sera pas toujours ce que vous pensez qu'il est. Par exemple, au cours d'une HEAD rebase va se déplacer vers l'arrière et en avant. Si votre serveur vérifie d'essai HEAD sur votre ordinateur portable lors d'un rebasage il pourrait obtenir un emplacement non valide ou indésirable.

Je pense ai obtenu une assez bonne solution en inversant la relation entre les deux systèmes. Au lieu d'avoir la traction du serveur de test à partir du référentiel de l'ordinateur portable, je pourrais avoir la poussée portable change vers le serveur à tester.

Tout d'abord ajouter une télécommande sur le repo de l'ordinateur portable:

git remote add testing <url of testing server>

Alors, chaque fois que j'ai le code pour le test, je peux faire une poussée:

git push -f testing HEAD:master

Cela fonctionne de quelque branche que je suis actuellement. Le -f assure que je vais souffler tout ce qui est déjà dans cette branche; Je ne vais pas à vous soucier de toute ascendance.

Cela ne fait mettre le dernier code dans une copie de travail, mais le vote de CruiseControl peut résoudre cela. Je pourrais aussi avoir un crochet côté serveur qui met à jour une copie de travail et court la suite de tests (je même pas besoin CC à ce moment-là).

Je veux probablement ajouter une commande + combiné engager push à un script ou un alias; cela me donnera mon une commande commit et test. Si pour une raison quelconque, je veux faire un commit sans un coup de pouce de test (ou vice versa), alors j'ai ces options aussi.

scroll top