Chef bash执行not_if某些命令返回1

时间:2015-03-17 12:50:50

标签: ruby git bash maven chef

我需要在git repo&中检查代码仅当repo dir中的代码包含错误的分支时才执行mvn clean package。我怎样才能在厨师食谱中使用(或不使用)not_if?

bash "checkout_and_compile_if_wrong_version" do
  user "develop"
  group "develop"
  cwd "/var/www/"
  environment 'HOME' => "/home/develop"
  code <<-EOH
            cd /var/www/code_repo/
            git checkout #{node['last_version']}
            git pull
            mvn clean package
  EOH
  not_if { ...condition... }
end

也许我可以使用像check这样的条件(在code_repo目录中):

[ "$(git branch |grep "*" |awk '{print $2}')" == #{node['last_version']} ] && echo 1
提前谢谢。

1 个答案:

答案 0 :(得分:2)

Chef有一个git resource,显然最适合您的用例。

我会做这样的事情(未经测试的代码):

execute "clean package" do
  cwd "/var/www/code_repo/"
  command "mvn clean package"
  user "develop"
  group "develop"
  action :nothing
end

git "/var/www/code_repo/" do
  repository "you_repo_url"
  revision node['last_version']
  user "develop"
  group "develop"
  action :sync
  notifies :run,"execute[clean package]", :immediately
end

如果新提交完成或node['last_version']更改并且只有在发生更改时才会运行mvn clean,这将同步。 HOME env var由git资源设置,因此不需要提供它。


根据评论编辑:

在任何事情之前引用not_ifonly_if警卫文件:

  

字符串作为shell命令执行。如果命令返回0,则   守卫是适用的。如果该命令返回任何其他值,那么   保护属性未应用

食谱代码:

bash "whatever" do
  command "test"
   only_if %Q{git branch | awk '/^[*] / { exit $2=="#{node['last_version']}"}'}, :cwd => "/var/www/code_repo"

end

棘手的部分: 只有当版本不等于node['last_version'](通过awk中的相等测试保护打印0)时,bash才会起作用

我在一行awk脚本中简化了grep / awk / test部分,该脚本以*/ /内的正则表达式)开始在线工作,然后告诉awk以两者之间的比较结果退出第二个字段(实际的git分支)和chef属性版本。 %Q{ code and "quote test indide" }是一种红宝石形式,允许使用引号而不必逃避它们。

如果比较结果为true,则不执行任何操作,如果为false,则运行bash脚本。

我强烈建议尽可能尝试使用厨师资源,并尝试尽可能地使用厨师资源替换bash脚本代码。 (它更容易维护并及时保持幂等性)