使用 GitHub Actions 实现项目的持续集成(CI)

目录

什么是 GitHub Actions

基础概念

Workflow 文件

Workflow 语法

实例:编译 OpenWrt


什么是 GitHub Actions

  • GitHub Actions 是 GitHub 推出的持续集成(Continuous Integration,简称 CI)服务
  • 它允许你创建自定义工作流,你可以使用这些工作流来自动化开发过程
  • 它提供了整套虚拟服务器环境,基于它可以进行构建、测试、打包、部署项目等等操作
  • 每个 GitHub 仓库都可以配置一个或多个工作流程,通过.github/workflows目录中的 YAML 文件定义
  • 简单来讲就是将软件开发中的一些流程交给云服务器自动化处理,比方说开发者把代码 push 到 GitHub 后它会自动测试、编译、发布
  • 有了持续集成服务开发者就可以专心于写代码,其它乱七八糟的事情就不用管了,这样可以大大提高开发效率
  • 持续集成(CI/CD)主要有三个: 持续集成、持续交付、持续部署
  • 我们一般的软件开发流程是:
  • 1-开发人员本地代码 commit,push
  • 2-通过 git hook 触发自动化测试
  • 3-测试通过后,合并发布分支
  • 4-通过 git hook 触发自动部署服务
  • 这里简单的描述了软件开发周期,当然实际上会更加复杂
  • CI/CD是由很多操作组成的,比如执行自动化测试、分支合并、服务部署等,而 GitHub 把这一系列的操作都称为 Actions
  • 当然 GitHub 创新点还不仅于此,不同的项目可能都会使用到相类似的 Action,GitHub 允许开发者把 action 写成独立的脚本文件,存放到代码仓库,使得其他开发者可以引用
  • GitHub 提供了一个官方市场:GitHub Action Market
  • GitHub Actions · GitHub
  • 在这里可以搜索到你想要的任何 actions,直接引用别人造好的轮子

基础概念

  • Workflows(工作流):持续集成一次运行的过程,可以添加到存储库中的自动化过程
  • 工作流由一个或多个作业组成,可以由事件调度或触发
  • Event(事件):触发工作流的特定动作;例如,向存储库提交 pr 或 pull 请求
  • Jobs(作业):在同一跑步器上执行的一组步骤;默认情况下,具有多个作业的工作流将并行运行这些作业
  • Steps(步骤):可以在作业中运行命令的单个任务;步骤可以是操作,也可以是 shell 命令
  • 作业中的每个步骤都在同一个运行程序上执行,从而允许该作业中的操作彼此共享数据
  • Actions(操作):操作是独立的命令,它们被组合成创建作业的步骤
  • 操作是工作流中最小的可移植构建块
  • 你可以创建自己的动作,或者使用 GitHub 社区创建的动作
  • 每个 step 可以依次执行一个或多个命令(action)
  • Runners(运行器):安装了 GitHub Actions 运行器应用程序的服务器
  • Github 托管的运行器基于 Ubuntu Linux、Microsoft Windows 和 macOS,工作流中的每个作业都在一个新的虚拟环境中运行

Workflow 文件

  • GitHub Ac­tions 的配置文件叫做 work­flow 文件(官方中文翻译为 “工作流程文件”)
  • 存放在代码仓库的.github/workflows目录中
  • work­flow 文件采用 YAML 格式,文件名可以任意取,但是后缀名统一为.yml或.yaml,比如icpctj.yml
  • 一个库可以有多个 work­flow 文件,GitHub 只要发现.github/workflows目录里面有.yml或.yaml文件,就会按照文件中所指定的触发条件在符合条件时自动运行该文件中的工作流程
  • 在 Ac­tions 页面可以看到很多种语言的 work­flow 文件的模版,可以用于简单的构建与测试
  • 下面是一个简单的 work­flow 文件示例:
  • 示例文件运行截图:

Workflow 语法

  • name
  • workflow的名称,GitHub在仓库的操作页面上显示workflow的名称
  • on
  • 触发 workflow 的 GitHub 事件的名称
  • 比如示例中的触发事件(使用单个事件)是 push,即在代码 push 到仓库后被触发
  • on 字段也可以是事件的数组,多种事件触发(使用多个事件),比如在 push 或 pull-request 时触发:
  • 某些事件具有活动类型,可让你更好地控制工作流的运行时间
  • 使用 on.<event.name>.types 定义将触发工作流运行的事件活动类型(使用活动类型)
  • 例如,issue-comment 事件具有 created、edited 和 deleted 活动类型
  • 如果工作流在 label 事件上触发,则每当创建、编辑或删除标签时,它都会运行
  • 如果为 created 事件指定 label 活动类型,则工作流将在创建标签时运行,但不会在编辑或删除标签时运行
  • 如果指定多个活动类型,则只需要发生其中一种事件活动类型就可触发工作流
  • 如果触发工作流的多个事件活动类型同时发生,则将触发多个工作流运行
  • 例如,创建或标记问题时,会触发以下工作流
  • 如果创建了一个带两个标签的问题,则将启动三个工作流运行:一个用于创建问题的事件,另外两个用于两个标记问题的事件
  • 某些事件具有筛选器,可让你更好地控制工作流的运行时间(使用筛选器)
  • 例如,push 事件具有 branches 筛选器,该筛选器仅在发生目标为与 branches 筛选器匹配的分支的推送时(而不是在发生任何推送时)运行工作流
  • (将活动类型和筛选器用于多个事件)
  • 如果为事件指定活动类型或筛选器,并且针对多个事件指定工作流触发器,则必须单独配置每个事件
  • 必须为所有事件附加冒号 (:),包括没有配置的事件
  • 例如,具有以下 on 值的工作流将在以下情况下运行:
  • 1-创建标签
  • 2-推送到存储库中的 main 分支
  • 3-推送到启用了 GitHub Pages 的分支
  • 完整的事件列表,请查看官方文档
  • 下面是一些比较常见的事件:
  • Jobs
  • 作业,workflow 主要执行的核心任务
  • 表示要执行的一项或多项任务
  • 每一项任务必须关联一个 ID (job.id),比如示例中的 my.first.job 和 my.second.job
  • jobs.<job.id>
  • job.id 里面的 name 字段是任务的名称
  • jobs.<job.id>.name
  • job.id 不能有空格,只能使用数字、英文字母和 - 符号,而 name 可以随意,若忽略 name 字段,则默认会设置为 job.id
  • job.id 里面的 needs 表示识别在此作业运行之前必须成功完成的任何作业
  • jobs.<job.id>.needs
  • 当有多个任务时,可以指定任务的依赖关系,即运行顺序,否则是同时运行
  • 上面代码中,job1 必须先于 job2 完成,而 job3 等待 job1 和 job2 的完成才能运行
  • 因此,这个 work­flow 的运行顺序依次为:job1、job2、job3
  • runs-on
  • runs-on 字段指定任务运行所需要的虚拟服务器环境,是必填字段
  • jobs.<job.id>.runs-on
  • 机器可以是 GitHub 托管的运行器或自托管的运行器
  • steps
  • steps 字段指定每个任务的运行步骤,可以包含一个或多个步骤
  • jobs.<job.id>.steps
  • 步骤可以是运行命令、运行设置任务,或者运行仓库中的操作和 Dcoker 镜像发布等
  • 步骤开头使用 - 符号表示
  • 每个步骤可以指定以下字段:
  • 1-jobs.<job.id>.steps[*].id
  • 步骤的唯一标识符
  • 可以使用 id 在上下文中引用该步骤
  • 2-jobs.<job.id>.steps[*].if
  • 可以使用 if 条件来阻止步骤运行,除非满足条件
  • 您可以使用任何支持上下文和表达式来创建条件
  • 3-jobs.<job.id>.steps[*].name
  • 步骤显示在 GitHub 上的名称
  • 4-jobs.<job.id>.steps[*].uses
  • 选择要作为作业中步骤的一部分运行的操作
  • 操作是一种可重复使用的代码单位
  • 可以使用在与工作流、公共存储库或已发布的 Docker 容器映像相同的存储库中定义的操作
  • 5-jobs.<job.id>.steps[*].run
  • 使用操作系统的 shell 运行不超过 21,000 个字符的命令行程序
  • 如果不提供 name,步骤名称将默认为 run 命令中指定的文本
  • 6-jobs.<job.id>.steps[*].working-directory
  • 使用 working-directory 关键字,你可以指定运行命令的工作目录位置
  • 7-jobs.<job.id>.steps[*].shell
  • 可以使用 shell 关键字,覆盖运行器操作系统中的默认 Shell 设置,以及作业的默认值
  • 8-jobs.<job.id>.steps[*].with
  • 由操作定义的输入参数的 map
  • 每个输入参数都是一个键/值对
  • 输入参数被设置为环境变量
  • 该变量的前缀为 INPUT_,并转换为大写
  • 为 Docker 容器定义的输入参数必须使用 args
  • 示例:
  • 定义由 hello_world 操作定义的三个输入参数(first_name、middle_name 和 last_name)
  • 这些输入变量将作为 INPUT_FIRST_NAME、INPUT_MIDDLE_NAME 和 INPUT_LAST_NAME 环境变量,由 hello-world 操作访问
  • 9-jobs.<job.id>.steps[*].env
  • 设置供步骤在运行器环境中使用的变量
  • 也可以设置用于整个工作流或某个作业的变量
  • 10-下面是一些常见的字段:
  • 其中 uses 和 run 是必填字段,每个步骤只能有其一
  • 同样名称也是可以忽略的
  • action
  • action 是 GitHub Ac­tions 中的重要组成部分,这点从名称中就可以看出,actions 是 action 的复数形式
  • 它是已经编写好的步骤脚本,存放在 GitHub 仓库中
  • 对于初学者来说可以直接引用其它开发者已经写好的 action
  • 可以在官方 action 仓库或者 GitHub Marketplace 去获取
  • 此外 Awesome Actions 这个项目收集了很多非常不错的 action
  • 既然 action 是代码仓库,当然就有版本的概念
  • 引用某个具体版本的 action:
  • 一般来说 action 的开发者会说明建议使用的版本

实例:编译 OpenWrt

  • 既然是编译 Open­Wrt 那么 work­flow 的名称就叫 Build OpenWrt
  • 触发事件我选择了 push
  • 个人常用的 Open­Wrt 编译环境使用的是 Ubuntu 18.04,所以任务所使用的虚拟环境也一样
  • 我并不确定系统中是否有编译所需要依赖,所以第一个步骤是安装依赖软件包
  • 由于我使用的是一个空仓库,所以第二个步骤使用 Git 去拉取 Open­Wrt 官方源码
  • TIPS:如果是有源码的仓库,可以引用 actions/checkout 这个官方 ac­tion 把源码签出到工作目录中
  • 工作目录也就是在 Ac­tions 中执行命令的根目录,其绝对路径为/home/runner/work/REPO_NAME/REPO_NAME,环境变量为$GITHUB_WORKSPACE
  • 然后还需要拉取 feeds,它是扩展软件包源码,所以需要单独拉取
  • 既然都是拉取源码,所以就都放在一起吧
  • 由于这只是尝试,所以第三个步骤就让它生成一个默认的配置文件
  • 由于每个步骤都会回退到工作目录,所以前面还需要加一条进入 buildroot 的命令
  • 第四个步骤是下载第三方软件包(俗称 dl 库)
  • 最后为了防止下载不完整导致编译失败,加了显示不完整文件和删除不完整文件的命令
  • 第五个步骤进入到最重要的开始编译环节
  • 同样是先进入 buildroot,为了能更快的编译,我自信的选择了多线程编译且不显示详细日志
  • 最后编译出的二进制文件如何取出来呢?
  • 官方有个 ac­tion 叫 upload-artifact,它可以将虚拟环境中的指定文件打包上传到 Ac­tions 页面
  • 为了方便我选择了上传整个 bin 目录,文件名为 OpenWrt
  • 最后展示一下完整 work­flow 文件:
  • 最后 push 到仓库运行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/316284.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot 自定义 HandlerMethodArgumentResolver 搞定xml泛型参数解析

文章目录 介绍一、解析简单 xml 数据案例引入 Jackson 的 xml 支持定义 Message 对象&MessageHeader 对象定义 Controller 方法调用结果 二、解析带泛型的 XML 数据案例2.1 直接给 Message 加上泛型 T2.2 无法直接解析泛型参数了 三、自定义 MVC 的参数解析器实现泛型参数解…

全志ARM-蜂鸣器

sh操作准备&#xff1a; 1.使Tab键的缩进和批量对齐为4格 在/etc/vim/vimrc 中添加一项配置 set tabstop 4; 也可以再加一行 set nu显示代码的行数 vim的设置&#xff0c;修改/etc/vim/vimrc文件&#xff0c;需要用超级用户权限 /etc/vim/vimrc set shiftwidth4 设置批量…

助力企业部署国产云原生数据库 XSKY星辰天合与云猿生完成产品互兼容认证

近日&#xff0c;北京星辰天合科技股份有限公司&#xff08;简称&#xff1a;XSKY 星辰天合&#xff09;与杭州云猿生数据有限公司&#xff08;简称“云猿生”&#xff09;完成了产品互兼容认证&#xff0c;星辰天合企业级分布式统一数据平台 XEDP 与云猿生的开源数据库管控平台…

CJSON工具类

4.4.3.CJSON工具类 OpenResty提供了一个cjson的模块用来处理JSON的序列化和反序列化。 官方地址&#xff1a; https://github.com/openresty/lua-cjson/ 1&#xff09;引入cjson模块&#xff1a; local cjson require "cjson"2&#xff09;序列化&#xff1a; …

竞赛 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉

文章目录 0 简介1 二维码检测2 算法实现流程3 特征提取4 特征分类5 后处理6 代码实现5 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器学习的二维码识别检测 - opencv 二维码 识别检测 机器视觉 该项目较为新颖&#xff0c;适合作为竞赛课…

网络层 --- IP协议

目录 1. 前置性认识 2. IP协议 3. IP协议头格式 3.1. 4位版本 3.2. 4位首部长度 3.3. 8位服务类型 3.4. 16位总长度 3.5. 8位生存时间 TTL 3.6. 8位协议 3.7. 16位首部检验和 3.8. 32位源IP和32位目的IP 4. 分片问题 4.1. 为什么要分片 4.2. 分片是什么 4.2.1. …

HTTP/1.1,HTTP/2.0和HTTP/3.0 各版本协议的详解(2024-04-24)

1、HTTP介绍 HTTP 协议有多个版本&#xff0c;目前广泛使用的是 HTTP/1.1 和 HTTP/2&#xff0c;以及正在逐步推广的 HTTP/3。 HTTP/1.1&#xff1a;支持持久连接&#xff0c;允许多个请求/响应通过同一个 TCP 连接传输&#xff0c;减少了建立和关闭连接的消耗。 HTTP/2&#…

win10 配置OpenCV LNK2019 无法解析的外部符号 “void __cdecl cv::imshow

1 遇到问题 严重性 代码 说明 项目 文件 行 禁止显示状态 详细信息 错误 LNK2019 无法解析的外部符号 “void __cdecl cv::imshow(class std::basic_string<char,struct std::char_traits,class std::allocator > const &,class cv::debug_build_guard::_InputArray…

MS17-010---利用“永恒之蓝”漏洞攻击 win7主机

免责声明:本文仅做技术交流与学习.... 目录 一.前置知识 1.何为永恒之蓝&#xff1f; 2.什么是SMB协议&#xff1f; 3.SMB工作原理是什么&#xff1f; 二、实验环境 三、实验步骤 nmap扫描 msf一把梭哈 shell执行命令 远程连接 一&#xff0e; 二&#xff0e; 一.前…

面向对象编程三大特征:封装、继承、多态

封装、继承、多态 1. 封装 1.1 介绍 封装(encapsulation)就是把抽象出的数据 [属性] 和对数据的操作 [方法] 封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作 [方法] ,才能对数据进行操作。 1.2 封装的理解和好处 1) 隐藏实现细节:方法(连接数据库)<…

用OpenCV先去除边框线,以提升OCR准确率

在OpenCV的魔力下&#xff0c;我们如魔法师般巧妙地抹去表格的边框线&#xff0c;让文字如诗如画地跃然纸上。 首先&#xff0c;我们挥动魔杖&#xff0c;将五彩斑斓的图像转化为单一的灰度世界&#xff0c;如同将一幅绚丽的油画化为水墨画&#xff0c;通过cv2.cvtColor()函数的…

通过AI助手实现一个nas定时任务更新阿里云域名解析

一.通过AI助手实现一个ip-domain.py的脚本 起一个Python脚本&#xff0c;ip-domain.py&#xff1b;注意已安装Python3.的运行环境&#xff1b;将下面阿里云相关配置添加&#xff0c;注意这里引用了两个包&#xff0c;requests和alibabacloud_alidns20150109&#xff1b;执行前…

如何利用有限的数据发表更多的SCI论文?——利用ArcGIS探究环境和生态因子对水体、土壤和大气污染物的影响

原文链接&#xff1a;如何利用有限的数据发表更多的SCI论文&#xff1f;——利用ArcGIS探究环境和生态因子对水体、土壤和大气污染物的影响https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247602528&idx6&snc89e862270fe54239aa4f796af07fb71&chksmfa82…

数据可视化在不同行业中有哪些应用?

数据可视化即通过图表的形式将数据的内在信息有逻辑性地呈现给用户&#xff0c;使用户更容易发现数据中蕴藏的规律&#xff0c;找出问题&#xff0c;进而做出决策&#xff1b;另一方面&#xff0c;数据可视化项目也是一张重要的名片&#xff0c;是企业数字化建设效果的呈现。本…

Spring基于AspectJ实现验签切点

文章目录 引言I AspectJ 依赖II 验签切点2.1 匹配方法执行的连接点2.2 设置带有CustomAnnotation注解的方法为切点III 案例:验签2.1 用法2.2 定义注解2.3 定义切面和切点引言 需求:验签 实现:基于AspectJ实现验签切点 I AspectJ 依赖 AspectJ 是一个基于 Java 语言的 AOP …

《HelloGitHub》第 97 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、…

分布式存储 Ceph 的演进经验

从 2004 年到今天&#xff0c;Ceph 的存储后端一直都在演变&#xff0c;从最开始基于 B 树的 EBOFS 演变到今天的 BlueStore&#xff0c;存储后端已经变得非常成熟&#xff0c;新的存储系统不仅能够提供良好的性能&#xff0c;还有着优异的兼容性。我们在这篇文章中将要简单介绍…

服务器数据恢复—Storwize V3700存储数据恢复案例

服务器存储数据恢复环境&#xff1a; 某品牌Storwize V3700存储&#xff0c;10块硬盘组建了2组Mdisk加入到一个存储池中&#xff0c;一共创建了1个通用卷来存放数据&#xff0c;主要数据为oracle数据库。 服务器存储故障&#xff1a; 其中一组Mdisk中两块磁盘出现故障离线&…

使用selenium时出现element click intercepted报错的解决办法

win10&#xff0c;python3.8.10。 selenium版本如下&#xff08;用pip38 show selenium查看&#xff09;&#xff1a; 在定位中&#xff0c;定位了一个按钮&#xff08;特点&#xff1a;button下还有span然后才是文本&#xff09;&#xff0c;代码如下&#xff1a; from sele…

枚举(enum)/共用体(union)/结构体(struct)---详解

前言 C语言包含内置类型和自定义类型。 其实C语言中有内置类型&#xff0c;包含&#xff1a;char,short,int,long,long long,float,double,long double ,这些是C语言本身支持的现成的类型。 但仅仅只有内置类型是远远不够的&#xff0c;在描述一个复杂对象是无法使用内置类型来…