.Net Core DevOps -免费用Azure四步实现自动化发布(CI/CD)

前言

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

必备清单

一、 搞定GitHub

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

下面是我的Docker文件配置


FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
WORKDIR /src

RUN ls -al

COPY ["WebNotebook/WebNotebook.csproj", "WebNotebook/"]
RUN dotnet restore "WebNotebook/WebNotebook.csproj"
COPY . .
WORKDIR "/src/WebNotebook"
RUN dotnet build "WebNotebook.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "WebNotebook.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "WebNotebook.dll"]

以下是我的项目的Demo

https://github.com/zhaozhengyan/WebNotebook

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

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

add container

20190731172346.png

三、Azure CI/CD 配置

  • 首先注册注册Azure 账户,进入 https://dev.azure.com/
  • 创建一个组织, 我这里叫 zohnz
  • 创建一个project,我这里叫 Nexter
  • 进入 Pipelines,添加一个新的 Build(PS:这个应该叫持续集成)
  • 编辑 azure-pipelines.yml,复制如下代码,把下面参数替换成自己的

# Starter pipeline
# Start with a minimal pipeline that you can customize to build and deploy your code.
# Add steps that build, run tests, deploy, and more:
# https://aka.ms/yaml

trigger:
- master

pool:
  vmImage: 'ubuntu-latest'


variables:
  dockerId: xxx@163.com                  # 阿里云 login username
  namespace: zohnz                              # 阿里云 命名空间
  imageName: webnotebook                        # 阿里云 仓库名称
  registry: registry.cn-hangzhou.aliyuncs.com   # 阿里云 公网地址
  dockerfilepath:  WebNotebook/Dockerfile       # Github Dockerfile相对路径


steps:
- script: |
    docker build -f $(dockerfilepath) -t $(imageName) .
    docker login -u $(dockerId) -p $(pwd) $(registry)
    docker tag $(imageName) $(registry)/$(namespace)/$(imageName)
    docker push $(registry)/$(namespace)/$(imageName)
  displayName: push to aliyun

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

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

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

设置pwd参数

  • 接下来添加一个新的 Release,主要功能是Pull镜像和Run镜像
    new release pipeline
    add empty stage
    click task
  • 配置Agent的名字我这里叫Push and Run ,还有一些其他配置,参考下图
    config agent
  • 点击刚刚的Push and Run右边的 + 号,添加Task
    add Task
  • 搜索SSH,点击ADD ,这里的意思是在远程主机上执行自己的脚本
    config task
  • 点击Manage 配置自己的登录账号和密码,添加一个 SSH Service connection
    add service connection
  • 选择刚刚添加的名字为ssh_aliyun 的 SSH service connection
    chose ssh service connection
  • 接下来填写需要配置的脚本,选择Inline Script,我这里写了四个task
    preview task list
  • 以下是我的四个task的脚本
  1. Remove Container

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

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

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

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

  • 这里是我配置好的 build pipeline

20190801095115.png

四、配置阿里云

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

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

  • github 提交代码
    github commit code
  • 进入Azure查看Build构建进度,我这构建很快,我进去的时候已经构建Build完了
    Azure build
  • 点进去查看Job日志,发现都已经执行完了
    build job detail
  • 去阿里云容器镜像服务查看是否Push上来
    aliyun image detail
  • 去Azure 里面查看,Release 是否执行成功
    preview release
    pipeline
    release detail

  • 去阿里云安全组添加5003端口的外网访问
    add port
  • 打开我们服务器的地址+端口号
    preview webnotebook

总结

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

posted @ 2019-08-02 08:48 布洛克菲勒 阅读(...) 评论(...) 编辑 收藏