使用云代理对Google Cloud SQL DB进行Azure Pipelines集成测试



我正在管理一个NodeJS云函数库,该库执行一些数据库操作,如"userExists"等,并希望对我的谷歌云SQL数据库进行集成测试。为了在我的本地上做到这一点,我在一个特定的端口上启动代理应用程序,然后配置Knex使用这个端口。

然而,我也想使用Azure Pipelines为此设置CI/CD。谷歌允许将代理作为docker镜像下载,我已经这样做了。我已经为它提供了服务帐户密钥,并成功启动了它,但是,当我运行测试时,它们仍然无法连接到代理。

我的管道的YAML文件中处理代理和运行测试的部分如下所示:

- script: |
docker run -d 
-v 'qa-key.json':/config 
-p 127.0.0.1:5432:5432 
gcr.io/cloudsql-docker/gce-proxy:1.12 /cloud_sql_proxy 
-instances=$(DBInstanceConnectionName)=tcp:0.0.0.0:5432 -credential_file=/config
displayName: 'Run GCP Proxy'
- task: Npm@1
displayName: 'Run Tests'
inputs:
command: custom
customCommand: 'test'

运行测试的test命令可用。配置knex的功能如下所示:

const connectKnex = () => {
const config = {
user: 'my_user',
password: 'my_users_password',
database: 'my_db',
port: 5432
}
return knex({
client: 'pg',
connection: config
});
}

我认为我的问题是因为运行代理的任务在测试运行后不再执行,但我不知道如何验证/修复这一问题。

问题1:我没有看到来自docker容器的输出

我直接从谷歌的支持页面复制了运行docker容器的命令。问题是,此命令包含-d标志(分离(,这会导致容器在后台运行并隐藏其输出,从而导致调试困难。删除后,我可以看到代理映像。找不到凭据文件。

问题2:找不到凭据文件

我没能花时间找到解决这个问题的合适办法。由于我在Azure构建服务器上运行代理映像,因此我无法访问交互式终端,无法从该终端尝试和访问映像的文件系统以尝试和调试装载。这个问题和下一个问题一起解决了。

问题3:我正在上传服务帐户密钥的占位符文件,并在构建过程中从一个秘密变量填充它,而不是在Azure Pipelines上使用安全文件功能

上传一个安全文件可以让你在构建过程中下载文件,而不必担心下载时文件的存储位置,因为位置存储在一个变量中。它使用起来非常简单。我只是在代理启动命令中包含了位置变量,它运行得很顺利。

问题4:运行测试时,我需要代理仍在运行

代理是一个长时间运行的进程,因此启动它的管道任务将继续运行并阻止管道其余部分的执行,直到代理停止。但是代理需要在运行测试的同时运行,所以我能想到的唯一解决方案是将它们放在同一个任务中。

我可以通过运行以下命令来做到这一点

<proxy launch command> & 
sleep 20 &&  //wait for the proxy to finish launching
yarn test && 
docker stop $(docker ps -a -q) //kill the proxy once tests finish running

最后,下载文件并运行代理和测试的yaml看起来是这样的:

- task: DownloadSecureFile@1
displayName: Download QA Key
inputs:
secureFile: 'qa-key.json'
- script: |
docker run 
-v $(Agent.TempDirectory):/config 
-p 127.0.0.1:5432:5432 
gcr.io/cloudsql-docker/gce-proxy:1.12 /cloud_sql_proxy 
-instances=$(DBInstanceConnectionName)=tcp:0.0.0.0:5432 - 
credential_file=/config/qa-key.json &  
sleep 20 && 
yarn test && 
docker stop $(docker ps -a -q)
displayName: 'Run Tests'

最新更新