Ошибка подстановки команды через SSH с Gitlab CI - PullRequest
0 голосов
/ 18 октября 2019

Я хочу выполнить shell через SSH с gitlab-ci, и я сталкиваюсь с ошибками.

Переменные имеют следующие значения:

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

часть gitlab-ci.yml выглядит так:

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"

Gitlab CI возвращает эту ошибку /usr/bin/bash: line 109: docker: command not found

Я пытался изменить команду docker с двоичным путем docker (/ usr / bin / docker) или $ (который docker), но яУ меня та же проблема.

Итак, я решил использовать другой подход:

review_app:
    stage: review
    before_script:
        # SSH key configuration
        # ...
    script:
        - ssh dev@${DEV_SERVER} \            
            "{ read CONTAINER_PORT _; } < <(docker port app_${CODE_APP}-${CI_COMMIT_REF_SLUG} 80 | cut -d ':' -f2)" \
            "&& echo 'My container port : ${CONTAINER_PORT}' > result.txt"

Но в этом случае файл result.txt будет пуст ипеременная CONTAINER_PORT тоже.

В обоих случаях я проверял команды непосредственно в оболочке, результат был хорошим, и я могу прочитать значение CONTAINER_PORT в result.txt

Ответы [ 2 ]

2 голосов
/ 18 октября 2019

То, что вы сделали, заставляет команду docker работать в Gitlab CI runner, который, вероятно, не знает об этом. Я предполагаю, что вы хотите запустить команду docker на $ {DEV_SERVER}, поэтому вам нужно правильно экранировать или заключить подкоманду в апострофы, чтобы убедиться, что она не раскрывается слишком рано. Что-то вроде этого должно сделать это:

    - 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 голос
/ 21 октября 2019

Большое спасибо! Это работает :) Наконец, я также использовал 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"
...