web-dev-qa-db-fra.com

Utilisation de capistrano pour se déployer à partir de différentes branches de git

J'utilise capistrano pour déployer une application RoR. La base de code est dans un dépôt git, et les branches sont largement utilisées en développement. Capistrano utilise le fichier deploy.rb Pour ses paramètres, l'un d'eux étant la branche à partir de laquelle déployer.

Mon problème est le suivant: supposons que je crée une nouvelle branche [~ # ~] a [~ # ~] à partir de master. Le fichier de déploiement référencera master branch. J'édite cela, donc [~ # ~] un [~ # ~] peut être déployé pour tester l'environnement. Je finis de travailler sur la fonctionnalité et de fusionner la branche [~ # ~] a [~ # ~] dans master. Puisque le fichier deploy.rb De [~ # ~] a [~ # ~] est plus récent, il est fusionné et maintenant le deploy.rb Dans master références de branche [~ # ~] a [~ # ~]. Il est temps d'éditer à nouveau.

Cela fait 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.

Quel serait le meilleur moyen d'automatiser ce processus?

Edit: Il se trouve 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 de transfert, 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 la valeur :branch "branch_name" Dans mon script de déploiement. Je l'ai essayé et cela a fonctionné. J'ai alors pensé que je devrais faire un changement similaire dans toutes mes succursales. Bien sûr, je suis un fainéant et je me demandais s’il n’y avait pas de meilleure façon.

Si vous n’êtes pas familier avec git, la commande de branche git contient une liste de branches avec un astérisque marquant celui qui est extrait sur votre ordinateur local. Par exemple:

> git branch
* drupal_authentication
fragment_caching
master

Donc, je me suis dit que si j'analysais simplement la sortie et cherchais la branche marquée comme étant courante:

set :branch, $1 if `git branch` =~ /\* (\S+)\s/m

Maintenant, je peux déployer n'importe quelle branche en cours sur ma machine locale à partir d'un seul script de déploiement partagé.

117
Toms Mikoss

Cela fonctionne avec Capistrano> = 3.1:

ajoute cette ligne à config/deploy.rb:

set :branch, ENV['BRANCH'] if ENV['BRANCH']

puis appelez capistrano avec:

cap production deploy BRANCH=master

Cette solution fonctionne avec Capistrano <3.1:

# call with cap -s env="<env>" branch="<branchname>" deploy

set :branch, fetch(:branch, "master")
set :env, fetch(:env, "production")
145
wintersolutions

En utilisant Capistrano 3.1.0+, aucun d’entre eux ne fonctionnait plus pour moi. Au lieu de cela, selon leurs instructions commentées:

   ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }

Mais, vous ne voulez pas utiliser ask ou il vous le demandera. Au lieu de cela, vous devriez utiliser set. HEAD est la branche la plus haute; "Edge" comme on l'appelle. Si vous voulez une autre branche, remplacez HEAD par votre nom de branche, par exemple: master, staging, etc.

Pour conclure avec des exemples, dans /config/deploy/production.rb, vous pouvez inclure cette ligne:

   set :branch, proc { `git rev-parse --abbrev-ref master`.chomp }

...ou

   set :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }

btw, HEAD est le paramètre par défaut, il n'est donc pas nécessaire de l'indiquer réellement dans un fichier. Peut-être mieux utilisé dans un /config/deploy/Edge.rb.

Dans /config/deploy/staging.rb, vous pouvez inclure cette ligne:

   set :branch, proc { `git rev-parse --abbrev-ref staging`.chomp }

...ou

   set :branch, proc { `git rev-parse --abbrev-ref test`.chomp }

Vous avez eu l'idée!

J'espère que ces exemples aideront les futurs utilisateurs de capistrano (^_^)

30
Eric Wanchic

Avec plusieurs étapes, c'est en fait maintenant:

cap production deploy -s branch=my-branch

La syntaxe de publication précédente ne fonctionne pas dans mon environnement

27
David Hersey

Je peux confirmer que le ci-dessous fonctionne toujours dans Cap 3.11.0 13/10/18 ainsi que Cap 2:

Dans deploy.rb/stage.rb:

set :branch, ENV['BRANCH'] || 'develop'

Sur la ligne de commande:

cap deploy BRANCH=featurex

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.

24
Paul Odeon

Alternativement, vous pouvez le structurer à partir de la ligne de commande où vous avez une branche et un environnement par défaut et vous pouvez également transmettre des paramètres à l'appel de plafond, qui peuvent inclure l'environnement et la branche à utiliser. Cela peut être une branche explicitement transmise ou un paramètre indiquant la branche actuelle, comme décrit dans le lien que vous avez répertorié.

#call with cap -S env="<env>" branch="<branchname>" deploy
...

# Prevents error if not parameter passed, assumes that default 'cap deploy' command
# and should deploy the master branch to the production server
set(:env, ‘production’) unless exists?(:env)
set(:branch, ‘master’) unless exists?(:branch)

if !env.nil? && env == "production"
   role :web, "production_ip_address"
else   # add more as needed 
   role :web, "development_ip_address"
end

if !branch.nil? && branch == "current"
   set :branch, $1 if `git branch` =~ /\* (\S+)\s/m
elsif !branch.nil?
   set :branch, branch
else   # add more as needed 
   set :branch, "master"
end
...

Exemple de code fortement emprunté à partir d'ici

15
naven87

Si vous utilisez capistrano-multiétage , il vous suffit de lancer

cap -s branch=$MY_BRANCH deploy

ou

cap -s branch=$MY_BRANCH production deploy

sans autre modification de votre deploy.rb.

10
asymmetric

Cette commande ne fonctionnera plus:

cap deploy -s branch=your_branch

Soutien -sS _ flags a été supprimé dans Capistrano v3 +.
Ici vous pouvez en lire plus à ce sujet: lien
Cela a été mentionné dans quelques réponses, mais pour l’instant, il n’est pas correct.

Ce qui fonctionne pour moi:
dans deploy.rb ajout de fichier

set :branch, ENV['BRANCH'] || :master

puis lancez:

BRANCH=your_branch cap deploy

Veuillez également noter que, pour exécuter cette commande avec succès, vous devez être sur la branche principale.

7
SakyHank

Cette solution devrait fonctionner avec toutes les versions de Capistrano.

def branch_name(default_branch)
  branch = ENV.fetch('BRANCH', default_branch)

  if branch == '.'
    # current branch
    `git rev-parse --abbrev-ref HEAD`.chomp
  else
    branch
  end
end

set :branch, branch_name('master')

Usage:

BRANCH=. cap [staging] deploy
# => deploy current branch

BRANCH=master cap [staging] deploy
# => deploy master branch

cap [staging] deploy
# => deploy default branch
3
Pablo Cantero

J'utilise la version .3.5 et j'ai ce travail:

set :branch, 'develop'
2
David Rosa

Pour les utilisateurs de capistrano 3:

desc "Prompt for branch or tag"
task :git_branch_or_tag do
  on roles(:all) do |Host|
    run_locally do
      execute :git, 'tag'
      tag_Prompt = "Enter a branch or tag name to deploy"
      ask(:branch_or_tag, tag_Prompt)
      tag_branch_target = fetch(:branch_or_tag, 'master')
      set(:branch, tag_branch_target)
    end
  end
end

before 'deploy:updated',  :git_branch_or_tag
1
lfender6445

Méthode 1: Définition d'une branche spécifique à l'étape (test, production, par exemple) pour le déploiement

Placez branch configuration dans les fichiers d'étape au lieu de 'deploy.rb' et définissez la branche cible de cette étape à partir de laquelle déployer.

Pour une application en deux étapes avec le nom de branche associé test et production, la configuration ressemblera à ceci:

# app_root/config/deploy/test.rb
...
set :branch, "test"
...

# app_root/config/deploy/production.rb
...
set :branch, "production"
...

Cette méthode permet de déployer à partir de branches spécifiques à une étape. Ainsi, la seule étape supplémentaire requise consiste à fusionner ou à rebaser le dernier code de la branche de base.

Méthode 2: déployer directement à partir de n'importe quelle branche (à l'aide d'une balise)

Une autre approche consiste à déployer en utilisant tag. Afin de déployer en utilisant tag, définissez le branch config. dans 'deploy.rb' comme suit,

set :branch, `git describe --tags $(git rev-list --tags --max-count=1)`.chomp

Et configurez le CI pour un déploiement conditionnel à différentes étapes si le modèle de point associé correspond (par exemple, /.*-test$/).

Maintenant, un déploiement peut être fait à partir de n'importe quelle branche,

  • Tout d’abord, créez une étiquette à partir de n’importe quelle branche,

    étiquette 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.

1
Shakil

Réponse générale:

Si vous avez un fichier de paramètres avec un contenu modifié d’environnement en environnement, vous devez créer cette ligne sous la forme d’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 le "@BRANCH_NAME@ "par la valeur appropriée requise par votre processus de déploiement.

1
VonC