GitHub Actions 初体验及踩坑记录

1348 字
7 分钟
GitHub Actions 初体验及踩坑记录
GitHub Actions 初体验及踩坑记录

上周摸鱼摸到 GitHub Actions,听说今年 11 月就要正式向大众开放了,试了下蛮好玩的,但局限性和坑点也非常多

Head Pic: #アークナイツ frost - am1m的插画 - pixiv


官方介绍说,GitHub Actions 可以自动化和定制化项目的 Workflow,相当于官方钦定的 CI,目前仍处于 beta 阶段,想使用必须去手动点个按钮申请,听说 11 月会正式开放给全员

实际折腾了几天,给我的感受是,得益于 GitHub 这个平台,再加上你的创(xiao)造(nao)力(gua),Actions 能做到的事情确实很多,但有很多问题十分影响使用体验,后面会一一列出

使用前可以搜索一下已有的介绍文章、阅读官方文档来大致了解,真正使用的话我们主要阅读 Workflow syntax 和 Contexts and expression syntax 文档就行了

你可以在 GitHub Marketplace 浏览寻找其他人开发的 actions,同时我推荐看看 sdras/awesome-actions 这个仓库,它收录了许多 GitHub Actions 相关的内容,并且对官方和他人开发的 actions 的功能做了分类与简略说明,方便你快速找到自己需要的 actions

用例与简单说明#

与 Travis CI 相似,GitHub Actions 也使用 YAML 作为配置文件的格式,放在.github/workflows文件夹下

这是一个简单的示例,作用是当我更新 vue 项目文件时自动构建 dist 并发布到 GitHub Pages,然后推送到我的 Coding Pages 所在的远程仓库

下面我简单描述一下 GitHub Actions 中常用的语法,使你可以大概了解它能做什么

  • on规定什么时候触发 workflow
    • 可以由push,pull_request,release等事件触发
      • 例如release这种事件可以定义具体类型
      • push,pull_request可以规定涉及具体分支branches、标签tags、路径path时触发
        • 路径可以用包含(path)或忽略(paths-ignore)两种模式,支持通配符,包含模式下可以用!声明例外目录
    • 可以由schedule定时触发,使用 cron 表达式
  • jobs是 workflow 的组成部分,每个 job 是在不同的容器内并行运行的,之间无法直接相互干涉
    • needs可以声明一个工作依赖另一个或多个 job,当这些 job 被完成后才会开始执行
    • runs-on系统环境,目前支持以下几个(以后估计会慢慢加)
      1. Windows Server 2019: windows-latest
      2. Ubuntu 18.04: ubuntu-latest or ubuntu-18.04
      3. Ubuntu 16.04: ubuntu-16.04
      4. macOS X Catalina 10.15: macos-latest
    • env定义环境变量,作用域为整个 job
    • if规定当满足某些条件时才执行这个 job
    • steps是 job 的组成部分,step 是顺序执行的
      1. env定义环境变量,作用域为当前 step,且你对环境变量的任何更改都不会带到其它 step 或者 job 中
      2. if规定当满足某些条件时才执行这个 step,并且可以使用状态检查函数,根据上一个 step 的状态决定是否运行
      3. uses声明使用其它 action 作为你的 step,也就是使用其他人写好的 action
      4. with为 uses 的 action 传入参数,具体看你使用的 action 的说明
      5. run运行命令,支持多行,具体看文档
      6. shell定义 run 所使用的 shell,具体看文档
      7. continue-on-error即使有错误也继续往下运行 step
      8. timeout-minutes规定该 step 的超时时间
    • timeout-minutes规定该 job 的超时时间
    • strategy定义一些矩阵供 job 使用,详细看文档
    • container容器具体信息,不规定时所有 step 将直接在runs-on规定的环境上运行,详细看文档
    • services声明使用哪些服务,例如nginx或redis等

Tips#

  1. 涉密内容应使用 secrets(如何使用请阅读 Contexts and expression syntax),在项目 settings 中可以设置,此时 workflow 的日志中所有与 secrets 一致的内容都会用***替换;基于这一特性,若你想隐藏日志中会出现的某些词句,即使它们不需要被当做涉密变量在 workflow 中使用,你也可以将它们设置成 secrets
  2. 可以使用 actions/cache 来缓存一些可以重复利用的文件,例如 node_modules,可以节省时间减少网络开销等
  3. 当你觉得他人开发的 action 与你的需求相当贴合但就是差了那么一丢丢时,你可以 fork 并自行修改,然后直接用自己改过的 action

坑#

  1. 只有push,pull_request事件触发的 workflow 可以使用 actions/cache,详见 issue#64
  2. 在if内无法访问 secrets 上下文
  3. 在if内无法访问同级env
    • 例如job.<job_id>.step.if只能访问job.<job_id>.env中定义的环境变量,而不能访问job.<job_id>.step.env中定义的环境变量
  4. 综合 2 和 3,2 的变通解决方式是在上级env中声明一个环境变量来使用 secrets 的值,并且由于 3 的限制,你只能在 step 上这么操作
  5. 由于env的本质是字符串,因此在if中使用env时请注意数据类型
    • 例如在 job 中声明环境变量test: ${{ true }},在 step 的 if 中使用时,条件应当用env.test == 'true',而不是env.test == true
  6. workflow 中产生的事件无法直接触发另一个 workflow 的运行,详见 About workflow events
    • 例如 A 是定时运行,会往项目 push 代码,B 会在 push 事件发生时触发,则 A 的运行无法触发 B

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

GitHub Actions 初体验及踩坑记录
https://moe.best/posts/github-actions-experience/
作者
神代綺凛
发布于
2019-11-14
许可协议
CC BY-NC-SA 4.0
相关文章智能推荐
1
GitHub Actions 踩坑之——自己造!
教程最近闲着研究了下怎么做一个 Action,并且研究了下组合式 Action,挺好玩,但是坑还挺多的
2
每日自动将你的网站备份到Github 告别数据丢失
杂七杂八的最近听到许多数据丢失的惨况,有人提议为何不用 Github 去备份网站?而且这样还能看到每次 commit 的更改情况,随时任意回档。一拍大腿,亲自试验,做出成品,写下文章,一气呵成(
3
[UoocOnline] 优课在线辅助
个人项目通过模拟正常视频观看进度刷课,Nodejs 编写
4
[Cloudreve] 树洞网络云盘 使用Docker一键部署
好东西就应该分享出来Cloudreve 是一款基于 ThinkPHP 构建的网盘系统,由“树洞外链”的作者开发,能够助您以较低成本快速搭建起公私兼备的网盘,并且还有能快速对接目前各家常用云储存等多项特性。 极光柠檬开发了这款网盘系统的 Docker 镜像,本站受邀转载其文章。
5
[Filerun] 轻松搭建私有网盘以及WebDAV
好东西就应该分享出来Filerun 是一个 php 环境下可部署的一个十分轻便的免费网盘程序,支持通过 Docker 一键部署,自带各种插件可供下载使用,一般网盘程序该有的功能一个也不少,支持中文,而且不像 ownCloud 和 NextCloud 那么重,就算是很低配的机器也能跑的很嗨。 更重要的是它同时自带 WebDAV 功能,并且提供 Windows / MacOS / Linux 平台的同步软件和 Android 客户端。
随机文章随机推荐
Profile Image of the Author
神代綺凛
专业咕咕
分类
标签
站点统计
文章
107
分类
15
标签
269
总字数
140,468
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
EdgeOne Pages
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录