我正在尝试将我的单元测试集成到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 提供了文档,甚至提供了一个示例。
您要做的是:
- 生成公钥/私钥对
- 在要连接的服务器上,将密钥的公共部分添加到列出授权密钥的文件(通常
~/.ssh/authorized_keys
) - 在 Gitlab 中,创建一个名为
SSH_PRIVATE_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 *ntStrictHostKeyChecking nonn" > ~/.ssh/config
-
然后,您的脚本应该能够无缝连接到服务器并在那里运行命令或脚本,例如(
$HOST
和$USER
也是秘密变量):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
背后的原因。