兩種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這兩個是變數配置的是阿里雲 映象倉庫的賬號密碼,需要參考下圖自行新增