我正在尝试将我的单元测试集成到主要工作的 Gitlab CI 中。

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

CI 脚本(包括在下面)似乎可以工作,并且测试通过了任何不需要 mysql 连接的函数。我需要我的 CI 运行器通过 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 提供 documentation甚至是 example .

你想做的是:

  • 生成公钥/私钥对
  • 在您要连接的服务器上,将 key 的公共(public)部分添加到列出授权 key 的文件中(通常为 ~/.ssh/authorized_keys )
  • 在 Gitlab 中,创建一个名为 SSH_PRIVATE_KEY 的新变量将 key 的私有(private)部分作为值
  • 在你的项目中,修改文件.gitlab-ci.yml以便 Docker 容器使用 key 的私有(private)部分:
    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 
    
  • 然后,您的脚本应该能够无缝连接到服务器并在那里运行命令或脚本,例如($HOST$USER 也是 secret 变量):
    deploy-dev: 
      stage: deploy 
      script: 
      - | 
        ssh -t $USER@$HOST << EOF 
          git fetch --all -v 
          git checkout -f dev 
          git reset --hard origin/dev 
          EOF 
    

  • 请注意,在撰写此答案时,我无法保持 SSH 连接处于事件状态并在那里一一运行命令。这就是使用 << EOF 的原因。 .


    评论关闭
    IT序号网

    微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!