|
|
|
@ -1,6 +1,6 @@
|
|
|
|
|
# 用 Github Actions 进行持续集成
|
|
|
|
|
# 用 GitHub Actions 进行持续集成
|
|
|
|
|
|
|
|
|
|
[Github Actions](https://github.com/features/actions) 是官方于 2018 年推出的持续集成服务,它非常强大,本文将手把手带领大家学习如何使用 `Github Actions` 对 Rust 项目进行持续集成。
|
|
|
|
|
[GitHub Actions](https://github.com/features/actions) 是官方于 2018 年推出的持续集成服务,它非常强大,本文将手把手带领大家学习如何使用 `GitHub Actions` 对 Rust 项目进行持续集成。
|
|
|
|
|
|
|
|
|
|
持续集成是软件开发中异常重要的一环,大家应该都听说过 `Jenkins`,它就是一个拥有悠久历史的持续集成工具。简单来说,持续集成会定期拉取同一个项目中所有成员的相关代码,对其进行自动化构建。
|
|
|
|
|
|
|
|
|
@ -8,11 +8,11 @@
|
|
|
|
|
|
|
|
|
|
在有了持续集成后,只要编写好相应的编译、测试、发布配置文件,那持续集成平台会自动帮助我们完成整个相关的流程,期间无需任何人介入,高效且可靠。
|
|
|
|
|
|
|
|
|
|
## Github Actions
|
|
|
|
|
## GitHub Actions
|
|
|
|
|
|
|
|
|
|
而本文的主角正是这样的持续集成平台,它由 Github 官方提供,并且跟 github 进行了深度的整合,其中 `actions` 代表了代码拉取、测试运行、登陆远程服务器、发布到第三方服务等操作行为。
|
|
|
|
|
而本文的主角正是这样的持续集成平台,它由 GitHub 官方提供,并且跟 GitHub 进行了深度的整合,其中 `actions` 代表了代码拉取、测试运行、登陆远程服务器、发布到第三方服务等操作行为。
|
|
|
|
|
|
|
|
|
|
最妙的是 Github 发现这些 `actions` 其实在很多项目中都是类似的,意味着 `actions` 完全可以被多个项目共享使用,而不是每个项目都从零开发自己的 `actions`。
|
|
|
|
|
最妙的是 GitHub 发现这些 `actions` 其实在很多项目中都是类似的,意味着 `actions` 完全可以被多个项目共享使用,而不是每个项目都从零开发自己的 `actions`。
|
|
|
|
|
|
|
|
|
|
若你需要某个 `action`,不必自己写复杂的脚本,直接引用他人写好的 `action` 即可,整个持续集成过程,就变成了多个 `action` 的组合,这就是` GitHub Actions` 最厉害的地方。
|
|
|
|
|
|
|
|
|
@ -20,8 +20,8 @@
|
|
|
|
|
|
|
|
|
|
既然 `action` 这么强大,我们就可以将自己的 `action` 分享给他人,也可以引用他人分享的 `action`,有以下几种方式:
|
|
|
|
|
|
|
|
|
|
1. 将你的 `action` 放在 github 上的公共仓库中,这样其它开发者就可以引用,例如 [github-profile-summary-cards](https://github.com/vn7n24fzkq/github-profile-summary-cards) 就提供了相应的 `action`,可以生成 github 用户统计信息,然后嵌入到你的个人主页中,具体效果[见这里](https://github.com/sunface)
|
|
|
|
|
2. Github 提供了一个[官方市场](https://github.com/marketplace?type=actions),里面收集了许多质量不错的 `actions`,并支持在线搜索
|
|
|
|
|
1. 将你的 `action` 放在 GitHub 上的公共仓库中,这样其它开发者就可以引用,例如 [github-profile-summary-cards](https://github.com/vn7n24fzkq/github-profile-summary-cards) 就提供了相应的 `action`,可以生成 GitHub 用户统计信息,然后嵌入到你的个人主页中,具体效果[见这里](https://github.com/sunface)
|
|
|
|
|
2. GitHub 提供了一个[官方市场](https://github.com/marketplace?type=actions),里面收集了许多质量不错的 `actions`,并支持在线搜索
|
|
|
|
|
3. [awesome-actions](https://github.com/sdras/awesome-actions),由三方开发者收集并整理的 actions
|
|
|
|
|
4. [starter workflows](https://github.com/actions/starter-workflows),由官方提供的工作流( workflow )模版
|
|
|
|
|
|
|
|
|
@ -39,18 +39,18 @@ actions/setup-node@f099707 # 指向一个 commit
|
|
|
|
|
|
|
|
|
|
## Actions 基础
|
|
|
|
|
|
|
|
|
|
在了解了何为 Github Actions 后,再来通过一个基本的例子来学习下它的基本概念,注意,由于篇幅有限,我们只会讲解最常用的部分,如果想要完整的学习,请移步[这里](https://docs.github.com/en/actions)。
|
|
|
|
|
在了解了何为 GitHub Actions 后,再来通过一个基本的例子来学习下它的基本概念,注意,由于篇幅有限,我们只会讲解最常用的部分,如果想要完整的学习,请移步[这里](https://docs.github.com/en/actions)。
|
|
|
|
|
|
|
|
|
|
#### 创建 action demo
|
|
|
|
|
|
|
|
|
|
首先,为了演示,我们需要创建一个公开的 github 仓库 `rust-action`,然后在仓库主页的导航栏中点击 `Actions` ,你会看到如下页面 :
|
|
|
|
|
首先,为了演示,我们需要创建一个公开的 GitHub 仓库 `rust-action`,然后在仓库主页的导航栏中点击 `Actions` ,你会看到如下页面 :
|
|
|
|
|
|
|
|
|
|
<img src="https://pic1.zhimg.com/80/v2-4bb58f042c7a285219910bfd3c259464_1440w.jpg" />
|
|
|
|
|
|
|
|
|
|
接着点击 `set up a workflow yourself ->` ,你将看到系统为你自动创建的一个工作流 workflow ,在 `rust-action/.github/workflows/main.yml` 文件中包含以下内容:
|
|
|
|
|
|
|
|
|
|
```yml
|
|
|
|
|
# 下面是一个基础的工作流,你可以基于它来编写自己的 Github Actions
|
|
|
|
|
# 下面是一个基础的工作流,你可以基于它来编写自己的 GitHub Actions
|
|
|
|
|
name: CI
|
|
|
|
|
|
|
|
|
|
# 控制工作流何时运行
|
|
|
|
@ -113,23 +113,23 @@ jobs:
|
|
|
|
|
|
|
|
|
|
<img src="https://pic1.zhimg.com/80/v2-94b46f23b5d63de35eae7f0425bb99b7_1440w.jpg" />
|
|
|
|
|
|
|
|
|
|
至此,我们已经初步掌握 `Github Actions` 的用法,现在来看看一些基本的概念。
|
|
|
|
|
至此,我们已经初步掌握 `GitHub Actions` 的用法,现在来看看一些基本的概念。
|
|
|
|
|
|
|
|
|
|
#### 基本概念
|
|
|
|
|
|
|
|
|
|
- **Github Actions**,每个项目都拥有一个 `Actions` ,可以包含多个工作流
|
|
|
|
|
- **GitHub Actions**,每个项目都拥有一个 `Actions` ,可以包含多个工作流
|
|
|
|
|
- **workflow 工作流**,描述了一次持续集成的过程
|
|
|
|
|
- **job 作业**,一个工作流可以包含多个作业,因为一次持续集成本身就由多个不同的部分组成
|
|
|
|
|
- **step 步骤**,每个作业由多个步骤组成,按照顺序一步一步完成
|
|
|
|
|
- **action 动作**,每个步骤可以包含多个动作,例如上例中的 `Run a multi-line script` 步骤就包含了两个动作
|
|
|
|
|
|
|
|
|
|
可以看出,每一个概念都是相互包含的关系,前者包含了后者,层层相扣,正因为这些精心设计的对象才有了强大的 `Github Actions`。
|
|
|
|
|
可以看出,每一个概念都是相互包含的关系,前者包含了后者,层层相扣,正因为这些精心设计的对象才有了强大的 `GitHub Actions`。
|
|
|
|
|
|
|
|
|
|
#### on
|
|
|
|
|
|
|
|
|
|
`on` 可以设定事件用于触发工作流的运行:
|
|
|
|
|
|
|
|
|
|
1. 一个或多个 Github 事件,例如 `push` 一个 `commit`、创建一个 `issue`、提交一次 `pr` 等等,详细的事件列表参见[这里](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows)
|
|
|
|
|
1. 一个或多个 GitHub 事件,例如 `push` 一个 `commit`、创建一个 `issue`、提交一次 `pr` 等等,详细的事件列表参见[这里](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows)
|
|
|
|
|
|
|
|
|
|
2. 预定的时间,例如每天零点零分触发,详情见[这里](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule)
|
|
|
|
|
|
|
|
|
@ -138,7 +138,7 @@ on:
|
|
|
|
|
schedule: -cron:'0 0 * * *'
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
3. 外部事件触发,例如你可以通过 `REST API` 向 Github 发送请求去触发,具体请查阅[官方文档](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#repository_dispatch)
|
|
|
|
|
3. 外部事件触发,例如你可以通过 `REST API` 向 GitHub 发送请求去触发,具体请查阅[官方文档](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#repository_dispatch)
|
|
|
|
|
|
|
|
|
|
#### jobs
|
|
|
|
|
|
|
|
|
@ -159,9 +159,9 @@ jobs:
|
|
|
|
|
|
|
|
|
|
#### runs-on
|
|
|
|
|
|
|
|
|
|
指定作业的运行环境,运行器 `runner` 分为两种:`GitHub-hosted runner` 和 `self-hosted runner`,后者是使用自己的机器来运行作业,但是需要 Github 能进行访问并给予相应的机器权限,感兴趣的同学可以看看[这里](https://docs.github.com/en/actions/using-jobs/choosing-the-runner-for-a-job#choosing-self-hosted-runners)。
|
|
|
|
|
指定作业的运行环境,运行器 `runner` 分为两种:`GitHub-hosted runner` 和 `self-hosted runner`,后者是使用自己的机器来运行作业,但是需要 GitHub 能进行访问并给予相应的机器权限,感兴趣的同学可以看看[这里](https://docs.github.com/en/actions/using-jobs/choosing-the-runner-for-a-job#choosing-self-hosted-runners)。
|
|
|
|
|
|
|
|
|
|
而对于前者,Github 提供了以下的运行环境:
|
|
|
|
|
而对于前者,GitHub 提供了以下的运行环境:
|
|
|
|
|
|
|
|
|
|
<img src="https://pic2.zhimg.com/80/v2-614999565cc513715aaf156c2e478991_1440w.jpg" />
|
|
|
|
|
|
|
|
|
@ -221,18 +221,18 @@ jobs:
|
|
|
|
|
|
|
|
|
|
如果有多个 `env` 存在,会使用就近那个。
|
|
|
|
|
|
|
|
|
|
至此,`Github Actions` 的常用内容大家已经基本了解,下面来看一个实用的示例。
|
|
|
|
|
至此,`GitHub Actions` 的常用内容大家已经基本了解,下面来看一个实用的示例。
|
|
|
|
|
|
|
|
|
|
## 真实示例:生成 Github 统计卡片
|
|
|
|
|
## 真实示例:生成 GitHub 统计卡片
|
|
|
|
|
|
|
|
|
|
相信大家看过不少用户都定制了自己的个性化 Github 首页,这个是通过在个人名下创建一个同名的仓库来实现的,该仓库中的 `Readme.md` 的内容会自动展示在你的个人首页中,例如 `Sunface` 的[个人首页](https://github.com/sunface) 和内容所在的[仓库](https://github.com/sunface/sunface)。
|
|
|
|
|
相信大家看过不少用户都定制了自己的个性化 GitHub 首页,这个是通过在个人名下创建一个同名的仓库来实现的,该仓库中的 `Readme.md` 的内容会自动展示在你的个人首页中,例如 `Sunface` 的[个人首页](https://github.com/sunface) 和内容所在的[仓库](https://github.com/sunface/sunface)。
|
|
|
|
|
|
|
|
|
|
大家可能会好奇上面链接中的 Github 统计卡片如何生成,其实有两种办法:
|
|
|
|
|
大家可能会好奇上面链接中的 GitHub 统计卡片如何生成,其实有两种办法:
|
|
|
|
|
|
|
|
|
|
- 使用 [github-readme-stats](https://github.com/anuraghazra/github-readme-stats)
|
|
|
|
|
- 使用 `Github Actions` 来引用其它人提供的 `action` 生成对应的卡片,再嵌入进来, `Sunface` 的个人首页就是这么做的
|
|
|
|
|
- 使用 `GitHub Actions` 来引用其它人提供的 `action` 生成对应的卡片,再嵌入进来, `Sunface` 的个人首页就是这么做的
|
|
|
|
|
|
|
|
|
|
第一种的优点就是非常简单,缺点是样式不太容易统一,不能对齐对于强迫症来说实在难受 :( 而后者的优点是规规整整的卡片,缺点就是使用起来更加复杂,而我们正好借此来看看真实的 `Github Actions` 长什么样。
|
|
|
|
|
第一种的优点就是非常简单,缺点是样式不太容易统一,不能对齐对于强迫症来说实在难受 :( 而后者的优点是规规整整的卡片,缺点就是使用起来更加复杂,而我们正好借此来看看真实的 `GitHub Actions` 长什么样。
|
|
|
|
|
|
|
|
|
|
首先,在你的同名项目下创建 `.github/workflows/profile-summary-cards.yml` 文件,然后填入以下内容:
|
|
|
|
|
|
|
|
|
|