起源

看到.Net群里再聊CI/CD,我就这里分享一下我目前自己一些小东西的做法,我目前在Github有一个自己私有的组织,里面存放了我的部分商业化项目,早期我采用Jenkins用Webhooks进行发布部署,

Jenkins我用起来太大。很多功能用不到而且还吃我服务器占用(ps:主要是高性能服务器太贵),抱着解决问题和节约成本的思路我发现了Github Actions。

官方说明:在 GitHub Actions 的仓库中自动化、自定义和执行软件开发工作流程。 您可以发现、创建和共享操作以执行您喜欢的任何作业(包括 CI/CD),并将操作合并到完全自定义的工作流程中。

官方教程地址:https://docs.github.com/cn/actions

喝水不忘打井人感谢:AlanGrady

正题

首先你要学习此教程你需要下面准备:

  1. 你要有一台能上外网的Linux服务器,并且安装了docker.
  2. 你要有一个Github仓库(正儿八经的项目请一定要私有)
  3. 阿里云镜像服务(https://cr.console.aliyun.com/us-west-1/instance/repositories)
  4. 本次教程使用的项目是我Abp vNext的入门系列大家可以fork一个跟着教程练习(https://github.com/BaseCoreVueProject/ABPvNext.Blog.Core)

阿里云配置

  • 首先我们区阿里云创建一个容器仓库,这里要注意选择的地区是美国,别选国内因为会出现连接超时。

  • 创建好之后注意下面2个位置的连接一会有用

配置参数

打开Github你fork的仓库地址(去自己的仓库下),创建配置参数(不要担心Secrets会被别人知道这是绝对安全的)

DOCKER_REPOSITORY: 镜像仓库地址,也就是上一个步骤复制到的公网地址

DOCKER_USERNAME:登录阿里云的账号

DOCKER_PASSWORD: 登录阿里云的密码

HOST:部署项目的服务器ip

HOST_PORT:服务器ssh端口号(默认是22)

HOST_USERNAME:服务器登录用户名

HOST_PASSWORD: 登录服务器的密码

DockerFile

在目录ABPvNext.Blog.Core\aspnet-core下面的Dockerfile文件,这里我采用的是本地编译上传镜像,你也可以用传统的那种

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base

WORKDIR /app
EXPOSE 80
EXPOSE 443
COPY . .
ENTRYPOINT ["dotnet", "ShunHang.Mrt.HttpApi.Host.dll"]

创建工作流

在github仓库面板,点击创建工作流

下面内容中有一个配置registry.us-west-1.aliyuncs.com这个是我们在阿里云创建的镜像地区有关,如果你和我不一样注意替换掉。整体脚本总结就分为2部分,一部分是将代码编译打包成镜像并上传,一部分通过ssh连接服务器pull镜像并删除旧的启动新的。


name: Docker Image Core CI/CD on:
push:
branches: [main] # 在main分支有push操作的时候自动部署
env:
IMAGE_NAME: ${{ secrets.DOCKER_REPOSITORY }} # 镜像名称
IMAGE_NAME_TAG: ${{ secrets.DOCKER_REPOSITORY }}:v${{ github.run_id }}.${{ github.run_number }} # 镜像名称:TAG名称(这里我很想实现自动1.1.1,1.1.2这种奈何我不会) jobs:
build-net-core: # 打包上传镜像
runs-on: ubuntu-latest # 依赖的环境
steps:
- uses: actions/checkout@v2
- name: Build .Net Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: 5.0.x
- name: dotnet restore
run: dotnet restore ./aspnet-core/src/Bcvp.Blog.Core.HttpApi.Host/Bcvp.Blog.Core.HttpApi.Host.csproj
- name: dotnet publish # 编译项目
run: dotnet publish ./aspnet-core/src/Bcvp.Blog.Core.HttpApi.Host/Bcvp.Blog.Core.HttpApi.Host.csproj --configuration -c Release --no-restore -o ./aspnet-core/app
- name: Docker Image
run: ls
- name: Copy DockerFile
run: cp ./aspnet-core/Dockerfile ./aspnet-core/app
- name: Login to registry
uses: docker/login-action@v1
with: # 登录阿里云镜像服务器
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
registry: registry.us-west-1.aliyuncs.com
- name: Build Image # 打包docker镜像
run: docker build -t ${{ env.IMAGE_NAME_TAG }} ./aspnet-core/app
- name: Push Image # 推送镜像
run: docker push ${{ env.IMAGE_NAME_TAG }} pull-docker: # docker部署
needs: [build-net-core]
name: Pull Docker
runs-on: ubuntu-latest
steps:
- name: Deploy
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }} # 服务器ip
username: ${{ secrets.HOST_USERNAME }} # 服务器登录用户名
password: ${{ secrets.HOST_PASSWORD }} # 服务器登录密码
port: ${{ secrets.HOST_PORT }} # 服务器ssh端口
script: |
docker stop $(docker ps -a | grep ${{ env.IMAGE_NAME }} | awk '{print $1}')
docker rm -f $(docker ps -a | grep ${{ env.IMAGE_NAME }} | awk '{print $1}')
docker rmi -f $(docker images | grep ${{ env.IMAGE_NAME }} | awk '{print $3}')
docker login --username=${{ secrets.DOCKER_USERNAME }} --password ${{ secrets.DOCKER_PASSWORD }} registry.cn-hangzhou.aliyuncs.com
docker pull ${{ env.IMAGE_NAME_TAG }}
docker run -d -p 8080:80 ${{ env.IMAGE_NAME_TAG }}

后面只要有代码push倒main分支都会自动触发该流程,进行自动部署,我们可以在Actions中查看我们的记录,如果出错了也是非常容易排查。

效果

结语

开发过程中一定要学会看日志,自己排查错误,我在上面教程中故意留了一个坑给各位,欢迎大佬评论补坑哈哈哈哈。

学习更多使用技巧请参阅官方文档教程,最后还是感谢AlanGrady的指导。

欢迎各位读者关注我的博客,下周开始我会每1-2周更新一篇vNext的源码解析文章。

技术番外篇丨Github Action CI/CD的更多相关文章

  1. 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  2. iOS冰与火之歌(番外篇) - 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权

    iOS冰与火之歌(番外篇) 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权 蒸米@阿里移动安全 0x00 序 这段时间最火的漏洞当属阿联酋的人权活动人士被apt攻击所使用 ...

  3. VT 入门番外篇——初识 VT

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  4. 番外篇 之 C#委托

    对于上一节 番外篇之C#多线程的反思 反思一:   Thread th = new Thread(参数); ////参数的总结 ////首先,第一情况,对于 Thread th = new Threa ...

  5. [置顶] think in java interview番外篇-谈程序员如何修练英语

    一.程序员对英语能力的重视度和能力要求应该是在各行各业中排在比较靠前的 这样说吧,英语程度的好坏直接影响着一个程序员的编程.开发.创新能力. 道理很简单: 1. 计算机和软件是用英语创造出来的 2. ...

  6. 知识图谱实战开发案例剖析-番外篇(1)- Neo4j是否支持按照边权重加粗和大数量展示

    一.前言 本文是<知识图谱实战开发案例完全剖析>系列文章和网易云视频课程的番外篇,主要记录学员在知识图谱等相关内容的学习 过程中,提出的共性问题进行展开讨论.该部分内容原始内容记录在网易云 ...

  7. C++雾中风景番外篇:理解C++的复杂声明与声明解析

    在学习C系列语言的过程之中,理解C/C++的复杂声明一直是初学者很困扰的问题.笔者初学之时也深受困扰,对很多规则死记硬背.后续在阅读<C专家编程>之后,尝试在编译器的角度来理解C/C++的 ...

  8. Java微信公众平台开发--番外篇,对GlobalConstants文件的补充

    转自:http://www.cuiyongzhi.com/post/63.html 之前发过一个[微信开发]系列性的文章,也引来了不少朋友观看和点评交流,可能我在写文章时有所疏忽,对部分文件给出的不是 ...

  9. 番外篇!全球首个微信应用号开发教程!小程序 DEMO 视频奉上!

    大家好,我是博卡君.经过国庆节的七天假期,相信很多朋友都已经研究出自己的小程序 demo 了吧?我最近也利用休息时间关注了一下网上关于小程序开发的讨论,今天就利用这个番外篇谈谈自己对小程序的一些想法吧 ...

随机推荐

  1. 浅谈Java和Go的程序退出

    前言 今天在开发中对Java程序的退出产生了困惑,因为题主之前写过一段时间Go,这两者的程序退出逻辑是不同的,下面首先给出结论,再通过简单的例子来介绍. 对于Java程序,Main线程退出,如果当前存 ...

  2. React事件处理、收集表单数据、高阶函数

    3.React事件处理.收集表单数据.高阶函数 3.1事件处理 class Demo extends React.Component { /* 1. 通过onXxx属性指定事件处理函数(注意大小写) ...

  3. cmd(命令行)超好用的技巧,很不错的打开方式

    超快速打开管理cmd widows + x 按a 直接打开文件位置,在地址栏输入cmd 地址----直接cmd打开到所在文件位置 ex:cmd D:\work cd ../../../ 返回上几层的方 ...

  4. zap高性能日志

    摘要 日志在整个工程实践中的重要性不言而喻,在选择日志组件的时候也有多方面的考量.详细.正确和及时的反馈是必不可少的,但是整个性能表现是否也是必要考虑的点呢?在长期的实践中发现有的日志组件对于计算资源 ...

  5. java基础之ThreadLocal

    早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序.Thr ...

  6. Linux内核编译配置脚本

    环境 宿主机平台:Ubuntu 16.04.6 目标机:iMX6ULL Linux内核编译配置脚本 在linux开发过程中熟练使用脚本可以大大简化命令行操作,同时对于需要经常重复操作的指令也是一种备忘 ...

  7. Appium问题解决方案(3)- java.lang.IllegalStateException: UiAutomation not connected!

    背景 连着手机,运行脚本,一段时间之后就报错了,看了Appium-server,发现报了这样一个错误 如何解决呢? 步骤一 通过 adb devices ,确定设备是否已连接上 步骤二(最终解决方案) ...

  8. Winform EF CodeFist方式连接数据库

    直接生成ado.net 实体数据模型挺方便的,但只有一步步的手写代码才能更好的理解EF,在学习asp.net core过程中手写代码已经明白了怎么回事,但实现过程有些麻烦不知道如何记录,但Winfor ...

  9. 利用GetInvalidFileNameChars()得到有效的文件名

    public static string GetValidName(string fileName) {     foreach (char c in System.IO.Path.GetInvali ...

  10. 理解MySQL回表

    回表就是先通过数据库索引扫描出数据所在的行,再通过行主键id取出索引中未提供的数据,即基于非主键索引的查询需要多扫描一棵索引树. 因此,可以通过索引先查询出id字段,再通过主键id字段,查询行中的字段 ...