我想使用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值
答案 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"