Gitlab ci не может запустить более 2 команд ssh - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь развернуть свое приложение с помощью докера из gitlab, используя его ci.Я настроил gitlab-ci следующим образом (он упрощен, сборка докера и передача в регистр выполняется на более ранних этапах, но для удобства чтения я пропущу его)

image: docker:stable

services:
  - postgres:latest
  - docker:dind

stages:
  - test
  - build
  - deploy

variables:
  DOCKER_HOST: tcp://docker:2375/
  DOCKER_DRIVER: overlay2

run_develop_container:
  stage: deploy
  image: kroniak/ssh-client
  before_script:
    - which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )
    - eval $(ssh-agent -s)
    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null
    - mkdir -p ~/.ssh
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
    - ssh-keyscan -H $DEVELOP_SERVER >> ~/.ssh/known_hosts
    - chmod 700 ~/.ssh
  script:
    - scp docker-compose-develop.yml $SSH_DEPLOY_USER@$DEVELOP_SERVER:~/docker-compose.yml
    - ssh -o StrictHostKeyChecking=no $SSH_DEPLOY_USER@$DEVELOP_SERVER "docker login -u $DOCKER_USER_ID -p $DOCKER_USER_PASSWORD"
    - ssh -o StrictHostKeyChecking=no $SSH_DEPLOY_USER@$DEVELOP_SERVER "docker-compose -p app-name down --remove-orphans"
    - ssh -o StrictHostKeyChecking=no $SSH_DEPLOY_USER@$DEVELOP_SERVER "docker-compose -p app-name pull && docker-compose -p app-name up -d"
  only:
    - setup_deploy_process

И вывод из конвейера выглядит следующим образом

... some common things ...
$ which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )
/usr/bin/ssh-agent
$ eval $(ssh-agent -s)
Agent pid 12
$ echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null
Identity added: (stdin) ((stdin))
$ mkdir -p ~/.ssh
$ [[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
$ ssh-keyscan -H $DEVELOP_SERVER >> ~/.ssh/known_hosts
# some_data_with_develop_server_ip
$ chmod 700 ~/.ssh
$ scp docker-compose-develop.yml $SSH_DEPLOY_USER@$DEVELOP_SERVER:~/docker-compose.yml
$ ssh -o StrictHostKeyChecking=no $SSH_DEPLOY_USER@$DEVELOP_SERVER "docker login -u $DOCKER_USER_ID -p $DOCKER_USER_PASSWORD"
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded
WARNING! Your password will be stored unencrypted in /home/runner/.docker/config.json.
Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store

$ ssh -o StrictHostKeyChecking=no $SSH_DEPLOY_USER@$DEVELOP_SERVER "docker-compose -p app-name down --remove-orphans"
ssh: connect to host 159.89.24.62 port 22: Connection refused
ERROR: Job failed: exit code 1

Теперь мне кажется, что ssh настроен правильно, так как скрипт может подключаться к scp docker-compose и входить в реестр.

При разработке сервера у меня один щелчокDocker droplet от DigitalOcean, возможно ли, что он не справится с этим трафиком?Может быть, мне стоит подождать, пока не будет вызвана следующая команда ssh?Я полностью потерян, так как это довольно простая конфигурация, и я не могу найти другую, поэтому я буду очень благодарен за любую подсказку, спасибо!

1 Ответ

0 голосов
/ 06 декабря 2018

Может быть, где-то в DO есть дросселирование ssh для предотвращения множественных последовательных соединений?(это можно проверить, передав хотя бы один флаг -v команде ssh ...)

В любом случае решение может состоять в том, чтобы объединить ваши команды ssh в одну.

Например, не могли бы вы попробовать что-то вроде этого?

- ssh -o StrictHostKeyChecking=no …@… "docker login … && docker-compose …"

В противном случае, если у вас есть репозиторий bash где-нибудь в вашем репо, вы также можете использовать канал для удаленного запуска этого скрипта, например:

- cat some_script.sh | ssh -o StrictHostKeyChecking=no …@… "bash --login"
...