Github Actions 初探

6,228

简单介绍

Github ActionsGithub推出的一个新的功能,可以为我们的项目自动化地构建工作流,例如代码检查,自动化打包,测试,发布版本等等。入口在项目pull request的旁边。

action入口
私有仓库现在应该很多同学都可以看到了,公有的因为现在还是beta版,名额还在陆续开放,需要主动去申请排队,有需要的同学可以去申请一下,点击主页的sign up for beta即可。

由于每个action都是在一个独立的docker容器里面运行的,所以需要我们有一点docker方面的知识储备,关于docker本文就不多加介绍了...

提出问题

1. workflow和action是什么?

字面上理解,workflow就是一个工作流,而action就是这个工作流中的一个个步骤,github规定每次最多只能并发执行两个工作流,每个工作流中的actions会按照我们需要的顺序运行,actions怎样执行可以根据我们的需要进行定制。

2. 怎么创建一个workflow?

方法一:通过github提供的可视化界面进行创建

  • 点击actions入口,一开始我们可以看到这个界面:

创建workflow

  • 点击上图的create a new workflow按钮,进入自定义workflow页面:

在这个界面,我们从workflow拉下来一条线,下面那个就是actionGitHub官方提供了几个action可以让我们直接用,点击右侧的几个action对应的use按钮即可。

例如我们想使用npm,点击npm对应的use,出现以下界面,假如我们每次push分支之后想执行npm install,在runs对应的输入框输入npm install,那么,执行npm install这个action就写好了。

方法二: 编写main.workflow文件

在项目根目录新建.github文件夹,在.github文件夹新建main.workflow文件,编写完成后推送到master分支即可。

这是一个简单的main.workflow文件:

workflow "Build, Test, and Publish" {
  on = "push"
  resolves = ["Publish"]
}

action "Build" {
  uses = "actions/npm@master"
  args = "install",
  env = {
    LOG_FILE = "log.txt"
  }
}

action "Test" {
  needs = "Build"
  uses = "actions/npm@master"
  args = "test"
}

action "Publish" {
  needs = "Test"
  uses = "actions/npm@master"
  args = "publish --access public"
  secrets = ["NPM_AUTH_TOKEN"]
}

其实,我们大概可以看出这段代码想要表达的意思,这里我简单介绍一下几个属性:

workflow的属性:

  • on: 定义什么情况下会触发这个workflow,例如,push, pull_request等。
  • resolves: 定义要调用的actions,可以是字符串或者一个字符串数组,若是只有一个字符串,表示最后调用的action,若是一个字符串数组,则表示完成这个workflow需要执行完这几个actions

action的属性:

  • needs:定义执行本action前需要成功执行的action,可以是字符串或者一个字符串数组,如果needsaction不止一个,那么这些actions会并行执行。

  • uses:定义执行本action需要运行的docker镜像,如uses = "node:10",如果不是使用docker hub提供的镜像,而是选择自己编写Dockerfile的话(后面会具体说明),这里的路径则为本地Dockerfile的路径。

  • runs:指定在docker镜像中要执行的命令,若指定,则会覆盖Dockerfile里面的ENTRYPOINT,若不指定,则默认执行Dockerfile里面ENTRYPOINT的命令。

假如我们想要在action里面执行npm install,那么只要指定: runs: "npm install"即可。

  • args:指定要传递给action的参数,可以是一个字符串或者一个字符串数组,若指定,则会覆盖Dockerfile里面的CMD

假如我们想要在action里面执行npm run lint,那么只要指定: args: "run lint"即可。

  • env:设置action运行时需要的环境变量,一般是自己写Dockerfile时会需要用到,具体说明请看官方文档

3. 怎么创建一个action?

方法一. 使用官方提供的几个action(比较简单)

github action界面点击右侧的actions列表,通过点击use按钮使用该action,根据需求填写runs, args, env等参数即可。

方法二. 自己写dockerfile(自定义程度高)

可以参考Github actions for npm等官方提供的action源码进行编写,主要是编写以下两个文件:

 Dockerfile
 entrypoint.sh

踩坑日记

1. entrypoint.sh需要执行权限

通过自己写dockerfile的方式来创建action的话,需要执行以下代码,不然会出错。

chmod +x ./actions/entrypoint.sh(替换成自己项目entrypoint.sh的路径)

2. npm install yarn -g ?

本来是想通过安装yarn,然后使用yarn来安装依赖的,但是因为容器的独立性,每个action都是独立的,不存在全局环境,所以无法实现,而github官方提供了一个公共的存储空间,npm install下载完成的文件就放在公共的存储空间,因此可以提供给后面的action使用,这也意味着如果需要在action之间传递信息,暂时也只能利用公共的存储空间,使用文件读写的方式来传递。

3. npm run test需要使用浏览器来跑单元测试,启动失败

浏览器无法直接在docker容器里面启动,使用xvfb-run npm test 成功解决。

总结

由于github action还算比较新的功能,网上的教程不是很多,以上大多是参考官方文档,加上自己摸索尝试得出的结论,如果有什么错漏之处,欢迎指出~