J'utilise capistrano pour déployer une application RoR. La base de code est dans un référentiel git et le branchement est largement utilisé dans le développement. Capistrano utilise un deploy.rb
fichier pour ses paramètres, l'un d'entre eux étant la branche à partir de laquelle effectuer le déploiement.
Mon problème est le suivant: disons que je crée une nouvelle branche A à partir de master . Le fichier Deploy référence maître branche. Je modifie cela, afin que A puisse être déployé pour tester l'environnement. J'ai fini de travailler sur la fonctionnalité et fusionne la branche A dans master . Étant donné que le deploy.rb
fichier de A est plus frais, il se fusionné et maintenant deploy.rb
en maître des références de la branche A . Il est temps de modifier à nouveau.
C'est beaucoup de modifications manuelles apparemment inutiles - le paramètre doit toujours correspondre au nom de la branche actuelle. En plus de cela, il est facile d'oublier de modifier les paramètres à chaque fois.
Quelle serait la meilleure façon d'automatiser ce processus?
Edit: Il s'avère que quelqu'un avait déjà fait exactement ce dont j'avais besoin :
Ce matin, j'ai eu l'occasion de déployer une branche d'un référentiel git sur un serveur intermédiaire, mais je n'avais pas la moindre idée de comment. Une recherche rapide dans le code source de capistrano a révélé que je pouvais utiliser set
:branch "branch_name"
dans mon script de déploiement. Je l'ai essayé et cela a fonctionné. J'ai alors pensé que je devrais effectuer un changement similaire dans toutes mes succursales. Bien sûr, je suis paresseux et je me demande s'il n'y a pas de meilleur moyen.Si vous n'êtes pas familier avec git, la sortie de la commande git branch est une liste de branches avec un astérisque marquant celle actuellement extraite sur votre machine locale. Par exemple:
> git branch * drupal_authentication fragment_caching master
Donc, j'ai pensé, que se passerait-il si je viens d'analyser la sortie et de rechercher la branche marquée comme actuelle:
set :branch, $1 if `git branch` =~ /\* (\S+)\s/m
Je suis maintenant en mesure de déployer n'importe quelle branche actuelle sur ma machine locale à partir d'un seul script de déploiement partagé.
la source
Réponses:
Cela fonctionne avec Capistrano> = 3.1:
ajoutez cette ligne à
config/deploy.rb
:puis appelez capistrano avec:
Cette solution fonctionne avec Capistrano <3.1:
la source
env
, mais cela a fonctionné pour moi simplement en utilisant une brancheEn utilisant Capistrano 3.1.0+, aucun de ceux-ci ne fonctionnait plus pour moi. Au lieu de cela, selon leurs instructions commentées:
Mais, vous ne voulez pas utiliser
ask
ou cela vous le demandera. Au lieu de cela, vous devriez utiliserset
.HEAD
est la branche la plus élevée; «bord» comme on l'appelle. Si vous voulez une autre branche, remplacezHEAD
votre nom de la branche, par exemple:master
,staging
, etc.Pour conclure avec des exemples, dans
/config/deploy/production.rb
, vous pouvez inclure cette ligne:...ou
btw,
HEAD
est le paramètre par défaut, donc pas besoin de vraiment l'indiquer dans le fichier. Peut être mieux utilisé dans un fichier/config/deploy/edge.rb
.Dans
/config/deploy/staging.rb
, vous pouvez inclure cette ligne:...ou
Vous avez eu l'idée!
J'espère que ces exemples aideront les futurs utilisateurs de capistrano (^_^)
la source
git rev-parse --abbrev-ref HEAD
est utilisé pour savoir sur quelle branche HEAD se trouve. l'exécutiongit rev-parse --abbrev-ref staging
sera (presque) toujours sortiestaging
. Vous pouvez simplement utiliserset :branch, 'staging'
.Avec plusieurs étages, c'est en fait maintenant:
La syntaxe de l'article précédent ne fonctionne pas dans mon environnement
la source
-s branch=foo
définit la branche variable capistrano surfoo
après le chargement des recettesJe peux confirmer que ce qui suit fonctionne toujours dans Cap 3.11.0 13/10/18 ainsi que Cap 2:
Dans deploy.rb / stage.rb:
Sur la ligne de commande:
Cela vous donne une branche par défaut (qui peut être différente pour différents environnements) et la possibilité de changer de branche quand vous le souhaitez.
la source
Vous pouvez également le structurer à partir de la ligne de commande où vous avez une branche et un environnement par défaut et vous pouvez également passer des paramètres à l'appel de cap qui pourraient inclure l'environnement et la branche à utiliser. Cela pourrait être une branche qui est explicitement passée ou vous pourriez avoir un paramètre qui indiquerait la branche actuelle comme décrit dans le lien que vous avez répertorié.
Exemple de code largement emprunté à ici
la source
-s
pour qu'il récupère la branche spécifiéeSi vous utilisez capistrano-multi-étapes , il vous suffit d'exécuter
ou
sans autre modification de votre
deploy.rb
.la source
branch=
, nonbranch-
.Cette commande ne fonctionnera plus:
La prise en charge des
-sS
indicateurs a été supprimée dans capistrano v3 +.Ici, vous pouvez en savoir plus à ce sujet: lien
Il a été mentionné dans quelques réponses, mais n'est actuellement pas correct.
Ce qui fonctionne pour moi:
dans un
deploy.rb
fichier ajouterpuis exécutez:
Veuillez également noter que pour exécuter cette commande avec succès, vous devez être sur la branche principale.
la source
Cette solution devrait fonctionner avec toutes les versions de Capistrano.
Usage:
la source
J'utilise la version 3.3.5 et cela fonctionne:
la source
Réponse générale:
Si vous avez un fichier de paramètres avec un contenu modifié d'un environnement à l'autre, vous devez créer cette ligne comme un "modèle" (avec une chaîne représentant le nom de la variable comme
@BRANCH_NAME@
ou@ENV_NAME@
).Ensuite, vous auriez un script (versionné) capable de lire votre fichier de configuration et de remplacer la
@BRANCH_NAME@
variable " " par la valeur appropriée requise par votre processus de déploiement.la source
Pour les utilisateurs de capistrano 3:
la source
Méthode 1: définir une branche spécifique à l'étape (par exemple, test, production) pour le déploiement
Placez la
branch
configuration dans des fichiers d'étape au lieu de «deploy.rb» et définissez la branche cible pour cette étape à partir de laquelle effectuer le déploiement.Pour une application en deux étapes avec un nom de branche associé
test
etproduction
, la configuration ressemblera à ceci,Cette méthode permet de déployer à partir de branches spécifiques à l'étape. Ainsi, la seule étape supplémentaire qui sera requise est de fusionner ou de rebaser le dernier code de la branche de base.
Méthode 2: déployer directement à partir de n'importe quelle branche (en utilisant une balise)
Une autre approche consiste à déployer à l'aide de tag. Afin de déployer à l'aide de la balise, définissez le
branch
fichier config. dans 'deploy.rb' comme suit,Et, configurez le CI pour un déploiement conditionnel à différentes étapes si le modèle de balise associé correspond (par exemple
/.*-test$/
).Désormais, un déploiement peut être effectué depuis n'importe quelle branche,
Tout d'abord, créez une balise à partir de n'importe quelle branche,
balise git -a v0.1.0-test -m "Version 0.1.0-test"
Et, poussez
git push origin v0.1.0-test
Remarque: les méthodes ci-dessus sont basées sur Capistrano 3.
la source
renverra la branche actuelle dans laquelle vous vous trouvez exactement.
J'ai toujours mis le
gpsh
au lieu degit push -u origin branch_name
la source