上一次我们讲了使用Azure DevOps Pipeline实现.Net Core程序的CI。这次我们来演示下如何使用Azure DevOps实现.Net Core程序的CD。

实现本次目标我们除了Azure DevOps外还需要:

  1. 一台安装了Docker的主机
  2. 一个 Docker Hub 账号

上一次我们的CI实现了:

发布>编译>单元测试

这次我们要实现剩下的几个步骤:

生成镜像>推送镜像>部署

创建Docker镜像仓库

我们生成的镜像需要有个存放的地方。各大云厂商其实都有这种服务,这次直接使用Docker Hub提供的公共仓库服务。



创建一个仓库名叫:az_devop_test。

创建Dockerfile

我们的代码创建为镜像需要一个Dockerfile来描述如何构建这个镜像。在项目根目录下新建一个文件命名为Dockerfile注意不带任何后缀名。以下为Dockerfile的内容:

  FROM mcr.microsoft.com/dotnet/core/sdk:3.1-bionic AS build
WORKDIR /app
COPY /. /app
RUN dotnet restore
WORKDIR /app/devops_test
RUN dotnet publish -o ./out -c Release
EXPOSE 5000
ENTRYPOINT ["dotnet", "out/devops_test.dll"]

配置Servic Connections

选择ProjectSetting菜单,选择Service connections。Service connections用来存储跟外部服务相关的账号密码等信息,这里我们需要配置2个service。

  1. Docker Hub的信息
  2. 主机SSH的信息

配置Docker Registry service

我们的pipeline需要给Docker hub推送镜像,所以需要一些必要的信息,比如账号密码等信息。



点击"New Service"找到Docker Register项目点击下一步



选择DockerHub,填写对应的账号密码

配置SSH service

我们的pipeline在完成镜像推送后需要通过SSH登录到主机运行命令把新的镜像跑起来。



填写主机IP端口等信息。

修改pipeline

上次我们的pipeline已经定义好了CI的步骤,这次需要在上次的基础上继续完善CD的功能。

BuildAndPush Task

找到上次的pipeline选择编辑功能,在右边的Task列表里找到DockerTask,点击出现配置界面



在Container register里选择前面在service connections配置的docker-hub服务。

repository填写我们在docker hub上新建的仓库:kklldog/az_devop_test 。注意:仓库名称要把用户名写全了不然推不上去。

tags填写:latest 。

command:选择buildAndPush 。build跟push本是两步操作,这里直接合并为一步。

SSH Task

添加完BuildAndPush Task后同样的方法再次添加SSH Task。



SSH service connection里选择前面我们配置好的ssh service。

Run 这里选择Commands。

Commands 填写需要执行的命令:

docker rm -f az_devop_test
docker rmi -f kklldog/az_devop_test
docker pull kklldog/az_devop_test
docker run -d -p 5000:5000 --name az_devop_test kklldog/az_devop_test

简单解释下这个命令:

删除运行的容器;删除镜像;拉取最新的镜像;使用新的镜像运行一个容器。

完整的pipeline

到此我们的pipeline已经配置好了,以下是完整的pipeline.yml代码。

# ASP.NET Core (.NET Framework)
# Build and test ASP.NET Core projects targeting the full .NET Framework.
# Add steps that publish symbols, save build artifacts, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/dotnet-core trigger:
- master pool:
vmImage: 'ubuntu-18.04' variables:
solution: '**/*.sln'
buildPlatform: 'Any CPU'
buildConfiguration: 'Release' steps:
- task: DotNetCoreCLI@2
inputs:
command: 'restore'
- task: DotNetCoreCLI@2
displayName: Build
inputs:
command: build
projects: '**/*.csproj'
arguments: '--configuration $(buildConfiguration)' - task: DotNetCoreCLI@2
inputs:
command: test
projects: '**/*Tests/*.csproj'
arguments: '--configuration $(buildConfiguration)'
- task: Docker@2
inputs:
containerRegistry: 'docker-hub'
repository: 'kklldog/az_devop_test'
command: 'buildAndPush'
Dockerfile: '**/Dockerfile'
tags: latest
- task: SSH@0
inputs:
sshEndpoint: 'azvm-ssh'
runOptions: 'commands'
commands: |
docker rm -f az_devop_test
docker rmi -f kklldog/az_devop_test
docker pull kklldog/az_devop_test
docker run -d -p 5000:5000 --name az_devop_test kklldog/az_devop_test
readyTimeout: '20000'

运行一下

手动运行一个这个pipeline,点击pipeline可以看到实时的日志,等到最后可以看到每一步都成功了,说明我们的pipeline配置成功了。



访问一下容器对应的端口,我们的网站已经可以访问了。修改一下代码,然后提交,每次都会自动部署最新的代码到主机。

总结

以上通过2篇文章简单的介绍了Azure DevOps Pipeline如何实现CICD功能。Azure DevOps Pipeline给我的感觉是比较易用的,配置yml其实都是图形化的上手难度会比较小。另外它跟Github有深入的集成,可以使用Github的账号直接登录。况且它还是个免费服务,大家可以试试。

关注公众号一起玩转技术

最新文章

  1. 【译】Meteor 新手教程:在排行榜上添加新特性
  2. eclipse PermGen space解决方案
  3. mysqli连接数据库的模板
  4. 学习笔记之 prim算法和kruskal算法
  5. 内存中OLTP(Hekaton)里的事务日志记录
  6. 【kAri OJ】wzt的树
  7. 【Android开发学习笔记】【第三课】Activity和Intent
  8. ASP.NET性能监视参数详解
  9. sublime text 调出结果输出框
  10. java基本类型与Hadoop常见基本类型的对照
  11. Python 3 中的json模块使用
  12. python 基于numpy的线性代数运算
  13. Gitlab配置、备份、升级、迁移
  14. Android UI系列-----RelativeLayout的相关属性
  15. 版本控制之GitHub亲手实验总结
  16. 前馈神经网络练习:使用tensorflow进行葡萄酒种类识别
  17. Android设计 - 图标设计概述(Iconography)
  18. C++主流编译器整理(编译器版本--供应商--C++11支持情况)
  19. python分析apahce网站日志的例子
  20. python开发_pickle

热门文章

  1. NodeJs path.resolve的使用
  2. Vue+Spring Boot 前后端分离的商城项目开源啦!
  3. 二叉搜索树 [四边形不等式优化区间dp]
  4. 欧几里得算法(gcd) 裴蜀定理 拓展欧几里得算法(exgcd)
  5. DDD与Repository
  6. Jmeter 常用函数(22)- 详解 __intSum
  7. 5 个 Git 工作流,改善你的开发流程
  8. Docker-Docker与IPV6
  9. Java 实例 - 获取本机ip地址及主机名
  10. day37:MySQL基本操作