通过SSH与Gitlab CI进行命令替换错误

时间:2019-10-18 14:55:33

标签: shell ssh gitlab gitlab-ci

我想使用gitlab-ci通过SSH执行shell,但是遇到错误。

变量具有以下值:

{{ item.score|round(2) }}

gitlab-ci.yml的一部分看起来像这样:

DEV_SERVER=myserver.domain.com
CODE_APP=4A
CI_COMMIT_REF_SLUG=pretorien-feature-ci

Gitlab CI返回此错误review_app: stage: review before_script: # SSH key configuration # ... script: - ssh dev@${DEV_SERVER} \ "CONTAINER_PORT=$(docker port app_${CODE_APP}-${CI_COMMIT_REF_SLUG} 80 | cut -d ':' -f2)" \ "&& echo 'My container port : ${CONTAINER_PORT}' > result.txt"

我尝试使用docker二进制路径(/ usr / bin / docker)或$(哪个docker)更改docker命令,但是我遇到了同样的问题。

因此,我决定使用其他方法:

/usr/bin/bash: line 109: docker: command not found

但是,在这种情况下,文件result.txt是,变量CONTAINER_PORT也是如此。

在两种情况下,我都直接在shell中检查了命令,结果很好,并且可以读取result.txt中的CONTAINER_PORT值

2 个答案:

答案 0 :(得分:2)

您所做的使docker命令在gitlab CI运行器中运行,该命令可能不知道。我假设您想在$ {DEV_SERVER}上运行docker命令,因此您需要正确地对子命令进行转义或将其括在撇号中,以确保它不会过早扩展。这样的事情应该做到这一点:

    - ssh dev@${DEV_SERVER} \
            "CONTAINER_PORT=\$(docker port app_${CODE_APP}-${CI_COMMIT_REF_SLUG} 80 | cut -d ':' -f2)" \
            "&& echo 'My container port : ${CONTAINER_PORT}' > result.txt"

我的测试:

$ ssh localhost "echo \$(echo \$SSH_CLIENT)"

正确写入SSH连接信息,该信息仅在会话中可用,而在本地会话中不可用。

答案 1 :(得分:1)

非常感谢!有用 :) 最后,我还使用了printf代替了echo

- ssh dev@${DEV_SERVER} \
            "cd ${DEV_REVIEW_DIRECTORY}/${CODE_APP}-${CI_COMMIT_REF_SLUG}/" \
            "&& CONTAINER_PORT=\$(docker port app_${CODE_APP}-${CI_COMMIT_REF_SLUG} 80 | cut -d ':' -f2)" \
            "&& printf '<html><head><script type=\"text/javascript\">window.location.replace(\"http://%q:%q\");</script></head></html>' ${DEV_SERVER} \$CONTAINER_PORT > redirect.html"