Github Actions 初探

简单介绍

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

action入口
私有仓库如今应该不少同窗均可以看到了,公有的由于如今仍是beta版,名额还在陆续开放,须要主动去申请排队,有须要的同窗能够 去申请一下,点击主页的 sign up for beta便可。

因为每一个action都是在一个独立的docker容器里面运行的,因此须要咱们有一点docker方面的知识储备,关于docker本文就很少加介绍了...git

提出问题

1. workflow和action是什么?

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

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就写好了。docker

方法二: 编写main.workflow文件

在项目根目录新建.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

  • 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还算比较新的功能,网上的教程不是不少,以上大可能是参考官方文档,加上本身摸索尝试得出的结论,若是有什么错漏之处,欢迎指出~

相关文章
相关标签/搜索