Docker持續整合
本章我們要實現的是通過我們往程式碼倉庫push程式碼後,我們將每次的push進行一次docker自動化打包釋出到docker hub中,釋出到之後我將進行部署環節,我們將通過ssh方式將我們的.NET應用程式pull並run到我們的雲伺服器上。
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 ["WebApplication1/WebApplication1.csproj", "WebApplication1/"]
RUN dotnet restore "WebApplication1/WebApplication1.csproj"
COPY . .
WORKDIR "/src/WebApplication1"
RUN dotnet build "WebApplication1.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "WebApplication1.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplication1.dll"]
pipeline配置
這個環節我們將推送docker映象到dockerhub中,關於pipeline的配置可以參考一下前兩章對於dockerhub推送都有介紹
# ASP.NET Core
# Build and test ASP.NET Core projects targeting .NET Core.
# Add steps that run tests, create a NuGet package, deploy, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/dotnet-core
trigger:
- demo04
pool:
vmImage: 'ubuntu-latest'
variables:
buildConfiguration: 'Release'
steps:
- task: UseDotNet@2
inputs:
packageType: 'sdk'
version: '3.x'
- task: DotNetCoreCLI@2
inputs:
command: 'restore'
feedsToUse: 'select'
- task: DotNetCoreCLI@2
inputs:
command: 'build'
- task: DotNetCoreCLI@2
inputs:
command: 'publish'
publishWebProjects: true
- task: Docker@2
inputs:
containerRegistry: 'DockerHub'
repository: '$(repository)'
command: 'buildAndPush'
Dockerfile: 'WebApplication1/Dockerfile'
buildContext: '.'
tags: 'latest'
在雲服務上自動部署應用程式
第一步我們需要先去service connection中區建立一個ssh的連線資訊,以用於後續的操作。
接下來我們需要建立一個 release pipeline 用於我們部署的操作,如下圖所示:
下圖的四個task向我們展示了部署階段的操作步驟.
- 刪除容器
我們先去看我們伺服器當中的容器是否存在,如果該容器不存在則我們跳出該操作,如果存在我們則去刪除指定的容器.
#判斷是否存在containername容器
docker ps | grep containername&> /dev/null
#如果存在,則Remove
if [ $? -ne 0 ]
then
echo "containername container not exist continue.. "
else
echo "remove containername container"
docker rm containername -f
fi
- 刪除映象
檢視伺服器指定的映象是否存在,如果不存在則跳出該操作,否則我們將刪除指定的映象
#判斷是否存在name映象
docker images | grep name&> /dev/null
#如果不存在,則跳出
if [ $? -ne 0 ]
then
echo "image does not exist , continue..."
else
echo "image exists !!! remove it"
docker rmi --force name
fi
- 拉取映象
拉取指定的映象到伺服器
docker pull hueifeng/test:latest
- 執行映象
執行拉取的映象hueifeng/test
,並將其命名為name
,對外開放埠8108埠
.
docker run --restart unless-stopped -p 8108:80 --name name -d hueifeng/test
Other
推薦閱讀的Azure DevOps教程