在现代软件开发中,持续集成(CI)和持续部署(CD)是提高开发效率、减少错误和加快产品上市时间的关键实践。本文将指导如何使用Azure DevOps和Docker Hub来实现.NET Core Web应用的自动化构建、测试和部署。
在开始之前,确保已经具备以下条件:
首先,需要在Docker Hub上注册一个账户,并创建一个仓库来存储应用Docker镜像。
使用以下命令为本地镜像打上Docker Hub仓库的标签,并授权Docker客户端,最后将镜像推送到Docker Hub:
$ docker tag <image-name> <namespace>/<repository>:<tag>
// 示例
$ docker tag webapp quickdevnotes/webapp:v1
// 登录Docker Hub账户
$ docker login
username:
password:
// 推送到Docker Hub
$ docker push quickdevnotes/webapp:v1
注意,如果使用的是私有仓库,需要先登录,然后才能推送镜像。否则,推送操作会因为授权错误而失败。
接下来,需要注册或登录Azure DevOps账户,并创建一个组织以及项目。
在Azure DevOps中,选择“创建项目”并提供必要的信息。在“高级”部分,可以根据需要进行设置。
现在,将自动化之前手动执行的步骤。在Azure DevOps中,选择“流水线” > “构建”并点击“新建流水线”。
Azure流水线需要连接到应用代码仓库。在“连接”标签页中,选择GitHub,并授权Azure Pipelines访问GitHub仓库。
授权完成后,将看到一个GitHub仓库列表。从列表中选择应用仓库,并提示安装Azure Pipelines。
Azure流水线会分析应用仓库,并提供一个基本的azure-pipelines.yml文件。这个文件位于GitHub仓库根目录,Azure构建流水线使用它来执行构建应用、执行测试、构建Docker镜像等任务。
以下是构建流水线的azure-pipelines.yml文件示例:
trigger:
- master
pool:
vmImage:
'Ubuntu-16.04'
variables:
imageName:
'quickdevnotes/webapp:$(build.buildNumber)'
steps:
- script: dotnet test WebApp.Tests/WebApp.Tests.csproj --logger trx
displayName: Run unit tests
- task: PublishTestResults@2
condition: succeededOrFailed()
inputs:
testRunner: VSTest
testResultsFiles:
'**/*.trx'
- task: Docker@1
displayName: Build an image
inputs:
command: Build an image
containerregistrytype: Container Registry
dockerRegistryEndpoint: DockerHub
dockerFile: Dockerfile
imageName: $(imageName)
imageNamesPath:
restartPolicy: always
- task: Docker@1
displayName: Push an image
inputs:
command: Push an image
containerregistrytype: Container Registry
dockerRegistryEndpoint: DockerHub
dockerFile: Dockerfile
imageName: $(imageName)
imageNamesPath:
restartPolicy: always
注意,生成的文件可能与这里看到的不同,因为已经根据需要更新了文件。
让详细看看构建文件中定义的任务。将保持在高层次上,以保持本系列的简单性。
触发器指定了推送到哪个分支将触发持续集成流水线运行。在例子中,是master分支。如果想使用不同的分支,只需更改分支名称。如果不指定任何分支,任何分支的推送都将触发构建。
变量部分用于声明在流水线中想要使用的任何变量。例如,在这里创建了一个变量imageName,它将被设置为想要创建的Docker镜像的名称。
已经在应用中添加了一些基本的单元测试。上面的脚本将在每次构建运行时执行这些测试。还可以从这些测试运行中获取测试报告。
上述两个任务中的第一个任务使用仓库根目录下的Dockerfile构建Docker镜像。构建镜像后,第二个任务将该镜像推送到Docker Hub仓库。
为了将镜像推送到Docker Hub仓库,构建代理上的Docker客户端需要先授权。这与手动推送镜像时所做的类似。
在导航窗格的左下角,选择“项目设置”。然后在“流水线”下选择“服务连接”,应该在这里看到GitHub连接。
要添加Docker Registry连接,请单击“新建服务连接”,然后从列表中选择“Docker Registry”。
在下一个对话框窗口中,选择“Docker Hub”作为注册表类型,并将“DockerHub”(必须与构建任务中的dockerRegistryEndpoint相同)设置为连接名称。
然后,提供Docker Hub账户的Docker ID和密码。电子邮件是可选的。请确保选中“允许所有流水线使用此连接”。
可以使用“验证此连接”链接来验证连接。点击“确定”,就完成了。
相信,到目前为止,已经有足够的信息来自定义持续集成流水线了。好了,是时候测试它是否按预期的那样工作了。
转到“流水线” > “构建”,然后选择“队列”来排队构建。如果没有错误,应该看到一个正在进行的构建。
构建流水线的最后一个任务成功地将新构建的Docker镜像推送到了Docker Hub。注意上面的图像标签,它等于上面的构建编号:
为了进行最终测试,更改应用代码并将其推送到master分支。这将触发构建,将看到提交消息作为构建标题:
注意构建描述告诉构建触发器是什么,这证明了它不是手动触发的。