Gitlab CI:Docker在运行测试之前通过SSH端口转发连接到远程MySQL

Gitlab CI:Docker在运行测试之前通过SSH端口转发连接到远程MySQL,docker,ssh,gitlab-ci,Docker,Ssh,Gitlab Ci,我正在尝试将我的单元测试集成到Gitlab CI中,它基本上是有效的 NodeJS应用程序使用托管在不同服务器上的MySQL数据库(使用:ssh-L 3306:127.0.0.1:3306)username@remoteserver)我们在本地端口转发到它,因此,当我们连接到它时,所有测试都在本地通过 CI脚本(包括在下面)似乎可以工作,并且测试可以传递任何不需要mysql连接的函数。我需要我的CI runner通过SSH连接到远程服务器,并测试其余的功能 但是,我正在努力找到一种方法,让我的g

我正在尝试将我的单元测试集成到Gitlab CI中,它基本上是有效的

NodeJS应用程序使用托管在不同服务器上的MySQL数据库(使用:
ssh-L 3306:127.0.0.1:3306)username@remoteserver
)我们在本地端口转发到它,因此,当我们连接到它时,所有测试都在本地通过

CI脚本(包括在下面)似乎可以工作,并且测试可以传递任何不需要mysql连接的函数。我需要我的CI runner通过SSH连接到远程服务器,并测试其余的功能

但是,我正在努力找到一种方法,让我的
gitlab ci.yml
脚本在运行测试之前执行SSH(使用公钥)到这个远程服务器,并在本地端口将其转发到127.0.0.1

我也不确定公钥/私钥对是在Docker内部生成,还是通常在安装Runner的机器上生成

谁能给我指出正确的方向吗

image: node:7.4

before_script:
  - apt-get update -qy
  - npm install -g mocha chai assert mysql require moment
stages:
  - test

test_job:
  stage: test
  tags: ["mySpecificRunner"]
  script:
    - npm run test

  environment:

  only:
  - development

这不是直截了当的,但总有办法。GitLab甚至提供了一个

您要做的是:

  • 生成公钥/私钥对
  • 在要连接到的服务器上,将密钥的公共部分添加到列出授权密钥的文件中(通常
    ~/.ssh/authorized\u keys
  • 在Gitlab中,创建一个名为
    SSH\u PRIVATE\u KEY
    的新变量,将密钥的私有部分作为值
  • 在项目中,修改文件
    .gitlab ci.yml
    ,以便Docker容器使用密钥的私有部分:

    image: debian:latest
    
    before_script:
    # install & run ssh-agent
    - apt-get -qq update -y
    - apt-get -qq install openssh-client -y
    # setup the private key
    - eval $(ssh-agent -s)
    - ssh-add <(echo "$SSH_PRIVATE_KEY")
    - mkdir -p ~/.ssh
    - echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
    

  • 请注意,在编写此答案时,我无法保持SSH连接处于活动状态并在那里逐个运行命令。这就是为什么要使用
    您好,谢谢您的详细回复!现在我有周末的时间来尝试并让它工作!我会很快报告的。这是一个好办法。我必须做的一件事是将公钥也添加为部署密钥,因为我得到了一个主机密钥检查错误。我还在关键行之后添加了“| | exit 1”(特别是在进入npm的部署/发布阶段),以在出现任何错误时强制使构建阶段失败
    
    deploy-dev:
      stage: deploy
      script:
      - |
        ssh -t $USER@$HOST << EOF
          git fetch --all -v
          git checkout -f dev
          git reset --hard origin/dev
          EOF