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é.
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")
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 (^_^)
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
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.
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
...
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
.
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.
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
J'utilise la version .3.5 et j'ai ce travail:
set :branch, 'develop'
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
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.
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.
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.