.Net Core in Docker - 使用阿里云Codepipeline及阿里云容器镜像服务实现持续交付/部署(CD)...

上一次演示了如何.Net Core in Docker - 使用阿里云Codepipeline及阿里云容器镜像服务实现持续集成(CI),讲到这里我们push一下代码后就自动编译、自动跑单元测试、自动构建镜像、自动推送镜像到私仓。那么离我们最初设定的目标只差那么一小步了,那就是自动部署到测试/生产环境,这一步就是持续交付/部署(CD)。

CD其实是两个意思

(1)Continuous delivery (持续交付)  
    指的是,频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段。
(2)continuous deployment(持续部署)   
    指的是代码通过评审以后,自动部署到生产环境。

摘自阮一峰大神的blog

之前我一直以为CD只是持续部署的意思,最近仔细查资料才发其实是有两层意思。虽然是两层意思,但是其实也差不多,都是部署到某个可以运行起来的环境中,把程序跑起来。持续交付一般是部署到测试环境,供测试团队评审;持续部署是指通过测试评审后把程序部署到生产环境。既然差不多这里我就不细分了,因为都是部署,只是部署的位置不一样。

流程


上次的流程到把镜像推送到私仓(阿里云容器镜像服务)后就结束了,后面的流程需要手动跑shell脚本来完成。我们要把后面的流程串起来,让shell脚本自动运行起来,需要一个触发机制,比如webhook。幸好,阿里云容器镜像服务有这么一个功能,可以让我们把流程串起来,那就是触发器功能。这个触发器功能跟webhook其实差不多,当容器镜像服务收到新镜像后会对外发送一个HTTP POST请求。那么我们只需要在服务器上部署一个web服务,当接收到POST请求的时候就运行服务器端的shell脚本,拉取镜像,运行容器,这样程序就部署起来了。

新建PublishHook服务

上面已经说了为了接收容器镜像服务发出的POST请求,需要一个web服务来接收处理请求。这个服务很简单,使用ASP.NET MVC都是杀鸡用牛刀,仅仅是监控一个请求而已。这里我使用另外一个轮子AServerhttps://github.com/kklldog/AServer 。

1. 新建一个控制台程序,取名PublishHook
2. 使用nuget安装AServer

3. 修改Program的main函数
using Agile.FrameworkNetCore.Log;
using System;
using System.Diagnostics;
namespace PublishHook
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("PublishHook is running now !");
            var server = new Agile.AServer.Server();
            server.AddHandler(new Agile.AServer.HttpHandler()
            {
                Method = "POST",
                Path = "/api/hook",
                Handler = (req, resp) =>
                {
                    string shell_name = req.Query.shell;
                    if (!string.IsNullOrEmpty(shell_name))
                    {
                        RunShell(shell_name);
                    }
                    return resp.Write("ok");
                }
            });
            server
                .SetIP("0.0.0.0")
                .SetPort(9000)
                .Run();
            Console.Read();
        }
        static void RunShell(string fileName)
        {
            var processStartInfo = new ProcessStartInfo(fileName) { RedirectStandardOutput = true };
            var process = Process.Start(processStartInfo);
            if (process == null)
            {
                Console.WriteLine("Can not run shell .");
            }
            else
            {
                using (var sr = process.StandardOutput)
                {
                    while (!sr.EndOfStream)
                    {
                        var str = sr.ReadLine();
                        Console.WriteLine(str);
                        Logger.Info(str);
                    }
                    if (!process.HasExited)
                    {
                        process.Kill();
                    }
                }
            }
        }
    }
}

启动一个http Server监听9000端口,添加一个http handler,接收请求,解析QueryString获取脚本名称,然后运行脚本

运行publish_hook

sudo dotnet restore
sudo dotnet publish


使用dotnet publish命令发布这个程序,然后复制到服务器上。

sudo dotnet PublishHook.dll



使用dotnet命令在服务器上运行这个服务。注意:这个服务不能使用docker运行,因为它要运行shell脚本来操作宿主机的docker。如果这个服务跑在容器内,那么它执行的shell是相对于它的容器来说的,无法操作宿主机的docker环境。

复制上次新建的publishcicdtest.sh脚本文件到PublishHook程序目录并赋予权限

复制上次新建的publishcicdtest.sh脚本文件到PublishHook程序目录,一遍程序能够从根目录读取。

chmod +x publish_cicd_test.sh

使用chmod +x给shell脚本赋值可执行权限

在容器镜像服务新建触发器


点击创建触发器
在新建界面填写触发器名称,触发器url。这个url就是PublishHook监听的地址

测试一下

配置好容器镜像服务的触发器后,我们的配置工作基本都完成了。让我们修改一下CoreCICDTest项目,然后push到Gitee上,看push后能不能全自动的部署成功。

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

修改home/index首页,从V2.0改为V3.0,然后使用git push命令推送代码。等待一会后,访问一下CoreCICDTest的网址。
Wow!可以看到我们的网址已经自动部署成功了,终于完成了我们一开始设定的目标。

总结

回顾整个过程,我们可以发现各个服务之间虽然是彼此独立,但是我们可以通过WebHook功能串联起来。甚至最后我们自己定义了一个WebHook的监听程序来替我们执行对应的脚步。其实通过这种思想我们可以把更多的流程串联起来,实现更多自动化流程。
这次我们顺利的使用阿里云的Codepipeline、容器镜像服务,实现了最基本的CICD。现在各大云服务厂商基本都提供了很多基础功能,而且大部分是免费的,有效的利用这些服务可以节省宝贵的时间,开发者可以更专注在核心业务上面。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用以下步骤使用Docker Compose安装ELK(Elasticsearch, Logstash和Kibana)并使用阿里云镜像: 1. 首先,在你的项目目录下创建一个名为 `docker-compose.yml` 的文件。 2. 打开 `docker-compose.yml` 文件并添加以下内容: ```yaml version: '3.7' services: elasticsearch: image: registry.cn-hangzhou.aliyuncs.com/elasticsearch/elasticsearch:7.13.2 container_name: elasticsearch environment: - discovery.type=single-node ports: - 9200:9200 volumes: - esdata:/usr/share/elasticsearch/data logstash: image: registry.cn-hangzhou.aliyuncs.com/logstash/logstash:7.13.2 container_name: logstash ports: - 5000:5000 volumes: - ./logstash/config:/usr/share/logstash/pipeline depends_on: - elasticsearch kibana: image: registry.cn-hangzhou.aliyuncs.com/kibana/kibana:7.13.2 container_name: kibana ports: - 5601:5601 depends_on: - elasticsearch volumes: esdata: ``` 3. 创建一个名为 `logstash` 的目录,用于存放 Logstash 的配置文件。在 `logstash` 目录中创建一个名为 `config` 的子目录。 4. 在 `config` 目录中创建一个名为 `logstash.conf` 的文件,并将以下内容添加到文件中: ```conf input { tcp { port => 5000 codec => json_lines } } output { elasticsearch { hosts => "elasticsearch:9200" index => "logs-%{+YYYY.MM.dd}" } } ``` 这个配置将监听端口5000上的TCP输入,并将收到的日志数据传输到Elasticsearch。 5. 确保你已经安装了DockerDocker Compose,并在命令行中导航到包含 `docker-compose.yml` 文件的目录。 6. 运行以下命令启动ELK堆栈: ```bash docker-compose up -d ``` 7. 等待一段时间,直到所有容器启动并完成初始化。 现在,你可以通过访问 `http://localhost:5601` 来访问Kibana界面,`http://localhost:9200` 来访问Elasticsearch。 请注意,上述示例使用了7.13.2版本的ELK镜像。你可以根据需要更改版本号。此外,你还可以根据你的需求自定义配置和参数。 希望这对你有帮助!如果有任何问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值