Mina: Auf mehreren Boxen gleichzeitig bereitstellen

Erstellt am 12. Juni 2012  ·  52Kommentare  ·  Quelle: mina-deploy/mina

Wenn ich mich nicht irre, ist es möglich, nur eine einzelne Box bereitzustellen. Dh, wenn ich eine Reihe identischer Boxen habe, muss ich sie für jede von ihnen bereitstellen und explizit angeben, für welche Box ich bereit bin. Etwas wie das:

mina deploy to=prodbox1 && mina deploy to=prodbox2 && mina deploy to=prodbox3

Ist eine parallele Bereitstellung in absehbarer Zeit geplant?

Hilfreichster Kommentar

Ich habe eine ähnliche Lösung wie @sarguru verwendet, aber ich musste den isolate Block hinzufügen. Ohne sie dupliziert jeder Aufruf von invoke in der Schleife im Grunde die Bereitstellung. Der 2. Host wird zweimal bereitgestellt, der 3. Host wird dreimal bereitgestellt usw. Hier ist der Code:

set :domains, %w[host1 host2 host3]

desc "Deploy to all servers"
task :deploy_all do
  isolate do
    domains.each do |domain|
      set :domain, domain
      invoke :deploy
      run!
    end
  end
end

Während dieser Ansatz auf mehreren Hosts bereitgestellt wird, erfolgt dies nacheinander, was bei längeren Bereitstellungen ein Problem sein kann. Es wäre schön, irgendwann einen nativ unterstützten parallelen Bereitstellungsansatz zu sehen.

Alle 52 Kommentare

Die Antwort darauf würde mich auch interessieren.

Ja, ich würde das gerne vor 1.0 selbst sehen. Diskussionen: https://trello.com/c/cukv1ztZ

set :domains, ['test.deeptest.in,'test1.deeptest.in']
Aufgabe :multi_deploy do
domains.each tun |domain|
setze :domain,domain
aufrufen :bereitstellen
Lauf!
Ende
Ende

Das funktioniert bei mir. Gibt es bessere Strategien, die jemand anderes verwendet?

Ich habe eine ähnliche Lösung wie @sarguru verwendet, aber ich musste den isolate Block hinzufügen. Ohne sie dupliziert jeder Aufruf von invoke in der Schleife im Grunde die Bereitstellung. Der 2. Host wird zweimal bereitgestellt, der 3. Host wird dreimal bereitgestellt usw. Hier ist der Code:

set :domains, %w[host1 host2 host3]

desc "Deploy to all servers"
task :deploy_all do
  isolate do
    domains.each do |domain|
      set :domain, domain
      invoke :deploy
      run!
    end
  end
end

Während dieser Ansatz auf mehreren Hosts bereitgestellt wird, erfolgt dies nacheinander, was bei längeren Bereitstellungen ein Problem sein kann. Es wäre schön, irgendwann einen nativ unterstützten parallelen Bereitstellungsansatz zu sehen.

Chancen, dass paralleler Einsatz Realität wird ...?

diese Frage stoßen. ist der von @sarguru und @phlipper empfohlene

Fyi, mina ist ein großartiges Werkzeug - fantastische Arbeit.

+1 zu diesem Problem. Das ist das Einzige, was mich davon abhält, komplett von Capistrano zu wechseln.

Der Trick von bereitzustellen - was passiert beispielsweise, wenn der letzte Server, auf dem Sie bereitstellen, ausfällt? -- also warte ich noch auf eine parallele Implementierung.

Mach weiter so @rstacruz!

Ich stimme zu - dies ist eine ausgezeichnete Frage, und es wurde ein guter Ansatz vorgeschlagen ...

Idealerweise eine Segmentierung zwischen "build" und "release/symlinking to current";

das heißt... auf allen Servern parallel bauen und auf Bestätigung warten (keine Fehler)... wenn bestätigt, dann "freigeben und neu starten"

Ich weiß, dass dies mit der Strategie "1 Shell-Skript, um sie alle zu beherrschen" etwas kompliziert ist, aber ich denke, es ist eine hervorragende Funktion / ein hervorragender Ansatz und eine Überlegung wert.

Ich bin mir nicht sicher, ob dieses Problem der Unterstützung von Multistage nahe genug ist, um ein neues Problem zu rechtfertigen. Ich füge einfach meine Stimme hinzu, um zu sagen, dass mehrstufige Bereitstellung großartig wäre.

+1!

Ich habe diese Funktion als selbstverständlich angesehen, als ich von Capistrano abgewandert bin. +1

obige Lösung funktioniert bei mir nicht...

Meine Lösung besteht darin, den Mina-Befehl mit Grunzen zu kapseln; und verwenden Sie eine Deployment-Schleife für mehrere Server mit grunt.js

module.exports = Funktion (grunt) {

// Project configuration.
grunt.initConfig({
    exec: {
        mina: {
            cmd: function(action, server, key) {
                var mina_command = 'mina ' + action + ' key=' + key + ' server=' + server + ' --verbose  ' ;
                grunt.log.write(mina_command).ok();

                return  mina_command;
            }
        },
        pwd : {

            cmd: 'pwd'
        }
    }

});

 // -----------------// -----------------// -----------------// -----------------
 // HELPER FUNCTIONS
 // -----------------// -----------------// -----------------// -----------------

// mina is used for SSH client for server deployements and configuration management
// configuration for mina is under /config/deploy.rb
// here is the function for wrapping mina functionality for our purposes

var runMina= function (action, server_type,user,branch) {

    // import list of servers
    var servers= grunt.file.readJSON('config/servers/'+ server_type+'.json');

    grunt.log.write('Setting up '+server_type+' servers...').ok();

    var key='';
    if (server_type=='production') key= '---- your pem here ------- '; else key= '---- your pem here -------';

    for (var server in servers) {
        grunt.task.run('exec:pwd');
        grunt.task.run('exec:mina:'+action+':'+user+'@'+servers[server]+':'+key + ' branch=' + branch);
    }

}


// -----------------// -----------------// -----------------// -----------------
// TASKS
// -----------------// -----------------// -----------------// -----------------


// A very basic default task.
grunt.registerTask('default', 'Log some stuff.', function() {
    grunt.log.write('Logging some stuff...').ok();
});




// setup servers for deployment

// deployments
grunt.registerTask('deploy-setup', 'Setting up server for deployments...', function(arg1) {

    var user='ec2-user';

    if (arguments.length === 0) {
        grunt.log.error(this.name + ", define a setup target ");
        return false;
    }

    switch (arg1) {

        case 'production':

            runMina('setup','production',user);

            break;

        case 'testing':

            runMina('setup','testing',user);

            break;

        default:

    }


});



// deployments
grunt.registerTask('deploy', 'Deploy to Servers...', function(arg1,arg2) {

    var user='ec2-user';

    if (arguments.length === 0) {
        grunt.log.error(this.name + ", define a deployment target ");
        return false;
     }


    // defined the branch; default is the master
    var branch='master';
    if (arg2) {  branch =arg2; }

    switch (arg1) {

        case 'production':

            runMina('deploy','production',user,branch);

            break;

        case 'testing':

            runMina('deploy','testing',user,branch);

            break;

         default:

    }


});

// https://github.com/jharding/grunt-exec
grunt.loadNpmTasks('grunt-exec');

};

Eigentlich ist es nicht so schwer. Ich habe das App-Verzeichnis als NFS-Share eingerichtet. Und im Grunde hat jeder Host einen Verweis auf dieses Verzeichnis. Sobald die Änderungen übertragen wurden, erhalten alle Hosts Änderungen über NFS und ich habe ein kleines Socket-Server-Client-Setup, das eine Nachricht vom Hauptserver an alle Hosts sendet, um den Server neu zu starten. Mina ist nur mit 1 primären Host verbunden und der primäre Host kümmert sich um den Rest.

+1

  • 1

+1

+1

Warte immer noch darauf...

irgendwelche Lösungen?

+1

+1

:+1:

+1

+1

Irgendwelche Lösungen @gabskoro?

+1

+1

@bbnnt , Sie verpassen das

@ronwsmith danke für den Hinweis

Danke @phlipper - du hast mir das Leben gerettet.

+1 für echte parallele Bereitstellungen!

Fast drei Jahre und kein Fortschritt, geschweige denn eine anständige Reaktion?

capistrano 3 ist eigentlich wirklich gut, ich habe es verwendet.

Am Dienstag, 17. März 2015 um 9:27 Uhr schrieb iMoses [email protected] :

Fast drei Jahre und kein Fortschritt, geschweige denn eine anständige Reaktion?


Antworten Sie direkt auf diese E-Mail oder zeigen Sie sie auf GitHub an
https://github.com/mina-deploy/mina/issues/8#issuecomment -82050525.

Basierend auf dem ersten von @cheba beschriebenen Szenario könnte es so einfach sein wie:

cat list_of_servers.txt | parallele Mina bereitstellen für = {}

Gibt es Nachteile beim Ausführen mehrerer Mina-Prozesse?

@josericardo Es funktioniert irgendwie, aber nicht ganz. Insbesondere möchten Sie möglicherweise nicht für jede Box eine vollständige Bereitstellung durchführen. Sie möchten Migrationen nur einmal ausführen (z. B. wenn Sie viele App-Server und einen DB-Server haben). Möglicherweise möchten Sie Ihre Assets nur einmal in das CDN hochladen. Es gibt legitime Gründe für die native Unterstützung für mehrere Ziele.

Gerade als ich in Mina nach unserem neuen Deployment-Setup stöberte, stoße ich darauf und werde in meinen Tracks gestoppt.

Bei der Bereitstellung auf mehreren Anwendungsservern geht es nicht nur darum, den Task auf allen Boxen auszuführen. Es gibt auch Koordination, z. Wenn die Bereitstellung auf einer Box fehlschlägt, erkennen Sie dies und setzen Sie die Bereitstellung auf allen Geräten zurück, damit nicht mehrere Versionen gleichzeitig ausgeführt werden. Insbesondere wenn Sie beispielsweise Assets erstellen und auf ein Remote-CDN übertragen, ist diese Art der Koordination von entscheidender Bedeutung. Daher ist es keine Lösung, einfach eine Domänenliste durchzugehen und die Bereitstellungsaufgabe für jede von ihnen abzufeuern.

Sehr enttäuschend, kompletter Deal-Breaker.

Hey @brendonrapp ja, ich stimme zu. Ich liebe das Konzept von Mina, aber unterm Strich ist Capistrano ein wesentlich ausgereifteres Produkt. Es steht für langjährige Praxiserfahrung in der Bereitstellung komplexer Produktionsumgebungen. Dem Mina-Projekt fehlen Tausende von Entwicklerstunden.

Dazu brauchen wir Hilfe. Da wir in unserem Unternehmen nicht mehrere Server verwenden, gibt es wirklich keine hohe Priorität.
Wir würden uns aber über PRs freuen.
Danke

Ich möchte nur teilen, wie man mehrere Bereitstellungsserver oder -umgebungen mit mina verwendet. Mina hat einen Drittanbieter, der in mehreren Phasen bereitgestellt wird. Sie können mina-multistages verwenden, dies ist die URL https://github.com/endoze/mina-multistage. Es ist wirklich mächtig, Ihre Bereitstellungsumgebung zu verwalten.
Ich hoffe, das hilft euch allen. Vielen Dank

Ich habe über die Verwendung von Mina in Verbindung mit Ansible für Multi-Host-Bereitstellungen gelesen.

+1, um zu sehen, dass dies nativ zu mina . hinzugefügt wird

  • 1 BUMP

+1

eine Lösung für die parallele Bereitstellung mit mina ??

Warte immer noch auf eine native Lösung.
Während ich warte, verwende ich immer noch die Lösung von @phlipper .

Mina macht nicht mehrere Boxen und wahrscheinlich auch nie, weil es als ein schnelles Skript auf einem Remote-Host verwendet werden soll.
Das tut mir leid.
Es gibt ein großartiges Werkzeug [capistrano], das diese Aufgabe gut erledigt.

Ich habe ein sehr einfaches Juwel namens mina-multi_server erstellt , das Unterstützung für mehrere Server

Alle Kommentare sind willkommen.

Dies ist ein Blocker für jeden, der zB den Sidekiq-Server in einer anderen dedizierten Box verwendet.

meins 2.x

set :domains, %w[host1 host2 host3]
desc "Deploy to all servers"
task :deploy_all do
    fetch(:domains).each do |domain|
      set :domain, domain
      invoke :deploy
    end
end

+1

Wir haben mina-multideploy entwickelt - ein nützliches Tool für die parallele Bereitstellung auf mehreren Servern.

So etwas könnte für die Handhabung von Rollen funktionieren. Auch hier (noch) nicht parallel.

task :staging do
  set :domains, 'staging-1.app.com' => [:db], 'staging-2.app.com' => []
end

task :deploy do
  invoke :'git:ensure_pushed'

  fetch(:domains).each do |domain, roles|
    set :domain, domain

    deploy do
      invoke :'git:clone'
      invoke :'deploy:link_shared_paths'
      invoke :'bundle:install'
      invoke :'rails:db_migrate' if roles.include?(:db)
      invoke :'rails:assets_precompile'
      invoke :'deploy:cleanup'

      on :launch do
        in_path(fetch(:current_path)) do
          command %(mkdir -p tmp/)
          command %(touch tmp/restart.txt)
          command %(direnv allow)
        end
      end
    end
  end
end
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen