2016-11-23 2 views
0

Ich versuche, App-Bereitstellung mit Capistrano zu automatisieren. Ich habe fast alle Aufgaben außer s3 Montage und Demontage von Rezept abgeschlossen.Mountpoint-Fehler in Ruby on Rails-Server mit Capistrano

Hier ist das Rezept, das ich geschrieben habe, es funktioniert unter bestimmten Bedingungen und es unter bestimmten Bedingungen nicht. Die im Rezept verwendeten Befehle werden jedoch ausgeführt, wenn ich mich manuell beim Server anmelde und sie selbst ausführe.

desc "Mounting S3 for the first time" 
    task :mounting_s3 do 
     on %w(uat2_sub1 uat2_main), in: :sequence, wait: 5 do |host| 
      as 'cc' do 
       within '/var/www/test_cap/current' do 
        code_folder = "/var/www/test_cap/current" 
        path = "/var/www/test_cap/current/public/system" 
        unmount_path = "/var/www/test_cap/shared/public/system" 

        # check first if public/system exists 
        puts "** Checking if public/system folder exists on #{host}" 
        if test("[ -d #{path} ]") 
         puts "** public/system folder exists.." 
         puts "** Checking if S3 is mounted" 
         result = execute! "mountpoint #{path}" 
         puts "result #{result}" 
         if result.match('is a mountpoint') != nil 
          puts "** S3 is mounted at #{path} on #{host}" 
          puts "** unmounting s3 at #{unmount_path}" 
          execute! "fusermount -u #{unmount_path}" 
          puts "** s3 unmounted at #{unmount_path} on #{host}" 
         elsif result.match('is not a mountpoint') != nil 
          puts "** #{path} is not a mountpoint on #{host}"  
         end 
        else 
         puts "** public/system folder does not exists.." 
         puts "** Mounting S3" 
         execute! "cd #{code_folder} && s3fs cc-system-uat #{path}" 
        end 
       end 
      end 
     end 
    end 

Ich bin in der Lage zu Aushängen S3 von Capistrano mit fusermount -u wenn ich s3 vom Server selbst montiert habe.

Ebenso kann ich mount s3 von capistrano, wenn ich s3 vom Server selbst abgehängt habe.

Ich führe alle Befehle als cc Benutzer. Ich verstehe immer noch nicht, warum ich den folgenden Fehler bekomme. In den Protokollen ist sichtbar, dass public/system kein Mount-Punkt ist, aber ich kann von diesem Punkt aus nicht fortfahren. Wie ich das Ergebnis von Mountpoint "public/system" in einer Variablen speichern und dann verschiedene Aufgaben ausführen soll.

** Invoke bundler:map_bins (first_time) 
** Execute bundler:map_bins 
** Invoke deploy:set_rails_env (first_time) 
** Execute deploy:set_rails_env 
** Invoke deploy:set_linked_dirs (first_time) 
** Execute deploy:set_linked_dirs 
** Invoke deploy:set_rails_env 
** Invoke deploy:mounting_s3 (first_time) 
** Execute deploy:mounting_s3 
** Checking if public/system folder exists on uat2_sub1 
** public/system folder exists.. 
** Checking if S3 is mounted 
00:00 deploy:mounting_s3 
     01 mountpoint /var/www/test_cap/current/public/system 
     01 /var/www/test_cap/current/public/system is not a mountpoint 
cap aborted! 
Exception while executing on host uat2_sub1: mountpoint /var/www/test_cap/current/public/system exit status: 1 
mountpoint /var/www/test_cap/current/public/system stdout: /var/www/test_cap/current/public/system is not a mountpoint 
mountpoint /var/www/test_cap/current/public/system stderr: Nothing written 
/home/xyz/.rvm/gems/ruby-2.1.0/gems/sshkit-1.11.4/lib/sshkit/runners/sequential.rb:31:in `rescue in run_backend' 

Antwort

0

Diese raise_on_non_zero_exit: false Option wurde behoben. Capture wirft tatsächlich einen Fehler, wenn keine Ausgabe erfolgt.

result = capture "cd #{code_folder} && mountpoint public/system" , raise_on_non_zero_exit: false