如何在 ruby​​ / chef 中打印 git latest_tag 命令的值

Posted

技术标签:

【中文标题】如何在 ruby​​ / chef 中打印 git latest_tag 命令的值【英文标题】:How to print the value of a git latest_tag command in ruby / chef 【发布时间】:2018-12-21 19:45:51 【问题描述】:

我正在尝试从 git repo 中获取最新的 git 标签,它是克隆到我的 EC2 Ubuntu 实例的。下面是我正在使用的厨师食谱,即 git.rb

execute 'test' do
cwd 'myapp-codecommit/myfiles'
 #command 'git clone https://'+node[:awscli][:GIT_USER]+':'+node[:awscli][:GIT_PASS]+'@git-codecommit.us-east-1.amazonaws.com/v1/repos/xxxxxxxx'
  command '$(git describe --abbrev=0 --tags)'
  puts "output is #command"

end

输出:EC2 日志

Use `bundle show [gemname]` to see where a bundled gem is installed.
output is $(git describe --abbrev=0 --tags)
[2018-07-13T12:04:28+00:00] INFO: Processing execute[test] action run 
Error executing action `run` on resource 'execute[test]'
Mixlib::ShellOut::ShellCommandFailed
Expected process to exit with [0], but received '127'
---- Begin output of $(git describe --abbrev=0 --tags) ----
STDOUT:
STDERR: sh: 1: master-1.0.177: not found
---- End output of $(git describe --abbrev=0 --tags) ----
Ran $(git describe --abbrev=0 --tags) returned 127
Resource Declaration:
# In /var/chef/runs/bb7cdd55-4fa8-4979-8485-dc5706d9db32/local-mode-cache/cache/cookbooks/deployfile/recipes/git.rb
3: execute 'test' do
4:     cwd 'myapp-codecommit/myfiles'
5:   #command 'git clone https://'+node[:awscli][:GIT_USER]+':'+node[:awscli][:GIT_PASS]+'@git-codecommit.us-east- 1.amazonaws.com/v1/repos/xxxxxxxx'
6:   command '$(git describe --abbrev=0 --tags)'
7:
8:   puts "output is #command"
9:
10: end

正如我们在输出日志中看到的,我能够在 (STDERR) 下获取最新标签,即 master-1.0.177 但我希望最新的标签,即 (master-1.0.177) 打印为

output is master-1.0.177

我在哪里

output is $(git describe --abbrev=0 --tags)

【问题讨论】:

不清楚您尝试了什么以及您要问什么,请明确定义问题。 请编辑您的问题(通过单击其正下方的编辑链接)并将相关代码和错误消息直接放入其中。请不要发布代码或错误消息的屏幕截图。 嗨@mjwatts,我想从命令中获取值并将其存储在一个变量中,但目前我只想让它显示puts中的值。第一次写给*** 请耐心等待并感谢您的帮助 嗨@HolgerJust 感谢您的帮助终于弄清楚了如何在没有问题截图的情况下获取代码。 :) 【参考方案1】:

厨师资源没有输出值。您可能想要的是 shell_out! 辅助方法的一些用法,但您必须更具体地了解您最终要完成的工作。这是为了快速调试吗?

编辑:

你想要这样的东西:

# You can swap in some other resource like s3_file, the principle is the same.
remote_file "download the artifact" do
  source lazy 
    git_describe = shell_out!('git describe --abbrev=0 --tags', cwd: '/path/to/myapp-codecommit/myfiles').stdout.strip
    "https://something/path/to/myapp-#git_describe.jar"
  
end

【讨论】:

所以,我将构建工件存储在 S3 中,它们被命名为 git 版本,例如master-1.0.177.jar ,所以我想编写一个配方,它采用最新的 git 版本并将其与构建 jar 名称进行比较,然后下载该特定 jar 以在 opsworks 中部署。有什么更好的方法来做到这一点? 如果您的意思是 OpsWorks Stacks,它会使事情稍微复杂化,因为那里没有可用的 Chef 版本受支持,但大多数相同的 API 都存在。我将在一个示例中进行编辑。 是的,它对我有用,只有我在第一行所做的更改,即带有 jar 扩展名的 remote_file 'test.jar' 文件名,它工作正常 :) 谢谢

以上是关于如何在 ruby​​ / chef 中打印 git latest_tag 命令的值的主要内容,如果未能解决你的问题,请参考以下文章

Cookbook 的深度依赖需要一个不可用的 Ruby 版本。如何通过 Chef for Amazon Linux 规避?

在 chef lwrp 中安装、要求和使用 ruby​​ 库

ruby 示例Chef扩展,用于从HashiCorp的Vault中提取秘密

特定的 nodejs 版本,opsworks_ruby,aws,chef 12

您如何中止/结束 Chef 运行?

ruby 使用Chef特定的版本检查安装.net