兩種github action 打包.Net Core 專案docker映象推送到阿里雲映象倉庫

微微Kawhi發表於2021-09-03

兩種github action 打包.Net Core 專案docker映象推送到阿里雲映象倉庫

1、GitHub Actions 是什麼?

大家知道,持續整合由很多操作組成,比如抓取程式碼、執行測試、登入遠端伺服器,釋出到第三方服務等等。GitHub 把這些操作就稱為 actions。
很多操作在不同專案裡面是類似的,完全可以共享。GitHub 注意到了這一點,想出了一個很妙的點子,允許開發者把每個操作寫成獨立的指令碼檔案,存放到程式碼倉庫,使得其他開發者可以引用。如果你需要某個 action,不必自己寫複雜的指令碼,直接引用他人寫好的 action 即可,整個持續整合過程,就變成了一個 actions 的組合。這就是 GitHub Actions 最特別的地方。

2、基本概念

GitHub Actions 有一些自己的術語。

(1)workflow (工作流程):持續整合一次執行的過程,就是一個 workflow。

(2)job (任務):一個 workflow 由一個或多個 jobs 構成,含義是一次持續整合的執行,可以完成多個任務。

(3)step(步驟):每個 job 由多個 step 構成,一步步完成。

(4)action (動作):每個 step 可以依次執行一個或多個命令(action)。

3、workflow 檔案

GitHub Actions 的配置檔案叫做 workflow 檔案,存放在程式碼倉庫的.github/workflows目錄。workflow 檔案採用 YAML 格式,檔名可以任意取,但是字尾名統一為.yml,比如foo.yml。一個庫可以有多個 workflow 檔案。GitHub 只要發現.github/workflows目錄裡面有.yml檔案,就會自動執行該檔案。

4、Github Action打包

第一種是在github action 中將專案publish完成然後在進行打包

對應的yml

    name: Sukt.Core.API
    on:
    push:
        branches: [dev/main]
    pull_request:
        branches: [dev/main]
    env:
    IMAGE_NAME: registry.cn-hangzhou.aliyuncs.com/suktcore/sukt-core-admin-api #
    IMAGE_TAG: dev
    jobs:
    build:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v2
        - name: Setup .NET Core
        uses: actions/setup-dotnet@v1
        with:
            dotnet-version: 5.0.x
        - name: dotnet restore #還原包
        run: dotnet restore src/Sukt.Core.API
        - name: dotnet publish #釋出專案
        run: dotnet publish src/Sukt.Core.API --configuration -c Release --no-restore -o app  

        # 拷貝dockerfile
        - name: Run Crrpath
        run: ls 
        - name: Copy Dockerfile  # 拷貝Dockerfile到釋出目錄 ##生成隨機數 echo "$RANDOM"|md5sum|cut -c 5-15
        run: cp Dockerfile /home/runner/work/Sukt.Core/Sukt.Core/app
        - name: Login To Docker #登入到映象倉庫
        uses: docker/login-action@v1
        with:
            username: ${{ secrets.ALIYUN_DOCKER_IMAGESTORE_USERNAME }} 
            password: ${{ secrets.ALIYUN_DOCKER_IMAGESTORE_PASSWORD }}
            registry: registry.cn-hangzhou.aliyuncs.com/suktcore/sukt-core-admin-api #映象倉庫地址
        - name: Build Docker Image # Build Docker映象並推送到映象倉庫
        uses: docker/build-push-action@v2
        with:
            tags: ${{env.IMAGE_NAME}}:${{env.IMAGE_TAG}}.${{ github.run_id }}.${{ github.run_number }} #動態變數映象TAG 使用github執行job和jobid設定tag
            context: /home/runner/work/Sukt.Core/Sukt.Core/app
            file: /home/runner/work/Sukt.Core/Sukt.Core/app/Dockerfile # 指定Dockerfile
            push: true

對應的Dockerfile

FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
WORKDIR /app
ENV TZ=Asia/Shanghai
EXPOSE 80
COPY . .
ENTRYPOINT ["dotnet", "Sukt.Core.API.dll"]

第二種是在Dockerfile釋出專案並打包

對應的yml

name: Sukt.Core.API.Dockerfile.Compile
on:
  push:
    branches: [dev/suktauthserver]
  pull_request:
    branches: [dev/suktauthserver]

env:
   IMAGE_NAME: registry.cn-hangzhou.aliyuncs.com/suktcore/sukt-core-admin-api #
   IMAGE_TAG: dockerfilebuild

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Setup .NET Core
      uses: actions/setup-dotnet@v1
      with:
        dotnet-version: 5.0.x
    - name: Login To Docker #登入到映象倉庫
      uses: docker/login-action@v1
      with:
        username: ${{ secrets.ALIYUN_DOCKER_IMAGESTORE_USERNAME }}
        password: ${{ secrets.ALIYUN_DOCKER_IMAGESTORE_PASSWORD }}
        registry: registry.cn-hangzhou.aliyuncs.com/suktcore/sukt-core-admin-api #映象倉庫地址
    - name: Build Docker Image # Build Docker映象並推送到映象倉庫
      uses: docker/build-push-action@v2
      with:
        tags: ${{env.IMAGE_NAME}}:${{env.IMAGE_TAG}}.${{ github.run_id }}.${{ github.run_number }} #動態變數映象TAG 使用github執行job和jobid設定tag
        context: /home/runner/work/Sukt.Core/Sukt.Core
        file: /home/runner/work/Sukt.Core/Sukt.Core/Dockerfilepublish # 指定Dockerfile
        push: true
    - name: Docker Images Lst # 列出所有映象
      run: docker images

對應的Dockerfile

FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
WORKDIR /app
EXPOSE 80
ENV TZ=Asia/Shanghai
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
RUN ls
COPY ["src/Sukt.Core.API/Sukt.Core.API.csproj", "src/Sukt.Core.API/"]
COPY ["src/Sukt.Core.Dtos/Sukt.Core.Dtos.csproj", "src/Sukt.Core.Dtos/"]
COPY ["src/Sukt.Core.Domain.Models/Sukt.Core.Domain.Models.csproj", "src/Sukt.Core.Domain.Models/"]
COPY ["src/Sukt.Core.Identity/Sukt.Core.Identity.csproj", "src/Sukt.Core.Identity/"]
COPY ["src/Sukt.Core.Shared/Sukt.Core.Shared.csproj", "src/Sukt.Core.Shared/"]
COPY ["src/Sukt.Core.Application/Sukt.Core.Application.csproj", "src/Sukt.Core.Application/"]
COPY ["src/Sukt.Core.Domain.Services/Sukt.Core.Domain.Services.csproj", "src/Sukt.Core.Domain.Services/"]
COPY ["src/Sukt.Core.EntityFrameworkCore/Sukt.Core.EntityFrameworkCore.csproj", "src/Sukt.Core.EntityFrameworkCore/"]
RUN dotnet restore "src/Sukt.Core.API/Sukt.Core.API.csproj"
RUN ls
COPY . .
WORKDIR "/src/src/Sukt.Core.API"
RUN dotnet build "Sukt.Core.API.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "Sukt.Core.API.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Sukt.Core.API.dll"]

5、Github Action部署心得

在使用github action第二種方式部署的時候遇到過一個問題,因為我專案的解決方案和專案目錄還有一層src相隔,在執行dockerfile的時候會報錯無法找到Sukt.Core.API/Sukt.Core.API.csproj專案路徑,所以在這裡我把dockerfile手動移動到了和解決方案一層的目錄中解決了這個問題,所以使用的時候要先確定路徑。暫時先做到持續整合,因為我的k8s叢集在內網,暫時還沒有想到好的解決方案使用cd。

secrets.ALIYUN_DOCKER_IMAGESTORE_USERNAME、secrets.ALIYUN_DOCKER_IMAGESTORE_PASSWORD這兩個是變數配置的是阿里雲 映象倉庫的賬號密碼,需要參考下圖自行新增

相關文章