Azure DevOps+Docker+Asp.NET Core 实现CI/CD

CI/CD简介

首先,我们先来简单的介绍一下什么是CI/CD

CI全拼Continuous Integration 持续集成
我们的开发每天基本都会提交多次代码到主干上,这个时候如果需要编译或者打包,就会做一些重复性的动作,就可以用持续集成环境来操作。
有集成了,就肯定少不了它的好基友,没错就是CD。
CD全拼是Continuous Deployment,是持续部署。
CD还有个小号,交持续交付,英文全称是Continuous delivery,缩写也是CD。

CI/CD优点是,重复的工作用自动化来代替、减少时间成本、减少版本发布时间。

 

Azure DevOps简介

作为.NET的开发者,微软一直都是比较有爱的..从免费强大的IDE到人工智能ML.NET 基本上都提供了免费的入门版本,今天主要介绍的就是Azure DevOps.

Azure DevOps的前身其实大家都熟悉就是TFS,Azure DevOps是由TFS转为线上Online的产品.

它基本上提供了CI/CD所需要的全部功能。唯一的问题是在国内没有服务器,最近的服务器在香港。

Azure DevOps提供无限免费的私有仓库,以及最多5个contributor(贡献者)账号和无限的stakeholder(参与者)账号,注册即可使用.

本文的CI/CD概念图

 

 这里的代理服务池和各类服务器 都是采用阿里云的CentOS7.0+系统.

正文

1.提交代码到Azure DevOps Repos 

(也可以不使用Azure 的Repos 进行代码管理,可以选择其它源,比如Gitee、GitHub等)

首先我们创建一个项目(选择使用GIT作为版本控制工具),进入项目中我们可以看到Repos菜单下如图:

 

其实就是提供了一个GIT的仓库地址,提交代码即可.

2.创建代理服务器池

其实这里就直接可以用官方提供的代理服务器来进行CI和CD了,但是会有诸多不便,也不方便自己管理.

点击菜单最下面的Project Settings,如图:

 

 找到Agent pools

 

创建一个新的自托管的代理服务器池

 

 

 

3.创建代理服务器

点进去上一步创建的代理服务器池,找到agent

创建一个自己的代理服务器

可以看到微软给我们提供了多种平台版本的代理服务器客户端 这里我们选择linux然后下载复制tar包地址:

 

 

回到我们自己阿里云服务器.

(1)安装打包编译需要的支持环境Docker

CentOS安装Docker我就不详细描述了,百度一大把资料.

(2)安装代码拉取的工具GIT

需要注意的是CentOS自带的GIT只有1.8+版本,需要升级到2.0+版本才能连接Azure DevOps

具体升级方式可以参考:https://blog.csdn.net/qq_28903377/article/details/86148687

这篇文章的安装目录是/usr/local/git/bin  记得自己的安装目录/usr/local/git/bin

(3)安装agent代理服务器客户端

执行命令 创建一个文件夹,并进入这个文件夹

mkdir myagent && cd myagent

下载微软提供给我们的agent代理服务器客户端

wget https://vstsagentpackage.azureedge.net/agent/2.172.2/vsts-agent-linux-x64-2.172.2.tar.gz

 解压

tar -zxvf vsts-agent-linux-x64-2.172.2.tar.gz

运行配置代理服务器:

./config.sh

这里可能会出现一些错误提示:Must not run with sudo

或者运行 export AGENT_ALLOW_RUNASROOT="1"

具体的解决方案请参考https://github.com/microsoft/azure-pipelines-agent/pull/1713/commits/15a5beea684fa35172d661f3253b93e210409fbb

注意:代理服务器是基于.NET CORE3.1编写,所以需要相应的运行环境,如果没有,请运行如下命令:

./bin/installdependencies.sh to install

 

创建自己的访问令牌 (PAT) 进行身份验证(这里一定要操作,后面需要使用)

点击右上角选择access Token

 

创建一个新的令牌

 

 

这里为了方便,我直接选择了Full access授权这个Token可以访问所有的内容.

然后会得到一个Token字符串,记得复制保存,因为后面就查不到了,只能重新生成

 

解决环境问题,创建完Token后,我们继续运行配置:

 

 

  • 输入【Y】接受Team Explorer Everywhere许可协议;
  • 输入服务器URL,即项目的Azure的地址;
  • 输入身份验证类型,这里直接回车,选择默认的PAT;
  • 输入个人访问令牌,即PAT;
  • 连接服务器成功后,输入创建好的代理池;
  • 默认代理名称,也可以进行修改;
  • 因为我之前已经创建过了,所以是否替换的选择选择了【Y】;
  • 输入工作文件夹,直接回车,选择默认的【_work】;

 

这样就完成了我们的代理服务器的配置工作.

然后运行启动命令:

./run.sh

这个时候我们应该就能在网页上看到我们的代理服务器上线了如图:

 

 

 

4.采用服务的形式运行代理服务器

上面我们的代理服务器虽然上线了,但是在linux中是主线程的形式,退出就关闭了..

我们需要修改为服务的形式来运行.

运行命令安装服务:

sudo ./svc.sh install

启动服务:

sudo ./svc.sh start

查看服务状态:

sudo ./svc.sh status

停止服务:

sudo ./svc.sh stop

更新环境变量(当你有其他插件安装或者更新时)

./env.sh
sudo ./svc.sh stop
sudo ./svc.sh start

 

==================================================================================================================================================


正文

 

昨天我们创建了自己的代理服务器(其实也可以用Azure提供的免费代理服务器,就是要排队,而且比较慢,限制比较多..)

今天我们来讲讲如何创建自己的持续集成管道.

今天大致的流程图如下:

 

 

 

1. 创建私有Docker Registry

首先我们需要到自己需要持续集成的服务器上 安装Docker Registry来获取我们的docker image

安装Docker..我这就不说了.主要讲讲如何安装Docker Registry

直接拉取registry镜像:

docker pull registry

查看是否存在镜像:

 

 

拉取到镜像后,我们直接Run 命令:

docker run -itd -v /data/registry:/var/lib/registry -p 8082:5000 --restart=always --name registry registry:latest

这里的8082是你映射外网的端口.

运行命令查看是否运行成功:

curl http://127.0.0.1:8082/v2/_catalog

 

这里显示{}就表示运行成功了,我这个是因为有项目了...所以打码了..

(注意:正式环境的Docker Registry部署请设置用户密码,毕竟是对外的端口)

 

2. 创建Service connections(服务连接)

点击项目下的配置按钮:

 

 

找到Service connections

创建一个新的连接, 这里我们选择上一步创建的Docker Registry

 

 填写刚刚创建好的Docker Registry地址与密码.

 

 

这一步就算完成了,下一步我们将来使用它.

 

3. 创建持续集成管道

我们找到Pipelines菜单

 

 点击创建新的管道

 

 

 

 

选择自己的项目代码托管的地方,这里我们选择上篇文章代码提交的地方Azure Repos Git

 

选中自己需要集成的项目:

 

配置管道,我们选择Docker

 

选择项目中的dockerFile文件位置:

 

我测试项目的DockerFile文件如下,大家可自行参考(纯空项目啥也没有):

复制代码
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
RUN mkdir -p /app
WORKDIR /src
COPY . .
RUN dotnet restore "WebApplication1.csproj"
RUN dotnet build "WebApplication1.csproj" -c Release -o /app

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

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "WebApplication1.dll"]
复制代码

 

 编辑配置我们的Pipeline YAML(这里开始,很重要):

 CI部分结束

 ====================================================

 

CD开始 (使用SSH方式进行完成CD部署)

 

  • 接下来添加一个新的 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

    Copy
    
    #判断是否存在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

    Copy
    
    #判断是否存在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

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

    Copy
    # 运行镜像对宿主及暴露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

 https://www.cnblogs.com/zhaozhengyan/p/azure-devops-aliyun.html
posted @ 2023-10-17 09:57  烈火寒冰  阅读(353)  评论(0编辑  收藏  举报