# LCTT 从Travis CI迁移到 GitHub Action 实践

- Link: https://www.ixiqin.com/2021/01/16/lctt-from-travis-ci-migration-to-making-the-action-into-practice/
- Published: 2021-01-16T14:30:03+08:00
- Author: 白宦成

文章目录

 [Toggle](https://www.ixiqin.com/2021/01/16/lctt-from-travis-ci-migration-to-making-the-action-into-practice/#)

 * [项目介绍](https://www.ixiqin.com/2021/01/16/lctt-from-travis-ci-migration-to-making-the-action-into-practice/#%e9%a1%b9%e7%9b%ae%e4%bb%8b%e7%bb%8d)
 * [迁移思路](https://www.ixiqin.com/2021/01/16/lctt-from-travis-ci-migration-to-making-the-action-into-practice/#%e8%bf%81%e7%a7%bb%e6%80%9d%e8%b7%af)
 * [改造实践](https://www.ixiqin.com/2021/01/16/lctt-from-travis-ci-migration-to-making-the-action-into-practice/#%e6%94%b9%e9%80%a0%e5%ae%9e%e8%b7%b5)
    - [1. 分析之前的 CI 流程](https://www.ixiqin.com/2021/01/16/lctt-from-travis-ci-migration-to-making-the-action-into-practice/#1_%e5%88%86%e6%9e%90%e4%b9%8b%e5%89%8d%e7%9a%84_ci_%e6%b5%81%e7%a8%8b)
    - [2. 直译配置文件](https://www.ixiqin.com/2021/01/16/lctt-from-travis-ci-migration-to-making-the-action-into-practice/#2_%e7%9b%b4%e8%af%91%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6)
    - [3. 恢复 Travis CI 的环境变量](https://www.ixiqin.com/2021/01/16/lctt-from-travis-ci-migration-to-making-the-action-into-practice/#3_%e6%81%a2%e5%a4%8d_travis_ci_%e7%9a%84%e7%8e%af%e5%a2%83%e5%8f%98%e9%87%8f)
    - [4. 拆分配置文件](https://www.ixiqin.com/2021/01/16/lctt-from-travis-ci-migration-to-making-the-action-into-practice/#4_%e6%8b%86%e5%88%86%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6)
    - [5. 测试 CI 的运行情况](https://www.ixiqin.com/2021/01/16/lctt-from-travis-ci-migration-to-making-the-action-into-practice/#5_%e6%b5%8b%e8%af%95_ci_%e7%9a%84%e8%bf%90%e8%a1%8c%e6%83%85%e5%86%b5)
 * [6. 移除 Travis-CI](https://www.ixiqin.com/2021/01/16/lctt-from-travis-ci-migration-to-making-the-action-into-practice/#6_%e7%a7%bb%e9%99%a4_travis-ci)
 * [7. 修改 GitHub 的 Branch 保护条件](https://www.ixiqin.com/2021/01/16/lctt-from-travis-ci-migration-to-making-the-action-into-practice/#7_%e4%bf%ae%e6%94%b9_github_%e7%9a%84_branch_%e4%bf%9d%e6%8a%a4%e6%9d%a1%e4%bb%b6)
 * [一些注意事项](https://www.ixiqin.com/2021/01/16/lctt-from-travis-ci-migration-to-making-the-action-into-practice/#%e4%b8%80%e4%ba%9b%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a1%b9)
    - [1. 环境变量不同](https://www.ixiqin.com/2021/01/16/lctt-from-travis-ci-migration-to-making-the-action-into-practice/#1_%e7%8e%af%e5%a2%83%e5%8f%98%e9%87%8f%e4%b8%8d%e5%90%8c)
    - [2. Action 运行依赖要注意安全](https://www.ixiqin.com/2021/01/16/lctt-from-travis-ci-migration-to-making-the-action-into-practice/#2_action_%e8%bf%90%e8%a1%8c%e4%be%9d%e8%b5%96%e8%a6%81%e6%b3%a8%e6%84%8f%e5%ae%89%e5%85%a8)
 * [总结](https://www.ixiqin.com/2021/01/16/lctt-from-travis-ci-migration-to-making-the-action-into-practice/#%e6%80%bb%e7%bb%93)
 * [参考阅读](https://www.ixiqin.com/2021/01/16/lctt-from-travis-ci-migration-to-making-the-action-into-practice/#%e5%8f%82%e8%80%83%e9%98%85%e8%af%bb)

LCTT 的 CI 已经在 Travis CI 上运转了多年，一致保持着良好的使用体验。自 2019 年 Github
推出了自家的 CI 工具 Github Action 后，我们就在考虑将 CI 从 Travis-CI 迁移到 Github，
以降低维护和沟通的成本，并借助于 GitHub Action Marketplace 实现更强的功能。

![项目首页](https://postimg.aliavv.com/mbp2021/ecyy4.jpg)

项目首页

最近，因为 TravisCI 屡屡部署出错，而我们的账户因为使用的较多，已经超出了免费使用
的限制，以此为契机，将 CI 从 Travis CI 迁移到 GitHub Action。

![Travis CI 的提醒](https://postimg.aliavv.com/mbp2021/mbeo3.png)

Travis CI 的提醒

## **项目介绍**

Translate Project 是 LCTT 翻译组的主要协作项目，几百位译者通过 GitHub 进行围绕开
源、Linux、软件工程等领域的文章翻译，从 2013 年来，累计了大量的 Commit，致使项目
下有非常多的文件。

Transalte Project 借助于 CI 帮助译者进行基本的文章格式进行检查；并定时执行命令，
以进行所有的文章检查，对于超时未完成翻译的工作进行回收；对于文章的状态进行标记，
生成相应的 Badge。

![生成 badge](https://postimg.aliavv.com/mbp2021/8hftd.png)

生成 badge

## **迁移思路**

Travis CI 和 Github Action 在使用方面，其实总体差异不会太大，都是基于 YAML 文件格式
来编写配置文件。不过，和 Travis CI 不同的是，Github Action 支持多个不同的配置文件，
因此，你可以根据不同的场景，设定不同的配置文件，降低单个配置的文件的复杂度。

此外，由于我们的脚本中依赖了一些 Travis CI 的环境变量，也需要将其替换为 Github Action
中的相应环境变量，从而确保脚本可以运转。

## **改造实践**

### **1. 分析之前的 CI 流程**

我们在 TravisCI 上的 CI 配置文件如图

![配置文件](https://postimg.aliavv.com/mbp2021/fojiv.png)

配置文件

总体可以分为三块：

 1. 命令区：说明了安装阶段和执行阶段的操作有哪些
 2. 条件区：指定了这个配置文件在哪些条件下会生效
 3. 部署区：写明了构建产物如何进行部署

在命令区中，有预置的安装过程和后续的执行过程。在安装过程中，安装了一些依赖，并将
当前的 pages 资源克隆到本地，以继承上一次构建生成的资料。

在条件区则指明了仅作用于 master 分支

在部署区便是将前面命令区的执行结果进行部署。

![基本流程](http://static.zybuluo.com/xiqingongzi/hug57qw228oajdp3an19utup/image.
png)

基本流程

在实际的执行过程中，还会根据环境变量不同，决定是否要执行特定的命令，这部分在后续
的改造过程中，就可以调整部署，拆分到不同的文件中。

![构建流程](http://static.zybuluo.com/xiqingongzi/0xi7a2xnel709joi1pbgihyj/image.
png)

构建流程

### **2. 直译配置文件**

在完成了基本的分析后，就可以建立新的 Action 配置文件了。由于基本的语法很类似，对于
其中的不少内容可以进行直译。

比如，我们的配置文件在直译后，结果如下

![直译后的结果](http://static.zybuluo.com/xiqingongzi/hll4swfd5io5kh4meddq2t5u/image.
png)

直译后的结果

直译的文件已经可以直接运行，不过，这里有很多不满足需要的地方，所以需要做一些修改。

### **3. 恢复 Travis CI 的环境变量**

由于我们使用的 Badge 等生成脚本并非我所编写，所以在这一次的迁移中，并不打算对齐进行
调整，以避免出现故障。而脚本中依赖了一些变量，需要将其重新设置出来。

Github Action 提供了一些方法，可以让你手动设置环境变量。你可以在你的构建的 step 
中，加入如下代码，从而在构建环境中设定 TRAVIS_BRANCH 和 TRAVIS_EVENT_TYPE 环境变量，
确保你可以使用这个环境变量。

    ```javascript
     - <strong>name</strong>: Set ENV variables
            run: |
              echo "::set-env name=TRAVIS_BRANCH::${TRAVIS_BRANCH:-$(echo $GITHUB_REF | awk 'BEGIN { FS = "/" } ; { print $3 }')}"
              echo "::set-env name=TRAVIS_EVENT_TYPE::$(if [ "schedule" == "$" ]; then echo "cron"; else echo "$"; fi)"

    Code language: JavaScript (javascript)
    ```

此外，由于 set-env 这个方法相对比较危险，你还需要在环境变量中，开启危险函数的执行。

    ```javascript
    jobs:
      build:
        runs-on: ubuntu-latest
        env:
          ACTIONS_ALLOW_UNSECURE_COMMANDS: true

    Code language: JavaScript (javascript)
    ```

### **4. 拆分配置文件**

Github Action 和 TravisCI 不同的一点是你可以将你的 CI文件拆分成多个文件，从而降低
每一个单独的配置文件的复杂度。

根据前面对于流程的分析，可以将我们的 CI 流程拆分成三个部分：

 1. 生成 badge 文件，应当跟随每一次 commit 进行
 2. 生成 status 文件，执行时间较长，可以定期执行
 3. 根据 Pull Request 内容进行整理，做核验

则将我们的配置文件拆分成三个不同的文件

![](https://postimg.aliavv.com/mbp2021/pxywy.png)

也得益于拆分开，则在 checker 中就可以免于安装一些必要的依赖，从而精简 CI 流程，提升
CI 的执行时间。

### **5. 测试 CI 的运行情况**

在完成了配置文件的编写和拆分后，就可以进行本地的执行测试。Github Action 写完了，
难免要执行一下，确保整个流程是正常的。

这个时候你可以安装工具（https://github.com/nektos/act），来在本地执行 action ，从而
确认你的代码执行是正确的。

![](https://postimg.aliavv.com/mbp2021/bkpl8.jpg)

如果你是 macOS ，只需要执行 `brew install act` 就可以安装 act 工具，来完成 act 的
安装。

安装完成 act ，就可以通过执行 act 命令来在本地执行 action ，比如，执行 `act pull_request`
来触发 GitHub 的 Pull Request 事件

![](https://postimg.aliavv.com/mbp2021/mt4ca.png)

通过本地测试后，再将你的配置文件推送到 GitHub 上，进行生产环境的测试即可。

## **6. 移除 Travis-CI**

通过上述的一些步骤，我们完成了从 Travis CI 到 GitHub Action 的迁移，此时，就可以
移除项目根目录中的 `.travis.yml` 文件，彻底关闭 travis-ci。

## **7. 修改 GitHub 的 Branch 保护条件**

为了确保修改符合标准，我们限制了新的 Pull Request 必须通过 CI 检查，才能合并进入
master，因此，也需要修改相应的分支保护规则，确保设定相应的保护。

![](https://postimg.aliavv.com/mbp2021/b5cwa.png)

## **一些注意事项**

### **1. 环境变量不同**

如果你依赖了环境变量，则需要进行相应的修改。或者可以像我一样，先通过 set-env 来让
本地拥有临时的环境变量，后续再逐步进行迁移。

### **2. Action 运行依赖要注意安全**

Action 执行过程中会有两个部分。action 本身流程依赖于 master，但执行过程中调用的脚本
是根据 source 决定的，因此，从安全角度来看，你应当尽可能将所有的流程放在 Action 
中，而不是放在你的源码目录中。

## **总结**

通过对 TravisCI 的流程整理、代码修改等流程，我们将之前的 Travis-CI 迁移至速度更快、
性能更好的 GitHub Action ，一方面可以优化我们的工作流，另一方面，也让我们的代码更加
简洁明了。

对于还在使用 Travis CI 的项目来说，也可以考虑迁移到 GitHub Action 中，来优化自己
的工作流。

## **参考阅读**

 * https://mauricius.dev/run-and-debug-github-actions-locally/
 * https://jeffrafter.com/working-with-github-actions/
 * https://developer.okta.com/blog/2020/05/18/travis-ci-to-github-actions
