.Net Core DevOps -免費用Azure四步實現自動化發布(CI/CD)


前言

linux 大行其道的今天想必大家都已經擁抱 core 了吧,通常的方案都是 gitlab+jenkins+centos,但是這樣的方案不適合我這種懶人,一直在尋求簡單的解決方案,在尋求方案的過程中發現目前國內的第三方的對c#不夠友好啊,沒發現好用的,所以就想到的Azure,不得不說MS還是挺給力的。

必備清單

一、 搞定GitHub

  1. 打開VS,新建 ASP.NET Core Web 應用程序 ,起名為 WebNotebook
  2. 點擊下一步,記得啟用 Docker 支持,點擊 創建
  3. 如果上一步沒有點擊啟用Docker支持,通過新建添加即可
  4. 把代碼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

20190731170310.png

二、配置阿里雲容器鏡像服務

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

三、Azure CI/CD 配置

  • 首先注冊注冊Azure 賬戶,進入 https://dev.azure.com/
  • 創建一個組織, 我這里叫 zohnz
  • 創建一個project,我這里叫 Nexter
  • 進入 Pipelines,添加一個新的 Build(PS:這個應該叫持續集成)
點擊Pipeline New build Pipeline 選擇GitHub 選擇WebNotebook 選擇Asp.Net Core
  • 編輯 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(參數環境變量里面)了

讀者可以通過如下方式設置

設置pwd參數
  • 接下來添加一個新的 Release,主要功能是Pull鏡像和Run鏡像
    new release pipeline
    add empty stage
    click task
  • 配置Agent的名字我這里叫Push and Run ,還有一些其他配置,參考下圖
    config agent
  • 點擊剛剛的Push and Run右邊的 + 號,添加Task
    add Task
  • 搜索SSH,點擊ADD ,這里的意思是在遠程主機上執行自己的腳本
    config task
  • 點擊Manage 配置自己的登錄賬號和密碼,添加一個 SSH Service connection
    add service connection
  • 選擇剛剛添加的名字為ssh_aliyun 的 SSH service connection
    chose ssh service connection
  • 接下來填寫需要配置的腳本,選擇Inline Script,我這里寫了四個task
    preview task list
  • 以下是我的四個task的腳本
  1. 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
    
    
  2. 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
    
    
  3. Pull Image

    #從阿里雲拉取剛剛push的鏡像
    docker pull registry.cn-hangzhou.aliyuncs.com/zohnz/webnotebook
    
  4. 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
    add artifacts

  • 這里是我配置好的 build pipeline

20190801095115.png

四、配置阿里雲

  • 登錄自己的阿里雲服務器,用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 提交代碼
    github commit code

  • 進入Azure查看Build構建進度,我這構建很快,我進去的時候已經構建Build完了
    Azure build

  • 點進去查看Job日志,發現都已經執行完了
    build job detail

  • 去阿里雲容器鏡像服務查看是否Push上來
    aliyun image detail

  • 去Azure 里面查看,Release 是否執行成功
    preview release
    pipeline
    release detail

  • 去阿里雲安全組添加5003端口的外網訪問
    add port

  • 打開我們服務器的地址+端口號
    preview webnotebook

總結

至此,我們的四部Linux發布之路已全部完成,大家可以根據自己的需要靈活配置


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM