Github Actions
是Github
推出的一个新的功能,能够为咱们的项目自动化地构建工做流,例如代码检查,自动化打包,测试,发布版本等等。入口在项目pull request
的旁边。 node
sign up for beta
便可。
因为每一个
action
都是在一个独立的docker
容器里面运行的,因此须要咱们有一点docker
方面的知识储备,关于docker
本文就很少加介绍了...git
字面上理解,workflow
就是一个工做流,而action
就是这个工做流中的一个个步骤,github
规定每次最多只能并发执行两个工做流,每一个工做流中的actions
会按照咱们须要的顺序运行,actions
怎样执行能够根据咱们的须要进行定制。github
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
就写好了。docker
在项目根目录新建.github
文件夹,在.github
文件夹新建main.workflow
文件,编写完成后推送到master
分支便可。npm
这是一个简单的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
的属性:bash
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"
便可。
action
的参数,能够是一个字符串或者一个字符串数组,若指定,则会覆盖Dockerfile
里面的CMD
。假如咱们想要在action里面执行npm run lint,那么只要指定:
args: "run lint"
便可。
Dockerfile
时会须要用到,具体说明请看官方文档。在github action
界面点击右侧的actions
列表,经过点击use按钮使用该action
,根据需求填写runs
, args
, env
等参数便可。
能够参考Github actions for npm等官方提供的action
源码进行编写,主要是编写如下两个文件:
Dockerfile
entrypoint.sh
复制代码
经过本身写dockerfile
的方式来建立action
的话,须要执行如下代码,否则会出错。
chmod +x ./actions/entrypoint.sh(替换成本身项目entrypoint.sh的路径)
复制代码
原本是想经过安装yarn
,而后使用yarn
来安装依赖的,可是由于容器的独立性,每一个action
都是独立的,不存在全局环境,因此没法实现,而github
官方提供了一个公共的存储空间,npm install
下载完成的文件就放在公共的存储空间,所以能够提供给后面的action
使用,这也意味着若是须要在action
之间传递信息,暂时也只能利用公共的存储空间,使用文件读写的方式来传递。
浏览器没法直接在docker容器里面启动,使用xvfb-run npm test
成功解决。
因为github action
还算比较新的功能,网上的教程不是不少,以上大可能是参考官方文档,加上本身摸索尝试得出的结论,若是有什么错漏之处,欢迎指出~