Gitlab CI:Docker 在 运行 测试之前通过 SSH 端口转发连接到远程 MySQL
Gitlab CI: Docker connect to remote MySQL via SSH Portforwarding before running tests
我正在尝试将我的单元测试集成到 Gitlab CI 中,这主要是工作。
NodeJS 应用程序使用 MySQL 托管在我们本地转发到的不同服务器上的数据库(使用:ssh -L 3306:127.0.0.1:3306 username@remoteserver
),因此,所有测试在我们连接到本地时通过它。
CI 脚本(包含在下面)似乎可以工作,并且测试通过了不需要 mysql 连接的任何函数。我需要我的 CI 运行 用户通过 SSH 连接到远程服务器并测试剩余的功能。
但是,我正在努力寻找一种方法让我的 gitlab-ci.yml
脚本执行 SSH(使用 public 密钥)到此远程服务器并在本地端口将其转发到 127.0.0.1,在测试之前 运行。
我也不确定 public/private 密钥对是在 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 and even an example。
您想做的是:
- 生成 public/private 密钥对
- 在您要连接的服务器上,将密钥的 public 部分添加到列出授权密钥的文件中(通常是
~/.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 *\n\tStrictHostKeyChecking no\n\n" > ~/.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
.
背后的原因
我正在尝试将我的单元测试集成到 Gitlab CI 中,这主要是工作。
NodeJS 应用程序使用 MySQL 托管在我们本地转发到的不同服务器上的数据库(使用:ssh -L 3306:127.0.0.1:3306 username@remoteserver
),因此,所有测试在我们连接到本地时通过它。
CI 脚本(包含在下面)似乎可以工作,并且测试通过了不需要 mysql 连接的任何函数。我需要我的 CI 运行 用户通过 SSH 连接到远程服务器并测试剩余的功能。
但是,我正在努力寻找一种方法让我的 gitlab-ci.yml
脚本执行 SSH(使用 public 密钥)到此远程服务器并在本地端口将其转发到 127.0.0.1,在测试之前 运行。
我也不确定 public/private 密钥对是在 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 and even an example。
您想做的是:
- 生成 public/private 密钥对
- 在您要连接的服务器上,将密钥的 public 部分添加到列出授权密钥的文件中(通常是
~/.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 *\n\tStrictHostKeyChecking no\n\n" > ~/.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
.