我想针对Azure管道内的本地Docker托管的SQL Server 2019数据库运行集成测试。我正在尝试将sqlpackage
复制到此Docker镜像,以便我可以每次还原.bacpac
以便在测试之前设置数据库。这是我到目前为止的YAML配置:
azure-pipelines.yml :
resources:
containers:
- container: 'sqlserver_linux_container_for_integration_tests'
image: 'mcr.microsoft.com/mssql/server:2019-CU5-ubuntu-16.04'
ports:
- 1433:1433/tcp
env:
ACCEPT_EULA: 'Y'
SA_PASSWORD: 'P@ssW0rd!'
trigger:
- azure-pipelines
pool:
vmImage: 'ubuntu-16.04'
variables:
buildConfiguration: 'Release'
steps:
- task: Bash@3
displayName: 'Echo some Docker info from bash'
inputs:
targetType: 'inline'
script: |
echo 'docker info'
docker info
echo 'docker ps'
docker ps
- task: Docker@2
displayName: 'Copy sqlpackage to Docker SQL Server'
inputs:
command: 'cp'
arguments: '$(Agent.BuildDirectory)/s/DBProject/_TestDb_/sqlpackage-linux/sqlpackage sqlserver_linux_container_for_integration_tests:/tmp/sqlpackage'
我想从sqlserver_linux_container_for_integration_tests
步骤访问Docker容器Docker@2
,以便可以将sqlpackage二进制文件复制到其中-数据库.bacpac
稍后将被复制,并且将运行sqlpackage从中还原数据库-但我收到错误消息“错误:没有这样的容器:路径:sqlserver_linux_container_for_integration_tests:/ tmp”。因此,似乎未启动Docker容器或未将其用于我的任务。此外,第一个任务中的docker ps
没有显示任何输出。那么,如何使Docker容器可用于将任务复制到文件并执行命令呢?
最佳答案
设法解决了问题。
首先,需要在docker ps
部分之前添加以下内容,以声明该作业取决于要启动的容器的服务(现在variables:
列出了该服务):
services:
sqlserver_linux_container_for_integration_tests: sqlserver_linux_container_for_integration_tests
...但是它的名称后面仍然附加了一些随机字符,这使我无法使用docker命令直接对其进行寻址。我注意到已创建了一个环境变量,其中包含将容器名称映射为其ID的JSON:AGENT_CONTAINERMAPPING = {
"sqlserver_linux_container_for_integration_tests": {
"id": "623aa2b3a1505da472d051e7845bfd5f20c979f0ff94fca63fb115e2d942e8b3"
}
}
因此,我首先使用PowerShell任务提取该ID并将其导出到变量:- task: PowerShell@2
name: varsCalc
displayName: 'Calculate variables in Powershell'
inputs:
targetType: 'inline'
script: |
$extractedId = Echo '$(Agent.ContainerMapping)' | ConvertFrom-Json | Select -Expand sqlserver_linux_container_for_integration_tests | Select -Expand id
Echo "##vso[task.setvariable variable=sqlServerTestDbId;isOutput=true]$extractedId"
然后,我可以在需要容器ID的Docker任务中使用该变量,例如复制到[containerId]:/local/container/path
:- task: Docker@2
displayName: 'TestDb - copy sqlpackage to SQLServer container'
inputs:
command: 'cp'
arguments: '$(Agent.BuildDirectory)/s/DBProject/_TestDb_/sqlpackage-linux.tgz $(varsCalc.sqlServerTestDbId):/tmp/sqlpackage-linux.tgz'