GitHub Actions 是帮助开发者和管理者实现工作流的一种有效方式,如更改存储库中的代码和事件等。这些事件可以是 push 事件(例如编写新的 C++ 代码)、打开或改变拉取请求(以合并更新的 C++ 代码)、创建新的分支、打开或修复问题、cron 计划任务等等。

工作流的步骤使用 YAML 代码定义,并存储在目录 .github/workflows 中。

这些操作在运行程序上执行,运行程序检查可用作业,每次只执行一个作业,直至作业完成。根据设计,运行程序安装在 GitHub 虚拟环境托管的容器中,或者由管理员自行托管。

为什么要在 C++ 项目中使用 GitHub Actions?

GitHub Actions 提供了一个非常方便有效的工具,可让所有与代码相关的工作规范化和自动化,覆盖从编译 C++ 代码,到执行依赖检查、测试等等流程。通过为实施可重复、可迁移的进程,让企业对代码部署将更有自信。此外,GitHub Actions 还可以显著提高开发速度,帮助缩短测试、报告以及提前隔离问题代码的时间,消除手动 CI/CD 活动,如安全分析、启动测试等。

对于那些已经在使用其他 DevOps 工具(如 Jenkins 或 Codeship)的人来说,GitHub Actions可能与这些工具的部分功能有一些重叠。这类团队可以使用下面两种方式的任意一种,发挥 GitHub Actions 的优势:

1、迁移——许多 CI/CD 框架已经实现了类似于 GitHub Actions 的工作流,如 Codeship Steps and Services。此外,已经使用此类框架的团队,可能会发现,与 GitHub 整合的优势很多,因此,将现有流程转化为 GitHub Actions 相当值得。这些优势包括:
1)减少 CI/CD 工具的种类,整合供应商
2)节省费用
3)更好地集成到 GitOps 流程中
将测试和验证C++代码步骤左移,提高代码可靠性
2、功能—— GitHub Actions 与其他现有的工作流不一定冲突;一些团队发现,当添加功能时,例如测试新代码库或自动更新依赖项,GitHub Actions 可以更快更好地帮助实现代码。

下面,我们通过一个实例去理解 GitHub Actions 的作用。

GitHub Actions C++——结合使用,效果更佳

在本例中,我们将:

1、创建一个简单的 C++ 程序来打印“Hello,World!”
2、编写代码以支持编译程序,如配置脚本和 Makefile 文件
3、添加测试,以验证代码
4、使用 GitHub Actions 编译和测试所有 C++ 代码,这些代码为发送至主分支的推拉请求代码。

本例中的代码非常简单,但是,如果你不希望通过键入或复制本文中的代码来创建示例,你可以在 GitHub 中找到示例代码。

使用 GitHub Actions
选中 “Allow all actions” (允许所有操作) 选项:

编写代码

下面这个简单的 Hello World 程序是本示例的基础(Hello.cpp):

#include <iostream>int main()
{std::cout << "Hello, World!" << std::endl;
}

编写一个名为 configure 的配置脚本:

XX=g++          # The C++ compiler
CXXFLAGS=-g       # C++ complilation flags
NATIVE=on        # compiles code targeted to current hardware
TUNE=generic     # performance-tuning switch

以及一个 Makefile:

/all:g++ -std=c++17 hello.cpp -o helloclean:/$(RM) hello

手动测试代码:

$ ./configure && make && ./hello
g++ -std=c++17 hello.cpp -o hello
g++ -std=c++17 helloTest.cpp -lcppunit -o helloTest
Hello, World!

编写一个测试

在代码运行时,编写一个 CppUnit 测试 (helloTest.cpp):

#include <iostream>
#include <cppunit/TestRunner.h>
#include <cppunit/TestResult.h>
#include <cppunit/TestResultCollector.h>
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/BriefTestProgressListener.h>
#include <cppunit/extensions/TestFactoryRegistry.h>class Test : public CPPUNIT_NS::TestCase
{CPPUNIT_TEST_SUITE(Test);CPPUNIT_TEST(testHelloWorld);CPPUNIT_TEST_SUITE_END();public:void setUp(void) {}void tearDown(void) {}
protected:void testHelloWorld(void) {system("./hello >nul 2>nul");}
};
CPPUNIT_TEST_SUITE_REGISTRATION(Test);int main(){CPPUNIT_NS::TestResult controller;CPPUNIT_NS::TestResultCollector result;controller.addListener(&result);CPPUNIT_NS::BriefTestProgressListener progress;controller.addListener(&progress);CPPUNIT_NS::TestRunner runner;runner.addTest(CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest());runner.run(controller);return result.wasSuccessful() ? 0 : 1;
}

升级 Makefile 文件,将测试代码和规则添加到原有文件中:

all:g++ -std=c++17 hello.cpp -o hellog++ -std=c++17 helloTest.cpp -lcppunit -o helloTesttest:chmod +x hello./helloTestclean:$(RM) hello helloTest
Again, manually test the code:
$ ./configure && make && make test
g++ -std=c++17 hello.cpp -o hello
g++ -std=c++17 helloTest.cpp -lcppunit -o helloTest
chmod +x hello
./helloTest
Test::testHelloWorld : OK

编写 GitHub Actions

编写代码和测试后,接下来就应该添加 GitHub Actions 了。默认情况下,GitHub Actions 以 YAML 文件的形式存储在 .github/workflows/ 目录中,例如 .github/workflows/helloAction.yml

Name 指令配置一个字符串,该字符串将显示在 GitHub 的 Actions 对话框中。

On 指令管理 GitHub Actions 何时运行,它可以是通用的指令,也可以特定于事件(如 push),并限制在特定的分支(如 main 分支)中。

GitHub Actions 工作流由一个或多个默认并行运行的作业组成。Jobs 定义运行步骤(以下步骤)的位置,以及在该步骤中要执行的操作,例如命令、设置任务,或存储库中的其他操作。Actions 将主要使用命令,如 make 和 configure 命令,但也将从上游导入操作签出。

/name: C/C++ CIon:push:branches: [ main ]pull_request:branches: [ main ]jobs:build-and-test:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: install cppunitrun: sudo apt install -y libcppunit-dev- name: configurerun: ./configure- name: makerun: make- name: make testrun: make test

执行代码

将代码添加至代码存储库中:

$ git add hello.cpp helloTest.cpp Makefile configure .github/workflows/helloAction.yml
$ git commit -m "initial commit" -a
$ git push origin main

检查 GitHub

观察 GitHub Actions 的结果:
GitHub Actions 的界面也可以扩展,我们可以看到所有的步骤细节:

故障测试

当然,测试成功是我们的目标,但是在第一次使用一个工具时,用一个失败的案例进行测试总是更加稳妥。因此,我们修改 helloTest.cpp 代码,让测试失败:

#include <iostream>
#include <cppunit/TestRunner.h>
#include <cppunit/TestResult.h>
#include <cppunit/TestResultCollector.h>
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/BriefTestProgressListener.h>
#include <cppunit/extensions/TestFactoryRegistry.h>class Test : public CPPUNIT_NS::TestCase
{CPPUNIT_TEST_SUITE(Test);
CPPUNIT_TEST(testHelloWorld);
CPPUNIT_TEST(failHelloWorld);
CPPUNIT_TEST_SUITE_END();public:void setUp(void) {}void tearDown(void) {}protected:void testHelloWorld(void)
{system("./hello >nul 2>nul");
}void failHelloWorld(void)
{system("./hello >nul 2>nul");
}void failHelloWorld(void)
{exit(1);
}};CPPUNIT_TEST_SUITE_REGISTRATION(Test);
int main(int ac, char **av)
{CPPUNIT_NS::TestResult controller;CPPUNIT_NS::TestResultCollector result;
controller.addListener(&result);CPPUNIT_NS::BriefTestProgressListener progress;
controller.addListener(&progress);CPPUNIT_NS::TestRunner runner;
runner.addTest(CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest());
runner.run(controller);return result.wasSuccessful() ? 0 : 1;
}

提交,推送更改代码:

/$ git commit -m "test failure" helloTest.cpp && git push origin main
[main 8b39841] test failure
1 file changed, 3 insertions(+), 3 deletions(-)
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 311 bytes | 155.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To github.com:jonathanmhurley/demo.git
3828a97..8b39841  main -> main/

在 GitHub 中观察结果:

当然,我们大概率会得到一个失败的测试,在许多实际操作中,我们也会这样做。改变被测代码单元(即测试代码),让测试失败。因此,我们不用去模拟测试失败,而是直接临时对 hello.cpp 代码进行更改,让它打印其他内容,并查看测试是否能顺利捕获这个缺陷。

GitHub Actions C++ —— 结论

尽管这个示例是在 C++ 和 Make 中使用 GitHub Actions,但实际上,GitHub Actions 也适用于其他语言和项目。其他的相关用例可在 GitHub 指南中找到,例如 python 用例,Java 用例。在 AWS 云中部署代码,使用 GitHub Actions 可参考 GitHub 指南。

GitHub Actions 适用于所有人,但不一定适用于所有进程,部分进程仍需要手动处理,设置为自动触发的成本太高。通常,如果你有希望进行自动触发的进程,在建立并稳定之后,编写一个 Actions 将是最有效的。不过,在急着为所有的触发进程编写GitHub Actions 之前,请确保时间的均衡分配,有效管理这些工作与其他任务,以最高效的方式使用这个功能。但是,当你看到某个操作可以重复进行时,根据你重复进程的具体情况,考虑使用 GitHub Actions 进行自动化。

《C++编译加速指南》下载连接

C++项目 GitHub Actions操作实例相关推荐

  1. Vue项目自动部署【精简版】NuxtJS + GitHub Actions + Linux 自动部署学习(包含阿里云Linux ECS购买过程、传统部署流程、pm2、Github Actions)

    购买阿里云Linux服务器 如果已有服务器请直接跳转到[传统部署方式] 登录阿里云,访问 云服务器 ECS 购买地址:https://ecs-buy.aliyun.com/ 也可从首页导航菜单进入. ...

  2. 前端项目自动化部署——超详细教程(Jenkins、Github Actions)

    本教程主要讲解了怎么使用 Jenkins 和 Github Actions 部署前端项目. 第一部分是使用 Gitea 配置局域网 git 服务器,再使用 Jenkins 将 Gitea 下的项目部署 ...

  3. 前端教程——前端项目自动化部署(Jenkins、Github Actions)

    本教程主要讲解了怎么使用 Jenkins 和 Github Actions 部署前端项目. 第一部分是使用 Gitea 配置局域网 git 服务器,再使用 Jenkins 将 Gitea 下的项目部署 ...

  4. 前端项目自动化部署——超详细教程(Jenkins、Github Actions)(转发)

    本教程主要讲解了怎么使用 Jenkins 和 Github Actions 部署前端项目. 第一部分是使用 Gitea 配置局域网 git 服务器,再使用 Jenkins 将 Gitea 下的项目部署 ...

  5. 使用Github Actions自动部署vue项目到nginx服务器

    解决的问题:妈妈再也不担心我deploy时候手滑了 1. 避免手动执行重复的前端发布流程,节约开发时间和耐心 2. 减少了使用Jenkins类似的工具来做这种简单的发布流程,减少了第三方系统(Jenk ...

  6. ios项目传到github_使用GitHub Actions将iOS应用程序部署到TestFlight或App Store

    ios项目传到github In this tutorial, we are going to configure a GitHub repository to deploy iOS app rele ...

  7. 后盾网lavarel视频项目---lavarel多表关联一对多操作实例

    后盾网lavarel视频项目---lavarel多表关联一对多操作实例 一.总结 一句话总结: 1.一对多中多那个部分的数据前端通过json弄到服务器 2.所有通过一操作多的时候,都要用上模型中定义的 ...

  8. GitHub之GitHub Actions的项目自动化持续集成和部署

    一.基本概念 GitHub Actions 是一个由事件驱动的自动化平台,通过设置触发条件,在某些事件发生时自动运行指定的操作.换言之,GitHub Actions 不仅允许开发人员在平台上托管代码, ...

  9. android 字符串数组去重,GitHub - deng-ming-hao/ec-do: 实例为日常开发常用的小实例,包括数组去重,打乱数组,字母大小写转换,cookie操作的封装等。...

    ec-do 自己封装的常用操作实例 实例为日常开发常用的小实例,包括数组去重,打乱数组,字母大小写转换,cookie操作的封装等. 使用方法 引入ec-do.js //去除空格 ecDo.trim(' ...

最新文章

  1. 互联网人不敢生孩子:加班多、想跳槽、怕被边缘化
  2. 三角形周长最短问题_谈“最短”
  3. 1分钟了解“区块链分叉”的本质
  4. 安卓软件错误log_Android编程实现捕获程序异常退出时的错误log信息功能详解
  5. fpga arm 通讯_科学网-[转载]【电子技术】【2014】FPGA增强的数据处理系统
  6. coco训练集darknet_YOLOv4: Darknet 如何于 Docker 编译,及训练 COCO 子集
  7. Nginx 常用配置,避坑指南!
  8. python3.7怎么用ghost.py_python ghost.py使用笔记
  9. CISSP重点知识总结1
  10. GPS卫星星历与卫星历书的区别
  11. Visio对mysql怎么画er图_怎么用Visio画ER图
  12. 堆中的off-by-one :ASIS CTF 2016:b00ks
  13. android lame wav 转 mp3,Wav文件转mp3(LAME)
  14. 指数波段划分以及底部反弹行业特征统计分析
  15. 播布客的视频讲座-下载(持续更新2011-12-31)
  16. 查询商品分类id为10或11的商品对应的商品信息
  17. CAD标注:CAD软件中如何快速进行角度尺寸标注?
  18. Bill Morrow‘s Birthday Party
  19. sourceTree 完全卸载
  20. Kali Linux 2016.1 x86 x64 安装 wine QQ

热门文章

  1. java之STS使用和相关目录解说、springBoot微服务项目、前后端发送和接收参数的方式、文件图片视频上传
  2. RFID固定资产条码标签管理系统,使资产更易盘点
  3. vue-cli中配置gzip压缩
  4. 场效应管的分类及型号命名方法
  5. JZOJ-senior-3502. 【NOIP2013模拟11.4B组】方格游戏
  6. Android 之 APP上架应用宝平台
  7. 感性电路电流计算_三相交流电怎么计算电功率?
  8. 汽车FMCW毫米波雷达信号处理流程
  9. 点击开关灯效果html,js实现电灯开关效果
  10. 第1章Activity的生命周期和启动模式