ASP.NET Core应用程序容器化、持续集成与Kubernetes集群部署(二)

在上文中我介绍了ASP.NET Core应用程序容器化时需要注意的几个问题,并给出了一个案例应用程序:tasklist。今天接着上文的内容,继续了解一下如何使用Azure DevOps进行ASP.NET Core应用程序的持续集成。为了便于讨论,本文会将持续集成(Continuous Integration)缩写为CI,而将持续部署(Continuous Deployment)缩写为CD。

Azure DevOps前身是Visual Studio Team Services(VSTS),从2018年9月10日开始,VSTS改名为Azure DevOps,原来VSTS所提供的服务也作了相应的调整。有关Azure DevOps的介绍,可以参考https://azure.microsoft.com/en-us/blog/introducing-azure-devops/。

容器化应用程序的CI/CD流程

下图展示了基于微软技术架构的容器化应用程序的CI/CD流程:

640?wx_fmt=png

大致流程如下:

  1. 开发人员通过Visual Studio Team Services Backlog(也就是最新的Azure Boards)获取一些开发任务

  2. 开发人员使用Visual Studio进行应用程序开发

  3. 开发的代码保存在Visual Studio Team Services Git(也就是最新的Azure Repos)

  4. Visual Studio Team Services CI(也就是最新的Azure Pipelines)从代码库获取代码,进行编译和持续集成

  5. 编译产生的容器被推送到Azure Container Registry

  6. Visual Studio Team Services CD(也就是最新的Azure Pipelines)触发持续部署,从Azure Container Registry获取容器镜像,然后部署到Azure Container Service中(这里使用托管的Kubernetes服务作为例子)

  7. Azure Application Insights对运行的应用程序进行跟踪分析,并将结果反馈给开发人员

  8. 开发人员将结果记录到Visual Studio Team Services Backlog(也就是最新的Azure Boards)中

这个过程还是比较容易理解的。图片来自https://azure.microsoft.com/en-us/solutions/architecture/cicd-for-containers/。对于tasklist而言,我所采用的持续集成/持续部署方案跟上图流程差不多,所不同的是,我没有使用Azure Repos,而是使用众所周知的GitHub,我也没有使用Azure Container Registry,而是使用Docker Hub。接下来,我们一起了解一下Azure DevOps Pipeline持续集成的配置过程。

基于Azure DevOps为tasklist搭建持续集成环境

首先使用你的微软账号(Microsoft Account)登录Azure DevOps,默认还是会进入经典的VSTS界面,此时点击屏幕右上角的大头贴图标,选择Preview features:

640?wx_fmt=png

然后在Preview features中打开New Navigation选项即可进入Azure DevOps的新界面:

640?wx_fmt=png

接下来,我们可以点击界面右上角的Create project按钮来创建一个新的项目。在创建新项目的界面中,输入项目名称和描述,然后决定是否公开该项目,之后在Advanced部分可以选择版本控制方案(Git或者Team Foundation Version Control),并且选择一个开发流程。这里我将项目命名为tasklist-demo,版本控制方案使用Git,开发流程就选择Agile(其实在我们的案例中,这并不重要)。一切就绪之后,点击Create按钮创建项目。

640?wx_fmt=png

项目创建成功之后,就自动进入了如上图所示的项目仪表板(Dashboard),此时我们可以在Boards里创建一些开发任务,然后通过Repos界面来初始化我们的代码库。不过,这两个步骤我们都不需要做,因为我们的代码已经在GitHub中了,我们可以直接进入Pipelines,定义我们的项目构建过程。

  1. 在Pipelines项目下,点击Builds,然后点击New pipeline按钮。在创建Build Pipeline的第一步,需要选择代码来源。Azure DevOps提供各种选择:Azure Repos Git、GitHub、GitHub Enterprise、Subvision、Bitbucket Cloud以及External Git。对于tasklist而言,我们选择使用GitHub。此时,如果你还没有创建GitHub连接,则需要新建一个。如下图指定GitHub连接的名称,然后通过OAuth或者GitHub访问token进行安全认证:

    640?wx_fmt=png

  2. 在认证成功后,即可选择需要编译的代码库,并指定需要编译的代码所在的分支(Branch)。在一切就绪后,点击Continue按钮继续:

    640?wx_fmt=png

  3. 接下来,在Select a template页面中,点击Empty job来创建一个空的构建任务,当然,也可以根据需要,在预定的构建模板中进行选择

    640?wx_fmt=png

  4. 在新建的Buid Pipeline中,可以看到,所有操作的第一步就是获取源代码,这一步已经在上面定义好了,不过还可以在这个界面中进行一些高级设置,比如可以指定在签出代码时,将submodule也同时签出

  5. 我们需要关注的就是Agent Job,一个Build Pipeline中,可以包含多个Agent Job,也就是执行过程需要Build Agent支持的Job;也可以包含多个Agentless Job,也就是执行过程不需要Build Agent支持的Job。Agent Job的执行需要依赖某种环境,比如托管的Linux环境,或者是装有VS2017的Windows环境。而Agentless Job的执行则不需要这样的环境,比如,调用RESTful API,或者设置一个定时器,延迟后续Job的执行等。对于tasklist而言,我们需要一个Linux的环境来执行Docker容器构建,因此,可以选择Hosted Ubuntu 1604的Agent Pool,于是,当代码构建开始执行时,Azure DevOps会从Hosted Ubuntu 1604的Agent池中,选择一个Agent执行构建

    640?wx_fmt=png

  6. 接下来,在这个新建的Agent Job中,点击加号(+),然后在列出的所有任务模板中,选择Docker Compose,并点击Add按钮,将它添加到Agent的任务中。事实上,Azure DevOps Pipelines提供了非常多的任务模板,比如,你可以选择一个执行单元测试的模板并将其添加到Agent Job中,然后根据自己的需要,配置单元测试的运行参数,这样的话,Agent Job就能帮你完成单元测试

    640?wx_fmt=png

  7. 在定义Docker Compose Command的界面中,注意将Container Registry Type切换为Container Registry,然后通过点击New按钮,新建一个Docker Registry连接。由于我们选用Docker Hub作为Registry,因此,选择Docker Hub,填上自己的账号和密码后,确认能够连接就可以了:

    640?wx_fmt=png

  8. 在Docker Compose File文本框中,输入tasklist代码库中docker-compose.yml文件的路径,也可以点击“…“按钮,在弹出的对话框中选择该文件:

    640?wx_fmt=png

  9. 在Action下拉框中,指定所执行的操作为Build service images,然后,在Additional Image Tags中,可以指定$(Build.BuildNumber),表示使用当前的构建编号为构建产生的容器镜像打上tag,同时可以选择Include Latest Tag选项,表示当前构建的容器镜像为最新版本(打上latest Tag)。完成这部分设置之后,参数大致如下:

    640?wx_fmt=png

  10. 在完成了上述步骤之后,我们已经可以完成整个tasklist App的编译了。可以看到,在Azure DevOps中设置Build Pipeline进行代码编译是非常简单的。由于我们已经定义了用于代码编译的Docker Compose文件,所以,只需要在Pipeline中添加一个Docker Compose的编译任务即可。现在测试一下,看看编译是否能够成功完成:

    640?wx_fmt=png

  11. 到目前为止,我们只是成功编译了tasklist的容器镜像,还没有将镜像推送到Docker Hub。在容器镜像被推送到Docker Hub之后,我们才能够将容器部署到Azure Container Service中运行。要推送编译好的容器镜像,只需要重复以上6到10步,在Agent Job下再添加一个Docker Compose的任务,所不同的是,Action需要修改为Push service images,保持其它配置不变。保存完Pipeline之后,再次触发编译:

    640?wx_fmt=png

  12. 打开Docker Hub,看看镜像是否已经成功推送:

    640?wx_fmt=png

  13. 最后一步,就是要将tasklist代码库中的yml文件作为编译结果(Artifacts)公布出来,这样做是为了在下一步做Azure Kubernetes Service(AKS)部署的时候,能够获取到部署的定义文件并根据该文件的内容进行部署。使用上述第6步的方法,添加一个Copy Files的任务和一个Publish Build Artifacts的任务。Copy Files的任务设置如下:

    640?wx_fmt=png

    Publish Build Artifacts的任务设置如下:

    640?wx_fmt=png

  14. 再次启动Build Pipeline,可以看到,tasklist已经成功编译:

    640?wx_fmt=png

    所需的编译结果文件(yml文件)也复制成功:

    640?wx_fmt=png

  15. 在Triggers页面,可以选择Enable continuous integration选项,此时每当有新的代码签入代码库,就会触发一次新的构建。当然,还有一些高级选项,比如选择代码分支等,还可以启用Pull request validation,这些内容与持续集成的流程有关,我们可以在今后学习,在这里,我们先勾选Enable continuous integration选项

    640?wx_fmt=png

总结

本文首先简单介绍了容器化应用程序的CI/CD流程,然后基于Azure DevOps,为tasklist案例建立了一个Build Pipeline,成功完成了tasklist App的编译以及Docker容器镜像的发布,最后,启用了持续集成功能,使得每次代码变更提交都会触发CI过程。这部分设置与开发过程以及持续集成的流程有关,不同的项目进行持续集成的方式也会有所不同,我们可以单独在其它篇章中进行深入讨论学习。在接下来的第三部分,让我们一起看看,如何把编译好的tasklist容器部署到Azure Kubernetes Service中。

相关文章:

  • ASP.NET Core应用程序容器化、持续集成与Kubernetes集群部署(一)

  • 微软发布Azure Pipelines,开源项目可无限制使用CI/CD

  • 持续集成配置之Nuget

原文地址: http://sunnycoding.cn/2018/10/09/dockerize-aspnetcore-cicd-with-azure-devops-and-kubernetes-part2/


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319527.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【每日一题】8月17日题目精讲-[SCOI2009]生日礼物

来源:牛客网: 时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 262144K,其他语言524288K 64bit IO Format: %lld题目描述 小西有一条很长的彩带,彩带上挂着各式各样的彩珠。已知彩珠有N个&#xff…

Followme Devops step by step

接着上次分享的devops历程[Followme Devops实践之路], 大家希望能够出一个step by step手册, 那今天我就来和手把手来一起搭建这么一套环境, 演示整个过程!实验环境需要准备docker /docker compose建议大家使用国外的vps学习, 不需要考虑网络/gwf的问题/方便(本demo搭建在linod…

【每日一题】8月25日题目精讲 XOR-pyramid

文章目录题目描述:题解:代码:题目描述: 链接:https://ac.nowcoder.com/acm/problem/112798 来源:牛客网 输入描述: 输出描述: Print q lines — the answers for the queries. 示例1 输入 复制 3 8 4 1…

申请Office 365一年免费的开发者账号攻略(2018年10月份版本)

要进行Office 365开发,当然需要有完整的Office 365环境才可以。为了便于广大开发人员快速地启动这项工作,微软官方给所有开发人员提供了免费的一年开发者账号那么如何申请Office 365一年免费的开发者账号呢?网上已经有一些攻略了,…

开源若要天下闻,掌声须给教育人

引子故事一当我们介绍 Linux Kernel 项目历史的时候,我们会如此说:“1991 年,赫尔辛基大学的大学生 Linus torvald, 在自己的电脑上开发了一个能够运行在 X86 架构上的操作系统,并将它发布在互联网上,任何人都可以参与…

【每日一题】8月27日题目精讲 Is It A Tree?

链接:https://ac.nowcoder.com/acm/problem/105905 来源:牛客网 时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 10000K,其他语言20000K 64bit IO Format: %lld 题目描述 A tree is a well-known data struct…

好代码是管出来的——使用Jenkins搭建CI服务器

Jenkins是一个开源的跨平台的CI工具,它可以部署在Windows、Linux等平台上,并且Jenkins提供了非常丰富的插件来帮助完成编译、测试、部署等工作。  本文将介绍在Windows平台上使用Jenkins完成.Net Core应用的持续集成环境搭建,其主要内容有&…

牛客练习赛 59

A.小乔和小灰灰 前几天刚刚学了序列自动机&#xff0c;这题直接也没咋想暴力的做法&#xff0c;直接上序列自动机匹配子序列即可。 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<algorithm&…

.Net Core 2.1 通用主机(Core 在控制台应用程序中的应用)

一、介绍官方文档中说&#xff0c;Microsoft.AspNetCore.App 元包&#xff08;ASP.NET Core 2.1 或更高版本&#xff09;包含通用主机的Microsoft.Extensions.Hosting包&#xff0c;当创建控制台项目以后并没有相应的包。在官方案例中所用的Nuget包有&#xff1a;1. Microsoft.…

产品开发管理之流程和体系(总篇)

前言秋风瑟瑟&#xff0c;夏日的灼热犹在&#xff0c;就瞬间迎来刺骨寒风。凛冬将至&#xff0c;今天对我们来说&#xff0c;像贴面的利刃一样冰冷而真实。农民、建筑工人、司机、程序员、私企高管、私企老板、资本巨富&#xff0c;都被裹挟进了这个焦灼的时代&#xff0c;没有…

YbtOJ#593-木棍问题【费用流】

正题 题目链接:https://www.ybtoj.com.cn/contest/114/problem/3 题目大意 n∗mn*mn∗m的网格上有一些格子有木球&#xff0c;两个相邻木球直接可以有木棍。 两个LLL形的木棍会产生AAA的代价&#xff0c;两个III形的木棍会产生BBB的代价 对于每个kkk求出插入kkk根木棍时的最小…

1143 Lowest Common Ancestor 甲级

题意&#xff1a; 给出一棵二叉搜索树的前序遍历&#xff0c;问结点u和v的共同最低祖先是谁&#xff0c;利用先序遍历特点。 二叉搜索树满足&#xff1a; 节点的左子树只包含键小于节点键的节点。 节点的键只包含节点的右键大于或等于子树的节点的键。 左子树和右子树也必须是…

《.NET Core 2.0 应用程序高级调试》7折优惠

活动截止到2018年10月15日晚24:00&#xff0c;之后恢复8.6折价格。都说.NET Core 在Linux 上跑得快&#xff0c;可是如果.NET Core 程序在Linux 操作系统上出现了内存泄漏、死锁或者崩溃情况怎么办&#xff1f;怎样在Linux 和macOS操作系统上有效地使用工具对.NET Core 应用程序…

确认过眼神,你是ApacheWay的人 | COSCon‘18 特辑

*大会官网&#xff1a;http://coscon.kaiyuanshe.cn/*报名链接&#xff1a;点击文末“阅读原文”如果您对 Apache 感兴趣那么中国开源年会COSCon18将是您不可错过的一站写在大会前为什么本土开源项目对 Apache 青睐相加我们用实际数据说话Apache 顶级项目Apache CarbonData Car…

牛客练习赛 57——manacher算法 树形dp?

A - Tic-Tac-Toe 直接考虑每个人8种赢的情况即可。 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<algorithm> using namespace std; const int N5; char g[N][N]; int main() {//IO;int …

asp.net core 错误定位 vs2017 远程调试部署在centos上的asp.net core程序

前言程序运行中会出现各种BUG。 排除BUG有三种方式。一、访问页面直接报错误信息出于安全&#xff0c;服务器是关闭这个功能的。在centos上可以用 命令设置环境变量来解决&#xff1a; export ASPNETCORE_ENVIRONMENTDevelopment二、console输出console.WriteLine(" hel…

AspNet Core下利用 app-metrics+Grafana + InfluxDB实现高大上的性能监控界面

在日常系统工作中&#xff0c;我们为了洞察系统的问题和运作情况通常会记录日志的方式来进行分析&#xff0c;但是在很多情况下都是被动的在出问题后才会去查日志。在很多时候&#xff0c;我们可能更需要相对实时的了解整个系统或者某一时段的运行的情况&#xff0c;诸如系统出…

微软向Linux表白: 向Linux社区开放60000多项专利

10 月 10 日&#xff0c;微软在博客中宣布正式加入开放创新网络&#xff08;Open Invention Network, 简称“OIN”&#xff09;&#xff0c;向所有开源专利联盟的成员开放其专利组合。对开源&#xff0c;微软是认真的OIN 的首席执行官 Keith Bergelt 在采访中说道&#xff1a;微…

牛客网dp专题 数位dp

文章目录数位dp例题&#xff1a;NC116652 uva11038 How many 0sNC15035 送分了QAQNC20669 诡异数字NC20665 7的意志NC17385 Beautiful NumbersCF55D NC108918 Beautiful numbers习题&#xff1a;NC17867 明七暗七NC19327 好朋友NC19945 [CQOI2016]手机号码NC20268 [SCOI2009]WI…

微软技术大会预览:DevOps顾问是怎样开发自己的产品的

“没有人比我们更懂DevOps”&#xff0c;这句话不是谁都敢说的。从无人问津到整个IT行业趋之若鹜&#xff0c;DevOps火起来也不过是3年的事情&#xff0c;但是leansoftX.com的DevOps资深顾问都是在这个行业已经摸爬滚打了10年的老兵了&#xff0c;从一开始的SDLC&#xff0c;到…