使用 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.mfbz.cn/a/584460.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【webrtc】MessageHandler 3: 基于线程的消息处理:以sctp测试为例

消息处理可以用于模拟发包处理G:\CDN\rtcCli\m98\src\net\dcsctp\socket\dcsctp_socket_network_test.cc 这个实现中,onMessage还是仅对了一种消息进行处理,就是接收则模式下,打印带宽。当然,可能程序有多个消息,分别在不同的onmessage中执行?SctpActor:以一个恒定的速率…

【webrtc】MessageHandler 1: 基于线程的消息处理:以10毫秒处理音频为例

基于m98 G:\CDN\rtcCli\m98\src\audio\null_audio_poller.h分发的消息由MessageHandler 类通过其抽象接口OnMessage 实现处理 NullAudioPoller NullAudioPoller 是一个处理audio的消息的分发器 poll 启动:

Adobe Firefly 3.0 AI 图像生成器来了

Adobe 发布其 Midjourney 和 Dall-E 3 竞争对手Firefly 2.0已经半年了。几天前&#xff0c;他们发布了Firefly 3.0&#xff08;目前处于测试阶段&#xff09;&#xff0c;这是他们最新的文本到图像人工智能工具&#xff0c;其中包含一些非常酷的更新。在我们深入了解细节之前&a…

开发一个语音聊天社交app小程序H5需要多少钱?

社交&#xff0c;即时通讯APP系统。如何开发一个社交App||开发一个即时通信应用是一项复杂而充满挑战的任务&#xff0c;需要考虑多个技术、开发时间和功能方面的因素。以下是一个概要&#xff0c;描述了从技术、开发时间和功能角度如何开发这样的应用&#xff1a; 1. 技术要点…

Docker-compose的介绍与用法

Docker-compose Docker Compose 是一个开源的容器编排工具&#xff0c;由 Docker 官方开发。它允许开发者定义一个或多个 Docker 容器作为单个服务&#xff0c;并将这些服务组合成一个项目。这些定义被保存在一个 YAML 文件中&#xff0c;称为 docker-compose.yml。 使用 Dock…

低代码技术在构建质量管理系统中的应用与优势

引言 在当今快节奏的商业环境中&#xff0c;高效的质量管理系统对于组织的成功至关重要。质量管理系统帮助组织确保产品或服务符合客户的期望、符合法规标准&#xff0c;并持续改进以满足不断变化的需求。与此同时&#xff0c;随着技术的不断进步&#xff0c;低代码技术作为一…

Qt下使用7Z源码进行压缩和解压缩

7Z压缩是一款常用的压缩算法和工具&#xff0c;本文主要介绍一款在qt环境下进行编译的压缩方法。 本人测试是可以正常跑通的&#xff0c;具体代码部分请下载&#xff1a;下载链接&#xff0c;提取码&#xff1a;ev9t 7z源码网址&#xff1a;7-Zip 7z简介&#xff1a; 7z 是…

一文带你了解5款高效率软件,建议收藏

​ 人类与99%的动物之间最大差别在于是否会运用工具&#xff0c;借助好的工具&#xff0c;能提升几倍的工作效率。 1. 高速文件复制——TeraCopy ​ TeraCopy是一款高效的文件复制工具&#xff0c;可以大幅度提高文件复制和移动的速度。它支持多线程复制、错误恢复、校验和等…

2024-04学习笔记

1.sql优化-子查询改为外连接 1.改之前 改之前是这样&#xff0c;那针对查出来的每一条数据&#xff0c;都要执行一次箭头所指的函数 执行的sql很慢 2.改之后 改之后是这样&#xff0c;整体做外连接&#xff0c;不用每一条都再执行一次查询 执行时间缩短了好几倍 2.Mybatis中…

maven修改默认编码格式为UTF-8

执行mvn -version查看maven版本信息发现&#xff0c;maven使用的编码格式为GBK。 为什么想到要修改编码格式呢&#xff1f;因为idea中我将文件格式统一设置为UTF-8&#xff08;如果不知道如何修改文件编码&#xff0c;可以参考文末&#xff09;&#xff0c;然后使用maven打包时…

ubuntu22 部署fastDFS单节点和集群,整合Spring Boot(刚部署成功)

ubuntu22 部署fastDFS单节点和集群 一、先准备1、所需依赖安装2、下载安装包 二、安装FastDFS单节点1、libfastcommon安装1.1、创建软连接 2、安装fastDFS2.1、fastDFS目录简单介绍2.2、创建软连接 3、配置和启动Tracker服务3.1、修改Tracker配置文件3.2、启动Tracker 4、配置和…

字节码插桩 -- 入门篇

背景 我们先了解下什么情况下会用到字节码插桩。学技术并不是为了秀技术&#xff0c;而是为了解决业务问题。 我们先想象一个业务场景— 我们需要统计耗时方法&#xff0c;这时&#xff0c;我们会怎么做&#xff1f; 在每个方法开头和结尾处分别记录开始时间与结束时间&…

学生管理系统[Python语言]

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 学生管理系统是计算机专业最基础的一个作业&#…

高扬程水泵,提升水源新选择!— 恒峰智慧科技

在炎炎夏日&#xff0c;阳光炙烤着大地&#xff0c;森林火灾的发生频率也随之上升。火势猛烈&#xff0c;烟雾弥漫&#xff0c;给森林带来了极大的破坏。为了保护森林资源&#xff0c;我们必须采取有效的措施来扑灭火灾。而在这其中&#xff0c;高扬程水泵成为了提升水源新选择…

智慧旅游驱动行业革新:智能技术引领服务全面升级,匠心打造高品质、个性化旅游新体验

一、引言 随着科技的飞速发展和信息化程度的不断提高&#xff0c;智慧旅游正逐渐成为旅游业发展的新趋势。智慧旅游&#xff0c;顾名思义&#xff0c;是以智能化技术为支撑&#xff0c;通过大数据、云计算、物联网、人工智能等先进技术的应用&#xff0c;实现旅游服务的全面升…

Java项目:基于SSM框架实现的实践项目管理系统(ssm+B/S架构+源码+数据库+毕业论文+开题报告)

一、项目简介 本项目是一套基于SSM框架实现的实践项目管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff…

BIMBase浏览器新功能——碰撞检测

BIMBase浏览器&#xff08;原BIMBase建模软件 Lite&#xff09;全新R1.14版本已经全面上线&#xff0c;新版本下载链接&#xff1a;BIMBase浏览器R1.14。本次给大家介绍一下本次版本的重点功能&#xff1a;碰撞检测。 各位设计院/施工单位/运维单位的伙伴们在模型交付、方案讨论…

第三节课,功能2:开发后端用户的管理接口5min(用户的查询/状态更改)【4】【9开始--本人】

一、代码任务 【录个屏】 二、写代码 2.1 代码文件位置 2.2 代码如下&#xff1a; 2.3 官方文档&#xff1a; 网址&#xff1a; 逻辑删除 | MyBatis-Plus (baomidou.com) 三、代码有bug&#xff0c;没有鉴权&#xff0c;表里添加一个字段。role 管理员 3.1 判断操作的人&am…

【开发工具】pythontutor——在线内存可视化工具

笔者在学习RISC-V时&#xff0c;希望找到一款可视化的内存工具&#xff0c;遗憾目前还未找到。发现了pythontutor这个网站&#xff0c;可以对C、python等多种语言进行内存可视化。结果似乎是x86架构的&#xff0c;符合小端存储。 贴一下网址&#xff0c;原准备依据开源版本进行…

什么是MOM?为什么它是趋势

制造运营管理&#xff08;MOM&#xff09; 制造运营管理&#xff08;MOM&#xff09;旨在优化制造流程的效率和有效性。它涵盖制造执行、质量管理、生产计划和调度以及制造智能等功能。这种解决方案以全面的方式管理和增强制造流程。 MOM的功能特点 对于MOM的功能特点来说&…