【问题标题】:gitlab-ci: remote shell execution with variable expansiongitlab-ci:带变量扩展的远程 shell 执行
【发布时间】:2018-04-28 15:46:59
【问题描述】:

在 gitlab-ci 作业中,我想创建一个带有作业 ID 的目录(在远程服务器上)并或多或少地执行一些操作,如下所示:

- ssh user@server mkdir -p /user/$CI_JOB_ID
- ssh user@server <perform_some_action_that_creates_several_zip_files>
- LAST_MODIFIED_FILE=$(ssh user@server bash -c 'find /user/$CI_JOB_ID -iname "*.zip" | tail -n 1 | xargs readlink -f')

确实创建了目录,并且创建了多个 zip 的操作也成功了。

但是,我用于获取最后修改/创建的.zip 的最后一个命令不起作用,因为$CI_JOB_ID 似乎没有得到扩展。

有什么建议吗?

【问题讨论】:

  • CI_JOB_ID 是远程机器中的环境变量吗?
  • 不,但这有效:ssh user@server mkdir -p /tmp/$CI_JOB_ID
  • 尝试使用双引号代替:"find /user/$CI_JOB_ID -iname '*.zip' | tail -n 1 | xargs readlink -f"。在这里,单引号可能会阻止$CI_JOB_ID的变量扩展
  • 我已经尝试过了...也不行...我还制作了一个本地副本variables 文件,其中包含export CI_JOB_ID=$CI_JOB_ID 等条目,将其复制到远程服务器并采购它......也没有运气......
  • 想一想,(在获取variables 文件时)变量不可用是有道理的......这些是不同的ssh 会话

标签: bash shell gitlab gitlab-ci


【解决方案1】:

这个问题是由于您的 ssh 调用造成的。你现在这样做的方式是混合上下文:

ssh user@server bash -c 'find /user/$CI_JOB_ID -iname "*.zip" | tail -n 1 | xargs readlink -f'
  • bash -c 'my_commands' :您使用简单的引号,因此 ssh 将完全执行指令 my_commands。在您的情况下,它将尝试查找 $CI_JOB_IDremote 值,而不是使用本地值。

  • ssh user@server bash -c "my_commands" :使用ssh,在远程 shell 上执行的命令作为单个字符串发送。因此,如果您要使用此引用运行 ssh,它将尝试运行 "bash -c find ... | tail ... | xargs ..."。在这里,只有find 贯穿bash -c

在您的情况下,只需直接编写以下语句即可:

ssh user@server "find /user/$CI_JOB_ID -iname '*.zip' | tail -n 1 | xargs readlink -f"

否则,如果您想继续使用bash -c 语法,则必须转义引号以便将其传播到远程计算机:

ssh user@server bash -c \"find /user/$CI_JOB_ID -iname '*.zip' | tail -n 1 | xargs readlink -f\"

【讨论】:

    猜你喜欢
    • 2019-04-10
    • 2018-04-11
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    相关资源
    最近更新 更多