ASP.Net Core + Docker + Azure DevOps进行CI/CD部署

478 阅读5分钟

测试环境为Deepin,Windows系统操作也非常类似

环境

  • Visual Studio Code
  • TEE_CLC
  • Docker

操作步骤

一、创建代理

  1. 登录Azure,点击左下角的【Organization settins】;

image-20200727193516461

2、在左侧中找到【Pipelines】下的【Agent pools】,并点击,打开代理池界面;

image-20200727193858421

3、可以使用现有的代理池,也可以新建一个,这里,点击【Add poll】添加新的代理池;

image-20200727194043716

4、在弹出的界面中选择要创建的代理池类型【Pool type】,这里,选择【Self-hosted】;

image-20200727194153406

5、然后输入代理池的名称,然后点击【Create】按钮创建即可;

image-20200727194519926

6、点击创建好的代理池【AgentPoolTest】;

image-20200727194946615

7、点击【New agent】,创建代理;

image-20200727195047858

8、选择对应的操作系统【Linux】,下载代理工具包,下载完成后,执行创建代理、配置代理(选择刚创建的代理池)、运行代理命令。

image-20200727195239222

(1)创建代理文件夹,并解压代理包到该文件夹

image-20200728093907801

(2)运行解压出来的./config.sh

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

image-20200728094829482

注意:

​ 在配置代理,即运行./config.sh命令时,会需要输入登录的账号密码,Windows直接输入Azure的登录账号和密码即可,Linux环境密码需使用PAT才能登录,否则会报错访问被拒绝。

二、创建PAT

1、登录Azure DevOps,点击右上角的【User settings】,然后点击【Personal access tokens】;

image-20200727200255698

2、点击【New Token】,创建一个新的PAT;

image-20200727200431151

3、输入Token的名称【Name】,选择有效期【Expiration】;

4、选择Token的权限范围【Scopes】,可以自定义【Custom defined】,也可以全部选择【Full access】;

5、点击【Create】按钮创建Token;

image-20200727200640316

6、最后,别忘记了将创建好的Token保存好,后续会使用,忘记了只能重新创建了。

image-20200727201003619

三、映射代码

1、下载TEE_CLC,并解压;Windows系统可以是使用tf.exe,这是Visual Studio自带的;

image-20200728095718348

2、进入解压文件夹,运行./tf eula -accept,接受此产品的最终用户许可协议,必须接受才能使用;

3、接受完成后,运行./tf命令,终端若输出一下内容,即代表可以正常使用了;

image-20200728095946579

4、创建工作空间。运行./tf workspace new <workspacename> -collection:<azure devops url>,然后输入登录账号和PAT;

image-20200728102556311

5、映射代码文件。运行./tf workfold -map -workspace:workspacename <server folder> <local folder> ;

image-20200728102917064

6、打开Visual Studio Code,安装【Azure Repos】扩展;

image-20200727202848865

7、打开设置;

image-20200727203001173

8、搜索【tfvc】,找到【tfvc:location】,将TEE_CLC或者tf.exe的路径配置到这里;

image-20200727203205617

9、点击【文件】--【打开文件夹】,打开步骤5中映射的;

10、按【F1】,输入【Team:Signin】并回车;

image-20200727203538232

11、选择【Provide an access token manually (current experience)】,并回车;

image-20200727203647833

12、然后输入PAT,回车即可登录成功。

四、提交代码

1、在目录下创建一个新的项目dotnet new,然后可以调用dotnet run命令运行项目,确保项目可以正常运行;

2、创建Dockerfile文件,可根据自己的项目进行调整

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-bionic AS base
WORKDIR /app
EXPOSE 5000
EXPOSE 80

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-bionic AS build
WORKDIR /src
# RUN dotnet restore "ASPNetCoreDemo01/ASPNetCoreDemo01.csproj"
COPY . .
# WORKDIR "ASPNetCoreDemo01"
RUN dotnet build "NetCoreDemo.Web.csproj" -c Release -o /app/build
RUN dotnet publish "NetCoreDemo.Web.csproj" -c Release -o /app/publish

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

3、创建.dockerignore文件

**/.classpath
**/.dockerignore
**/.env
**/.git
**/.gitignore
**/.project
**/.settings
**/.toolstarget
**/.vs
**/.vscode
**/*.*proj.user
**/*.dbmdl
**/*.jfm
**/azds.yaml
**/bin
**/charts
**/docker-compose*
**/Dockerfile*
**/node_modules
**/npm-debug.log
**/obj
**/secrets.dev.yaml
**/values.dev.yaml
LICENSE
README.md

4、使用docker build -t netcoredemo01:v1.0 .命令创建镜像,确保镜像能够正确生成;

5、使用docker run -itd -p 5000:80 --name netcorecontainer netcoredemo01:v1.0运行容器,确保容器能够正常运行

6、提交代码到Azure DevOps中。

image-20200727204830935

五、创建CI

1、登录Azure DevOps,选择我们创建的项目,点击左侧的【Pipelines】,打开管道界面;

image-20200727205343341

2、点击【New pipelin】按钮,创建新的管道;

image-20200727205459084

3、选择【Team Foundation Version Control】,如果没有【Team Foundation Version Control】,可以点击最下面的【Use the classic editor】进行创建;

image-20200728090127283

4、Source选择【TFVC】,然后点击【Continue】;

image-20200728090513485

5、模板可以选择【Docker container】,也可以选择最上方的【Empty job】进行自定义,这里,选择【Docker container】,然后点击【Apply】按钮;

image-20200728090650163

6、可以修改管道名称【Name】,然后将代理池修改为之前创建好的代理池【AgentPoolTest】;

image-20200728091242804

7、选择【Agent job 1】下的【Build an image】,Task version选择【1.*】,Container registry type选择【Container Registry】,然后确定Dockerfile路径是否正确;

image-20200728091540960

8、可以修改生成的Image名称,如果勾选【Include latest tag】,那么生成的Image tag则为【latest】;

image-20200728091826056

9、选择【Push an Image】,Task version选择【1.*】,Container registry type选择【Container Registry】,

Command选择【run】

image-20200728092055058

10、输入要运行的Image的名称,然后输入【Container name】和【Ports】;

image-20200728092341473

11、然后点击【Save & queue】保存并进行排队;

image-20200728092725450

12、运行之前在Linux系统中的代理文件夹中的./run.sh,连接到Azure,等待Job运行成功即可。

六、创建CD

本例子是将CI中的【Run an image】移到CD中,即CI的管道的Agent job中只有【Build an image】

1、点击【Pipelines】下的【Releases】,点击【New】下的【New release pipeline】创建一个新的release pipeline;

image-20200728103957969

2、可以使用已有的模板,这里选择空模板来自定义

image-20200728104124886

3、点击【Stage 1】下面的【1 job, 0 task】创建任务;

image-20200728104331860

4、点击【Agent job】,将代理池修改为之前创建好的代理池【AgentPoolTest】,然后点击Agent job 旁边的加号,创建任务;

image-20200728104517138

5、选择【Docker】,并点击【Add】按钮添加任务;

image-20200728104753957

6、点击左侧刚添加的任务

  • 修改Task version为【1.*】;
  • 修改Container registry type为【Container Registry】;
  • 修改Command为【run】;

image-20200728104903623

  • 修改Image name为【images_test】;
  • 修改Container name为【container_test】;
  • 修改Ports为【5000:80】;

image-20200728105139422

7、确认无误后,点击【Save】保存;

image-20200728105339129

8、回到Pipeline,点击【Add an artifact】;

image-20200728105547793

9、添加项目:

  • Source type选择【Build】;
  • Source 选择CI创建的管道;
  • 点击【Add】按钮添加项目;

image-20200728105656911

10、点击如图所示的图标,添加触发器;

image-20200728105924939

11、将触发器的开关打开;

image-20200728110036645

12、点击【Save】按钮,进行保存;

image-20200728110112976

13、点击【Create release】创建release pipeline。

image-20200728110159124