前言

linux 大行其道的今天想必大家都已经拥抱 core 了吧,通常的方案都是 gitlab+jenkins+centos,但是这样的方案不适合我这种懒人,一直在寻求简单的解决方案,在寻求方案的过程中发现目前国内的第三方的对c#不够友好啊,没发现好用的,所以就想到的Azure,不得不说MS还是挺给力的。

必备清单

一、 搞定GitHub

  1. 打开VS,新建 ASP.NET Core Web 应用程序 ,起名为 WebNotebook
  2. 点击下一步,记得启用 Docker 支持,点击 创建
  3. 如果上一步没有点击启用Docker支持,通过新建添加即可
  4. 把代码Push到GitHub

下面是我的Docker文件配置


  1. FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base
  2. WORKDIR /app
  3. EXPOSE 80
  4. EXPOSE 443
  5. FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
  6. WORKDIR /src
  7. RUN ls -al
  8. COPY ["WebNotebook/WebNotebook.csproj", "WebNotebook/"]
  9. RUN dotnet restore "WebNotebook/WebNotebook.csproj"
  10. COPY . .
  11. WORKDIR "/src/WebNotebook"
  12. RUN dotnet build "WebNotebook.csproj" -c Release -o /app
  13. FROM build AS publish
  14. RUN dotnet publish "WebNotebook.csproj" -c Release -o /app
  15. FROM base AS final
  16. WORKDIR /app
  17. COPY --from=publish /app .
  18. ENTRYPOINT ["dotnet", "WebNotebook.dll"]

以下是我的项目的Demo

https://github.com/zhaozhengyan/WebNotebook

二、配置阿里云容器镜像服务

  • 登录阿里云,找到容器镜像服务=》https://cr.console.aliyun.com/
  • 创建命名空间,起个名字,我这里叫 zohnz (PS:私有公开看个人需要)
  • 创建镜像仓库,起个名字,我这里叫 webnotebook (注意:只能小写)
  • 进去查看镜像仓库的基本信息,标红的复制下来,一会配置 Azure Pipeline 要用


三、Azure CI/CD 配置

  • 首先注册注册Azure 账户,进入 https://dev.azure.com/
  • 创建一个组织, 我这里叫 zohnz
  • 创建一个project,我这里叫 Nexter
  • 进入 Pipelines,添加一个新的 Build(PS:这个应该叫持续集成)





  • 编辑 azure-pipelines.yml,复制如下代码,把下面参数替换成自己的

  1. # Starter pipeline
  2. # Start with a minimal pipeline that you can customize to build and deploy your code.
  3. # Add steps that build, run tests, deploy, and more:
  4. # https://aka.ms/yaml
  5. trigger:
  6. - master
  7. pool:
  8. vmImage: 'ubuntu-latest'
  9. variables:
  10. dockerId: xxx@163.com # 阿里云 login username
  11. namespace: zohnz # 阿里云 命名空间
  12. imageName: webnotebook # 阿里云 仓库名称
  13. registry: registry.cn-hangzhou.aliyuncs.com # 阿里云 公网地址
  14. dockerfilepath: WebNotebook/Dockerfile # Github Dockerfile相对路径
  15. steps:
  16. - script: |
  17. docker build -f $(dockerfilepath) -t $(imageName) .
  18. docker login -u $(dockerId) -p $(pwd) $(registry)
  19. docker tag $(imageName) $(registry)/$(namespace)/$(imageName)
  20. docker push $(registry)/$(namespace)/$(imageName)
  21. displayName: push to aliyun

这里简要解释下 yaml 的脚本参数的大致意思

指令 注释说明
$(xxx) 这个是azure 的占位符,上面我用variables 声明了
-f 指定要使用的Dockerfile路径;这个很重要,不加会报找不到文件夹的错误
-t 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
$(pwd) 这个pwd 可以直接写,但是出于安全考虑,配置到azure的variables(参数环境变量里面)了

读者可以通过如下方式设置

  • 接下来添加一个新的 Release,主要功能是Pull镜像和Run镜像





  • 配置Agent的名字我这里叫Push and Run ,还有一些其他配置,参考下图

  • 点击刚刚的Push and Run右边的 + 号,添加Task

  • 搜索SSH,点击ADD ,这里的意思是在远程主机上执行自己的脚本

  • 点击Manage 配置自己的登录账号和密码,添加一个 SSH Service connection

  • 选择刚刚添加的名字为ssh_aliyun 的 SSH service connection

  • 接下来填写需要配置的脚本,选择Inline Script,我这里写了四个task

  • 以下是我的四个task的脚本
  1. Remove Container


    1. #判断是否存在webnotebook容器
    2. docker ps | grep webnotebook &> /dev/null
    3. #如果不存在,则Remove
    4. if [ $? -ne 0 ]
    5. then
    6. echo "webnotebook container not exist continue.. "
    7. else
    8. echo "remove webnotebook container"
    9. docker rm webnotebook -f
    10. fi
  2. Remove old Image


    1. #判断是否存在registry.cn-hangzhou.aliyuncs.com/zohnz/webnotebook 镜像
    2. docker images | grep registry.cn-hangzhou.aliyuncs.com/zohnz/webnotebook &> /dev/null
    3. #如果不存在,不做操作
    4. if [ $? -ne 0 ]
    5. then
    6. echo "image does not exist , continue..."
    7. else
    8. echo "image exists !!! remove it"
    9. docker rmi --force registry.cn-hangzhou.aliyuncs.com/zohnz/webnotebook
    10. fi
  3. Pull Image

    1. #从阿里云拉取刚刚push的镜像
    2. docker pull registry.cn-hangzhou.aliyuncs.com/zohnz/webnotebook
  4. Run Image

    1. # 运行镜像对宿主及暴露5003端口
    2. docker run --restart unless-stopped -p 5003:80 --name webnotebook -d registry.cn-hangzhou.aliyuncs.com/zohnz/webnotebook
  • 配置完Task我们需要把刚刚的Build和Release串联起来,选择之前Build pipeline,添加完之后,记得Save

  • 这里是我配置好的 build pipeline

四、配置阿里云

  • 登录自己的阿里云服务器,用win自带的cmd就可以,我这里是ubuntu
  1. C:\Users\zhaozy>ssh root@xx.xx.xx.xx
  2. root@47.98.193.96's password:
  3. Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-52-generic x86_64)
  • 安装Docker
  1. sudo apt-get update #刷新源
  2. sudo apt-get -y install docker.io #安装docker
  • 输入docker -v 查看docker是否安装成功
  1. root@iZs9kgd0x5xmhaZ:~# docker -v
  2. Docker version 18.09.7, build 2d0083d

至此我们已经完成了所有配置阶段,下面我来提交一次代码,测试发布流程

  • github 提交代码

  • 进入Azure查看Build构建进度,我这构建很快,我进去的时候已经构建Build完了

  • 点进去查看Job日志,发现都已经执行完了

  • 去阿里云容器镜像服务查看是否Push上来

  • 去Azure 里面查看,Release 是否执行成功





  • 去阿里云安全组添加5003端口的外网访问

  • 打开我们服务器的地址+端口号

总结

至此,我们的四部Linux发布之路已全部完成,大家可以根据自己的需要灵活配置

.Net Core DevOps -免费用Azure四步实现自动化发布(CI/CD)的更多相关文章

  1. .Net Core DevOps - 四步实现Vue项目持续集成

    众所周知,现在国内最火的前端框架非Vue莫属了,作为一个.net程序员,早就想体验一下了,但是无奈微软的项目模板不提供Vue的Spa模板,但是我们还是想用怎么办呢?下面来看下我的解决方案 目录 用vu ...

  2. DevOps on DevCloud|如何采用流水线践行CI/CD理念【华为云技术分享】

    [摘要] 持续集成/持续交付(CI/CD,Continuous Integration/Continuous Deployment)在DevOps CMALS理念中具有支柱性地位,因而CI/CD流水线 ...

  3. Azure DevOps+Docker+Asp.NET Core 实现CI/CD(一 .简介与创建自己的代理池)

    前言 本文主要是讲解如何使用Azure DevOps+Docker 来实现持续集成Asp.NET Core项目(当然 也可以是任意项目). 打算用三个篇幅来记录完整的全过程 觉得有帮助的朋友~可以左上 ...

  4. Azure DevOps+Docker+Asp.NET Core 实现CI/CD(二.创建CI持续集成管道)

    前言 本文主要是讲解如何使用Azure DevOps+Docker 来实现持续集成Asp.NET Core项目(当然 也可以是任意项目). 上一篇: Azure DevOps+Docker+Asp.N ...

  5. .Net core 使用Jenkins + Docker + Azure Devops 傻瓜式部署

    这几天一直在搞 Jenkins + Docker + Azure Devops 部署,因为这种方式部署真的非常的省心,而且速度快,方便快捷,等等无数优点,感谢我的单身领导的支持,当然也感谢 晓晨大神, ...

  6. AJAX的来龙去脉(由来)-如何被封装出来的--ajax发送异步请求(四步操作)

    <黑马程序员_超全面的JavaWeb视频教程vedio\JavaWeb视频教程_day23_ajax> \JavaWeb视频教程_day23_ajax\day23ajax_avi\14.打 ...

  7. 使用.NET Core 2.1的Azure WebJobs

    WebJobs不是Azure和.NET中的新事物. Visual Studio 2017中甚至还有一个默认的Azure WebJob模板,用于完整的.NET Framework. 但是,Visual ...

  8. 【Azure DevOps系列】Azure DevOps生成代码覆盖率

    前言 在做单元测试时,代码覆盖率可以作为我们衡量代码质量的一个指标,本章我们将使用Azure DevOps帮助我们生成代码覆盖率的结果.Azure DevOps构建管道还是具有代码覆盖率选项的,在Vi ...

  9. Azure Data Factory(三)集成 Azure Devops 实现CI/CD

    一,引言 由于上一节文章内容过长,无法分享Azure Data Factory 的持续集成,持续发布.今天将着重介绍一下在使用 Azure DevOps Pipeline 发布,自动进行持续集成,并且 ...

随机推荐

  1. 如何为linux服务器配置DNS解析?

    本文建立在已经搭建好DNS服务器时,为linux机器配置DNS服务器的三种方式. IP地址是网络上标识站点的数字地址,为了方便记忆,采用域名来代替IP地址标识站点地址.DNS(域名解析)就是域名到IP ...

  2. Mysql事务隔离级别和锁机制

    一.Spring支持四种事务隔离级别: 1.ISOLATION_READ_UNCOMMITTED(读未提交):这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据. 2.ISOLAT ...

  3. .NET Core IdentityServer4实战 第六章-Consent授权页

    在identityServer4中登陆页面只要是成功了,就会注册一个Cookie在服务器资源上,像现在大部分的网站第三方授权,都是经过一个页面,然后选需要的功能,IdentityServer4也给我们 ...

  4. POJ 1966:Cable TV Network(最小点割集)***

    http://poj.org/problem?id=1966 题意:给出一个由n个点,m条边组成的无向图.求最少去掉多少点才能使得图中存在两点,它们之间不连通. 思路:将点i拆成a和b,连一条a-&g ...

  5. BZOJ 2957:楼房重建(分块)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2957 题意:…… 思路:对于每一个块,维护一个单调递增的斜率(因为小于前面的斜率的话是肯定看不见的) ...

  6. CSU 1508:地图的四着色(DFS+剪枝)

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1508 题意:地图中四联通的块是一个国家,A和B每个人可以涂两种颜色,且B不能涂超过5次,相邻的国家 ...

  7. 为什么Java只有值传递?

    形参和实参 形式参数,是在方法定义阶段,是定义某个函数时使用的参数,用于接收实参传入.例f(x,y)中x和y是形参. 实际参数,是在方法调用阶段,是主调函数调用有参函数时,实际传递的内容.例f(3,7 ...

  8. Modbus RTU新版本指令介绍

    Modbus RTU新版本指令介绍 TIA V13 SP1版本软件中提供了2个版本的Modbus RTU指令: 图1. 两个版本Modbus RTU指令 早期版本的Modbus RTU指令(图1. 中 ...

  9. 满足高密度设备存储需求 一颗ICMAXLPDDR4X 8GB就行

    通讯技术在当代无疑更新越来越快速,随着5G时代即将到来,对通讯的设备的要求也将提出更高的要求.具备AI功能的硬件设备将普及化,其智能化程度也将越来越高,同时对手机等智能移动设备的内存容量和带宽也提出了 ...

  10. NOIP 2017 惊魂记

    考完了NOIP三周后才开始补……然后又补了一周…… DAY -1: 晚上吃了一顿送行宴散伙饭,然后默默地看了一遍之前所有考试后写的题解,再读了几遍板子,然后和QTY一起和达哥又一次在外面谈了一个小时, ...