2014-12-23 5 views
1

AWS OpsWorks를 사용하여 장고 응용 프로그램을 배포하려고합니다. 나는 모든 종류의 개발 작업에 새로운 브랜드가되어 상당한 어려움을 겪고 있습니다.OpsWorks 장고 배포

배포를 자동화하기 위해 this cookbook을 사용하려고합니다. Python3.4가 필요합니다. 따라서 요리 책에서 몇 가지 사항을 수정했습니다. 현재 배포 후크 동안, 나는 다음과 같은 코드에서 오류가 점점 오전 :

# install requirements 
    requirements = Helpers.django_setting(deploy, 'requirements', node) 
    if requirements 
    Chef::Log.info("Installing using requirements file: #{requirements}") 
    pip_cmd = ::File.join(deploy["venv"], 'bin', 'pip') 
    execute "#{pip_cmd} install --source=#{Dir.tmpdir} -r #{::File.join(deploy[:deploy_to], 'current', requirements)}" do 
     cwd ::File.join(deploy[:deploy_to], 'current') 
     user deploy[:user] 
     group deploy[:group] 
     environment 'HOME' => ::File.join(deploy[:deploy_to], 'shared') 
    end 
    else 
    Chef::Log.debug("No requirements file found") 
    end 

오류 보고서 :

STDERR: /opt/aws/opsworks/releases/20141216163306_33300020141216163306/vendor/bundle/ruby/2.0.0/gems/mixlib-shellout-1.4.0/lib/mixlib/shellout/unix.rb:147:in `chdir': No such file or directory - /srv/www/django/current (Errno::ENOENT) 

가이 코드 내 requirements.txt에서 요구 사항을 설치하려고 것을 얻을 파일이 무엇입니까? 그러나 tmp 디렉토리와 current 디렉토리는 무엇입니까? 분명히 배포를 수행 할 때 만들어진 current 디렉토리가 없습니다. 배포에서 OpsWorks로 가져 오는 코드와 일반적으로 비슷한 파일 구조는 무엇입니까? 또한이 오류에 대한 해결책을 찾으려면 어떻게해야합니까?

저는 요리사, OpsWorks, KitchenCI, Berksfile 및 기타 기술에 대한 문서를 읽고 있었지만 며칠 동안은 DevOps의 세계에서 모든 것을 느낄 수있었습니다. 난 그냥 내 응용 프로그램을 실행하고 싶어!

편집

사용자 정의 JSON은 다음과 같습니다

{ 
    "deploy" : { 
     "django" : { 
      "django_settings_template" : null, 
      "django_settings_file" : "settings.py", 
      "django_collect_static" : "true", 
      "python_major_version" : "3.4", 
      "venv_options" : "--python=$(which python3.4) --no-site-packages", 
     "custom_type" : "django" 
     } 
    } 
} 

답변

0

에는 현재 디렉토리가 배포 과정에서 생성되지 않았기 때문에 그것의 존재하지 않는 경우. 스크립트는 실제로 해당 디렉토리를 참조합니다.

아래의이 코드 블록은 오류가있는 곳입니다. 실행 리소스 블록 https://docs.chef.io/resource_execute.html에 대한 문서를 참조하면 실행 리소스에 명령을 제공하지 않으면 블록의 이름이 어떤 명령이 실행되는지 알 수 있습니다. 그래서 귀하의 경우에는 Ruby의 file.join을 통해 pip 명령에 대한 경로를 생성하므로 pip_cmd는/usr/bin/pip와 같아야합니다. 그러면 블록 이름이 다음과 같은 명령이어야합니다.

#Mind you I'm not sure if the /tmp dir is correct, but if not it might also be the chef tmp directory 
/usr/bin/pip install --source=/tmp -r /srv/www/django/current/requirements 

이제 리소스에서 "현재 작업 디렉터리"또는 명령이 실행되는 디렉터리 인 cwd 특성을 갖게됩니다. 이 명령을 실행 그래서 때 전류//는 SRV/www /에서 장고에서 실행되는 것

pip_cmd = ::File.join(deploy["venv"], 'bin', 'pip') 
execute "#{pip_cmd} install --source=#{Dir.tmpdir} -r #{::File.join(deploy[:deploy_to], 'current', requirements)}" do 
    cwd ::File.join(deploy[:deploy_to], 'current') 
    user deploy[:user] 
    group deploy[:group] 
    environment 'HOME' => ::File.join(deploy[:deploy_to], 'shared') 
end 

지금 배포에 대해 좀 더 알고없이 정말 어떻게 좀 더 알고없이 문제를 해결하는 방법을 말할 수 없다 배포에 대해 이 요리 책을 사용하여 코드를 배포하는 방법을 볼 수 있도록 실제 요리 코드를 게시 할 수 있습니까?

+0

조금 더 파고 나면 코드가 SCM에 배포되지 않는 것으로 보입니다. 내가 사용하고있는 요리 책은이 repo에서 찾을 수 있습니다 : https://github.com/alecpm/opsworks-web-python/tree/master/opsworks_deploy_python'python_base_deploy.rb' 정의에서 196 행의 메시지가 나타납니다. 어떤 scm 저장소도 설정되어 있지 않습니다 ... 그러나 저는 OpsWorks 콘솔에서 Bitbucket 저장소를 설정하고 deploy [: my_app] [: scm]을 올바르게 설정하고 있습니다. – rfj001

+0

@ rfj001 그러면 배포 설정이 github 페이지의 사용 예제와 비슷합니까? 게시 할 수 있습니까? –

+0

스택에 보내는 사용자 정의 배치 JSON을 의미합니까? – rfj001