Capistrano - Как поместить файлы в общую папку?

Я новичок в Capistrano, и я видел, что есть общая папка, а также опция :linked_files. Я думаю, что общая папка используется для хранения файлов между релизами. Но мой вопрос в том, как файлы попадают в общую папку?

Кроме того, если я хочу символизировать другой каталог в текущем каталоге, например. статическая папка на каком-то пути, как я могу поместить ее в linked_dirs?

И наконец, как установить chmod 755 на linked_files и linked_dirs.

Спасибо.

Ответ 1

Папки внутри вашего приложения являются символическими ссылками на папки в общем каталоге. Если ваше приложение записывается в log/production.log, оно будет писать на ../shared/log/production.log. То, как файлы попадают в общую папку.

Вы можете увидеть, как это работает, глядя на спецификации или тесты в Capistrano.

Если вы хотите chmod эти общие файлы, вы можете просто сделать это один раз непосредственно через ssh, так как они никогда не будут изменены Capistrano после их создания.

Чтобы добавить связанный каталог в deploy.rb:

set :linked_dirs, %w{bin log tmp/backup tmp/pids tmp/cache tmp/sockets vendor/bundle}

или

set :linked_dirs, fetch(:linked_dirs) + %w{public/system}

Ответ 2

Я написал задачу для Capistrano 3 для загрузки ваших файлов конфигурации в общую папку каждого из ваших серверов, она проверит эти каталоги в порядке:

  • конфиг/развернуть/Config/:. Этап /* ут
  • конфиг/развернуть/конфигурации/*. YML

И загрузите все найденные файлы конфигурации. Он будет загружать файлы только в том случае, если они были изменены. Также обратите внимание, что если у вас есть тот же файл в обоих каталогах, то второй будет проигнорирован.

Здесь код: https://gist.github.com/Jesus/448d618c83fb0445ebbf

Последнее, эта задача - просто загрузить конфигурацию. файлов в вашу удаленную общую папку, вам все равно нужно установить linked_files в config/deploy.rb, например:

set :linked_files, %w{config/database.yml config/aws.yml}

UPDATE:

Если вы используете Git, вы, вероятно, захотите проигнорировать эти файлы:

echo "config/deploy/config/*" >> .gitignore

Ответ 3

Capistrano 3.5 +

Capistrano 3.5 представил append для полей массива. Из официальных документов вы должны использовать их:

Для общих файлов:

append :linked_files, %w{config/database.yml}

Для общих каталогов:

append :linked_dirs, %w{bin log public/uploads vendor/bundle}

Ответ 4

Есть три простых шага, которые вы можете выполнить, чтобы поместить файл, который вы не хотите изменять в последовательных выпусках; добавьте файл в список связанных_файлов.

set :linked_files, fetch(:linked_files, []).push('config.php')

Выберите все файлы, которые вы хотите разделить. Поместите этот файл с локального на удаленный сервер через scp

scp config.php [email protected]:~/capistrano/shared/config.php

Теперь разверните команду, указанную ниже:

bundle exec cap staging deploy

конечно, размещение может быть изменено в соответствии с требованиями может быть производство, песочница и т.д.

Еще одна вещь, потому что вы не хотите, чтобы ваши члены команды совершали такие файлы. Итак, поместите этот файл в ваш .gitignore файл. И нажмите его на git дистанционное репо.

Ответ 6

Для меня это не сработало, поэтому я добавил две функции в конце процесса развертывания:

namespace :your_company do
    desc "remove index.php"
    task :rm_files do
        on roles(:all) do
                execute "rm -rf #{release_path}/index.php"
        end
    end
end

namespace :your_company do
    desc "add symlink to index.php"
    task :add_files do
        on roles(:all) do
                execute "ln -sf #{shared_path }/index.php #{release_path}/index.php"
        end
    end
end

after "deploy:finished", "your_company:rm_files"
after "deploy:finished", "your_company:add_files"