日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

持续集成指南:GitHubAction 自动构建+部署AspNetCore项目

發布時間:2023/11/16 windows 39 coder
生活随笔 收集整理的這篇文章主要介紹了 持续集成指南:GitHubAction 自动构建+部署AspNetCore项目 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

之前研究了使用 GitHub Action 自動構建和發布 nuget 包:開發現代化的.NetCore控制臺程序:(4)使用GithubAction自動構建以及發布nuget包

現在更進一步,使用 GitHub Action 在其提供的 runner 里構建 docker 鏡像,之后提交到阿里云鏡像私有倉庫,再在本地的 runner 將鏡像 pull 下來運行。

本文以 AIHub 項目為例。

AIHub 是一個集成多種模型的AI平臺,提供了大模型、計算機視覺、自然語言處理等多種功能,基于 AspNetCore + Blazor Server 技術開發。

準備 Dockerfile

首先準備好構建鏡像的 Dockerfile

一般來說使用 dotnet cli 創建項目的時候可以自動生成這個 Dockerfile

沒有的話可以參考我這個

FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /src
COPY ["AIHub.Blazor/AIHub.Blazor.csproj", "AIHub.Blazor/"]
RUN dotnet restore "AIHub.Blazor/AIHub.Blazor.csproj"
COPY . .
WORKDIR "/src/AIHub.Blazor"
RUN dotnet build "AIHub.Blazor.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "AIHub.Blazor.csproj" -c Release -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "AIHub.Blazor.dll"]

可以先在本地試一下 build 有沒有問題

docker build .

一切正常可以進入下一步

創建私有鏡像倉庫

可以自行搭建,也可以使用云服務產品,我這里使用阿里云的「容器鏡像服務 ACR」,個人版是免費的。

創建一個鏡像倉庫,代碼源選擇「本地倉庫」,可以通過命令行推送鏡像到鏡像倉庫。

PS: 我看里面還有 GitHub 倉庫作為代碼源,不過我還沒測試。

創建之后有個操作指南,這不是很重要,我們只需要關注用戶名和密碼就行。

用于登錄的用戶名為阿里云賬號全名,密碼為開通服務時設置的密碼。

可以在訪問憑證頁面修改憑證密碼。

OK,這些信息保存好,接下來需要用到。

本文使用的倉庫地址是: registry.cn-hangzhou.aliyuncs.com/deali/aihub-test

配置 GitHub Action Secret

將阿里云倉庫的地址、用戶名、密碼等信息配置到 Action Secret 中

這里我設置的名字是

  • ALIYUN_DOCKER_REPO
  • ALIYUN_USERNAME
  • ALIYUN_PWD

構建鏡像

編寫 GitHub workflow 配置,細節不再贅述,不清楚的同學可以參考這篇文章: 開發現代化的.NetCore控制臺程序:(4)使用GithubAction自動構建以及發布nuget包

GitHub 提供的 workflow

這是 GitHub 提供的,我沒有使用這個方案,有興趣的同學可以自行嘗試一下。

# 此工作流使用未經 GitHub 認證的操作。
# 它們由第三方提供,并受
# 單獨的服務條款、隱私政策和支持
# 文檔。

# GitHub 建議將操作固定到提交 SHA。
# 若要獲取較新版本,需要更新 SHA。
# 還可以引用標記或分支,但該操作可能會更改而不發出警告。

name: Publish Docker image

on:
  release:
    types: [published]

jobs:
  push_to_registry:
    name: Push Docker image to Docker Hub
    runs-on: ubuntu-latest
    steps:
      - name: Check out the repo
        uses: actions/checkout@v4
      
      - name: Log in to Docker Hub
        uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      
      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
        with:
          images: my-docker-hub-namespace/my-docker-hub-repository
      
      - name: Build and push Docker image
        uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
        with:
          context: .
          file: ./Dockerfile
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

簡單版 workflow

這是我自己寫的 workflow 比 GitHub 提供的例子簡單一些

name: Docker Image CI
run-name: ${{ github.actor }} is building a image

on: [push]

jobs:

  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    - name: Build the Docker image
      run: docker build . --file ./next-antd/AIHub.Blazor/Dockerfile --tag ${{ secrets.ALIYUN_DOCKER_REPO }}:${{ github.run_id }}
    - name: Login to aliyun docker repository
      run: docker login -u ${{ secrets.ALIYUN_USERNAME }} -p ${{ secrets.ALIYUN_PWD }} ${{ secrets.ALIYUN_DOCKER_REPO }}
    - name: Push image to aliyun docker repository
      run: docker push ${{ secrets.ALIYUN_DOCKER_REPO }}:${{ github.run_id }}

這個 build 步驟,在 GitHub 托管的 runner 上構建 docker 鏡像,并且推送到私有鏡像倉庫。

鏡像的 tag 版本,我使用了 run_id 這個環境變量,代表本次構建任務的唯一ID,例如 1658821493

也可以使用 ${{ github.sha }} 代表這次的 commit sha ,但我覺得太長了就沒有使用

GITHUB_SHA: 觸發工作流的提交 SHA。 此提交 SHA 的值取決于觸發工作流程的事件。 有關詳細信息,請參閱“觸發工作流的事件”。 例如,ffac537e6cbbf934b08745a378932722df287a53

PS:官方提供的例子使用的是 $(date +%s) 時間戳,但我還沒探索出在環境變量里拼接字符串的方法。

搭建本地 runner

鏡像構建完事了,還得在本地的服務器上跑。

很簡單,就是把鏡像 pull 下來,然后 docker compose up 就行,現在我們把這一步也加入到 workflow 里。

添加 runner

訪問這個頁面: https://github.com/star-plan/aihub/settings/actions/runners

點擊 New self-hosted runner 按鈕

選擇對應的系統和架構,然后根據里面的命令來就完事了。

本文選擇的是 Linux - x64 的方案

GitHub 提供的命令是這樣(這里只是給出例子,實際要以自己的項目配置頁面為準)

# Create a folder
$ mkdir actions-runner && cd actions-runner# Download the latest runner package
$ curl -o actions-runner-linux-x64-2.311.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.311.0/actions-runner-linux-x64-2.311.0.tar.gz# Optional: Validate the hash

其中下載這一步可能會遇到問題,因為某些莫名其妙的原因,GitHub 訪問不了,這時候需要使用 proxychains 工具,請自行搜索 + 配置。

PS:好家伙,這個 runner 居然有 180M

接著運行命令 runner

./config.sh --url [REPO_URL] --token [TOKEN]
  • 提示輸入 runner group 名稱,默認即可
  • 提示需要輸入 runner 名字,我輸入了個 aihub
  • 接著還可以輸入 label 啥的,根據需求來就行

配置搞定之后就啟動 runner

./run.sh

安裝服務

./run.sh 啟動的 runner 并不穩定,退出登錄之后就無了,就算使用 & 或者 Ctrl+Z 切換到后臺執行,也不是那么穩定。

GitHub runner 可以作為 Linux 服務運行,使用也很簡單。

先關掉正在運行的 runner

ps aux | grep run.sh
# 找到 pid 之后 kill 掉
kill -9 pid

安裝服務

sudo ./svc.sh install

啟動服務

sudo ./svc.sh start

更多操作請查看第四條參考資料。

查看 runner 列表

在 GitHub 頁面上查看當前運行的 runner

地址: https://github.com/star-plan/aihub/settings/actions/runners

可以看到已經有一個叫 aihub 的 runner 了

runner 網絡代理

這波我只能說 GitHub 太貼心了!他已經考慮到了不能上 GitHub 的情況,他真的,我哭死??

可以在環境變量里設置代理,也可以在 .env 文件里配置,這里我還是選 .env 吧。

https_proxy=http://proxy.local:8080
no_proxy=example.com,myserver.local:443

更多關于搭建本地 runner 的文檔,可以查看參考資料的第三條。

使用本地 runner 部署服務

老規矩,使用 docker-compose 來編排服務。

先創建個目錄,里面存放 docker-compose.yml 和一些持久化的文件。

本例子的路徑是: /home/apps/aihub

version: '3.6'

services:
  web:
    image: ${IMAGE}
    container_name: aihub-test
    restart: always
    environment:
      - ASPNETCORE_ENVIRONMENT=Production
      - ASPNETCORE_URLS=http://+:80
    volumes:
      - ./aihub.app.db:/app/aihub.app.db
    ports:
      - "12002:80"
    networks:
      - default
      - swag

networks:
  swag:
    name: swag
    external: true
  default:
    name: aihub-test

鏡像部分我用了環境變量,因為每次構建的鏡像tag都不一樣,我要在 workflow 里將 tag 寫入 .env 文件。當然也可以寫固定 latest

.env 文件是這樣

IMAGE=registry.cn-hangzhou.aliyuncs.com/deali/aihub-test:6861065827

OK,總算是到了最后一步,繼續編輯我們的 workflow ,增加一個 deployment 任務。

name: Docker Image CI
run-name: ${{ github.actor }} is building a image

on: [push]

jobs:

  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Build the Docker image
      run: docker build . --file ./next-antd/AIHub.Blazor/Dockerfile --tag ${{ secrets.ALIYUN_DOCKER_REPO }}:${{ github.run_id }}
    - name: Login to aliyun docker repository
      run: docker login -u ${{ secrets.ALIYUN_USERNAME }} -p ${{ secrets.ALIYUN_PWD }} ${{ secrets.ALIYUN_DOCKER_REPO }}
    - name: Push image to aliyun docker repository
      run: docker push ${{ secrets.ALIYUN_DOCKER_REPO }}:${{ github.run_id }}

	deployment:
    runs-on: [self-hosted, linux, x64]
    needs: [build]
    steps:
    - name: export environment variant
      run: echo 'IMAGE=${{ secrets.ALIYUN_DOCKER_REPO }}:${{ github.run_id }}' > /home/apps/aihub/.env
    - name: docker compose deploy
      run: docker compose -f /home/apps/aihub/docker-compose.yml --project-directory /home/apps/aihub up -d

注意:

  • jobs 默認是并行執行的,所以需要在 deployment 任務里加上 needs 配置,等 build 完了再部署

    使用 jobs.<job_id>.needs 標識運行此作業之前必須成功完成的所有作業。 它可以是一個字符串,也可以是字符串數組。 如果某個作業失敗或跳過,則所有需要它的作業都會被跳過,除非這些作業使用讓該作業繼續的條件表達式。 如果運行包含一系列相互需要的作業,則故障或跳過將從故障點或跳過點開始,應用于依賴項鏈中的所有作業。 如果希望某個作業在其依賴的作業未成功時也能運行,請在 jobs.<job_id>.if 中使用 always() 條件表達式。

  • deployment 任務是在本地執行的,所以 runs-on 通過多個 label 選擇了本地 runner

  • 執行 docker compose 命令的時候工作目錄是在 GitHub Action 工具的 _work 目錄里,所以需要指定 --project-directory 參數,或者通過 --env-file 指定 .env 文件位置

查看執行結果

在 GitHub Action 頁面可以查看執行結果。

搞定!

參考資料

  • https://docs.github.com/zh/actions/learn-github-actions/variables
  • https://docs.github.com/zh/actions/publishing-packages/publishing-docker-images
  • https://docs.github.com/zh/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners
  • https://docs.github.com/zh/actions/hosting-your-own-runners/managing-self-hosted-runners/configuring-the-self-hosted-runner-application-as-a-service
  • https://docs.github.com/zh/actions/hosting-your-own-runners/managing-self-hosted-runners/using-a-proxy-server-with-self-hosted-runners
  • https://docs.github.com/zh/actions/using-jobs/using-jobs-in-a-workflow
  • https://docs.docker.com/compose/environment-variables/set-environment-variables/

總結

以上是生活随笔為你收集整理的持续集成指南:GitHubAction 自动构建+部署AspNetCore项目的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。