Die Bereitstellung von Capistrano schlägt fehl, nachdem ich die Repository-URL geändert habe

75

Ich habe eine einfache Bereitstellung über capistrano aus einem Git-Repository. Zuerst habe ich Form GitHub bereitgestellt, alles hat gut funktioniert. Aber dann habe ich mein Repository auf BitBucket verschoben und jetzt bekomme ich

fatal: Could not parse object '9cfb...'.

Das Problem verschwindet, sobald ich mich umziehe

set :deploy_via, :remote_cache

zu

set :deploy_via, :copy

Aber das behebt das Problem nicht, es umgeht es nur. Kann ich Capistrano auf irgendeine Weise anweisen, den alten Cache einfach zu löschen?

Jakub Arnold
quelle

Antworten:

45

Ich muss sagen, ich bin mir nicht sicher, da ich das nicht testen konnte, aber das sollte funktionieren:

cap deploy:cleanup -s keep_releases=0

Da löscht es jede Version (Cache) vom Server.

Anscheinend müssen Sie auch entfernen shared/cached-copy, da dies nicht durch den Capistrano-Aufruf oben gemäß dem Kommentar unten gereinigt zu werden scheint.

Robustus
quelle
65
Dies hat das Problem nicht vollständig gelöst, aber nachdem ich es entfernt habe shared/cached-copy, wird es jetzt einwandfrei bereitgestellt.
Jakub Arnold
Es hat auch bei mir nicht funktioniert, aber Jakubs Kommentar hier hat es getan.
JD.
5
Sie können einfach die URL des Ursprungsferns in Ihre neue Repo-Adresse im shared/cached-copyVerzeichnis ändern .
Null
2
Die Antwort löscht nur alle Releases auf dem Server (einschließlich der aktuellen). Die beste Antwort (wenn der Remote-Cache aktiv ist) ist die von Jakub Arnold.
Evaevans
7
Seit Capistrano 3 müssen Sie /repostatt löschen shared/cached-copy. Bearbeiten: Siehe Justin Tanners Antwort
csch
106

Capistrano 2.X.

Löschen Sie das Repo und klonen Sie es erneut unter der neuen Adresse:

cd $deploy_to/shared
rm -rf cached-copy
git clone ssh://[email protected]/new/repo.git cached-copy

Ändern Sie Ihre config/deploy.rb, um das neue Repo zu verwenden:

set :repository, "ssh://[email protected]/new/repo.git"
set :scm, :git
set :deploy_via, :remote_cache

Erneut bereitstellen:

cap deploy

Capistrano 3.X.

  1. Entfernen Sie das $deploy_to/repoVerzeichnis
  2. Ändern Sie Ihre config/deploy.rb(wie 2.X)
  3. cap deploy
Justin Tanner
quelle
5
Ich würde sagen, das ist die bessere Antwort. Wenn Sie alle Releases löschen, sind Sie im Wesentlichen in einem schlechten Zustand, wenn Ihre neue Bereitstellung fehlschlägt und Sie kein Rollback durchführen können. Ich denke auch, dass es erwähnenswert ist, dass das manuelle Klonen des Repos nur erforderlich ist, um den Host zu den bekannten Hosts hinzuzufügen. Wenn es bereits hinzugefügt wurde, funktioniert die Bereitstellung (also im Wesentlichen dasselbe wie beim erstmaligen Einrichten von capistrano, das Auschecken des Repos funktioniert überall, nur um es hinzuzufügen)
Kenny Lövrin
@ KennyLövrin Ja, wenn Sie das Repo irgendwo klonen, wird Ihr Host auf die bekannten Hosts übertragen, aber wenn Sie festgelegt haben :remove_cache, dass Sie etwas im Verzeichnis der zwischengespeicherten Kopien benötigen, wird Capistrano nicht bereitgestellt.
Justin Tanner
7
Denken Sie daran, dass Capistrano 3.1 verwendet shared/repo stattdessenshared/cached-copy sodass diese Antwort, obwohl sie fast korrekt ist, aktualisiert werden sollte.
Fred Oliveira
4
In capistrano 3.2.1 habe ich das Entfernen des $deploy_to/repoOrdners gelöst, da ich keinen repoOrdner in gefunden habe shared.
Roxas Shadow
1
Dies ist die bessere Antwort
Brettski
15

Capistrano 2 und darunter

SSH auf Ihren Server und aktualisieren Sie das Repo im ./shared/cached-copy/.git/configBereitstellungsordner oder entfernen Sie einfach das./shared/cached-copy

Capistrano 3 und höher

SSH auf Ihren Server und aktualisieren Sie das Repo im ./repo/configBereitstellungsordner.

Aktivieren Sie das Kontrollkästchen Capistrano 3-Bereitstellungen nach einer Repository-Änderung reparieren

Guilherme Viebig
quelle
1
schöne Lösung. ./repo/configpath_to_your_repo/repo/config
Nehmen
6

Ich habe dies mit folgendem gelöst deploy.rb:

namespace :deploy do
  task :cope_with_git_repo_relocation do
    run "if [ -d #{shared_path}/cached-copy ]; then cd #{shared_path}/cached-copy && git remote set-url origin #{repository}; else true; fi"
  end
end
before "deploy:update_code", "deploy:cope_with_git_repo_relocation"

Dadurch werden Bereitstellungen etwas langsamer. Es lohnt sich daher, sie zu entfernen, sobald Sie sicher sind, dass alle Bereitstellungsziele aufgeholt haben.

sheldonh
quelle
3

Sie müssen den Git- Ursprung in Ihrem Ordner / shared / cached-copy ändern

cd /var/www/your-project/production/shared/cached-copy
git remote remove origin
git remote add origin git@bitbucket.org:/origin.git

Versuchen Sie, die Cap-Produktion bereitzustellen

Tim Kozak
quelle
0

Am einfachsten ist es, die Repo-URL in die neue in .git / config im Verzeichnis shared / cached-copy auf dem Webserver zu ändern. Dann können Sie wie gewohnt eine normale Bereitstellung durchführen.

Sævar
quelle
0

Wenn Sie viele Repos machen müssen, möchten Sie vielleicht eine Aufgabe dafür hinzufügen.

Für capistrano 3 fügen Sie diese Aufgabe in Ihre deploy.rb ein

desc "remove remote git cache repository"
  task :remove_git_cache_repo do
      on roles(:all) do
    execute "cd #{fetch(:deploy_to)} && rm -Rf repo"
  end
end

Und dann einmal für jede Phase ausführen:

cap testing remove_git_cache_repo
mipmip
quelle
0

Hier ist die Capistrano 3-Version dessen, worüber diese Antwort spricht. Es kann mühsam sein, auf jedem Server das zu tun, was die Antwort vorschlägt.

Also lass es rein deploy.rbund renne danncap <environment> deploy:fix_repo_origin

namespace :deploy do
  desc 'Fix repo origin, for use when changing git repo URLs'
  task :fix_repo_origin do
    on roles(:web) do
      within repo_path do
        execute(:git, "remote set-url origin #{repo_url}")
      end
    end
  end
end
ErJab
quelle
-1

Für Capistrano 3.0+

  1. Ändern Sie die Repository-URL in Ihrer config / deploy.rb

  2. Ändern Sie die Repository-URL in der Datei your_project / repo / config auf dem Server.

Nataliya Logunkova
quelle