action的形容词 action


action的形容词 action

文章插图
自 2019 年 Github 推出了自家的 CI 工具 Github Action 后,我们就在考虑将 CI 从 Travis-CI 迁移到 Github,以降低维护和沟通的成本,并借助于 GitHub Action Marketplace 实现更强的功能 。
? 作者:Bestony ?
(本文字数:4497,阅读时长大约:6 分钟)
LCTT 的 CI 已经在 Travis CI 上运转了多年,一致保持着良好的使用体验 。自 2019 年 Github 推出了自家的 CI 工具 Github Action 后,我们就在考虑将 CI 从 Travis-CI 迁移到 Github,以降低维护和沟通的成本,并借助于 GitHub Action Marketplace 实现更强的功能 。
action的形容词 action

文章插图
项目首页


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

文章插图
Travis CI 的提醒


项目介绍Translate Project 是 LCTT 翻译组的主要协作项目,几百位译者通过 GitHub 进行围绕开源、Linux、软件工程等领域的文章翻译,从 2013 年来,累计了大量的提交,致使项目下有非常多的文件 。
Translate Project 借助于 CI 帮助译者对基本的文章格式和拉取请求进行检查;并定时执行命令,以进行所有的申请检查,对于超时未完成翻译的工作进行回收;对于文章的状态进行标记,生成相应的徽章 。
action的形容词 action

文章插图
生成徽章


迁移思路Travis CI 和 Github Action 在使用方面,其实总体差异不会太大,都是基于 YAML 文件格式来编写配置文件 。不过,和 Travis CI 不同的是,Github Action 支持多个不同的配置文件,因此,你可以根据不同的场景,设定不同的配置文件,降低单个配置的文件的复杂度 。
此外,由于我们的脚本中依赖了一些 Travis CI 的环境变量,也需要将其替换为 Github Action 中的相应环境变量,从而确保脚本可以运转 。
改造实践1. 分析之前的 CI 流程
我们在 TravisCI 上的 CI 配置文件如图:
action的形容词 action

文章插图
配置文件


总体可以分为三块:
  1. 命令区:说明了安装阶段和执行阶段的操作有哪些
  2. 条件区:指定了这个配置文件在哪些条件下会生效
  3. 部署区:写明了构建产物如何进行部署
在命令区中,有预置的安装过程和后续的执行过程 。在安装过程中,安装了一些依赖,并将当前的 pages 资源克隆到本地,以继承上一次构建生成的资料 。
在条件区则指明了仅作用于 master 分支 。
在部署区便是将前面命令区的执行结果进行部署 。
action的形容词 action

文章插图
基本流程


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

文章插图
构建流程


2. 直接套用配置文件
在完成了基本的分析后,就可以建立新的 Action 配置文件了 。由于基本的语法很类似,对于其中的不少内容可以进行直接套用 。
比如,我们的配置文件在直接套用后,结果如下
action的形容词 action

文章插图
直接套用后的结果


直接套用的文件已经可以直接运行,不过,这里有很多不满足需要的地方,所以需要做一些修改 。
3. 恢复 Travis CI 的环境变量
由于我们使用的 Badge 等生成脚本并非我所编写,所以在这一次的迁移中,并不打算对齐进行调整,以避免出现故障 。而脚本中依赖了一些变量,需要将其重新设置出来 。
Github Action 提供了一些方法,可以让你手动设置环境变量 。你可以在你的构建的步骤中,加入如下代码,从而在构建环境中设定 TRAVIS_BRANCH 和 TRAVIS_EVENT_TYPE 环境变量,确保你可以使用这个环境变量 。
- name: Set ENV variablesrun: |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" == "${{ github.event_name }}" ]; then echo "cron"; else echo "${{ github.event_name }}"; fi)"

秒懂生活扩展阅读