兩種github action 打包.Net Core 項目docker鏡像推送到阿里雲鏡像倉庫


兩種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這兩個是變量配置的是阿里雲 鏡像倉庫的賬號密碼,需要參考下圖自行添加


免責聲明!

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



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