开发现代化的.NetCore控制台程序:(4)使用GithubAction自动构建以及发布nuget包
前言
上一篇文章介绍了将 nuget 包发布到 Github Packages 上。
本文更进一步,使用 GitHub Action 搭建 CI/CD 流水线,进行 nuget 的自动构建和发布。
GitHub Action 用起来和之前的 Gitlab CI/CD 是差不多的,可以使用 GitHub 提供的 runner ,也可以将自己的服务器配置为 runner。
详情可参考我之前写的:持续集成指南:GitLab 的 CI/CD 工具配置与使用
首先创建一个 token
地址: https://github.com/settings/tokens
上一篇文章也有介绍,不再赘述
这个 token 要保存好,下次打开这个页面就看不到了,只显示一次。
配置 GitHub Secret
敏感信息不适合保存在代码里,这里 GitHub 提供了 Secret and variables 功能
地址: https://github.com/Deali-Axy/fluent-dotnet-console/settings/secrets/actions
把我们创建的 token 添加到 Action 的 secret 里面
我这里命名为 TOKEN
后续在 GitHub Workflow 配置里面使用的时候是这样
${{secrets.TOKEN}}
编写 workflows 配置
在项目根目录下新建 .github/workflows 目录
PS: 可以直接在 GitHub 的网页上执行这个操作,点 Add File ,文件名里输入
/即可自动识别为目录
接下来就开始编写 workflow 配置文件了,跟之前的 Gitlab CICD 配置差不多,也是 yaml 格式
这里我创建一个名为 publish-nuget.yml 的文件
# 发布新的 nuget 包
name: publish-nuget
run-name: ${{ github.actor }} is publishing a nuget package
on: [push]
jobs:
publish-nuget-packages:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup .NET
uses: actions/setup-dotnet@v3
with:
dotnet-version: 7.0.x
- name: Restore dependencies
run: dotnet restore ./src/Templates/FluentConsole.Templates.csproj
- name: Build
run: dotnet build --no-restore -c Release ./src/Templates/FluentConsole.Templates.csproj
- name: Create the package
run: dotnet pack -c Release ./src/Templates/FluentConsole.Templates.csproj
- name: Add nuget source
run: dotnet nuget add source --username DealiAxy --password ${{ secrets.TOKEN }} --store-password-in-clear-text --name github "https://nuget.pkg.github.com/Deali-Axy/index.json"
- name: Publish the package to Github Packages
run: dotnet nuget push ./src/Templates/bin/Release/*.nupkg --api-key ${{ secrets.TOKEN }} --source github --skip-duplicate
一些配置的介绍
这个文件里我配置了名为 publish-nuget-packages 的 job 用于构建 nuget 和推送到 GitHub Packages
文件开头的 on 表示这个 workflow 的触发条件,可以设置为只有 master 分支更新的时候才执行,配置如下
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
jobs.<job_id>.runs-on 参数表示要运行作业的计算机类型:
目标计算机可以是 GitHub 托管的运行器、大型运行器 或 自托管运行器。
你可以根据分配给运行器的标签、其组成员身份或两者的组合来定位运行器。
可以提供以下形式的
runs-on:- 单个字符串
- 包含字符串的单个变量
- 字符串数组、包含字符串的变量或两者的组合
- 使用
group或label键的key: value对
可以指定多个 runner ,比如
// 作业将仅在具有标签 linux、x64 和 gpu 的自托管运行器上运行
runs-on: [self-hosted, linux, x64, gpu]
本文是直接白嫖了 GitHub 托管的 runner ,就不赘述自己搭建 runner 的过程了,详情参考文档: https://docs.github.com/zh/actions/using-jobs/choosing-the-runner-for-a-job#choosing-self-hosted-runners
关于 Setup .NET 的 step,通过这个参数 uses: actions/setup-dotnet@v3 设置了运行环境,同理 GitHub 也提供了 Nodejs / Gradle 之类的其他环境,不过不在本文的讨论范围之内哈…
关于 GitHub 托管的 runner
如果使用 GitHub 托管的运行器,每个作业将在 runs-on 指定的运行器映像的新实例中运行。
可用的 GitHub 托管的运行器类型包括:
| 虚拟机 | 处理器 (CPU) | 内存 (RAM) | 存储 (SSD) | 操作系统(YAML 工作流标签) | 说明 |
|---|---|---|---|---|---|
| Linux | 2 | 7 GB | 14 GB | ubuntu-latest、ubuntu-22.04、ubuntu-20.04 |
ubuntu-latest 标签当前使用 Ubuntu 22.04 运行器映像。 |
| Windows | 2 | 7 GB | 14 GB | windows-latest、windows-2022、windows-2019 |
windows-latest 标签当前使用 Windows Server 2022 运行器映像。 |
| macOS | 3 | 14 GB | 14 GB | macos-latest、macos-12、macos-11 |
macos-latest 工作流标签目前使用 macOS 12 运行器映像。 |
| macOS | 4 | 14 GB | 14 GB | macos-13 [Beta 版] |
不可用 |
最后我想吐槽一下 nuget 的推送机制,我明明在 dotnet nuget add source 里已经制定了 token 了,push 的时候却还得再指定一次…
执行 Action
搞定之后提交代码
即可在 Action 页面看到执行结果

完美,解放双手~ 还能白嫖 Github 的 runner 算力
推送包到官方的 NuGet Gallery
本文的前半部分都是通过 GitHub Action 将 nuget 包推送到 GitHub Packages ,这样安装时需要从 Github 的源进行安装。
接下来研究一下如何推送到官方的 NuGet Gallery
创建 APIKey
地址: https://www.nuget.org/account/apikeys
可以选有效期,最长是 365 天,记得到期前更新 token ,不然所有流水线就失效了。
创建之后点击 Copy 复制,这个和 GitHub 类似,都是只会显示一次 token ,下次访问就无了,所以请保存好。
添加 GitHub Action Secret
和前面的操作是一样的
我添加了一个,名字是 NUGET_GALLERY_TOKEN
修改 workflow
修改一下 workflow 的配置
在最后增加一个 step
- name: Publish the package to Nuget Gallery
run: dotnet nuget push ./src/Templates/bin/Release/*.nupkg --api-key ${{ secrets.NUGET_GALLERY_TOKEN }} --source nuget.org --skip-duplicate
默认的 source 就是 nuget.org ,也可以不指定。
使用以下命令可以列出当前的 source 列表。
dotnet nuget list source
搞定~
参考资料
- https://docs.github.com/zh/actions/quickstart
- https://docs.github.com/zh/actions/automating-builds-and-tests/building-and-testing-net
- https://docs.github.com/zh/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions#upgrading-a-workflow-that-accesses-a-registry-using-a-personal-access-token
开发现代化的.NetCore控制台程序:(4)使用GithubAction自动构建以及发布nuget包的更多相关文章
- jenkins 整合maven,svn(配置钩子程序实现提交代码自动构建),tomcat实现热部署(windows+linux分别实现)
springboot : https://blog.csdn.net/zjh_746140129/article/details/80904876 1 准备工作: (1)运行jenkins的tomca ...
- Mac/Windows开发跨平台.NET Core 控制台程序
自从微软开始在Github上开源搞.NET Core后,.NET的跨平台逐渐就成真了.多年使用各种语言,说实话还是csharp用起来最舒服.不过现在的工作环境里使用它的机会比较少,大部分时候只是用来写 ...
- windows下建立netcore控制台程序,然后传送到centos7下的docker容器里运行
1.首先,在window下用vs2017开发netcore控制台项目. 2.把建立好的项目传送到centos7下面的容器里. docker cp sharefoldersforwindows/ 359 ...
- 【Azure DevOps系列】Azure DevOps构建并发布Nuget程序包
在Azure DevOps中,管道可以用来构建解决方案,O(∩_∩)O哈哈~快万能了,本章主要介绍如何创建Nuget包并且将其发布到Nuget服务器的过程. 前面我创建了一个非常简单的类库,这边我不做 ...
- NetCore控制台程序-使用HostService和HttpClient实现简单的定时爬虫
.NetCore承载系统 .NetCore的承载系统, 可以将长时间运行的服务承载于托管进程中, AspNetCore应用其实就是一个长时间运行的服务, 启动AspNetCore应用后, 它就会监听网 ...
- 省市县树形结构打印-.netCore控制台程序
using CityJson;using Dapper;using Newtonsoft.Json;{ using (var db = DbHelper.Db()) { //数据格式 //code_p ...
- 开发.NET Core NuGet包并实现CI/CD
实际开发中我们需要对一些公共类库进行开发,并基于Jenkins进行CI/CD(CI:持续集成,CD:持续部署),其他项目通过NuGet引用.上文讲述了如何搭建本地NuGet服务器并发布NuGet包,这 ...
- 初识Visual Studio Code 一.使用Visual Studio Code 开发C# 控制台程序
原文:初识Visual Studio Code 一.使用Visual Studio Code 开发C# 控制台程序 1. 安装.NET Core 安装包下载地址:https://www.microso ...
- VS开发】如何给console控制台程序更换应用程序图标
[VS开发]如何给console控制台程序更换应用程序图标 标签:[VS开发] 实际上非常简单,就是增加一个图标资源,在资源视图里,然后修改其ID为IDC_MAINFRAME,然后编译生成即可! 20 ...
- 使用.NetCore 控制台演示 熔断 降级(polly)
1.熔断降级的概念: 熔断:我这里有一根长度一米的钢铁,钢铁的熔点1000度(假设),现在我想用力把这根钢铁折弯,但是人的力有限达不到折弯的点,然后我使用火给钢铁加热,每隔一段时间我就会尝试一下是否能 ...
随机推荐
- 简单的python3脚本:从日志中提取信息
命名:log_extractor.py or download_stats_extractor.py # coding:utf-8 #!/usr/bin/python3 def filter_line ...
- python数据处理:获取Dataframe中的一列或一行
解决方案 df['w'] #选择表格中的'w'列,使用类字典属性,返回的是Series类型 df.w #选择表格中的'w'列,使用点属性,返回的是Series类型 df[['w']] #选择表格中的' ...
- [数据分析与可视化] Python绘制数据地图4-MovingPandas入门指北
MovingPandas是一个基于Python和GeoPandas的开源地理时空数据处理库,用于处理移动物体的轨迹数据.它提供了一组强大的工具,可以轻松地加载.分析和可视化移动物体的轨迹.通过使用Mo ...
- K8S | Config应用配置
绕不开的Config配置: 一.背景 在自动化流程中,对于一个应用来说,从开发阶段的配置管理,到制作容器镜像,再到最后通过K8S集群发布为服务,整个过程涉及到的配置非常多: 应用环境:通常是指代码层面 ...
- 痞子衡嵌入式:借助i.MXRT10xx系列INIT_VTOR功能可以缩短程序热重启时间
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是借助i.MXRT10xx系列INIT_VTOR功能可以缩短程序热重启时间. 最近痞子衡写了篇文章 <i.MXRT从Serial N ...
- xshell批量新建会话
1,xshell的会话形式就是文件夹和文件,我们只需要修改文件名称即可,但是一个个弄很麻烦,可以利用这个程序来批量新建(程序很烂,但能用) 基于python编写,文件处理 --> 文件下载 提取 ...
- JNDI注入的本地搭建和分析
JNDI注入的本地搭建和分析 JNDI概述 JNDI(The java Naming and Directory Interface,java命名和目录接口)是一组在Java应用中访问命名和目录服 ...
- WPF使用Blazor的快速案例
下面我们将讲解在WPF中使用Blazor,并且使用Blazor做一些文件编辑操作,下面是需要用到的东西 WPF Blazor Masa Blazor Monaco 安装Masa Blazor模板 使用 ...
- VINS中的重力-尺度-速度初始化(2)
VINS中的重力-尺度-速度初始化(2) 细化重力 \(\quad\)上一篇文章中得到的 \(g\) 一般是存在误差的.因为在实际应用中,当地的重力向量的模一般是已知固定大小的(所以只有两个自由度未知 ...
- [EasyExcel] 导出合并单元格
前言 使用spring boot 对excel 进行操作在平时项目中要经常使用.常见通过jxl和poi 的方式进行操作.但他们都存在一个严重的问题就是非常的耗内存.这里介绍一种 Easy Excel ...