Mina: انشر في عدة صناديق في نفس الوقت

تم إنشاؤها على ١٢ يونيو ٢٠١٢  ·  52تعليقات  ·  مصدر: mina-deploy/mina

إذا لم أكن مخطئًا ، فمن الممكن النشر فقط في صندوق واحد. على سبيل المثال ، إذا كان لدي مجموعة من المربعات المتطابقة ، يجب أن أنشر لكل منها تحديدًا صريحًا لأي مربع أقوم بنشره. شيء من هذا القبيل:

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

هل تم التخطيط للنشر الموازي في أي وقت قريبًا؟

التعليق الأكثر فائدة

لقد استخدمت حلاً مشابهًا لـ sarguru لكنني كنت بحاجة إلى إضافة كتلة isolate . بدونها ، فإن كل استدعاء لـ invoke في الحلقة يكرر النشر بشكل أساسي. يتم نشر المضيف الثاني مرتين ، ويتم نشر المضيف الثالث ثلاث مرات ، وما إلى ذلك. إليك الكود:

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

بينما يتم نشر هذا الأسلوب على عدة مضيفين ، فإنه يفعل ذلك واحدًا تلو الآخر ، مما قد يمثل مشكلة لعمليات النشر الأطول. سيكون من الجيد رؤية نهج نشر مواز مدعوم محليًا في مرحلة ما.

ال 52 كومينتر

سأكون مهتمًا أيضًا بالإجابة على هذا.

نعم ، أريد أن أرى هذا قبل الإصدار 1.0 بنفسي. المناقشات: https://trello.com/c/cukv1ztZ

مجموعة: المجالات ، ['test.deeptest.in،' test1.deeptest.in ']
المهمة: multi_deploy القيام به
المجالات.كل ما تفعله | المجال |
مجموعة: المجال والمجال
استدعاء: نشر
يركض!
نهاية
نهاية

هذا يعمل بالنسبة لي. أي استراتيجيات أفضل يستخدمها أي شخص آخر؟

لقد استخدمت حلاً مشابهًا لـ sarguru لكنني كنت بحاجة إلى إضافة كتلة isolate . بدونها ، فإن كل استدعاء لـ invoke في الحلقة يكرر النشر بشكل أساسي. يتم نشر المضيف الثاني مرتين ، ويتم نشر المضيف الثالث ثلاث مرات ، وما إلى ذلك. إليك الكود:

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

بينما يتم نشر هذا الأسلوب على عدة مضيفين ، فإنه يفعل ذلك واحدًا تلو الآخر ، مما قد يمثل مشكلة لعمليات النشر الأطول. سيكون من الجيد رؤية نهج نشر مواز مدعوم محليًا في مرحلة ما.

فرص أن يصبح النشر الموازي حقيقة ...؟

صدم هذا السؤال. هل النهج الموصى به من قبل sarguru و phlipper هو الحل الرسمي أم أن هناك خطة لإضافة دعم النشر الموازي مباشرةً داخل mina؟

لمعلوماتك ، مينا أداة رائعة - عمل رائع.

+1 لهذه المشكلة. هذا هو الشيء الوحيد الذي يمنعني من التحول تمامًا من Capistrano.

تعمل خدعة phlipper ، لكنني أعتقد أنه من الخطير بعض الشيء نشرها بالتسلسل - على سبيل المثال ، ماذا يحدث عندما يفشل آخر خادم تقوم بنشره؟ - لذلك ما زلت أنتظر تنفيذًا موازيًا.

استمروا في العمل الجيد @ rstacruz!

أوافق - هذا سؤال ممتاز ، وقد تم اقتراح نهج جيد ...

من الناحية المثالية ، تجزئة بين "البناء" و "الإصدار / الارتباط بالتيار" ؛

أي ... قم بالبناء على جميع الخوادم بالتوازي وانتظر التأكيد (لا توجد أخطاء) ... إذا تم التأكيد ، ثم "حرر وأعد التشغيل"

أعلم أن هذا الأمر معقد بعض الشيء مع إستراتيجية "1 shell script لحكمهم جميعًا" ، لكنني أعتقد أنها ميزة / نهج ممتاز وشيء يستحق التفكير فيه.

لست متأكدًا مما إذا كانت هذه المشكلة قريبة بدرجة كافية لدعم المراحل المتعددة لتبرير إصدار مشكلة جديدة. مجرد إضافة صوتي لأقول أن النشر متعدد المراحل سيكون رائعًا.

+1!

أخذت هذه الميزة كأمر مسلم به أثناء الهجرة بعيدًا عن كابيسترانو. +1

الحل أعلاه لا يعمل بالنسبة لي ...

الحل الذي أقدمه هو تغليف أمر mina بنخر ؛ واستخدم حلقة نشر متعددة للخادم مع grunt.js

module.exports = function (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');

} ؛

في الواقع ليس الأمر بهذه الصعوبة. لقد قمت بإعداد دليل التطبيق كمشاركة NFS. وكل المضيف لديه إشارة إلى هذا الدليل. بمجرد دفع التغييرات ، يتلقى كل المضيف التغييرات عبر NFS ولدي إعداد عميل خادم مقبس صغير يرسل رسالة من الخادم الرئيسي إلى كل المضيف لإعادة تشغيل الخادم. واجهات Mina فقط مع مضيف أساسي واحد ويتولى المضيف الأساسي الباقي.

+1

  • 1

+1

+1

ما زلت انتظر هذا ...

اي حلول؟

+1

+1

: +1:

+1

+1

أي حلولgabskoro؟

+1

+1

bbnnt ، أنت تفتقد المشكلة الرئيسية - الموازي مقابل المسلسل. الحل البديل لعدة مضيفين متسلسلين ، لكنه بطيء في البنى التحتية الكبيرة. من الناحية المثالية ، هناك طريقة للإفراج عن جميع العقد في نفس الوقت.

ronwsmith شكرا للإشارة إلى هذا

شكرا phlipper - لقد أنقذت حياتي.

+1 لعمليات نشر موازية حقيقية!

ما يقرب من ثلاث سنوات وليست خطوة إلى الأمام ، ناهيك عن الاستجابة اللائقة؟

كابيسترانو 3 جيد حقًا لقد تحولت إلى استخدامه.

في الثلاثاء ، 17 مارس 2015 الساعة 9:27 صباحًا ، كتب iMoses [email protected] :

ما يقرب من ثلاث سنوات وليست خطوة إلى الأمام ، ناهيك عن الاستجابة اللائقة؟

-
قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub
https://github.com/mina-deploy/mina/issues/8#issuecomment -82050525.

بناءً على السيناريو الأول الذي وصفه cheba ، يمكن أن يكون الأمر بسيطًا مثل:

cat list_of_servers.txt | نشر الميناء المتوازي إلى = {}

هل هناك أي عيوب في تشغيل عمليات الميناء المتعددة؟

josericardo إنه نوع من العمل ولكن ليس تمامًا. على وجه التحديد ، قد لا ترغب في إجراء نشر كامل على كل مربع. تريد تشغيل عمليات الترحيل مرة واحدة فقط (على سبيل المثال ، إذا كان لديك العديد من خوادم التطبيقات وخادم ديسيبل واحد). قد ترغب في تحميل الأصول الخاصة بك إلى CDN مرة واحدة فقط. هناك أسباب مشروعة للحصول على دعم محلي لوجهات متعددة.

تمامًا كما كنت أحفر في مينا لإعداد النشر الجديد ، واجهت هذا وأوقفني في مساراتي.

إن النشر على خوادم تطبيقات متعددة ليس مجرد مسألة "تشغيل المهمة في جميع المربعات". هناك أيضًا تنسيق ، على سبيل المثال. إذا فشل النشر في مربع واحد ، فتعرف على ذلك وقم بإلغاء النشر على كل منهم ، لئلا ينتهي بك الأمر مع إصدارات مختلفة تعمل في نفس الوقت. خاصة إذا كنت تفعل شيئًا مثل بناء الأصول ودفعها إلى شبكة توصيل المحتوى عن بُعد ، فإن هذا النوع من التنسيق أمر بالغ الأهمية. ومن ثم ، فإن مجرد إجراء حلقات عبر قائمة المجال وإطلاق مهمة النشر على كل منها ليس حلاً.

مخيبة للآمال للغاية ، صفقة كاملة.

مرحبًا brendonrapp ، نعم ، أوافق. أحب مفهوم مينا ، لكن خلاصة القول هي أن Capistrano منتج أكثر نضجًا إلى حد كبير. إنه يمثل سنوات عديدة من الخبرة الواقعية في نشر بيئات الإنتاج المعقدة. يستغرق مشروع مينا آلاف الساعات للمطورين.

نحن بحاجة للمساعدة في هذا. نظرًا لأننا لا نستخدم خوادم متعددة في شركتنا ، فليس هناك بالفعل أولوية عالية.
لكننا نقدر العلاقات العامة.
شكرا

أريد فقط مشاركة كيفية استخدام خادم أو بيئة نشر متعددة مع mina. مينا لديها طرف ثالث للنشر في مراحل متعددة. يمكنك استخدام mina-multistages هذا عنوان url https://github.com/endoze/mina-multistage. إنه حقًا قوي لإدارة بيئة النشر الخاصة بك.
أتمنى أن يساعدك هذا جميعًا. شكرا

قرأت عن استخدام Mina بالتزامن مع Ansible لعمليات النشر متعددة المضيف.

+1 لرؤية هذا تمت إضافته في الأصل إلى مينا

  • 1 بومب

+1

أي حل للنشر الموازي باستخدام مينا ؟؟

ما زلت تنتظر التلوث الأصلي.
أثناء الانتظار ، ما زلت أستخدم حل

لا يقوم Mina بعمل عدة مربعات وربما لا يقوم أبدًا بذلك ، لأنه من المفترض استخدامه كنص سريع واحد على مضيف بعيد واحد.
أنا آسف حول هذا الموضوع.
هناك أداة رائعة [capistrano] تقوم بهذه المهمة بشكل جيد.

لقد أنشأت جوهرة بسيطة جدًا تسمى mina-multi_server تضيف دعمًا لخوادم متعددة. يتم تشغيل المهام بشكل متسلسل ، ولكن من المحتمل ألا تكون مشكلة إذا لم يكن لديك الكثير من الخوادم.

هي موضع تقدير جميع التعليقات.

هذا مانع لأي شخص يستخدم على سبيل المثال خادم sidekiq في مربع مخصص آخر.

منجم 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

لقد قمنا ببناء mina-multideploy - أداة مفيدة

شيء من هذا القبيل يمكن أن يعمل في التعامل مع الأدوار. مرة أخرى ، ليس موازيًا (حتى الآن).

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
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات