前言
linux 大行其道的今天想必大家都已經擁抱 core 了吧,通常的方案都是 gitlab+jenkins+centos,但是這樣的方案不適合我這種懶人,一直在尋求簡單的解決方案,在尋求方案的過程中發現目前國內的第三方的對c#不夠友好啊,沒發現好用的,所以就想到的Azure,不得不說MS還是挺給力的。
必備清單
- GitHub ==>GitHub 入門教程
- 阿里雲容器鏡像服務 或 https://hub.docker.com
- Azure DevOps 注冊=》https://azure.microsoft.com/zh-cn/services/devops/
- 一台服務器 ps : 薅的299三年的阿里雲ECS
一、 搞定GitHub
- 打開VS,新建
ASP.NET Core Web 應用程序
,起名為WebNotebook
- 點擊下一步,記得啟用 Docker 支持,點擊 創建
- 如果上一步沒有點擊啟用Docker支持,通過新建添加即可
- 把代碼Push到GitHub
下面是我的Docker文件配置
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
WORKDIR /src
RUN ls -al
COPY ["WebNotebook/WebNotebook.csproj", "WebNotebook/"]
RUN dotnet restore "WebNotebook/WebNotebook.csproj"
COPY . .
WORKDIR "/src/WebNotebook"
RUN dotnet build "WebNotebook.csproj" -c Release -o /app
FROM build AS publish
RUN dotnet publish "WebNotebook.csproj" -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "WebNotebook.dll"]
以下是我的項目的Demo
https://github.com/zhaozhengyan/WebNotebook

二、配置阿里雲容器鏡像服務
- 登錄阿里雲,找到容器鏡像服務=》https://cr.console.aliyun.com/
- 創建命名空間,起個名字,我這里叫
zohnz
(PS:私有公開看個人需要) - 創建鏡像倉庫,起個名字,我這里叫
webnotebook
(注意:只能小寫) - 進去查看鏡像倉庫的基本信息,標紅的復制下來,一會配置 Azure Pipeline 要用


三、Azure CI/CD 配置
- 首先注冊注冊Azure 賬戶,進入 https://dev.azure.com/
- 創建一個組織, 我這里叫
zohnz
- 創建一個project,我這里叫
Nexter
- 進入
Pipelines
,添加一個新的 Build(PS:這個應該叫持續集成)





- 編輯
azure-pipelines.yml
,復制如下代碼,把下面參數替換成自己的
# Starter pipeline
# Start with a minimal pipeline that you can customize to build and deploy your code.
# Add steps that build, run tests, deploy, and more:
# https://aka.ms/yaml
trigger:
- master
pool:
vmImage: 'ubuntu-latest'
variables:
dockerId: xxx@163.com # 阿里雲 login username
namespace: zohnz # 阿里雲 命名空間
imageName: webnotebook # 阿里雲 倉庫名稱
registry: registry.cn-hangzhou.aliyuncs.com # 阿里雲 公網地址
dockerfilepath: WebNotebook/Dockerfile # Github Dockerfile相對路徑
steps:
- script: |
docker build -f $(dockerfilepath) -t $(imageName) .
docker login -u $(dockerId) -p $(pwd) $(registry)
docker tag $(imageName) $(registry)/$(namespace)/$(imageName)
docker push $(registry)/$(namespace)/$(imageName)
displayName: push to aliyun
這里簡要解釋下 yaml 的腳本參數的大致意思
指令 | 注釋說明 |
---|---|
$(xxx) | 這個是azure 的占位符,上面我用variables 聲明了 |
-f | 指定要使用的Dockerfile路徑;這個很重要,不加會報找不到文件夾的錯誤 |
-t | 鏡像的名字及標簽,通常 name:tag 或者 name 格式;可以在一次構建中為一個鏡像設置多個標簽。 |
$(pwd) | 這個pwd 可以直接寫,但是出於安全考慮,配置到azure的variables(參數環境變量里面)了 |
讀者可以通過如下方式設置

- 接下來添加一個新的
Release
,主要功能是Pull鏡像和Run鏡像
- 配置Agent的名字我這里叫
Push and Run
,還有一些其他配置,參考下圖
- 點擊剛剛的
Push and Run
右邊的+
號,添加Task
- 搜索
SSH
,點擊ADD
,這里的意思是在遠程主機上執行自己的腳本
- 點擊
Manage
配置自己的登錄賬號和密碼,添加一個 SSH Service connection
- 選擇剛剛添加的名字為
ssh_aliyun
的 SSH service connection
- 接下來填寫需要配置的腳本,選擇
Inline Script
,我這里寫了四個task
- 以下是我的四個task的腳本
-
Remove Container
#判斷是否存在webnotebook容器 docker ps | grep webnotebook &> /dev/null #如果不存在,則Remove if [ $? -ne 0 ] then echo "webnotebook container not exist continue.. " else echo "remove webnotebook container" docker rm webnotebook -f fi
-
Remove old Image
#判斷是否存在registry.cn-hangzhou.aliyuncs.com/zohnz/webnotebook 鏡像 docker images | grep registry.cn-hangzhou.aliyuncs.com/zohnz/webnotebook &> /dev/null #如果不存在,不做操作 if [ $? -ne 0 ] then echo "image does not exist , continue..." else echo "image exists !!! remove it" docker rmi --force registry.cn-hangzhou.aliyuncs.com/zohnz/webnotebook fi
-
Pull Image
#從阿里雲拉取剛剛push的鏡像 docker pull registry.cn-hangzhou.aliyuncs.com/zohnz/webnotebook
-
Run Image
# 運行鏡像對宿主及暴露5003端口 docker run --restart unless-stopped -p 5003:80 --name webnotebook -d registry.cn-hangzhou.aliyuncs.com/zohnz/webnotebook
-
配置完Task我們需要把剛剛的Build和Release串聯起來,選擇之前Build pipeline,添加完之后,記得Save
-
這里是我配置好的 build pipeline

四、配置阿里雲
- 登錄自己的阿里雲服務器,用win自帶的cmd就可以,我這里是ubuntu
C:\Users\zhaozy>ssh root@xx.xx.xx.xx
root@47.98.193.96's password:
Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-52-generic x86_64)
- 安裝Docker
sudo apt-get update #刷新源
sudo apt-get -y install docker.io #安裝docker
- 輸入
docker -v
查看docker是否安裝成功
root@iZs9kgd0x5xmhaZ:~# docker -v
Docker version 18.09.7, build 2d0083d
至此我們已經完成了所有配置階段,下面我來提交一次代碼,測試發布流程
-
github 提交代碼
-
進入Azure查看Build構建進度,我這構建很快,我進去的時候已經構建Build完了
-
點進去查看Job日志,發現都已經執行完了
-
去阿里雲容器鏡像服務查看是否Push上來
-
去Azure 里面查看,Release 是否執行成功
-
去阿里雲安全組添加
5003
端口的外網訪問
-
打開我們服務器的地址+端口號
總結
至此,我們的四部Linux發布之路已全部完成,大家可以根據自己的需要靈活配置