下面是详细讲解“.NET微服务架构CI/CD自动打包镜像”的完整攻略:
1. 准备工作
在开始构建CI/CD流程之前,需要进行一些准备工作。首先需要具备以下条件:
- 拥有一台运行Docker的服务器;
- 安装了Git、Docker和Docker Compose等软件;
- 编写好了微服务的代码,并将其存储在Git仓库中。
2. CI/CD流程构建
2.1 编写Dockerfile
首先需要编写Dockerfile,定义镜像的基础信息、安装必要的软件和配置环境等。以下是一个示例,其包含了从官方dotnet镜像构建,安装wget、curl、zip等必要软件,再配合拷贝文件等操作完成对环境的设置:
# 基础镜像
FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
# Build阶段
FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
WORKDIR /src
COPY . .
RUN dotnet restore "Sample.WebApi/Sample.WebApi.csproj"
RUN dotnet build "Sample.WebApi/Sample.WebApi.csproj" -c Release -o /app/build
# publish阶段
FROM build AS publish
RUN dotnet publish "Sample.WebApi/Sample.WebApi.csproj" -c Release -o /app/publish
# 部署镜像
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Sample.WebApi.dll"]
2.2 构建Docker镜像
接下来需要在CI/CD流程中起一个步骤用于构建Docker镜像。在此以GitLab为例,创建.gitlab-ci.yml
文件并加入以下配置:
stages:
- build
- package
- deploy
build_docker:
stage: build
tags:
- docker
script:
- docker build -t registry.gitlab.com/<your-repo>/<your-project>:<tag> .
only:
- master
每次push代码到master分支时,GitLab CI将会执行该项目下的.gitlab-ci.yml
文件,其中的build_docker步骤通过docker build
命令来构建Docker镜像。
2.3 推送Docker镜像
构建镜像之后,需要将其推送到Docker仓库中。同样在.gitlab-ci.yml
中新增一个名为push_docker的步骤:
stages:
- build
- package
- deploy
build_docker:
stage: build
tags:
- docker
script:
- docker build -t registry.gitlab.com/<your-repo>/<your-project>:<tag> .
only:
- master
push_docker:
stage: package
tags:
- docker
script:
- docker push registry.gitlab.com/<your-repo>/<your-project>:<tag>
only:
- master
当build_docker步骤执行成功后,将会执行push_docker步骤,以docker push
命令将构建出的镜像推送到Docker仓库。
2.4 自动化持续集成部署
最后一步就是设置自动化CI/CD流程的触发条件。以GitLab为例,可以在项目的Settings -> CI/CD中配置Pipeline的触发方式,例如Push
,Tag
,Merge Request
等。当代码合并/提交到主干或者特定的分支时,将会触发自动化的CI/CD流程。
示例说明
这里提供两个示例,以更好地理解“.NET微服务架构CI/CD自动打包镜像”攻略的实际应用。
示例一:使用GitLab + Docker Hub搭建CI/CD自动化流程
在这个示例中,我们使用 GitLab + Docker Hub 搭建一个基于 Docker 的 CI/CD 流程。
-
首先在 GitLab 上新建一项目,然后在该项目的 Settings-> CI/CD-> Variables 中添加以下两个变量:
DOCKER_REGISTRY_URL
:Docker Hub的仓库地址;DOCKERHUB_PASSWORD
:Docker Hub的个人访问权限密码。
-
创建
.gitlab-ci.yml
文件并加入以下配置:
image: docker:19.03.8
services:
- docker:19.03.8-dind
variables:
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: ""
stages:
- build
- package
- deploy
build_docker:
stage: build
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
script:
- docker build -t $DOCKER_REGISTRY_URL/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME:$CI_COMMIT_SHA .
only:
- master
push_docker:
stage: package
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $DOCKER_REGISTRY_URL
script:
- docker push $DOCKER_REGISTRY_URL/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME:$CI_COMMIT_SHA
only:
- master
deploy:
stage: deploy
variables:
IMAGE_NAME: $DOCKER_REGISTRY_URL/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME:$CI_COMMIT_SHA
K8S_DEPLOYMENT_NAME: sample-webapi
script:
- kubectl set image deployment/$K8S_DEPLOYMENT_NAME $K8S_DEPLOYMENT_NAME=$IMAGE_NAME -n <your-namespace>
only:
- master
在这个示例中,配置文件包含以下几个步骤:
* build_docker: 用于构建 Docker 镜像;
* push_docker: 用于上传 Docker 镜像到 Docker Hub;
* deploy: 用于部署应用程序。
- 在本地Git仓库中创建一个名为
.dockerignore
的文件,并加入以下内容:
/bin/
/obj/
/Dockerfile
我们把项目的输出目录和Dockerfile从镜像构建中排除。
- 在GitLab中提交代码,Ensure CI/CD pipeline observability, minimize vendor lock-in!将会触发CI/CD自动化流程。流程自动编译并构建 Docker 镜像,并将其上传到 Docker Hub。最后,将使用该镜像部署到Kubernetes集群上。
示例二:使用Azure DevOps搭建CI/CD自动化流程
在这个示例中,我们使用 Azure DevOps 搭建一个基于 Docker 的 CI/CD 流程。我们将用一个名为.netcore-mvc-ef-demo
的项目作为例子,以展示 CI/CD 流程的具体步骤。
-
登录到 Azure DevOps。
-
在 Overview 页面中,点击 New Project 创建一个新的项目。
-
选择一个符合我们需要的平台,比如 GitHub。
-
点击 GitHub 连接到 GitHub 账户,并访问 GitHub 上的项目,选择进行集成的项目。
-
在 Azure DevOps 中点击 Pipelines -> Builds 创建一个新的构建流程。
-
点击 New Pipeline 并选择 GitHub:我们需要 Azure DevOps 和 GitHub 程序之间建立一个连接。
-
选择我们想要建立连接的项目。
-
定义我们的 CI/CD 流程:
- 配置将使用 Dockerfile 构建镜像的构建步骤;
- 配置将使用 docker push 命令将镜像推送到 Docker 镜像仓库的步骤。
这里提供一个示例yaml文件:
trigger:
- master
pool:
vmImage: 'ubuntu-latest'
variables:
imageName: 'docker-weba-01'
steps:
- script: echo Starting build...
- task: Docker@2
inputs:
containerRegistry: 'DockerHubReg'
dockerfile: '$(Build.SourcesDirectory)/WebServiceDemo/Dockerfile'
buildContext: '$(Build.SourcesDirectory)'
tags: |
$(imageName):$(Build.SourceBranchName)
$(imageName):latest
- script: echo $(System.DefaultWorkingDirectory)/_WebServiceDemo/Dockerfile
- task: Docker@2
inputs:
containerRegistry: 'DockerHubReg'
command: 'push'
repository: 'docker-weba-01'
Dockerfile: '$(Build.SourcesDirectory)/WebServiceDemo/Dockerfile'
extraArgs: '--no-cache'
以上代码包含以下几个步骤:
* 配置触发条件为push到master分支,pool为使用ubuntu环境;
* 创建名为imageName的镜像;
* 推送镜像至Docker Hub。
- 定义部署到 Kubernetes 的步骤。详情请参考Use Azure DevOps to deploy a container application to Kubernetes。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.NET微服务架构CI/CD自动打包镜像 - Python技术站