简单介绍
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
还算比较新的功能,网上的教程不是很多,以上大多是参考官方文档,加上自己摸索尝试得出的结论,如果有什么错漏之处,欢迎指出~