【问题标题】:Gitlab ci can't run more than 2 ssh commandsGitlab ci 不能运行超过 2 个 ssh 命令
【发布时间】:2018-12-08 04:42:07
【问题描述】:

我正在尝试使用来自 gitlab 的 docker 使用它的 ci 部署我的应用程序。我已将 gitlab-ci 配置如下(它已简化,docker build 和 push to registy 是在eariel 步骤中完成的,但为了便于阅读,我将跳过它)

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 并登录到注册表。

作为开发服务器,我有一个来自 DigitalOcean 的一键式 docker droplet,它是否可能无法处理此流量?也许我应该等一下,直到调用下一个 ssh 命令?我完全迷失了,因为这是一个非常基本的配置,我找不到任何其他配置,所以我会非常感谢任何提示,谢谢!

【问题讨论】:

  • 是的,在将所有命令合并到一个只需要一个 ssh 连接的组合之后,它就开始工作了。但为什么?是不是可以建立多个ssh连接,每次只调用一个command?

标签: docker gitlab-ci


【解决方案1】:

也许在 DO 限制 ssh 的某个地方有一个配置来防止多个连续的连接? (这可以通过将至少一个-v 标志传递给ssh 命令来进行调查……)

在任何情况下,一个解决方案可能是将您的 ssh 命令合并为一个。

例如,您可以尝试这样的事情吗?

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

否则,假设您的存储库中某处有一个 bash 脚本,您也可以使用管道远程运行此脚本,例如:

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

【讨论】:

  • 谢谢,我就是这样做的,确实有帮助。实际上,我还尝试在每个 ssh 之间等待几秒钟,这似乎也有帮助。 ssh 连接是否在命令执行的整个时间内打开?如果是这样,是否可以告诉 gitlab-ci 完全等待执行结束?
  • 当然:这是默认情况下发生的情况。
  • @kebie 再次想到,由于命令引用,我在回答中建议的 bash --login -c "…" 措辞似乎不起作用;事实上,你可以运行ssh [options] …@… "command1 && command2"(或者使用管道,请参阅我更新答案的最后一部分)
  • 您知道如何更改设置以允许多个连接吗?将命令与&& 合并按预期工作,但很难解决此限制。我已经更改了/etc/ssh/sshd_config 中的MaxSessions 参数,但问题仍然存在。
猜你喜欢
  • 1970-01-01
  • 2019-05-13
  • 2017-04-01
  • 2022-11-08
  • 2020-06-28
  • 2022-08-06
  • 2020-02-15
  • 2019-03-03
  • 2022-08-14
相关资源
最近更新 更多