简单介绍
Github Actions是Github推出的一个新的功能,可以为我们的项目自动化地构建工作流,例如代码检查,自动化打包,测试,发布版本等等。入口在项目pull request的旁边。
sign up for beta即可。
由于每个
action都是在一个独立的docker容器里面运行的,所以需要我们有一点docker方面的知识储备,关于docker本文就不多加介绍了...
提出问题
1. workflow和action是什么?
字面上理解,workflow就是一个工作流,而action就是这个工作流中的一个个步骤,github规定每次最多只能并发执行两个工作流,每个工作流中的actions会按照我们需要的顺序运行,actions怎样执行可以根据我们的需要进行定制。
2. 怎么创建一个workflow?
方法一:通过github提供的可视化界面进行创建
- 点击
actions入口,一开始我们可以看到这个界面:
- 点击上图的
create a new workflow按钮,进入自定义workflow页面:
workflow拉下来一条线,下面那个就是action,GitHub官方提供了几个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,可以是字符串或者一个字符串数组,如果needs的action不止一个,那么这些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还算比较新的功能,网上的教程不是很多,以上大多是参考官方文档,加上自己摸索尝试得出的结论,如果有什么错漏之处,欢迎指出~