我需要在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
提前谢谢。
答案 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_if
或only_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脚本代码。 (它更容易维护并及时保持幂等性)