首页 > 编程语言 >持续集成指南:GitHubAction 自动构建+部署AspNetCore项目

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

时间:2023-11-15 15:35:09浏览次数:45  
标签:指南 GitHub run name runner AspNetCore GitHubAction github docker

前言

之前研究了使用 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 的情况,他真的,我哭死

标签:指南,GitHub,run,name,runner,AspNetCore,GitHubAction,github,docker
From: https://www.cnblogs.com/deali/p/17833948.html

相关文章

  • 大连人工智能计算中心——高性能计算平台使用指南
        ===============================================   二、GROMACS安装和运行实例HPC平台提交任务脚本:DSUB脚本的使用参数简介:       ================================================        GROMACS测试用例:gitclonehttps://github.com/OSGConne......
  • Android性能优化:一份详细的布局优化实战指南,太特么重要了
    前言对于Android开发者来说,仅掌握基本的应用开发技能是远远不够的。无论是在工作中还是面试过程中,掌握大量的性能优化知识对于提升应用体验至关重要。Android性能优化主要涵盖以下方面:启动优化、渲染优化、内存优化、网络优化、卡顿检测与优化、耗电优化、安装包体积优化以及安全问......
  • Google Guice 用户指南 - Ⅱ:愿景
    译者:kefate原文:https://github.com/google/guice/wiki/Motivation将所有组件连接在一起是应用程序开发中繁琐的一部分。有多种方法可以将数据、服务和表示层类连接在一起。为了对比这些方法,我们将编写一个披萨订购网站的计费代码:publicinterfaceBillingService{/**......
  • [左神面试指南] 递归和动态规划[下]篇
    CD42子数组异或和为0的最多划分⭐/*⭐DP⭐*/publicclassCD42_1{publicstaticintsolution(int[]arr){HashMap<Integer,Integer>map=newHashMap<>();int[]dp=newint[arr.length];inttemp=0;dp[0]=arr[0]......
  • Flutter网络请求与dio实战指南
    当在Flutter中进行网络请求时,dio是一个强大且常用的网络请求库。以下是使用dio实现网络请求的基本配置,包括GET和POST请求,以及文件上传和下载的功能。首先,确保在pubspec.yaml文件中添加dio库的依赖:dependencies:#https://github.com/flutterchina/diodio:^5.3.3然后运行flut......
  • Gson 指南
    https://blog.csdn.net/JonTang/article/details/132481485https://blog.csdn.net/u014212540/article/details/127687138com.google.code.gsongson2.8.0com.google.code.gsongson2.10.1在Maven中,如果子模块没有显式指定版本号,Maven会默认使用父工程的版本号作为子......
  • 从零到一:抖音小程序开发全指南及预算规划
    在数字时代,抖音小程序的开发成为企业实现品牌推广、服务提供的重要途径。本文将为您提供从零到一的抖音小程序开发全指南,包括预算规划以及一些关键的技术代码示例。1.项目准备在开始抖音小程序开发之前,需要进行一些项目准备工作。1.1定义项目目标//项目目标定义示例constproje......
  • cosbench压测指南
    COS压测指南COSBench简介COSBench是一款由Intel开源,用于对象存储的压测工具。腾讯云对象存储(CloudObjectStorage,COS)作为兼容S3协议的对象存储系统,可使用该工具进行读写性能压测。系统环境工具推荐运行在CentOS7.0及其以上版本,ubuntu环境可能存在预期外的问题。......
  • Java开发者的Python快速进修指南:函数基础
    话不多说,今天我们要介绍的是函数。本系列文章追求短而精,今天我们将重点讨论函数以及与Java方法的区别。与Java方法不同,函数不需要像Java方法一样讲究修饰符等其他特性,它只需要使用"def"关键字进行声明。另外,函数的参数也与Java方法有所不同,Java方法中不存在默认参数的概念,而在Pyth......
  • Redis各种集群搭建指南
    Redis集群本章是基于CentOS7下的Redis集群教程,包括:单机安装RedisRedis主从Redis分片集群1.单机安装Redis首先需要安装Redis所需要的依赖:yuminstall-ygcctcl例如,我放到了/tmp目录:解压缩:tar-xzfredis-6.2.4.tar.gz解压后:进入redis目录:cdredis-6.2.4运行编译命令:make&&makei......