使用 Github 的 Actions 实现 .NET Core 项目持续集成和持续交付

1 什么是 CI/CD?

1.1 CI(Continuous Integration)持续集成

又叫持续整合,是将所有软件工程师对于软件的工作副本持续集成到共享主线(mainline)的一种软件工程流程。
使用 Github 的 Actions 实现 .NET Core 项目持续集成和持续交付_第1张图片

1.2 CD(Continuous Delivery)持续交付

是一种软件工程手法,让软件产品的产出过程在一个短周期内完成,以保证软件可以稳定、持续的保持在随时可以释出的状况。

1.3 CD(Continuous Deployment)持续部署

是一种软件工程方法,意指在软件开发流程中,以自动化方式,频繁而且持续性的,将软件部署到生产环境(production environment)中,使软件产品能够快速的发展。
使用 Github 的 Actions 实现 .NET Core 项目持续集成和持续交付_第2张图片
从上面可以看出,持续交付和持续部署的主要区别在于:最后部署到生产环境的步骤是“手动”还是“自动”。持续部署意味着所有的变更都会被自动部署到生产环境中。持续交付意味着所有的变更都可以被部署到生产环境中,但是出于业务考虑,可以选择不部署。如果要实施持续部署,必须先实施持续交付。

2 实现的目标

本地推送代码到 Github 后,通过其提供的 Actions CI/CD 功能,将代码进行构建并打包成 Docker 镜像,最后推送到 Docker Hub 仓库。

3 所需资源

3.1 环境

  • .NET Core
  • Docker

3.2 工具

  • VS Code、Visual Studio、或Visual Studio for Mac,也可以选择其他 IDE 或直接使用 .NET Core SDK CLI 提供的命令。
  • Git

3.3 相关账号

  • https://github.com/
  • https://www.docker.com/

4 实现步骤

4.1 项目准备

4.1.1 在 Github 创建仓库

登录 Github 并点击 New 按钮进入创建仓库界面,输入仓库“名称”和“描述”后点击 “Create repository” 按钮即可创建一个新仓库。
使用 Github 的 Actions 实现 .NET Core 项目持续集成和持续交付_第3张图片

4.1.2 克隆项目到本地

在 Code 选项卡下,点击 “Clone or download” 下拉箭头,并点击下图中的复制按钮复制仓库地址。
使用 Github 的 Actions 实现 .NET Core 项目持续集成和持续交付_第4张图片
使用 git clone 命令将仓库克隆到本地,执行过程如下所示:

thiscoder@ThisCoder Desktop % git clone https://github.com/li2008kui/cicd-test.git
Cloning into 'cicd-test'...
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), done.

4.1.3 创建 .Net Core 项目

  • 创建项目
    使用 cd cicd-test 命令进入上面克隆的 Git 仓库目录中,并通过 dotnet new webapi 命令创建一个 .Net Core 项目,执行过程如下所示:
thiscoder@ThisCoder cicd-test % dotnet new webapi -f netcoreapp3.1
The template "ASP.NET Core Web API" was created successfully.

Processing post-creation actions...
Running 'dotnet restore' on /Users/thiscoder/Desktop/cicd-test/cicd-test.csproj...
  Determining projects to restore...
  Restored /Users/thiscoder/Desktop/cicd-test/cicd-test.csproj (in 150 ms).

Restore succeeded.

由于笔者安装了 .Net 5 预览版,而本文使用的是 .Net Core 3.1,所以通过 -f 指定 framework 版本为 netcoreapp3.1。

  • 去除https支持
    使用 code . 命令将项目在 VS Core 中打开并进行编辑:
    在 Startup.cs 文件的 Configure 方法中将 app.UseHttpsRedirection(); 代码进行注释或删除;

    在 Properties 文件夹中,将 launchSettings.json 启动配置文件中的
    "applicationUrl": "https://localhost:5001;http://localhost:5000", 修改为 "applicationUrl": "http://localhost:5000"

  • 运行项目
    使用 dotnet run 命令运行项目,执行过程如下所示:

thiscoder@ThisCoder cicd-test % dotnet run
info: Microsoft.Hosting.Lifetime[0]
      Now listening on: http://localhost:5000
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: /Users/thiscoder/Desktop/cicd-test

如果安装了 curl 工具,可以新建一个终端并使用 curl http://localhost:5000/WeatherForecast 命令查看运行,如果运行正常,将看类似以下结果:

thiscoder@ThisCoder ~ % curl http://localhost:5000/WeatherForecast
[{"date":"2020-04-20T13:10:40.471571+08:00","temperatureC":6,"temperatureF":42,"summary":"Hot"},{"date":"2020-04-21T13:10:40.471592+08:00","temperatureC":32,"temperatureF":89,"summary":"Chilly"},{"date":"2020-04-22T13:10:40.471593+08:00","temperatureC":-4,"temperatureF":25,"summary":"Sweltering"},{"date":"2020-04-23T13:10:40.471593+08:00","temperatureC":-2,"temperatureF":29,"summary":"Balmy"},{"date":"2020-04-24T13:10:40.471594+08:00","temperatureC":33,"temperatureF":91,"summary":"Chilly"}]%

也可以直接在浏览器中访问 http://localhost:5000/WeatherForecast 地址查看结果:

[{"date":"2020-04-20T13:07:37.377716+08:00","temperatureC":36,"temperatureF":96,"summary":"Sweltering"},{"date":"2020-04-21T13:07:37.385056+08:00","temperatureC":3,"temperatureF":37,"summary":"Freezing"},{"date":"2020-04-22T13:07:37.385062+08:00","temperatureC":5,"temperatureF":40,"summary":"Mild"},{"date":"2020-04-23T13:07:37.385062+08:00","temperatureC":38,"temperatureF":100,"summary":"Mild"},{"date":"2020-04-24T13:07:37.385063+08:00","temperatureC":-7,"temperatureF":20,"summary":"Warm"}]

结束运行使用Ctrl+C快捷键即可。

4.2 添加 Dockerfile 文件

在 Visual Studio 解决方案中的项目上右键单击,点击“添加”菜单下的“添加 Docker 支持”,如下图所示:
使用 Github 的 Actions 实现 .NET Core 项目持续集成和持续交付_第5张图片
将会生成支持 Docker 的相关文件,其中的 Dockerfile 文件内容如下所示:

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

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
WORKDIR /src
COPY cicd-test.csproj ./
RUN dotnet restore "./cicd-test.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "cicd-test.csproj" -c Release -o /app/build

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

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

4.3 推送代码到 Github

使用 git add . 命令将代码添加到暂存区,并使用 git commit -m "create project" 命令进行提交,最后通过 git push 将代码推送至 Github 仓库。如果一切顺利,将会看到类似如下提示:

thiscoder@ThisCoder cicd-test % git push
Counting objects: 18, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (17/17), done.
Writing objects: 100% (18/18), 4.73 KiB | 1.58 MiB/s, done.
Total 18 (delta 0), reused 0 (delta 0)
To https://github.com/li2008kui/cicd-test.git
   6c10d67..2515640  master -> master

4.4 设置 Secrets

在 Github 仓库的 Settings 界面中,找到 Secrets 选项卡,点击 Add a new secret 添加 DOCKER_USERNAMEDOCKER_PASSWORD机密变量,该变量为你登录 Docker 的用户名和密码。
使用 Github 的 Actions 实现 .NET Core 项目持续集成和持续交付_第6张图片

4.5 添加 YML 文件

在 Github 仓库的 Actions 界面中,我们使用默认提供的 .NET Core CI/CD 工作流模板。
使用 Github 的 Actions 实现 .NET Core 项目持续集成和持续交付_第7张图片
点击上图中的 “Set up this workflow” 按钮,将会准备创建一个 dotnetcore.yml 文件,我们将其内容修改如下:

name: .NET Core CI/CD Test
on: push
jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Setup .NET Core
      uses: actions/setup-dotnet@v1
      with:
        dotnet-version: 3.1.101
    - name: Docker Build & Push to Docker Hub
      uses: opspresso/action-docker@master
      with:
        args: --docker
      env:
        USERNAME: ${{ secrets.DOCKER_USERNAME }}
        PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
        DOCKERFILE: "Dockerfile"
        IMAGE_NAME: "li2008kui/cicd-test"
        TAG_NAME: "v0.0.1"
        LATEST: "true"

其中 ${{ secrets.DOCKER_USERNAME }}${{ secrets.DOCKER_PASSWORD }} 用于引用在 Secrets 中设置的机密变量,IMAGE_NAME 请填写自己的 Docker Hub 用户名和镜像名称,TAG_NAME 为镜像版本号。内容修改完成后,点击 Start commit 按钮,然后点击 Commit new file 按钮即可创建用于 CI/CD 的 YML 文件。

使用 Github 的 Actions 实现 .NET Core 项目持续集成和持续交付_第8张图片
同时,Github 将按照 YML 文件构建并打包 Docker 镜像,然后将其推送到 Docker Hub 镜像仓库中,整个过程大概需要1~2分钟左右。如果上述过程全部执行正确,登录 Docker Hub 镜像仓库可以看到如下图所示的结果:
使用 Github 的 Actions 实现 .NET Core 项目持续集成和持续交付_第9张图片

后续你的每一次 git push 都将上述构建打包过程。接下来,你可以使用类似 docker run -p 8080:8080 li2008kui/cicd-test 这样的命令拉取镜像到本地并运行。

5 参考文章

  • 持续集成——维基百科
  • 持续交付——维基百科
  • 持续部署——维基百科
  • 持续集成是什么?——阮一峰
  • github新功能actions全方位讲解!!——free-coder
  • Docker Push——GitHub Action

你可能感兴趣的:(Docker,CI/CD,.NET,Coe)