使用Chef开始,并在部署时运行Composer Install

6
我们希望使用OpsWorks在Amazon上部署几个基于Laravel4的PHP应用程序,这需要以下几点:
  • 从git获取代码
  • 从getcomposer.com下载composer.phar
  • 运行php composer.phar install
  • 更改几个特定文件夹的权限
我对chef完全不熟悉,因此最初寻找一个了解chef基础知识的地方,然后是如何完成上述任务,希望得到任何指导。
6个回答

2

由于composer.phar已经是可执行文件,您可以将其放置在$PATH目录中的一个文件夹中:

remote_file '/usr/bin/composer' do
    source 'http://getcomposer.org/composer.phar'
    mode '0755'
    action :create_if_missing
end

2
我不是厨师大师(通常我使用 Puppet),但请尝试以下步骤:

从 git 获取代码

您可以执行 wget 命令(请参阅下面的示例)。

如果您想要更复杂的东西,请参见 http://docs.opscode.com/resource_deploy.html

deploy_revision "/path/to/application" do
  repo 'ssh://name-of-git-repo/repos/repo.git'
  migrate false
  purge_before_symlink %w{one two folder/three}
  create_dirs_before_symlink []
  symlinks(
    "one"   => "one",
    "two"   => "two",
    "three" => "folder/three"
  )
  before_restart do
    # some Ruby code
  end
  notifies :restart, "service[foo]"
  notifies :restart, "service[bar]"
end

从getcomposer.com下载composer.phar

我会执行wget命令。

我从这里提取了一些代码:http://cookingclouds.com/2012/06/23/chef-simple-cookbook-example/

它基本上只是在特定文件夹中执行wget,提取tar文件的内容并更新新文件的权限。仅当文件夹不存在时才执行此操作。

# Run a bash shell -  download and extract composer
bash "install_composer" do
     user "root"
     cwd "/folder/to/extact/to"
     code <<-EOH
       wget http://getcomposer.com/composer.tar.gz
       tar -xzf composer.tar.gz
       chown -R user:group /folder/to/extact/to
     EOH
     not_if "test -d /folder/to/extact/to"
end

运行“php composer.phar install”命令。

http://docs.opscode.com/resource_execute.html

execute "composer install" do
  command "php composer.phar install && touch /var/log/.php_composer_installed"
  creates "/var/log/.php_composer_installed"
  action :run
end

这将只运行一次,否则您可以删除“creates”,这样它每次都会运行。

更改几个特定文件夹的权限

http://docs.opscode.com/resource.html

directory "/tmp/folder" do
  owner "root"
  group "root"
  mode 0755
  action :create
end

如果目录已经存在,则不会发生任何事情。如果目录有任何更改,资源将被标记为已更新。

最后

我发现搜索很方便,在Chef网站上浏览东西似乎是没有希望的(要挖掘的内容太多)。http://docs.opscode.com/search.html


采用了类似的设置,但我不再在部署时下载composer.phar,因为我已经遇到过composer网站宕机的情况,这会导致整个部署站点崩溃。相反,我现在将composer.phar放在git仓库中。 - duellsy

2
我会基本上同意Drew Khoury的回答,只有一个改变。为了下载compose.phar,你可以使用remote_file resource而不是在bash脚本中使用wget。请注意保留HTML标签。

在Drew的回答下添加了一条评论,说明我为什么不再下载composer.phar。 - duellsy

0
您可以将git钩子post-receive配置为以下内容:
GIT_WORK_TREE=/path/to/your/site
cd /path/to/your/site
curl -sS https://getcomposer.org/installer | php
php composer.phar install
# do your stuff here 

同时确保将可执行权限赋予 post-receive 文件。


0

或者你可以直接提交你的 vendor 目录。我们有几个项目在 Laravel 4 和 OpsWorks 上运行。


除了增加存储库的大小之外,有哪些缺点?如果您有一个付费客户,他期望他的解决方案能够持久存在,我不想把它交给一些随机陌生人来保持他们的存储库在线。别误会,我很感激人们为Composer及其库所做的工作,但是人们会失去兴趣、生病等。 - Maciej Swic
增加存储库大小是一个问题,但还有一个巨大的提交历史记录问题,其中涌现了其他人的更新,这些更新与我的项目完全无关。 - duellsy
@duellsy 是的,这一点必须考虑到,但是没有技术上的影响,对吧? - Maciej Swic

-1

我在Laravel和OpsWorks方面处于同样的位置。我一直在寻找解决方案,但是...

如果有人将安全漏洞注入其中一个子模块中会发生什么?这是否意味着我们信任X个外部代码库始终是100%安全的?

要么我的理解存在一些根本性缺陷,要么在生产服务器上运行composer本身就是最严重的问题。

我现在确保项目存储库中的代码将被100%原样部署。永远不会在生产服务器上下载外部模块。


这正是composer.lock文件的作用,它确保您下载的软件包版本与本地工作的版本完全一致。请参阅http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file。 - duellsy
确切的版本或确切的代码(例如通过校验和进行验证)?我们如何知道代码与开发环境中的代码完全相同? - Daniel
确切的版本,实际上就是确切的代码。当你执行 composer update 命令时,它会使用每个包的版本更新 composer.lock 文件。如果你在另一台机器上运行 composer install 命令,则根据 composer.lock 文件中的版本号下载软件包,而不是盲目地下载最新版本的软件包。 - duellsy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接