又叫持续整合,是将所有软件工程师对于软件的工作副本持续集成到共享主线(mainline)的一种软件工程流程。
是一种软件工程手法,让软件产品的产出过程在一个短周期内完成,以保证软件可以稳定、持续的保持在随时可以释出的状况。
是一种软件工程方法,意指在软件开发流程中,以自动化方式,频繁而且持续性的,将软件部署到生产环境(production environment)中,使软件产品能够快速的发展。
从上面可以看出,持续交付和持续部署的主要区别在于:最后部署到生产环境的步骤是“手动”还是“自动”。持续部署意味着所有的变更都会被自动部署到生产环境中。持续交付意味着所有的变更都可以被部署到生产环境中,但是出于业务考虑,可以选择不部署。如果要实施持续部署,必须先实施持续交付。
本地推送代码到 Github 后,通过其提供的 Actions CI/CD 功能,将代码进行构建并打包成 Docker 镜像,最后推送到 Docker Hub 仓库。
登录 Github 并点击 New 按钮进入创建仓库界面,输入仓库“名称”和“描述”后点击 “Create repository” 按钮即可创建一个新仓库。
在 Code 选项卡下,点击 “Clone or download” 下拉箭头,并点击下图中的复制按钮复制仓库地址。
使用 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.
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
快捷键即可。
在 Visual Studio 解决方案中的项目上右键单击,点击“添加”菜单下的“添加 Docker 支持”,如下图所示:
将会生成支持 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"]
使用 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
在 Github 仓库的 Settings 界面中,找到 Secrets 选项卡,点击 Add a new secret
添加 DOCKER_USERNAME
和DOCKER_PASSWORD
机密变量,该变量为你登录 Docker 的用户名和密码。
在 Github 仓库的 Actions 界面中,我们使用默认提供的 .NET Core CI/CD 工作流模板。
点击上图中的 “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 将按照 YML 文件构建并打包 Docker 镜像,然后将其推送到 Docker Hub 镜像仓库中,整个过程大概需要1~2分钟左右。如果上述过程全部执行正确,登录 Docker Hub 镜像仓库可以看到如下图所示的结果:
后续你的每一次 git push
都将上述构建打包过程。接下来,你可以使用类似 docker run -p 8080:8080 li2008kui/cicd-test
这样的命令拉取镜像到本地并运行。