前面已经介绍过了 .Net Core 程序发布到 Docker 容器的内容。但是每次通过 SSH 链接到服务器敲命令,运行脚本也是挺麻烦的一件事。程序员是最懒的,能让电脑解决的问题绝不手动解决,如果当我们push一次代码后自动build代码,自动跑单元测试,如果测试通过,自动发布程序,如果失败就发邮件通知管理员,这样的话该多美好。为了达成这个目标于是持续集成(CI)持续交付/部署(CD)就被发明出来了。CICD领域有个大名鼎鼎的工具:Jenkins,但是这次不使用它。如果你使用阿里云的话,阿里云已经提供了类似的功能,可以免去自己搭建Jenkins服务,以及Docker镜像私仓的过程,而且目前它们是免费的。

阿里云Codepipeline服务,是一套类似Jenkins的服务(其实我觉得它的核心引擎就是来自Jenkins)。

阿里云容器镜像服务,是一个镜像仓库,可以是公开的,也可以是私有的。

持续集成CI

持续集成指的是,频繁地(一天多次)将代码集成到主干。

它的好处主要有两个。

(1)快速发现错误。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易。

(2)防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。

持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。

Martin Fowler说过,"持续集成并不能消除Bug,而是让它们非常容易发现和改正。"

摘自阮一峰大神的blog

下面就演示一下如何通过阿里云Codepipeline跟容器镜像服务来实现 .Net Core 程序的CICD。

持续集成

流程



代码push后Gitee通过webhook功能触发Codepipeline构建,构建成功后自动推送镜像到容器镜像服务

新建一个 .Net Core MVC 的程序



新建一个 .net core mvc 程序名叫CoreCICDTest

    public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
} public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel(options =>
{
options.Listen(IPAddress.Any, 5000);
});
}

修改Program的main方法,使Kestrel监听5000端口

@{
ViewData["Title"] = "Home Page";
} <h3>
.NET CORE CICD TEST -- V 1.0
</h3>

修改Home/index视图



运行一下看看效果,网站正常显示 .NET CORE CICD TEST -- V 1.0

新建一个 MSTest 项目



在CoreCICDTest的解决方案下新建一个 MSTest 项目用来写单元测试,名叫CoreCICDTest.Tests

    [TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
string str = "00"; Assert.AreEqual(str, "00");
}
}

修改UnitTest1文件中的TestMethod1方法,使其成为一个合法的TestMethod



运行一下单元测试,全部通过

添加Dockerfile文件

FROM microsoft/dotnet:latest AS build
WORKDIR /app
COPY /. /app
RUN dotnet restore
WORKDIR /app/CoreCICDTest.Tests
RUN dotnet test CoreCICDTest.Tests.csproj
WORKDIR /app/CoreCICDTest
RUN dotnet publish -o ./out -c Release
EXPOSE 5000
ENTRYPOINT ["dotnet", "out/CoreCICDTest.dll"]

Dockerfile注意文件名没有任何后缀,Dockerfile用来在Docker容器内自动test、build我们的代码

在Gitee上新建一个项目,并把CoreCICDTest解决方案推送上去

使用Gitee的免费Git服务,新建一个项目名叫CoreCICDTest,使用Git Push命令把本地代码推送上去。

在阿里云容器镜像服务上新建项目并进行配置





点击“创建镜像仓库”按钮,弹出创建界面。填写命名空间kklldog,仓库名称cicd_test



点击下一步,代码源选择“本地仓库”,点击“创建镜像仓库”完成仓库的创建

在阿里云Codepipeline上新建项目并进行配置



点击“新建”按钮跳转至新建项目页面。这个界面跟Jenkins简直就是一模一样



项目名称填写cicd_test,这里没有.net相关的模板,囧!项目类型选择"构建一个自由风格的软件"就可以



点击下一步,填写项目基本信息,源码选择Gitee。构建类型默认是java,无所谓不用过它



点击“绑定云码账号”跳转至云码授权页面进行授权,以便阿里云可以拉取云码上的代码



进行授权后,源码管理界面就可以选择到Gitee上的项目,填写相应的分支



点击“增加构建步骤”,选择“镜像构建与发布”



在“镜像构建与发布”界面填写刚才创建的仓库信息

镜像仓库名格式为namespace/镜像仓库名。如果registry为Docker hub,拉取镜像命令为docker pull docker,则本配置项填写docker;如果 registry为阿里云Docker镜像仓库,拉取镜像命令为docker pull registry.cn-hangzhou.aliyuncs.com/acs-sample/wordpress, 则本配置项填写acs-sample/wordpress。
  Registry地址 用来配置docker registry地址,如果为空,默认使用Docker hub registry (https://index.docker.io/v1/);如果使用阿里云registry, 请填写https://registry.cn-beijing.aliyuncs.com/v2/,其中地域(cn-beijing)根据用户实际的镜像仓库地域来修改。
Registry证书 用来添加授权信息,请添加Registry授权类型的证书。



勾选“远程触发器”,先填写分支master,然后点击“生成”会生成触发器地址,这里好像有点小bug,有的时候这个地址不起效,如果不起效,多生成几次试试



在“构建后操作”界面填写邮件地址,用来接收邮件通知。勾选“每次不稳定的构建都发送邮件通知”

在Gitee的CoreCICDTest项目上配置WebHook



点击“管理>WebHook”菜单,进行WebHook的配置



WebHook的Url填写刚才Codepipeline里的“远程触发器”里生成的url地址;密码不填;勾选Push事件,勾选“激活”;点击“添加”按钮完成Webhook的配置。这样当我们push代码的时候,Gitee会自动给配置的url发送一次post请求,里面携带了详细的项目信息,提交信息等数据



当点击“添加”按钮后Gitee会立马往webHook配置的url地址Post一次请求,如果Codepipeline做出“Task has been scheduled to queue”的响应则说明Codepipeline开始进行自动构建了



返回Codepipeline项目列表,可以看到cicd_test项目已经构建成功了



这个时候构建的镜像也应该被推送到了容器镜像服务的cicd_test仓库里。

编写shell脚本运行容器

sudo vim publish_cicd_test.sh
输入以下内容
#!/bin/bash
sudo docker stop cicd_test
sudo docker rm cicd_test
sudo docker rmi registry-vpc.cn-shanghai.aliyuncs.com/kklldog/cicd_test
sudo docker login --username=xxx --password=xxx registry-vpc.cn-shanghai.aliyuncs.com
sudo docker pull registry-vpc.cn-shanghai.aliyuncs.com/kklldog/cicd_test:latest
sudo docker run --name cicd_test -d -p 7000:5000 -v /etc/localtime:/etc/localtime registry-vpc.cn-shanghai.aliyuncs.com/kklldog/cicd_test:latest

新建一个shell脚本命名为publish_cicd_test.sh;使用docker pull从仓库中拉取最近的镜像;使用docker run运行容器

sudo /bin/bash publish_cicd_test.sh



运行一下shell脚本

sudo docker ps -a

使用docker ps命令查看一下容器的运行状态,可以看到cicd_test容器已经运行成功了



使用浏览器访问一下对应的端口,网站已经正常运行了

Push代码触发构建

刚才的构建是我们配置Webhook的时候Gitee默认发送的一次请求,正常应该是用户使用git push命令后Gitee会发送一次请求,让我们模拟一下。



修改home/index页面,把V1.0改成V2.0

提交成功之后查看Codepipeline项目列表,等待项目构建成功之后,我们再次运行一下publis_cicd_test.sh脚本,成功之后再次使用浏览器访问一下对应的端口看看home/index是否已经变为了V2.0



可以看到home/index已经变成V2.0了,说明我们的持续集成流程跑通了

持续交付/部署

我们上面演示的过程离一开始说的push一下代码就自动构建自动发布程序就差一点点了,太晚了下次再说吧。

.Net Core in Docker - 使用阿里云Codepipeline及阿里云容器镜像服务实现持续集成(CI)的更多相关文章

  1. 云原生交付加速!容器镜像服务企业版支持 Helm Chart

    2018 年 6 月,Helm 正式加入了 CNCF 孵化项目:2018 年 8 月,据 CNCF 的调研表明,有百分之六十八的开发者选择了 Helm 作为其应用包装方案:2019 年 6 月,阿里云 ...

  2. 基于容器微服务的PaaS云平台设计(一) 实现容器微服务和持续集成

    版权声明:本文为博主原创文章,欢迎转载,转载请注明作者.原文超链接 ,博主地址:http://www.cnblogs.com/SuperXJ/ 前言:关于什么是容器微服务PaaS和容器微服务PaaS的 ...

  3. [Docker镜像] 关于阿里云容器镜像服务的使用(以天池比赛提交镜像为例)

    最近在参加天池比赛,由于比赛需要使用阿里云容器镜像服务完成线上预测任务,所以花费了3-4天的时间了解并使用Docker完成相关镜像操作,在此分享下我学习的内容,以下是本文的目录结构: 介绍 镜像 容器 ...

  4. 阿里云开源 image-syncer 工具,容器镜像迁移同步的终极利器

    为什么要做这个工具? 由于阿里云上的容器服务 ACK 在使用成本.运维成本.方便性.长期稳定性上大大超过公司自建自维护 Kubernets 集群,有不少公司纷纷想把之前自己维护 Kubernetes ...

  5. Gitlab+Gitlab-CI+Docker实现持续集成(CI)与持续部署(CD)

    写在前面 记录一下,一个自动化开发部署项目的构建过程与简单使用,实现真正的DevOps gitlab安装 步骤一:安装依赖 yum -y install git gcc glibc-static te ...

  6. 【docker】docker持续集成CI/持续部署CD

    持续集成(CI) 持续集成(Continuous integration)是一种流行的软件开发实践.集成是指开发将自己本地的代码提交到git等远端仓库上,那么持续集成就是每天多次提交,提早提交代码. ...

  7. 云原生强大且灵活的持续集成CI开源框架Tekton实战-上

    @ 目录 概述 定义 常见CICD工具 使用好处 组件 基本概念 安装 前提条件 安装Tekton Pipelines 创建并运行任务 安装Dashboard 安装Cli Pipelines示例演示 ...

  8. .Net Core:Docker无法拉取mcr.microsoft.com相关镜像解决办法

    今天在教同事Docker简单部署Asp.Net Core项目,pull镜像时突然出现下图中的错误: 因为微软在 2018 年五月之后,只会将相关镜像打包发布到 MCR 上.但是 MCR 对国内用户不太 ...

  9. .net core 部署 docker (CentOS7)

    最近研究 docker 在Linux 下部署 .net core 项目,在过程中踩了很多坑,网上的资料对我帮助确实大,但有些问题未指明出来. 特地整理一份在发布文档 本文使用的是 root 账号操作, ...

随机推荐

  1. CentOS 网络互通情况下把一个Linux服务器的文件发送到另一个服务器

    scp -r  文件名/目录名 root@192.168.2.144:/home/hsw -r   发送目录使用,表示把该目录下的所有子目录以及文件发送过去

  2. Flink会话窗口测试

    Flink会话窗口测试 一.测试结论: 1.会话窗口的间隔时间和水位线作用一样,表示输出现在时间 - 间隔时间之前所有未结算时间的数据,作用类似于水位线,但是和水位线开闭不一样. 2.会话窗口显示的数 ...

  3. vue中ajax应用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. reportlab生成pdf

    文档地址:https://www.reportlab.com/docs/reportlab-userguide.pdf 源码地址:https://bitbucket.org/rptlab/report ...

  5. 雅阁微信群、雅阁车友群、十代雅阁交流微信QQ群

    最近一直在关注第十代雅阁,不论是普通汽油版本还是油电混动版本都很不错,在网上看到很多评测文章和视频 后续都会整理发布到微信群中. 由于论坛发帖,博客发文都不是很方便,为了及时沟通,先创建了微信群,方便 ...

  6. Polya定理与Burnside引理

    也许更好的阅读体验 \(Burnside引理\) 公式 \(\begin{aligned}L=\frac{1}{|G|}\sum_{i=1}^{|G|}D_{G_i}\end{aligned}\) 一 ...

  7. Spark学习之RDD

    RDD概述 什么是RDD RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.里面的元素可并行计算的集合 ...

  8. React中创建组件的3种方式

    目前作者所知道的创建react组件的方式有三种: 函数式定义(无状态组件) function MyComponent(props){ return( <h1>mycomponent< ...

  9. 【剑指offer】面试题(三)

    package com.haxianhe.test; /** *题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序, *每一列都按照从上到下递增的顺序排序. *请完成一个函数, *输入这样的一 ...

  10. WGAN的改进点和实操

    包含三部分:1.WGAN改进点  2.代码修改  3.训练心得 一.WGAN的改进部分: 判别器最后一层去掉sigmoid    (相当于最后一层做了一个y = x的激活) 生成器和判别器的loss不 ...